1 /////////////////////////////////////////////////////////////////////////////
2 // Name: setPreference.cpp
3 // Copyright: (c) 2006 Iowa State University
4 // Licence:
5 /////////////////////////////////////////////////////////////////////////////
6
7 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
8 #pragma implementation "setPreference.h"
9 #endif
10 #include "Globals.h"
11
12 // For compilers that support precompilation, includes "wx/wx.h".
13 #include "wx/wxprec.h"
14
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18
19 #ifndef WX_PRECOMP
20 #include "wx/wx.h"
21 #endif
22
23 ////@begin includes
24 ////@end includes
25 #include "PrefsPanes.h"
26 #include "MolDisplayWin.h"
27 #include "main.h"
28
29 #include "setPreference.h"
30
31 using namespace std;
32
33 extern WinPrefs * gPreferences;
34 extern WinPrefs * gPrefDefaults;
35
IMPLEMENT_DYNAMIC_CLASS(setPreference,wxDialog)36 IMPLEMENT_DYNAMIC_CLASS( setPreference, wxDialog )
37
38 /*
39 * SetPreference event table definition
40 */
41
42 BEGIN_EVENT_TABLE( setPreference, wxDialog )
43 EVT_CLOSE( setPreference::OnCloseWindow )
44
45 EVT_CHOICEBOOK_PAGE_CHANGED(ID_NOTEBOOK, setPreference::OnChoicebook)
46 /* EVT_CHOICEBOOK_PAGE_CHANGING(ID_NOTEBOOK, setPreference::OnChoicebook) */
47 //related to wxNoteBook
48
49 EVT_BUTTON( myID_SETFONT, setPreference::OnSetFont )
50 EVT_BUTTON( wxID_OK, setPreference::OnOK )
51 EVT_BUTTON( wxID_CANCEL, setPreference::OnCancel )
52 EVT_BUTTON( ID_FACTORY_DEFAULT, setPreference::facDefaults )
53 EVT_BUTTON( ID_APPLY, setPreference::OnApply )
54 EVT_BUTTON( ID_REVERT, setPreference::OnRevert )
55 EVT_BUTTON( ID_USER_DEFAULT, setPreference::userDefaults )
56 END_EVENT_TABLE()
57
58
59 /*!
60 * SetPreference constructors
61 */
62
63 setPreference::setPreference( )
64 {
65
66 }
67
~setPreference()68 setPreference::~setPreference( )
69 {
70 delete mPrefs;
71 }
72
setPreference(MolDisplayWin * parent,bool isGlobal,wxWindowID id,const wxString & caption,const wxPoint & pos,const wxSize & size,long style)73 setPreference::setPreference( MolDisplayWin* parent, bool isGlobal, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
74 {
75 mIsGlobal = isGlobal;
76
77 mParent = parent;
78
79 if (isGlobal)
80 mParentPrefs = gPreferences;
81 else
82 mParentPrefs = parent->GetPrefs();
83
84 mPrefs = new WinPrefs();
85 *mPrefs = *mParentPrefs;
86
87 create(parent, id, caption, pos, size, style);
88 }
89
90 /*!
91 * setPreference creator
92 */
93
create(MolDisplayWin * parent,wxWindowID id,const wxString & caption,const wxPoint & pos,const wxSize & size,long style)94 bool setPreference::create( MolDisplayWin* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
95 {
96 wxDialog::Create( parent, id, caption, pos, size, style );
97
98 wxBoxSizer * lSizer = new wxBoxSizer(wxVERTICAL);
99 SetSizer(lSizer);
100
101 m_choiceBook = (wxChoicebook *) NULL;
102 m_panel = (wxPanel *) NULL;
103
104 // m_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(50,50),
105 // wxTAB_TRAVERSAL | wxCLIP_CHILDREN | wxNO_BORDER | wxNO_FULL_REPAINT_ON_RESIZE);
106 m_panel = new wxPanel(this);
107 lSizer->Add(m_panel, wxALIGN_CENTER_HORIZONTAL | wxEXPAND | wxALL, 0);
108 m_sizer = new wxBoxSizer(wxVERTICAL);
109 m_panel->SetSizer(m_sizer);
110
111 RecreateBooks();
112
113 m_bottomSizer = new wxBoxSizer(wxHORIZONTAL);
114 m_midSizer = new wxBoxSizer(wxHORIZONTAL);
115 m_midLeftSizer = new wxBoxSizer(wxHORIZONTAL);
116 m_midRightSizer = new wxBoxSizer(wxHORIZONTAL);
117
118 m_midSizer->Add(m_midLeftSizer, wxALL, 5);
119 m_midSizer->Add(m_midRightSizer, wxALL, 5);
120
121 m_sizer->Add(m_midSizer, wxSizerFlags().Center());
122 m_sizer->Add(m_bottomSizer, wxSizerFlags().Center());
123
124 m_buttFont = new wxButton(m_panel, myID_SETFONT, wxT("Set Font"));
125 m_buttOK = new wxButton(m_panel, wxID_OK, wxT("OK") );
126 m_buttCancel = new wxButton(m_panel, wxID_CANCEL, wxT("Cancel"));
127
128 if (mIsGlobal)
129 m_buttApply = new wxButton(m_panel, ID_APPLY, wxT("Apply to All"));
130 else
131 m_buttApply = new wxButton(m_panel, ID_APPLY, wxT("Apply"));
132
133 m_buttFacDef = new wxButton(m_panel, ID_FACTORY_DEFAULT, wxT("Factory Default"));
134 m_buttRevert = new wxButton(m_panel, ID_REVERT, wxT("Revert"));
135
136 if (!mIsGlobal)
137 m_buttUserDef = new wxButton(m_panel, ID_USER_DEFAULT, wxT("User Defaults"));
138
139 m_bottomSizer->Add(m_buttFont, wxSizerFlags().Border(wxALL, 7));
140 m_bottomSizer->Add(80, 30);
141 m_bottomSizer->Add(m_buttApply, wxSizerFlags().Border(wxALL, 7));
142 m_bottomSizer->Add(m_buttCancel, wxSizerFlags().Border(wxALL, 7));
143 m_bottomSizer->Add(m_buttOK, wxSizerFlags().Border(wxALL, 7));
144
145 m_midLeftSizer->Add(m_buttFacDef, wxSizerFlags().Border(wxALL, 7));
146
147 if (!mIsGlobal)
148 m_midLeftSizer->Add(m_buttUserDef, wxSizerFlags().Border(wxALL, 7));
149
150 m_midRightSizer->Add(138, 30);
151 m_midRightSizer->Add(m_buttRevert, wxSizerFlags().Border(wxALL, 7));
152
153 // m_sizer->Fit(this);
154 // m_sizer->SetSizeHints(this);
155
156 // m_sizer->Layout();
157 m_panel->SetSize(size);
158 m_panel->Layout();
159 lSizer->Fit(this);
160 lSizer->SetSizeHints(this);
161 lSizer->Layout();
162
163 Centre(wxBOTH);
164 //This is a hack to get the window to default to a reasonable size on 2.9.x on OS X
165 //Without this the height of the window defaults to ridiculously small.
166 //This seems to fix the problem with the global prefs, but not the window specific prefs.
167 #if wxCHECK_VERSION(2,9,0)
168 // I would rather use the incoming size, but the default of -1,-1 simply isn't getting a properly
169 // sized window. On the global prefs the width is about 2/3 of correct and the height is passable.
170 // Instead set the fixed size below.
171 SetSize(MINIMUM_WINDOW_PREF_SIZE);
172 #endif
173 UpdateWindowTitle();
174 return true;
175 }
176
177 /*!
178 * Update the Window title in the event the file is saved
179 */
UpdateWindowTitle(void)180 void setPreference::UpdateWindowTitle(void) {
181 if (mIsGlobal) {
182 SetTitle(SYMBOL_GLOBALPREFERENCE_TITLE);
183 } else {
184 wxString foo = mParent->GetTitle();
185 foo += wxString(_(" ")) + wxString(SYMBOL_SETPREFERENCE_TITLE);
186 SetTitle(foo);
187 }
188 }
189
190 /*!
191 * wxEVT_CLOSE_WINDOW event handler for ID_DIALOG
192 */
193
OnCloseWindow(wxCloseEvent & event)194 void setPreference::OnCloseWindow( wxCloseEvent& event )
195 {
196 (void)event;
197 if (mIsGlobal) {
198 MpApp & app = wxGetApp();
199 app.CloseGlobalPrefs();
200 } else {
201 mParent->ClosePrefsWindow();
202 }
203 }
204 /*!
205 * wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_CANCEL
206 */
207
OnCancel(wxCommandEvent & event)208 void setPreference::OnCancel( wxCommandEvent& event ) {
209 (void)event;
210 Close();
211 }
212 /*!
213 * wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK
214 */
215
OnOK(wxCommandEvent & event)216 void setPreference::OnOK( wxCommandEvent& event ) {
217 (void)event;
218
219 saveCurrPrefs(currPanel);
220
221 if (mIsGlobal) {
222 *gPreferences = *mPrefs;
223 gPreferences->WriteUserPrefs();
224 } else {
225 mParent->SetWindowPreferences(mPrefs);
226 mParent->ResetAllWindows();
227 }
228
229 Close();
230 }
231
facDefaults(wxCommandEvent &)232 void setPreference::facDefaults( wxCommandEvent& /* event */ ) {
233
234 switch (currPanel) {
235 case 0: mPrefs->ReadAtomDefaults(); break;
236 case 1: mPrefs->ReadBondDefaults(); break;
237 case 2: mPrefs->ReadDisplayDefaults(); break;
238 case 3: mPrefs->ReadEnergyDefaults(); break;
239 case 4: mPrefs->ReadFileDefaults(); break;
240 case 5: mPrefs->ReadScalingDefaults(); break;
241 case 6: mPrefs->ReadStereoDefaults(); break;
242 case 7: mPrefs->ReadSurfaceDefaults(); break;
243 case 8: mPrefs->ReadQD3DDefaults(); break;
244 }
245
246 updatePanels(currPanel);
247
248 }
249
userDefaults(wxCommandEvent &)250 void setPreference::userDefaults( wxCommandEvent& /* event */ ) {
251
252 copyCurrPrefs(currPanel, gPreferences);
253 updatePanels(currPanel);
254
255 }
256
OnApply(wxCommandEvent & event)257 void setPreference::OnApply( wxCommandEvent& event ) {
258 (void)event;
259 saveCurrPrefs(currPanel);
260
261 if (!mIsGlobal) {
262 mParent->SetWindowPreferences(mPrefs);
263 mParent->ResetAllWindows();
264 } else {
265 MpApp & app = wxGetApp();
266 app.ApplyPrefsToAll(mPrefs);
267 }
268
269 }
270
OnRevert(wxCommandEvent &)271 void setPreference::OnRevert( wxCommandEvent& /* event */ )
272 {
273 WinPrefs* newPrefs;
274
275 if (!mIsGlobal)
276 newPrefs = mParent->GetPrefs();
277 else
278 newPrefs = gPreferences;
279
280 copyCurrPrefs(currPanel, newPrefs);
281 updatePanels(currPanel);
282 }
283
saveCurrPrefs(int panelID)284 void setPreference::saveCurrPrefs(int panelID) {
285
286 switch (panelID) {
287 case 0: atomPanel->saveToTempPrefs(); break;
288 case 1: bondPanel->saveToTempPrefs(); break;
289 case 2: displayPanel->saveToTempPrefs(); break;
290 case 3: energyPanel->saveToTempPrefs(); break;
291 case 4: filePanel->saveToTempPrefs(); break;
292 case 5: scalPanel->saveToTempPrefs(); break;
293 case 6: stereoPanel->saveToTempPrefs(); break;
294 case 7: surfPanel->saveToTempPrefs(); break;
295 case 8: qd3dPanel->saveToTempPrefs(); break;
296 }
297
298 }
299
copyCurrPrefs(int panelID,WinPrefs * newPrefs)300 void setPreference::copyCurrPrefs(int panelID, WinPrefs* newPrefs) {
301
302 switch (panelID) {
303 case 0: mPrefs->CopyAtomPrefs(newPrefs); break;
304 case 1: mPrefs->CopyBondPrefs(newPrefs); break;
305 case 2: mPrefs->CopyDisplayPrefs(newPrefs); break;
306 case 3: mPrefs->CopyEnergyPrefs(newPrefs); break;
307 case 4: mPrefs->CopyFilePrefs(newPrefs); break;
308 case 5: mPrefs->CopyScalingPrefs(newPrefs); break;
309 case 6: mPrefs->CopyStereoPrefs(newPrefs); break;
310 case 7: mPrefs->CopySurfacePrefs(newPrefs); break;
311 case 8: mPrefs->CopyQD3DPrefs(newPrefs); break;
312 }
313
314 }
315
updatePanels(int panelID)316 void setPreference::updatePanels(int panelID) {
317
318 m_choiceBook->DeletePage(panelID);
319
320 switch (panelID) {
321 case 0:
322 atomPanel = new AtomPrefsPane(mParent, m_choiceBook, mPrefs, mIsGlobal);
323 atomPanel->SetupPaneItems(mParent);
324 m_choiceBook->InsertPage(panelID, atomPanel, wxT("Elements"), true );
325 break;
326 case 1:
327 bondPanel = new BondPrefsPane(mParent, m_choiceBook, mPrefs, mIsGlobal);
328 bondPanel->SetupPaneItems(mParent);
329 m_choiceBook->InsertPage( panelID, bondPanel, wxT("Bonds/Vectors"), true );
330 break;
331 case 2:
332 displayPanel = new DisplayPrefsPane(mParent, m_choiceBook, mPrefs, mIsGlobal);
333 displayPanel->SetupPaneItems(mParent);
334 m_choiceBook->InsertPage( panelID, displayPanel, wxT("Display Options"), true );
335 break;
336 case 3:
337 energyPanel = new EnergyPrefsPane(mParent, m_choiceBook, mPrefs, mIsGlobal);
338 energyPanel->SetupPaneItems(mParent);
339 m_choiceBook->InsertPage( panelID, energyPanel, wxT("Energy Options"), true );
340 break;
341 case 4:
342 filePanel = new FilePrefsPane(mParent, m_choiceBook, mPrefs, mIsGlobal);
343 filePanel->SetupPaneItems(mParent);
344 m_choiceBook->InsertPage( panelID, filePanel, wxT("File"), true );
345 break;
346 case 5:
347 scalPanel = new ScalingPrefsPane(mParent, m_choiceBook, mPrefs, mIsGlobal);
348 scalPanel->SetupPaneItems(mParent);
349 m_choiceBook->InsertPage( panelID, scalPanel, wxT("Scaling/Speed"), true );
350 break;
351 case 6:
352 stereoPanel = new StereoPrefsPane(mParent, m_choiceBook, mPrefs, mIsGlobal);
353 stereoPanel->SetupPaneItems(mParent);
354 m_choiceBook->InsertPage( panelID, stereoPanel, wxT("Stereo Options"), true );
355 break;
356 case 7:
357 surfPanel = new SurfacePrefsPane(mParent, m_choiceBook, mPrefs, mIsGlobal);
358 surfPanel->SetupPaneItems(mParent);
359 m_choiceBook->InsertPage( panelID, surfPanel, wxT("Surface Options"), true );
360 break;
361 case 8:
362 qd3dPanel = new QD3DPrefsPane(mParent, m_choiceBook, mPrefs, mIsGlobal);
363 qd3dPanel->SetupPaneItems(mParent);
364 m_choiceBook->InsertPage( panelID, qd3dPanel, wxT("3D Options"), true );
365 break;
366 }
367 }
368
RecreateBooks()369 void setPreference::RecreateBooks() {
370 wxChoicebook *oldBook = m_choiceBook;
371
372 m_choiceBook = new wxChoicebook(m_panel, ID_NOTEBOOK, wxDefaultPosition, wxSize(10,10), wxCHB_DEFAULT);
373
374 m_sizer->Add(m_choiceBook, 5, wxALL | wxEXPAND, 4);
375
376 if (oldBook) {
377 int sel = oldBook->GetSelection();
378 int count = oldBook->GetPageCount();
379
380 for (int n = 0; n < count; n++) {
381 wxString str = oldBook->GetPageText(n);
382 wxWindow *page = new wxPanel(m_choiceBook);
383 m_choiceBook->AddPage(page, str, false );
384 }
385
386 m_sizer->Detach(oldBook);
387 delete oldBook;
388
389 if (sel != wxNOT_FOUND) {
390 m_choiceBook->SetSelection(sel);
391 }
392 } else {
393 CreateInitialPages(m_choiceBook);
394 }
395
396 // m_sizer->Insert(0, m_choiceBook, 5, wxALL | wxEXPAND, 4);
397 // m_sizer->Show(m_choiceBook);
398 // m_sizer->Layout();
399 }
400
401
GetCurrentBook()402 wxBookCtrlBase *setPreference::GetCurrentBook() {
403
404 return m_choiceBook;
405
406 }
407
CreateInitialPages(wxBookCtrlBase * parent)408 void setPreference::CreateInitialPages(wxBookCtrlBase *parent) {
409
410 // Create and add some panels to the notebook
411 atomPanel = new AtomPrefsPane(mParent, parent, mPrefs, mIsGlobal);
412 atomPanel->SetupPaneItems(mParent);
413 parent->AddPage( atomPanel, wxT("Elements"), false );
414
415 bondPanel = new BondPrefsPane(mParent, parent, mPrefs, mIsGlobal);
416 bondPanel->SetupPaneItems(mParent);
417 parent->AddPage( bondPanel, wxT("Bonds/Vectors"), false );
418
419 displayPanel = new DisplayPrefsPane(mParent, parent, mPrefs, mIsGlobal);
420 displayPanel->SetupPaneItems(mParent);
421 parent->AddPage( displayPanel, wxT("Display Options"), false );
422
423 energyPanel = new EnergyPrefsPane(mParent, parent, mPrefs, mIsGlobal);
424 energyPanel->SetupPaneItems(mParent);
425 parent->AddPage( energyPanel, wxT("Energy Options"), false );
426
427 filePanel = new FilePrefsPane(mParent, parent, mPrefs, mIsGlobal);
428 filePanel->SetupPaneItems(mParent);
429 parent->AddPage( filePanel, wxT("File"), false );
430
431 scalPanel = new ScalingPrefsPane(mParent, parent, mPrefs, mIsGlobal);
432 scalPanel->SetupPaneItems(mParent);
433 parent->AddPage( scalPanel, wxT("Scaling/Speed"), false );
434
435 stereoPanel = new StereoPrefsPane(mParent, parent, mPrefs, mIsGlobal);
436 stereoPanel->SetupPaneItems(mParent);
437 parent->AddPage( stereoPanel, wxT("Stereo Options"), false );
438
439 surfPanel = new SurfacePrefsPane(mParent, parent, mPrefs, mIsGlobal);
440 surfPanel->SetupPaneItems(mParent);
441 parent->AddPage( surfPanel, wxT("Surface Options"), false );
442
443 qd3dPanel = new QD3DPrefsPane(mParent, parent, mPrefs, mIsGlobal);
444 qd3dPanel->SetupPaneItems(mParent);
445 parent->AddPage( qd3dPanel, wxT("3D Options"), false );
446
447 parent->SetSelection(0);
448 currPanel = 0;
449 }
450
OnSetFont(wxCommandEvent &)451 void setPreference::OnSetFont(wxCommandEvent& /* event */) {
452 wxFontData data;
453 wxFontDialog dialog(this, data);
454
455 if ( dialog.ShowModal() == wxID_OK ) {
456 wxFontData retData = dialog.GetFontData();
457 wxFont myFont = retData.GetChosenFont();
458 }
459 }
460
OnChoicebook(wxChoicebookEvent & event)461 void setPreference::OnChoicebook(wxChoicebookEvent& event) {
462 int idx = event.GetOldSelection();
463
464 saveCurrPrefs(idx);
465 currPanel = event.GetSelection();
466 }
467