5 * Created by Toshi Nagata on 08/10/24.
6 * Copyright 2008 Toshi Nagata. All rights reserved.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation version 2 of the License.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
18 #ifndef __MyDocument_h__
19 #define __MyDocument_h__
21 #include "wx/docview.h"
22 #include "wx/cmdproc.h"
23 #include "wx/process.h"
25 #include "../MolLib/MolLib.h"
27 #include <stdio.h> /* For FILE structure */
29 class wxProcess; /* For running QChem */
31 /* Custom Event for Document handling */
32 extern const wxEventType MyDocumentEvent;
34 MyDocumentEvent_willNeedCleanUndoStack = 1,
35 MyDocumentEvent_documentModified,
36 MyDocumentEvent_scriptMenuModified,
37 MyDocumentEvent_updateDisplay,
38 MyDocumentEvent_insertFrameFromMD,
39 MyDocumentEvent_threadTerminated,
40 MyDocumentEvent_openFilesByEvent,
41 MyDocumentEvent_documentWillClose,
42 MyDocumentEvent_openAuxiliaryDocuments
45 class MyDocument: public wxDocument
51 virtual ~MyDocument();
53 void SetMolecule(Molecule *mol);
54 Molecule *GetMolecule() { return mol; }
56 // For "register-undo" based undo/redo mechanism
59 bool isModifyNotificationSent;
61 wxCommand *currentCommand;
62 MolAction **undoStack;
66 bool isCleanUndoStackRequested;
68 bool hasFile; /* wxWidgets does not maintain this info for us */
70 int subThreadKind; /* 0: none, 1: MM/MD (mutex is in Molecule structure), 2: QChem (also mutex is in Molecule structure) */
72 wxProcess *subProcess; /* subprocess object for QChem run */
74 int (*endSubProcessCallback)(Molecule *mol, int status);
75 int (*timerSubProcessCallback)(Molecule *mol, int timerCount);
76 FILE *subProcessStdout; /* Stdout of the subprocess */
77 FILE *subProcessStderr; /* Stderr of the subprocess */
79 MainView *GetMainView() { return (mol != NULL ? mol->mview : NULL); }
80 void SetIsUndoing(bool flag) { isUndoing = flag; }
81 void SetCurrentCommand(wxCommand *command) { currentCommand = command; }
82 void PushUndoAction(MolAction *action);
83 void CleanUndoStack(bool shouldRegister = true);
84 bool IsUndoEnabled() { return isUndoEnabled; }
85 void SetUndoEnabled(bool flag);
86 void UpdateModifyFlag();
87 void BeginUndoGrouping();
88 void EndUndoGrouping();
92 void OnNeedCleanUndoStack(wxCommandEvent& event);
94 void OnDocumentModified(wxCommandEvent& event);
95 void OnImport(wxCommandEvent& event);
96 void OnExport(wxCommandEvent& event);
97 void OnExportGraphic(wxCommandEvent &event);
99 void OnCustomClose(wxCommandEvent &event);
101 void OnCopy(wxCommandEvent& event);
102 void OnCut(wxCommandEvent& event);
103 void OnPaste(wxCommandEvent& event);
104 void OnDelete(wxCommandEvent& event);
106 void OnCreateNewAtom(wxCommandEvent &event);
107 void OnCreateNewParameter(wxCommandEvent &event);
108 void OnCreatePiAnchor(wxCommandEvent &event);
110 void OnSelectAll(wxCommandEvent& event);
111 void OnSelectFragment(wxCommandEvent& event);
112 void OnSelectReverse(wxCommandEvent& event);
114 void OnAddHydrogen(wxCommandEvent& event);
116 void OnFitToScreen(wxCommandEvent& event);
117 void OnCenterSelection(wxCommandEvent& event);
118 // void OnShowMenu(wxCommandEvent& event);
119 // void OnToggleLineMode(wxCommandEvent &event);
120 // void OnShowGraphite(wxCommandEvent &event);
122 void OnShowAllAtoms(wxCommandEvent &event);
123 void OnHideSelected(wxCommandEvent &event);
124 void OnHideUnselected(wxCommandEvent &event);
125 void OnHideReverse(wxCommandEvent &event);
127 void DoMDOrMinimize(int minimize);
128 void OnMolecularDynamics(wxCommandEvent &event);
129 void OnMinimize(wxCommandEvent &event);
130 void OnStopMDRun(wxCommandEvent &event);
132 long RunSubProcess(const char *cmd, int (*callback)(Molecule *, int), int (*timerCallback)(Molecule *, int), FILE *output, FILE *errout);
133 void OnEndSubProcess(wxProcessEvent &event);
134 void FlushSubProcessOutput();
136 // void OnDefinePeriodicBox(wxCommandEvent &event);
137 // void OnShowPeriodicImage(wxCommandEvent &event);
138 // void OnPressureControl(wxCommandEvent &event);
139 // void OnDefineSymmetry(wxCommandEvent &event);
140 // void OnExpandBySymmetry(wxCommandEvent &event);
142 // void OnGuessUFFParameters(wxCommandEvent &event);
143 // void OnInvokeResp(wxCommandEvent &event);
144 // void OnInvokeAntechamber(wxCommandEvent &event);
145 // void OnCreateSanderInput(wxCommandEvent &event);
146 // void OnImportAmberFrcmod(wxCommandEvent &event);
148 // void OnCreateGamessInput(wxCommandEvent &event);
149 // void OnCreateMOPACInput(wxCommandEvent &event);
150 // void OnCreateMOCube(wxCommandEvent &event);
152 void OnInsertFrameFromMD(wxCommandEvent &event);
153 void OnUpdateDisplay(wxCommandEvent &event);
154 void OnSubThreadTerminated(wxCommandEvent &event);
155 void OnOpenAuxiliaryDocuments(wxCommandEvent &event);
157 void OnUpdateUI(wxUpdateUIEvent &event);
159 void TimerCallback(int timerCount);
162 virtual bool DoSaveDocument(const wxString& file);
163 virtual bool DoOpenDocument(const wxString& file);
164 virtual bool OnCreate(const wxString& path, long flags);
165 virtual bool Revert();
168 DECLARE_DYNAMIC_CLASS(MyDocument)
169 DECLARE_EVENT_TABLE()
172 MyDocument *MyDocumentFromMolecule(Molecule *mp);