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