1 // This file is part of BOINC.
2 // http://boinc.berkeley.edu
3 // Copyright (C) 2015 University of California
4 //
5 // BOINC is free software; you can redistribute it and/or modify it
6 // under the terms of the GNU Lesser General Public License
7 // as published by the Free Software Foundation,
8 // either version 3 of the License, or (at your option) any later version.
9 //
10 // BOINC is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 // See the GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public License
16 // along with BOINC.  If not, see <http://www.gnu.org/licenses/>.
17 
18 
19 // This code was initially generated with wxFormBuilder (version Oct 13 2006)
20 // http://www.wxformbuilder.org/
21 
22 #include "stdwx.h"
23 #include "Events.h"
24 #include "diagnostics.h"
25 #include "util.h"
26 #include "mfile.h"
27 #include "miofile.h"
28 #include "parse.h"
29 #include "LogBOINC.h"
30 #include "BOINCGUIApp.h"
31 #include "MainDocument.h"
32 #include "SkinManager.h"
33 
34 #include "DlgAdvPreferencesBase.h"
35 
36 #define STATICBOXBORDERSIZE 8
37 #define STATICBOXVERTICALSPACER 10
38 #define DAYOFWEEKBORDERSIZE 10
39 
40 ///////////////////////////////////////////////////////////////////////////
41 
42 // NOTE: On MS Windows with wxWidgets 3.0, controls inside a wxStaticBox
43 // don't refresh properly unless they are children of the wxStaticBox!
44 //
CDlgAdvPreferencesBase(wxWindow * parent,int id,wxString title,wxPoint pos,wxSize size,int style)45 CDlgAdvPreferencesBase::CDlgAdvPreferencesBase( wxWindow* parent, int id, wxString title, wxPoint pos, wxSize size, int style ) :
46     wxDialog( parent, id, title, pos, size, style )
47 {
48     wxString strCaption = title;
49     if (strCaption.IsEmpty()) {
50         CSkinAdvanced* pSkinAdvanced = wxGetApp().GetSkinManager()->GetAdvanced();
51         wxASSERT(pSkinAdvanced);
52         wxASSERT(wxDynamicCast(pSkinAdvanced, CSkinAdvanced));
53 
54         strCaption.Printf(_("%s - Computing preferences"), pSkinAdvanced->GetApplicationShortName().c_str());
55     }
56 
57     this->SetExtraStyle( this->GetExtraStyle() | wxWS_EX_VALIDATE_RECURSIVELY );
58     this->Centre( wxBOTH );
59     this->SetTitle(strCaption);
60 
61     wxBoxSizer* dialogSizer = new wxBoxSizer( wxVERTICAL );
62 
63 
64     bool usingLocalPrefs = doesLocalPrefsFileExist();
65     if (web_prefs_url->IsEmpty()) {
66         m_bmpWarning = NULL;
67     } else {
68         wxStaticBox* topControlsStaticBox = new wxStaticBox( this, -1, wxEmptyString );
69 
70         wxStaticBoxSizer* topControlsSizer = new wxStaticBoxSizer( topControlsStaticBox, wxHORIZONTAL );
71 
72         m_bmpWarning = new wxStaticBitmap( topControlsStaticBox, ID_DEFAULT, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
73         m_bmpWarning->SetMinSize( wxSize( 48,48 ) );
74 
75         topControlsSizer->Add( m_bmpWarning, 0, wxALIGN_CENTER_VERTICAL|wxALL, 0 );
76 
77         wxBoxSizer* legendSizer = new wxBoxSizer( wxVERTICAL );
78 
79         if (usingLocalPrefs) {
80             legendSizer->Add(
81                 new wxStaticText( topControlsStaticBox, ID_DEFAULT,
82                             _("Using local preferences.\n"
83                             "Click \"Use web prefs\" to use web-based preferences from"
84                             ), wxDefaultPosition, wxDefaultSize, 0 ),
85                 0, wxALL, 1
86             );
87         } else {
88             legendSizer->Add(
89                 new wxStaticText( topControlsStaticBox, ID_DEFAULT,
90                             _("Using web-based preferences from"),
91                             wxDefaultPosition, wxDefaultSize, 0 ),
92                 0, wxALL, 1
93             );
94         }
95 
96         legendSizer->Add(
97             new wxHyperlinkCtrl(
98                 topControlsStaticBox, wxID_ANY, *web_prefs_url, *web_prefs_url,
99                 wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE
100             ),
101             0, wxLEFT, 5
102         );
103 
104         if (!usingLocalPrefs) {
105             legendSizer->Add(
106                 new wxStaticText( topControlsStaticBox, ID_DEFAULT,
107                      _("Set values and click OK to use local preferences instead."),
108                      wxDefaultPosition, wxDefaultSize, 0 ),
109                 0, wxALL, 1
110             );
111         }
112 
113         topControlsSizer->Add( legendSizer, 1, wxALL, 1 );
114 
115         m_btnClear = new wxButton( topControlsStaticBox, ID_BTN_CLEAR, _("Use web prefs"), wxDefaultPosition, wxDefaultSize, 0 );
116         m_btnClear->SetToolTip( _("Restore web-based preferences and close the dialog.") );
117         if (!usingLocalPrefs) {
118             m_btnClear->Hide();
119         }
120 
121         topControlsSizer->Add( m_btnClear, 0, wxALIGN_BOTTOM|wxALL, 4 );
122 
123 #ifdef __WXMAC__
124         dialogSizer->Add( topControlsSizer, 0, wxTOP|wxLEFT|wxRIGHT|wxEXPAND, 10 );
125 #else
126         dialogSizer->Add( topControlsSizer, 0, wxALL|wxEXPAND, 5 );
127 #endif
128     }
129     m_panelControls = new wxPanel( this, ID_DEFAULT, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
130     m_panelControls->SetExtraStyle( wxWS_EX_VALIDATE_RECURSIVELY );
131 
132     wxBoxSizer* notebookSizer = new wxBoxSizer( wxVERTICAL );
133 
134     m_Notebook = new wxNotebook( m_panelControls, ID_DEFAULT, wxDefaultPosition, wxDefaultSize, wxNB_FLAT|wxNB_TOP );
135     m_Notebook->SetExtraStyle( wxWS_EX_VALIDATE_RECURSIVELY );
136 
137     // Note: we must set the third AddPage argument ("select") to
138     // true for each page or ToolTips won't initialize properly.
139     m_panelProcessor = createProcessorTab(m_Notebook);
140     m_Notebook->AddPage( m_panelProcessor, _("Computing"), true );
141 
142     m_panelNetwork = createNetworkTab(m_Notebook);
143     m_Notebook->AddPage( m_panelNetwork, _("Network"), true );
144 
145     m_panelDiskAndMemory = createDiskAndMemoryTab(m_Notebook);
146     m_Notebook->AddPage( m_panelDiskAndMemory, _("Disk and memory"), true );
147 
148     m_panelDailySchedules = createDailySchedulesTab(m_Notebook);
149     m_Notebook->AddPage( m_panelDailySchedules, _("Daily schedules"), true );
150 
151     notebookSizer->Add( m_Notebook, 1, wxEXPAND | wxALL, 1 );
152 
153     m_panelControls->SetSizer( notebookSizer );
154     m_panelControls->Layout();
155     notebookSizer->Fit( m_panelControls );
156 
157     dialogSizer->Add( m_panelControls, 1, wxALL|wxEXPAND, 5 );
158 
159     m_panelButtons = new wxPanel( this, ID_DEFAULT, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
160     wxBoxSizer* buttonSizer = new wxBoxSizer( wxHORIZONTAL );
161 
162     m_btnOK = new wxButton( m_panelButtons, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
163     m_btnOK->SetToolTip( _("Save all values and close the dialog.") );
164     m_btnOK->SetDefault();
165 
166     buttonSizer->Add( m_btnOK, 0, wxALL, 5 );
167 
168     m_btnCancel = new wxButton( m_panelButtons, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
169     m_btnCancel->SetToolTip( _("Close the dialog without saving.") );
170 
171     buttonSizer->Add( m_btnCancel, 0, wxALL, 5 );
172 
173     m_btnHelp = new wxButton( m_panelButtons, ID_HELPBOINC, _("Help"), wxDefaultPosition, wxDefaultSize, 0 );
174     m_btnHelp->SetToolTip( _("Shows the preferences web page.") );
175 
176     buttonSizer->Add( m_btnHelp, 0, wxALL, 5 );
177 
178     m_panelButtons->SetSizer( buttonSizer );
179     m_panelButtons->Layout();
180     buttonSizer->Fit( m_panelButtons );
181     dialogSizer->Add( m_panelButtons, 0, wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALL, 1 );
182 
183     dialogSizer->Fit( this );
184     this->SetSizer( dialogSizer );
185 }
186 
addNewRowToSizer(wxSizer * toSizer,wxString & toolTipText,wxWindow * first,wxWindow * second,wxWindow * third,wxWindow * fourth,wxWindow * fifth)187 void CDlgAdvPreferencesBase::addNewRowToSizer(
188                 wxSizer* toSizer, wxString& toolTipText,
189                 wxWindow* first, wxWindow* second, wxWindow* third,
190                 wxWindow* fourth, wxWindow* fifth)
191 {
192     wxBoxSizer* rowSizer = new wxBoxSizer( wxHORIZONTAL );
193 
194 #ifdef __WXMSW__
195     // MSW adds space to the right of checkbox label
196     if (first->IsKindOf(CLASSINFO(wxCheckBox))) {
197         rowSizer->Add(first, 0, wxTOP | wxBOTTOM |wxLEFT, 5 );
198     } else
199 #endif
200         rowSizer->Add(first, 0, wxALL, 5 );
201 
202     first->SetToolTip(toolTipText);
203 
204     rowSizer->Add(second, 0, wxALL, 2 );
205     second->SetToolTip(toolTipText);
206 
207     rowSizer->Add(third, 0, wxALL, 5 );
208     third->SetToolTip(toolTipText);
209 
210     if (fourth) {
211         rowSizer->Add(fourth, 0, wxALL, 2 );
212         fourth->SetToolTip(toolTipText);
213     }
214 
215     if (fifth) {
216         rowSizer->Add(fifth, 0, wxALL, 5 );
217         fifth->SetToolTip(toolTipText);
218     }
219 
220     toSizer->Add( rowSizer, 0, 0, 1 );
221 }
222 
223 
createProcessorTab(wxNotebook * notebook)224 wxPanel* CDlgAdvPreferencesBase::createProcessorTab(wxNotebook* notebook)
225 {
226     CSkinAdvanced*      pSkinAdvanced = wxGetApp().GetSkinManager()->GetAdvanced();
227     wxASSERT(pSkinAdvanced);
228 
229     wxSize textCtrlSize = getTextCtrlSize(wxT("999.99"));
230 
231     wxPanel* processorTab = new wxPanel( notebook, ID_TABPAGE_PROC, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
232     processorTab->SetExtraStyle( wxWS_EX_VALIDATE_RECURSIVELY );
233 
234     wxBoxSizer* processorTabSizer = new wxBoxSizer( wxVERTICAL );
235 
236     wxStaticBox* usageLimitsStaticBox = new wxStaticBox(processorTab, -1, _("Usage limits") );
237     wxStaticBoxSizer* usageLimitsBoxSizer = new wxStaticBoxSizer(usageLimitsStaticBox, wxVERTICAL);
238     makeStaticBoxLabelItalic(usageLimitsStaticBox);
239 
240     /*xgettext:no-c-format*/
241     wxString MaxCPUPctTT(_("Keep some CPUs free for other applications. Example: 75% means use 6 cores on an 8-core CPU."));
242     wxStaticText* staticText20 = new wxStaticText(
243         usageLimitsStaticBox, ID_DEFAULT, _("Use at most"), wxDefaultPosition, wxDefaultSize, 0 );
244 
245     m_txtProcUseProcessors = new wxTextCtrl( usageLimitsStaticBox, ID_TXTPROCUSEPROCESSORS, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT );
246 
247     /*xgettext:no-c-format*/
248     wxStaticText* staticText21 = new wxStaticText( usageLimitsStaticBox, ID_DEFAULT, _("% of the CPUs"), wxDefaultPosition, wxDefaultSize, 0 );
249 
250     addNewRowToSizer(usageLimitsBoxSizer, MaxCPUPctTT, staticText20, m_txtProcUseProcessors, staticText21);
251 
252     /*xgettext:no-c-format*/
253     wxString MaxCPUTimeTT(_("Suspend/resume computing every few seconds to reduce CPU temperature and energy usage. Example: 75% means compute for 3 seconds, wait for 1 second, and repeat."));
254     wxStaticText* staticText22 = new wxStaticText(
255         usageLimitsStaticBox, ID_DEFAULT, _("Use at most"), wxDefaultPosition, wxDefaultSize, 0 );
256 
257     m_txtProcUseCPUTime = new wxTextCtrl( usageLimitsStaticBox, ID_TXTPOCUSECPUTIME, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT );
258 
259     /*xgettext:no-c-format*/
260     wxStaticText* staticText23 = new wxStaticText( usageLimitsStaticBox, ID_DEFAULT, _("% of CPU time"), wxDefaultPosition, wxDefaultSize, 0 );
261 
262     addNewRowToSizer(usageLimitsBoxSizer, MaxCPUTimeTT, staticText22, m_txtProcUseCPUTime, staticText23);
263 
264     processorTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
265     processorTabSizer->Add( usageLimitsBoxSizer, 0, wxLEFT | wxRIGHT | wxEXPAND, STATICBOXBORDERSIZE );
266 
267     wxStaticBox* suspendComputingStaticBox = new wxStaticBox(processorTab, -1, _("When to suspend") );
268     wxStaticBoxSizer* suspendComputingBoxSizer = new wxStaticBoxSizer(suspendComputingStaticBox, wxVERTICAL);
269     makeStaticBoxLabelItalic(suspendComputingStaticBox);
270 
271     m_chkProcOnBatteries = new wxCheckBox(
272         suspendComputingStaticBox, ID_CHKPROCONBATTERIES,
273         _("Suspend when computer is on battery"), wxDefaultPosition, wxDefaultSize, 0
274     );
275     m_chkProcOnBatteries->SetToolTip(
276         _("Check this to suspend computing on portables when running on battery power.")
277     );
278     suspendComputingBoxSizer->Add( m_chkProcOnBatteries, 0, wxALL, 5 );
279 
280     m_chkProcInUse = new wxCheckBox(
281         suspendComputingStaticBox, ID_CHKPROCINUSE,
282         _("Suspend when computer is in use"), wxDefaultPosition, wxDefaultSize, 0
283     );
284     m_chkProcInUse->SetToolTip(
285         _("Check this to suspend computing and file transfers when you're using the computer.")
286     );
287     suspendComputingBoxSizer->Add( m_chkProcInUse, 0, wxALL, 5 );
288 
289     m_chkGPUProcInUse = new wxCheckBox(
290         suspendComputingStaticBox, ID_CHKGPUPROCINUSE,
291         _("Suspend GPU computing when computer is in use"), wxDefaultPosition, wxDefaultSize, 0
292     );
293     m_chkGPUProcInUse->SetToolTip(
294         _("Check this to suspend GPU computing when you're using the computer.")
295     );
296     suspendComputingBoxSizer->Add( m_chkGPUProcInUse, 0, wxALL, 5 );
297 
298     // min idle time
299     wxString ProcIdleForTT(_("This determines when the computer is considered 'in use'."));
300 
301     wxStaticText* staticText24 = new wxStaticText(
302             suspendComputingStaticBox, ID_DEFAULT,
303             // context: 'In use' means mouse/keyboard input in last ___ minutes
304             _("'In use' means mouse/keyboard input in last"),
305             wxDefaultPosition, wxDefaultSize, 0
306         );
307 
308     m_txtProcIdleFor = new wxTextCtrl(
309         suspendComputingStaticBox, ID_TXTPROCIDLEFOR, wxEmptyString, wxDefaultPosition, getTextCtrlSize(wxT("999.99")), wxTE_RIGHT
310     );
311 
312     wxStaticText* staticText25 = new wxStaticText(
313         suspendComputingStaticBox, ID_DEFAULT,
314         // context: 'In use' means mouse/keyboard input in last ___ minutes
315         _("minutes"),
316         wxDefaultPosition, wxDefaultSize, 0
317     );
318 
319     addNewRowToSizer(suspendComputingBoxSizer, ProcIdleForTT, staticText24, m_txtProcIdleFor, staticText25);
320 
321     // max CPU load
322     wxString MaxLoadCheckBoxText = wxEmptyString;
323     MaxLoadCheckBoxText.Printf(_("Suspend when non-BOINC CPU usage is above"));
324 
325     wxString MaxLoadTT(_("Suspend computing when your computer is busy running other programs."));
326     m_chkMaxLoad = new wxCheckBox(
327         suspendComputingStaticBox, ID_CHKMAXLOAD, MaxLoadCheckBoxText, wxDefaultPosition, wxDefaultSize, 0);
328 
329     m_txtMaxLoad = new wxTextCtrl(
330         suspendComputingStaticBox, ID_TXTMAXLOAD, wxEmptyString, wxDefaultPosition, getTextCtrlSize(wxT("100.00")), wxTE_RIGHT
331     );
332 
333     wxStaticText* staticText26 = new wxStaticText( suspendComputingStaticBox, ID_DEFAULT, wxT("%"),
334             wxDefaultPosition, wxDefaultSize, 0 );
335 
336     addNewRowToSizer(suspendComputingBoxSizer, MaxLoadTT, m_chkMaxLoad, m_txtMaxLoad, staticText26);
337 
338      suspendComputingBoxSizer->Add(
339         new wxStaticText( suspendComputingStaticBox, ID_DEFAULT, _("To suspend by time of day, see the \"Daily Schedules\" section."), wxDefaultPosition, wxDefaultSize, 0),
340         0, wxALL, 5
341     );
342 
343     processorTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
344     processorTabSizer->Add( suspendComputingBoxSizer, 0, wxLEFT | wxRIGHT | wxEXPAND, STATICBOXBORDERSIZE );
345 
346     wxStaticBox* miscProcStaticBox = new wxStaticBox(
347         processorTab, -1,
348         // Context: heading for a group of miscellaneous preferences
349         _("Other")
350     );
351     wxStaticBoxSizer* miscProcBoxSizer = new wxStaticBoxSizer( miscProcStaticBox, wxVERTICAL );
352     makeStaticBoxLabelItalic(miscProcStaticBox);
353 
354     // buffer sizes
355     wxString NetConnectIntervalTT(_("Store at least enough tasks to keep the computer busy for this long."));
356     wxStaticText* staticText30 = new wxStaticText(
357         miscProcStaticBox, ID_DEFAULT,
358         // context: Store at least ___ days of work
359         _("Store at least"),
360         wxDefaultPosition, wxDefaultSize, 0
361     );
362 
363     m_txtNetConnectInterval = new wxTextCtrl(
364         miscProcStaticBox, ID_TXTNETCONNECTINTERVAL, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT
365     );
366 
367     wxStaticText* staticText31 = new wxStaticText(
368         miscProcStaticBox, ID_DEFAULT,
369         // context: Store at least ___ days of work
370         _("days of work"),
371         wxDefaultPosition, wxDefaultSize, 0
372     );
373 
374     addNewRowToSizer(miscProcBoxSizer, NetConnectIntervalTT, staticText30, m_txtNetConnectInterval, staticText31);
375 
376     wxString NetAdditionalDaysTT(_("Store additional tasks above the minimum level.  Determines how much work is requested when contacting a project."));
377     wxStaticText* staticText331 = new wxStaticText(
378         miscProcStaticBox, ID_DEFAULT,
379         // context: Store up to an additional ___ days of work
380         _("Store up to an additional"),
381         wxDefaultPosition, wxDefaultSize, 0
382     );
383     staticText331->SetToolTip(NetAdditionalDaysTT);
384 
385     m_txtNetAdditionalDays = new wxTextCtrl(
386         miscProcStaticBox, ID_TXTNETADDITIONALDAYS, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT
387     );
388 
389     wxStaticText* staticText341 = new wxStaticText(
390         miscProcStaticBox, ID_DEFAULT,
391         // context: Store up to an additional ___ days of work
392         _("days of work"),
393         wxDefaultPosition, wxDefaultSize, 0
394     );
395 
396     addNewRowToSizer(miscProcBoxSizer, NetAdditionalDaysTT, staticText331, m_txtNetAdditionalDays, staticText341);
397 
398     wxString ProcSwitchEveryTT = wxEmptyString;
399     ProcSwitchEveryTT.Printf(_("If you run several projects, %s may switch between them this often."), pSkinAdvanced->GetApplicationShortName().c_str());
400 
401     wxStaticText* staticText18 = new wxStaticText(
402         miscProcStaticBox, ID_DEFAULT,
403         // context: Switch between tasks every ___ minutes
404         _("Switch between tasks every"),
405         wxDefaultPosition, wxDefaultSize, 0
406     );
407 
408     m_txtProcSwitchEvery = new wxTextCtrl( miscProcStaticBox, ID_TXTPROCSWITCHEVERY, wxEmptyString, wxDefaultPosition, getTextCtrlSize(wxT("9999.99")), wxTE_RIGHT );
409 
410     wxStaticText* staticText19 = new wxStaticText(
411         miscProcStaticBox, ID_DEFAULT,
412         // context: Switch between tasks every ___ minutes
413         _("minutes"),
414         wxDefaultPosition, wxDefaultSize, 0
415     );
416 
417     addNewRowToSizer(miscProcBoxSizer, ProcSwitchEveryTT, staticText18, m_txtProcSwitchEvery, staticText19);
418 
419     wxString DiskWriteToDiskTT(_("This controls how often tasks save their state to disk, so that they later can be continued from that point."));
420     wxStaticText* staticText46 = new wxStaticText(
421         miscProcStaticBox, ID_DEFAULT,
422         // context: Request tasks to checkpoint at most every ___ seconds
423         _("Request tasks to checkpoint at most every"),
424         wxDefaultPosition, wxDefaultSize, 0
425     );
426 
427     m_txtDiskWriteToDisk = new wxTextCtrl( miscProcStaticBox, ID_TXTDISKWRITETODISK, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT );
428 
429     wxStaticText* staticText47 = new wxStaticText(
430         miscProcStaticBox, ID_DEFAULT,
431         // context: Request tasks to checkpoint at most every ___ seconds
432         _("seconds"),
433         wxDefaultPosition, wxDefaultSize, 0
434     );
435 
436     addNewRowToSizer(miscProcBoxSizer, DiskWriteToDiskTT, staticText46, m_txtDiskWriteToDisk, staticText47);
437 
438     miscProcBoxSizer->AddSpacer(1); // Ensure staticText22 is fully visible on Mac
439 
440     processorTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
441     processorTabSizer->Add( miscProcBoxSizer, 0, wxLEFT | wxRIGHT | wxEXPAND, STATICBOXBORDERSIZE );
442     processorTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
443 
444     processorTab->SetSizer( processorTabSizer );
445     processorTab->Layout();
446     processorTabSizer->Fit( processorTab );
447 
448     return processorTab;
449 }
450 
createNetworkTab(wxNotebook * notebook)451 wxPanel* CDlgAdvPreferencesBase::createNetworkTab(wxNotebook* notebook)
452 {
453     CSkinAdvanced*      pSkinAdvanced = wxGetApp().GetSkinManager()->GetAdvanced();
454     wxASSERT(pSkinAdvanced);
455 
456     wxSize textCtrlSize = getTextCtrlSize(wxT("9999.99"));
457 
458     wxPanel* networkTab = new wxPanel( notebook, ID_TABPAGE_NET, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
459     networkTab->SetExtraStyle( wxWS_EX_VALIDATE_RECURSIVELY );
460 
461     wxBoxSizer* networkTabSizer = new wxBoxSizer( wxVERTICAL );
462 
463     wxStaticBox* networkUsageLimitsStaticBox = new wxStaticBox( networkTab, -1, _("Usage limits") );
464     wxStaticBoxSizer* networkUsageLimitsBoxSizer = new wxStaticBoxSizer( networkUsageLimitsStaticBox, wxVERTICAL );
465     makeStaticBoxLabelItalic(networkUsageLimitsStaticBox);
466 
467     // upload/download rates
468 
469     wxString NetDownloadRateTT(_("Limit the download rate of file transfers."));
470     m_chkNetDownloadRate = new wxCheckBox( networkUsageLimitsStaticBox, ID_CHKNETDOWNLOADRATE, _("Limit download rate to"), wxDefaultPosition, wxDefaultSize, 0 );
471 
472     m_txtNetDownloadRate = new wxTextCtrl( networkUsageLimitsStaticBox, ID_TXTNETDOWNLOADRATE, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT );
473 
474     wxStaticText* staticText33 = new wxStaticText( networkUsageLimitsStaticBox, ID_DEFAULT, _("KB/second"), wxDefaultPosition, wxDefaultSize, 0 );
475 
476     addNewRowToSizer(networkUsageLimitsBoxSizer, NetDownloadRateTT, m_chkNetDownloadRate, m_txtNetDownloadRate, staticText33);
477 
478     wxString NetUploadRateTT(_("Limit the upload rate of file transfers."));
479     m_chkNetUploadRate = new wxCheckBox( networkUsageLimitsStaticBox, ID_CHKNETUPLOADRATE, _("Limit upload rate to"), wxDefaultPosition, wxDefaultSize, 0 );
480 
481     m_txtNetUploadRate = new wxTextCtrl( networkUsageLimitsStaticBox, ID_TXTNETUPLOADRATE, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT );
482 
483     wxStaticText* staticText35 = new wxStaticText( networkUsageLimitsStaticBox, ID_DEFAULT, _("KB/second"), wxDefaultPosition, wxDefaultSize, 0 );
484 
485     addNewRowToSizer(networkUsageLimitsBoxSizer, NetUploadRateTT, m_chkNetUploadRate, m_txtNetUploadRate, staticText35);
486 
487     // long-term quota
488 
489     wxString daily_xfer_limitTT = wxEmptyString;
490     daily_xfer_limitTT.Printf(_("Example: %s should transfer at most 2000 MB of data every 30 days."), pSkinAdvanced->GetApplicationShortName().c_str());
491 
492     m_chk_daily_xfer_limit = new wxCheckBox( networkUsageLimitsStaticBox, ID_CHKDAILYXFERLIMIT, _("Limit usage to"), wxDefaultPosition, wxDefaultSize, 0 );
493 
494     m_txt_daily_xfer_limit_mb = new wxTextCtrl( networkUsageLimitsStaticBox, ID_TXTNETDOWNLOADRATE, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT );
495 
496     wxStaticText* staticText_daily_xfer2 = new wxStaticText( networkUsageLimitsStaticBox, ID_DEFAULT, _("MB every"), wxDefaultPosition, wxDefaultSize, 0 );
497 
498     m_txt_daily_xfer_period_days = new wxTextCtrl( networkUsageLimitsStaticBox, ID_TXTNETUPLOADRATE, wxEmptyString, wxDefaultPosition, getTextCtrlSize(wxT("999.99")), wxTE_RIGHT );
499 
500     wxStaticText* staticText_daily_xfer4 = new wxStaticText( networkUsageLimitsStaticBox, ID_DEFAULT, _("days"), wxDefaultPosition, wxDefaultSize, 0 );
501 
502     addNewRowToSizer(networkUsageLimitsBoxSizer, daily_xfer_limitTT, m_chk_daily_xfer_limit, m_txt_daily_xfer_limit_mb, staticText_daily_xfer2, m_txt_daily_xfer_period_days, staticText_daily_xfer4);
503 
504      networkUsageLimitsBoxSizer->Add(
505         new wxStaticText( networkUsageLimitsStaticBox, ID_DEFAULT, _("To limit transfers by time of day, see the \"Daily Schedules\" section."), wxDefaultPosition, wxDefaultSize, 0),
506         0, wxALL, 5
507     );
508 
509     networkTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
510     networkTabSizer->Add( networkUsageLimitsBoxSizer, 0, wxLEFT | wxRIGHT | wxEXPAND, STATICBOXBORDERSIZE );
511 
512         // Context: heading for a group of miscellaneous preferences
513     wxStaticBox* connectOptionsStaticBox = new wxStaticBox(
514         networkTab, -1,
515         // Context: heading for a group of miscellaneous preferences
516         _("Other")
517     );
518     wxStaticBoxSizer* connectOptionsSizer = new wxStaticBoxSizer( connectOptionsStaticBox, wxVERTICAL );
519     makeStaticBoxLabelItalic(connectOptionsStaticBox);
520 
521     wxString NetSkipImageVerificationTT = wxEmptyString;
522     NetSkipImageVerificationTT.Printf(_("Check this only if your Internet provider modifies image files. Skipping verification reduces the security of %s."), pSkinAdvanced->GetApplicationShortName().c_str());
523 
524     m_chkNetSkipImageVerification = new wxCheckBox( connectOptionsStaticBox, ID_CHKNETSKIPIMAGEVERIFICATION, _("Skip data verification for image files"), wxDefaultPosition, wxDefaultSize, 0 );
525     m_chkNetSkipImageVerification->SetToolTip(NetSkipImageVerificationTT);
526     connectOptionsSizer->Add( m_chkNetSkipImageVerification, 0, wxALL, 5 );
527 
528     m_chkNetConfirmBeforeConnect = new wxCheckBox( connectOptionsStaticBox, ID_CHKNETCONFIRMBEFORECONNECT, _("Confirm before connecting to Internet"), wxDefaultPosition, wxDefaultSize, 0 );
529     m_chkNetConfirmBeforeConnect->SetToolTip( _("Useful only if you have a modem, ISDN or VPN connection.") );
530     connectOptionsSizer->Add( m_chkNetConfirmBeforeConnect, 0, wxALL, 5 );
531 
532     m_chkNetDisconnectWhenDone = new wxCheckBox( connectOptionsStaticBox, ID_CHKNETDISCONNECTWHENDONE, _("Disconnect when done"), wxDefaultPosition, wxDefaultSize, 0 );
533     m_chkNetDisconnectWhenDone->SetToolTip( _("Useful only if you have a modem, ISDN or VPN connection.") );
534     connectOptionsSizer->Add( m_chkNetDisconnectWhenDone, 0, wxALL, 5 );
535 
536     networkTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
537     networkTabSizer->Add( connectOptionsSizer, 0, wxLEFT | wxRIGHT | wxEXPAND, STATICBOXBORDERSIZE );
538     networkTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
539 
540     networkTab->SetSizer( networkTabSizer );
541     networkTab->Layout();
542     networkTabSizer->Fit( networkTab );
543 
544     return networkTab;
545 }
546 
createDiskAndMemoryTab(wxNotebook * notebook)547 wxPanel* CDlgAdvPreferencesBase::createDiskAndMemoryTab(wxNotebook* notebook)
548 {
549     CSkinAdvanced*      pSkinAdvanced = wxGetApp().GetSkinManager()->GetAdvanced();
550     wxASSERT(pSkinAdvanced);
551 
552     wxSize textCtrlSize = getTextCtrlSize(wxT("9999.99"));
553 
554     wxPanel* diskMemoryTab = new wxPanel( notebook, ID_TABPAGE_DISK, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
555     diskMemoryTab->SetExtraStyle( wxWS_EX_VALIDATE_RECURSIVELY );
556 
557     wxBoxSizer* diskAndMemoryTabSizer = new wxBoxSizer( wxVERTICAL );
558 
559     wxStaticBox* diskUsageStaticBox = new wxStaticBox( diskMemoryTab, -1, _("Disk") );
560     wxStaticBoxSizer* diskUsageBoxSizer = new wxStaticBoxSizer( diskUsageStaticBox, wxVERTICAL );
561     makeStaticBoxLabelItalic(diskUsageStaticBox);
562 
563     wxString MostRestrictiveText = wxEmptyString;
564     MostRestrictiveText.Printf(_("%s will use the most restrictive of these settings:"), pSkinAdvanced->GetApplicationShortName().c_str());
565     diskUsageBoxSizer->Add(new wxStaticText( diskUsageStaticBox, -1, MostRestrictiveText, wxDefaultPosition, wxDefaultSize, 0),
566         0, wxALL, 5
567     );
568 
569     wxString DiskMaxSpaceTT = wxEmptyString;
570     DiskMaxSpaceTT.Printf(_("Limit the total amount of disk space used by %s."), pSkinAdvanced->GetApplicationShortName().c_str());
571 
572     m_chkDiskMaxSpace = new wxCheckBox (
573         diskUsageStaticBox, ID_CHKDISKMAXSPACE, _("Use no more than"), wxDefaultPosition, wxDefaultSize, 0 );
574 
575     m_txtDiskMaxSpace = new wxTextCtrl( diskUsageStaticBox, ID_TXTDISKMAXSPACE,wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT );
576 
577     wxStaticText* staticText41 = new wxStaticText( diskUsageStaticBox, ID_DEFAULT, _("GB"), wxDefaultPosition, wxDefaultSize, 0 );
578 
579     addNewRowToSizer(diskUsageBoxSizer, DiskMaxSpaceTT, m_chkDiskMaxSpace, m_txtDiskMaxSpace, staticText41);
580 
581     wxString DiskLeastFreeTT = wxEmptyString;
582     DiskLeastFreeTT.Printf(_("Limit disk usage to leave this much free space on the volume where %s stores data."), pSkinAdvanced->GetApplicationShortName().c_str());
583 
584     m_chkDiskLeastFree = new wxCheckBox (
585         diskUsageStaticBox, ID_CHKDISKLEASTFREE, _("Leave at least"), wxDefaultPosition, wxDefaultSize, 0 );
586 
587     m_txtDiskLeastFree = new wxTextCtrl( diskUsageStaticBox, ID_TXTDISKLEASTFREE, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT );
588 
589     wxStaticText* staticText43 = new wxStaticText( diskUsageStaticBox, ID_DEFAULT, _("GB free"), wxDefaultPosition, wxDefaultSize, 0 );
590 
591     addNewRowToSizer(diskUsageBoxSizer, DiskLeastFreeTT, m_chkDiskLeastFree, m_txtDiskLeastFree, staticText43);
592 
593     wxString DiskMaxOfTotalTT = wxEmptyString;
594     DiskMaxOfTotalTT.Printf(_("Limit the percentage of disk space used by %s on the volume where it stores data."), pSkinAdvanced->GetApplicationShortName().c_str());
595 
596     m_chkDiskMaxOfTotal = new wxCheckBox (
597         diskUsageStaticBox, ID_CHKDISKMAXOFTOTAL, _("Use no more than"), wxDefaultPosition, wxDefaultSize, 0 );
598 
599     m_txtDiskMaxOfTotal = new wxTextCtrl( diskUsageStaticBox, ID_TXTDISKMAXOFTOTAL, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT );
600 
601     /*xgettext:no-c-format*/
602     wxStaticText* staticText45 = new wxStaticText( diskUsageStaticBox, ID_DEFAULT, _("% of total"), wxDefaultPosition, wxDefaultSize, 0 );
603 
604     addNewRowToSizer(diskUsageBoxSizer, DiskMaxOfTotalTT, m_chkDiskMaxOfTotal, m_txtDiskMaxOfTotal, staticText45);
605 
606     diskAndMemoryTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
607     diskAndMemoryTabSizer->Add( diskUsageBoxSizer, 0, wxLEFT | wxRIGHT | wxEXPAND, STATICBOXBORDERSIZE );
608 
609     wxStaticBox* memoryUsageStaticBox = new wxStaticBox( diskMemoryTab, -1, _("Memory") );
610     wxStaticBoxSizer* memoryUsageBoxSizer = new wxStaticBoxSizer( memoryUsageStaticBox, wxVERTICAL );
611     makeStaticBoxLabelItalic(memoryUsageStaticBox);
612 
613     wxString MemoryMaxInUseTT = wxEmptyString;
614     MemoryMaxInUseTT.Printf(_("Limit the memory used by %s when you're using the computer."), pSkinAdvanced->GetApplicationShortName().c_str());
615 
616     wxStaticText* staticText50 = new wxStaticText( memoryUsageStaticBox, ID_DEFAULT, _("When computer is in use, use at most"), wxDefaultPosition, wxDefaultSize, 0 );
617 
618     textCtrlSize = getTextCtrlSize(wxT("100.00"));
619     m_txtMemoryMaxInUse = new wxTextCtrl( memoryUsageStaticBox, ID_TXTMEMORYMAXINUSE, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT );
620 
621     /*xgettext:no-c-format*/
622     wxStaticText* staticText51 = new wxStaticText( memoryUsageStaticBox, ID_DEFAULT, _("%"), wxDefaultPosition, wxDefaultSize, 0 );
623 
624     addNewRowToSizer(memoryUsageBoxSizer, MemoryMaxInUseTT, staticText50, m_txtMemoryMaxInUse, staticText51);
625 
626     wxString MemoryMaxOnIdleTT = wxEmptyString;
627     MemoryMaxOnIdleTT.Printf(_("Limit the memory used by %s when you're not using the computer."), pSkinAdvanced->GetApplicationShortName().c_str());
628 
629     wxStaticText* staticText52 = new wxStaticText( memoryUsageStaticBox, ID_DEFAULT, _("When computer is not in use, use at most"), wxDefaultPosition, wxDefaultSize, 0 );
630 
631     m_txtMemoryMaxOnIdle = new wxTextCtrl( memoryUsageStaticBox, ID_TXTMEMORYMAXONIDLE, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT );
632 
633     /*xgettext:no-c-format*/
634     wxStaticText* staticText53 = new wxStaticText( memoryUsageStaticBox, ID_DEFAULT, _("%"), wxDefaultPosition, wxDefaultSize, 0 );
635 
636     addNewRowToSizer(memoryUsageBoxSizer, MemoryMaxOnIdleTT, staticText52, m_txtMemoryMaxOnIdle, staticText53);
637 
638     m_chkMemoryWhileSuspended = new wxCheckBox( memoryUsageStaticBox, ID_CHKMEMORYWHILESUSPENDED, _("Leave non-GPU tasks in memory while suspended"), wxDefaultPosition, wxDefaultSize, 0 );
639     m_chkMemoryWhileSuspended->SetToolTip( _("If checked, suspended tasks stay in memory, and resume with no work lost. If unchecked, suspended tasks are removed from memory, and resume from their last checkpoint.") );
640     memoryUsageBoxSizer->Add(m_chkMemoryWhileSuspended, 0, wxALL, 5 );
641 
642     wxString DiskMaxSwapTT = wxEmptyString;
643     DiskMaxSwapTT.Printf(_("Limit the swap space (page file) used by %s."), pSkinAdvanced->GetApplicationShortName().c_str());
644 
645     wxStaticText* staticText48 = new wxStaticText( memoryUsageStaticBox, ID_DEFAULT, _("Page/swap file: use at most"), wxDefaultPosition, wxDefaultSize, 0 );
646 
647     m_txtDiskMaxSwap = new wxTextCtrl( memoryUsageStaticBox, ID_TXTDISKWRITETODISK, wxEmptyString, wxDefaultPosition, textCtrlSize, wxTE_RIGHT );
648 
649     /*xgettext:no-c-format*/
650     wxStaticText* staticText49 = new wxStaticText( memoryUsageStaticBox, ID_DEFAULT, _("%"), wxDefaultPosition, wxDefaultSize, 0 );
651 
652     addNewRowToSizer(memoryUsageBoxSizer, DiskMaxSwapTT, staticText48, m_txtDiskMaxSwap, staticText49);
653 
654     diskAndMemoryTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
655     diskAndMemoryTabSizer->Add( memoryUsageBoxSizer, 0, wxLEFT | wxRIGHT | wxEXPAND, STATICBOXBORDERSIZE );
656     diskAndMemoryTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
657 
658     diskMemoryTab->SetSizer( diskAndMemoryTabSizer );
659     diskMemoryTab->Layout();
660     diskAndMemoryTabSizer->Fit( diskMemoryTab );
661 
662     return diskMemoryTab;
663 }
664 
665 
createDailySchedulesTab(wxNotebook * notebook)666 wxPanel* CDlgAdvPreferencesBase::createDailySchedulesTab(wxNotebook* notebook)
667 {
668     wxSize textCtrlSize = getTextCtrlSize(wxT("23:59 "));
669 
670     wxString andString(_("and"));
671     wxString toString(wxT(" ")+_("to")+wxT(" "));
672 
673     wxPanel* dailySchedulesTab = new wxPanel(
674         notebook, ID_TABPAGE_SCHED, wxDefaultPosition,
675         wxDefaultSize, wxTAB_TRAVERSAL
676     );
677     dailySchedulesTab->SetExtraStyle( wxWS_EX_VALIDATE_RECURSIVELY );
678 
679     wxBoxSizer* dailySchedulesTabSizer = new wxBoxSizer( wxVERTICAL );
680 
681     // Computing schedule
682     //
683     wxStaticBox* computingTimesStaticBox = new wxStaticBox(
684         dailySchedulesTab, -1, _("Computing")
685     );
686     wxStaticBoxSizer* computingTimesStaticBoxSizer = new wxStaticBoxSizer(
687         computingTimesStaticBox, wxVERTICAL
688     );
689     makeStaticBoxLabelItalic(computingTimesStaticBox);
690 
691     wxString ProcEveryDayTT(_("Compute only during a particular period each day."));
692     m_chkProcEveryDay = new wxCheckBox(
693         computingTimesStaticBox, ID_CHKPROCEVERYDAY,
694         _("Compute only between"), wxDefaultPosition, wxDefaultSize, 0
695     );
696 
697     m_txtProcEveryDayStart = new wxTextCtrl(
698         computingTimesStaticBox, ID_TXTPROCEVERYDAYSTART, wxEmptyString,
699         wxDefaultPosition, textCtrlSize, wxTE_RIGHT
700     );
701 
702     wxStaticText* staticText25 = new wxStaticText(
703         computingTimesStaticBox, ID_DEFAULT, andString, wxDefaultPosition,
704         wxDefaultSize, wxALIGN_CENTRE
705     );
706 
707     m_txtProcEveryDayStop = new wxTextCtrl(
708         computingTimesStaticBox, ID_TXTPROCEVERYDAYSTOP, wxEmptyString,
709         wxDefaultPosition, textCtrlSize, wxTE_RIGHT
710     );
711 
712     addNewRowToSizer(
713         computingTimesStaticBoxSizer, ProcEveryDayTT, m_chkProcEveryDay,
714         m_txtProcEveryDayStart, staticText25, m_txtProcEveryDayStop
715     );
716 
717     wxStaticBox* procSpecialTimesStaticBox = new wxStaticBox(
718         computingTimesStaticBox, -1, _("Day-of-week override")
719     );
720     wxStaticBoxSizer* procSpecialTimesStaticBoxSizer = new wxStaticBoxSizer(
721         procSpecialTimesStaticBox, wxVERTICAL
722     );
723     makeStaticBoxLabelItalic(procSpecialTimesStaticBox);
724 
725     wxStaticText* staticText36 = new wxStaticText(
726         procSpecialTimesStaticBox, ID_DEFAULT,
727         _("Override the times above on the selected days:"),
728         wxDefaultPosition, wxDefaultSize, 0
729     );
730 #ifdef __WXMAC__
731     procSpecialTimesStaticBoxSizer->Add( staticText36, 0, wxLEFT, 5 );
732 #else
733     procSpecialTimesStaticBoxSizer->Add( staticText36, 0, wxLEFT, DAYOFWEEKBORDERSIZE );
734 #endif
735 
736     procSpecialTimesStaticBoxSizer->AddSpacer(3);
737 
738 //    procSpecialTimesStaticBox->SetToolTip(_("On each selected \"override\" day, ignore the \"Every day\" times above and suspend if the time is outside the range shown for that day"));
739 
740     wxFlexGridSizer* procDaysSizer = new wxFlexGridSizer( 4, 9, 0, 0 );
741     procDaysSizer->SetFlexibleDirection( wxHORIZONTAL );
742     procDaysSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
743 
744     // Tooltips for Day-of-Week override wxCheckBoxes and wxTextCtrls
745     // are set in CDlgAdvPreferences::SetSpecialTooltips()
746     //
747     wxString procDaysTimeTT(PROC_DAY_OF_WEEK_TOOLTIP_TEXT);
748 
749     m_chkProcMonday = new wxCheckBox(
750         procSpecialTimesStaticBox, ID_CHKPROCMONDAY, _("Monday"),
751         wxDefaultPosition, wxDefaultSize, 0
752     );
753     procDaysSizer->Add( m_chkProcMonday, 0, wxTOP, 5 );
754 
755     m_txtProcMondayStart = new wxTextCtrl(
756         procSpecialTimesStaticBox, ID_TXTPROCMONDAYSTART, wxEmptyString,
757         wxDefaultPosition, textCtrlSize, 0
758     );
759     procDaysSizer->Add( m_txtProcMondayStart, 0, wxALL, 1 );
760 
761     wxStaticText* toStringProcMonday = new wxStaticText(
762         procSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition,
763         wxDefaultSize, 0
764     );
765     toStringProcMonday->SetToolTip(procDaysTimeTT);
766     procDaysSizer->Add(toStringProcMonday , 0, wxTOP, 5 );
767 
768     m_txtProcMondayStop = new wxTextCtrl(
769         procSpecialTimesStaticBox, ID_TXTPROCMONDAYSTOP, wxEmptyString,
770         wxDefaultPosition, textCtrlSize, 0
771     );
772     procDaysSizer->Add( m_txtProcMondayStop, 0, wxALL, 1 );
773 
774     procDaysSizer->AddSpacer(15);
775 
776     m_chkProcFriday = new wxCheckBox(
777         procSpecialTimesStaticBox, ID_CHKPROCFRIDAY, _("Friday"),
778         wxDefaultPosition, wxDefaultSize, 0
779     );
780     procDaysSizer->Add( m_chkProcFriday, 0, wxTOP, 5 );
781 
782     m_txtProcFridayStart = new wxTextCtrl( procSpecialTimesStaticBox, ID_TXTPROCFRIDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
783     procDaysSizer->Add( m_txtProcFridayStart, 0, wxALL, 1 );
784 
785     wxStaticText* toStringProcFriday = new wxStaticText( procSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
786     toStringProcFriday->SetToolTip(procDaysTimeTT);
787     procDaysSizer->Add(toStringProcFriday , 0, wxTOP, 5 );
788 
789     m_txtProcFridayStop = new wxTextCtrl( procSpecialTimesStaticBox, ID_TXTPROCFRIDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
790     procDaysSizer->Add( m_txtProcFridayStop, 0, wxALL, 1 );
791 
792     m_chkProcTuesday = new wxCheckBox( procSpecialTimesStaticBox, ID_CHKPROCTUESDAY, _("Tuesday"), wxDefaultPosition, wxDefaultSize, 0 );
793     procDaysSizer->Add( m_chkProcTuesday, 0, wxTOP, 5 );
794 
795     m_txtProcTuesdayStart = new wxTextCtrl( procSpecialTimesStaticBox, ID_TXTPROCTUESDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
796     procDaysSizer->Add( m_txtProcTuesdayStart, 0, wxALL, 1 );
797 
798     wxStaticText* toStringProcTuesday = new wxStaticText( procSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
799     toStringProcTuesday->SetToolTip(procDaysTimeTT);
800     procDaysSizer->Add(toStringProcTuesday , 0, wxTOP, 5 );
801 
802     m_txtProcTuesdayStop = new wxTextCtrl( procSpecialTimesStaticBox, ID_TXTPROCTUESDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
803     procDaysSizer->Add( m_txtProcTuesdayStop, 0, wxALL, 1 );
804 
805     procDaysSizer->AddSpacer(15);
806 
807     m_chkProcSaturday = new wxCheckBox( procSpecialTimesStaticBox, ID_CHKPROCSATURDAY, _("Saturday"), wxDefaultPosition, wxDefaultSize, 0 );
808     procDaysSizer->Add( m_chkProcSaturday, 0, wxTOP, 5 );
809 
810     m_txtProcSaturdayStart = new wxTextCtrl( procSpecialTimesStaticBox, ID_TXTPROCSATURDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
811     procDaysSizer->Add( m_txtProcSaturdayStart, 0, wxALL, 1 );
812 
813     wxStaticText* toStringProcSaturday = new wxStaticText( procSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
814     toStringProcSaturday->SetToolTip(procDaysTimeTT);
815     procDaysSizer->Add(toStringProcSaturday , 0, wxTOP, 5 );
816 
817     m_txtProcSaturdayStop = new wxTextCtrl( procSpecialTimesStaticBox, ID_TXTPROCSATURDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
818     procDaysSizer->Add( m_txtProcSaturdayStop, 0, wxALL, 1 );
819 
820     m_chkProcWednesday = new wxCheckBox( procSpecialTimesStaticBox, ID_CHKPROCWEDNESDAY, _("Wednesday"), wxDefaultPosition, wxDefaultSize, 0 );
821     procDaysSizer->Add( m_chkProcWednesday, 0, wxTOP, 5 );
822 
823     m_txtProcWednesdayStart = new wxTextCtrl( procSpecialTimesStaticBox, ID_TXTPROCWEDNESDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
824     procDaysSizer->Add( m_txtProcWednesdayStart, 0, wxALL, 1 );
825 
826     wxStaticText* toStringProcWednesday = new wxStaticText( procSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
827     toStringProcWednesday->SetToolTip(procDaysTimeTT);
828     procDaysSizer->Add(toStringProcWednesday , 0, wxTOP, 5 );
829 
830     m_txtProcWednesdayStop = new wxTextCtrl( procSpecialTimesStaticBox, ID_TXTPROCWEDNESDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
831     procDaysSizer->Add( m_txtProcWednesdayStop, 0, wxALL, 1 );
832 
833     procDaysSizer->AddSpacer(15);
834 
835     m_chkProcSunday = new wxCheckBox( procSpecialTimesStaticBox, ID_CHKPROCSUNDAY, _("Sunday"), wxDefaultPosition, wxDefaultSize, 0 );
836     procDaysSizer->Add( m_chkProcSunday, 0, wxTOP, 5 );
837 
838     m_txtProcSundayStart = new wxTextCtrl( procSpecialTimesStaticBox, ID_TXTPROCSUNDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
839     procDaysSizer->Add( m_txtProcSundayStart, 0, wxALL, 1 );
840 
841     wxStaticText* toStringProcSunday = new wxStaticText( procSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
842     toStringProcSunday->SetToolTip(procDaysTimeTT);
843     procDaysSizer->Add(toStringProcSunday , 0, wxTOP, 5 );
844 
845     m_txtProcSundayStop = new wxTextCtrl( procSpecialTimesStaticBox, ID_TXTPROCSUNDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
846     procDaysSizer->Add( m_txtProcSundayStop, 0, wxALL, 1 );
847 
848     m_chkProcThursday = new wxCheckBox( procSpecialTimesStaticBox, ID_CHKPROCTHURSDAY, _("Thursday"), wxDefaultPosition, wxDefaultSize, 0 );
849     procDaysSizer->Add( m_chkProcThursday, 0, wxTOP, 5 );
850 
851     m_txtProcThursdayStart = new wxTextCtrl( procSpecialTimesStaticBox, ID_TXTPROCTHURSDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
852     procDaysSizer->Add( m_txtProcThursdayStart, 0, wxALL, 1 );
853 
854     wxStaticText* toStringProcThursday = new wxStaticText( procSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
855     toStringProcThursday->SetToolTip(procDaysTimeTT);
856     procDaysSizer->Add(toStringProcThursday , 0, wxTOP, 5 );
857 
858     m_txtProcThursdayStop = new wxTextCtrl( procSpecialTimesStaticBox, ID_TXTPROCTHURSDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
859     procDaysSizer->Add( m_txtProcThursdayStop, 0, wxALL, 1 );
860 
861 #ifdef __WXMAC__
862     procSpecialTimesStaticBoxSizer->Add(
863         procDaysSizer, 0, wxRIGHT | wxBOTTOM, DAYOFWEEKBORDERSIZE
864     );
865     computingTimesStaticBoxSizer->Add(
866         procSpecialTimesStaticBoxSizer, 0, wxRIGHT | wxBOTTOM,
867         STATICBOXBORDERSIZE + 3
868     );
869 #else
870     procSpecialTimesStaticBoxSizer->Add(
871         procDaysSizer, 1, wxRIGHT | wxLEFT | wxBOTTOM, DAYOFWEEKBORDERSIZE
872     );
873     computingTimesStaticBoxSizer->Add(
874         procSpecialTimesStaticBoxSizer, 1, wxRIGHT | wxLEFT | wxBOTTOM,
875         STATICBOXBORDERSIZE
876     );
877 #endif
878     dailySchedulesTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
879     dailySchedulesTabSizer->Add(
880         computingTimesStaticBoxSizer, 1, wxRIGHT | wxLEFT | wxEXPAND,
881         STATICBOXBORDERSIZE
882     );
883 
884     // Network schedule
885     //
886     wxStaticBox* networkTimesStaticBox = new wxStaticBox( dailySchedulesTab, -1, _("Network") );
887     wxStaticBoxSizer* networkTimesBoxSizer = new wxStaticBoxSizer( networkTimesStaticBox, wxVERTICAL );
888     makeStaticBoxLabelItalic(networkTimesStaticBox);
889 
890     wxString NetEveryDayTT(_("Transfer files only during a particular period each day."));
891     m_chkNetEveryDay = new wxCheckBox(
892         networkTimesStaticBox, ID_CHKNETEVERYDAY, _("Transfer files only between"), wxDefaultPosition, wxDefaultSize, 0 );
893 
894     m_txtNetEveryDayStart = new wxTextCtrl( networkTimesStaticBox, ID_TXTNETEVERYDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
895 
896     wxStaticText* staticText37 = new wxStaticText( networkTimesStaticBox, ID_DEFAULT, andString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
897 
898     m_txtNetEveryDayStop = new wxTextCtrl( networkTimesStaticBox, ID_TXTNETEVERYDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
899 
900     addNewRowToSizer(networkTimesBoxSizer, NetEveryDayTT, m_chkNetEveryDay, m_txtNetEveryDayStart, staticText37, m_txtNetEveryDayStop);
901 
902     wxStaticBox* netSpecialTimesStaticBox = new wxStaticBox(networkTimesStaticBox, -1, _("Day-of-week override") );
903     wxStaticBoxSizer* netSpecialTimesStaticBoxSizer = new wxStaticBoxSizer(netSpecialTimesStaticBox, wxVERTICAL);
904     makeStaticBoxLabelItalic(netSpecialTimesStaticBox);
905 
906     wxStaticText* staticText39 = new wxStaticText( netSpecialTimesStaticBox, ID_DEFAULT, _("Override the times above on the selected days:"), wxDefaultPosition, wxDefaultSize, 0 );
907 #ifdef __WXMAC__
908     netSpecialTimesStaticBoxSizer->Add( staticText39, 0, wxLEFT, 5 );
909 #else
910     netSpecialTimesStaticBoxSizer->Add( staticText39, 0, wxLEFT, DAYOFWEEKBORDERSIZE );
911 #endif
912     netSpecialTimesStaticBoxSizer->AddSpacer(3);
913 
914 //    netSpecialTimesStaticBox->SetToolTip(_("On each selected \"override\" day, ignore the \"Every day\" times above and suspend if the time is outside the range shown for that day"));
915 
916     // Tooltips for Day-of-Week overrides are set in CDlgAdvPreferences::SetSpecialTooltips()
917     wxString netDaysTimeTT(NET_DAY_OF_WEEK_TOOLTIP_TEXT);
918 
919     wxFlexGridSizer* netDaysGridSizer = new wxFlexGridSizer( 4, 9, 0, 0 );
920     netDaysGridSizer->SetFlexibleDirection( wxHORIZONTAL );
921     netDaysGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
922 
923     m_chkNetMonday = new wxCheckBox( netSpecialTimesStaticBox, ID_CHKNETMONDAY, _("Monday"), wxDefaultPosition, wxDefaultSize, 0 );
924     netDaysGridSizer->Add( m_chkNetMonday, 0, wxTOP, 5 );
925 
926     m_txtNetMondayStart = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETMONDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
927     netDaysGridSizer->Add( m_txtNetMondayStart, 0, wxALL, 1 );
928 
929     wxStaticText* toStringNetMonday = new wxStaticText( netSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
930     toStringNetMonday->SetToolTip(netDaysTimeTT);
931     netDaysGridSizer->Add(toStringNetMonday , 0, wxTOP, 5 );
932 
933     m_txtNetMondayStop = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETMONDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
934     netDaysGridSizer->Add( m_txtNetMondayStop, 0, wxALL, 1 );
935 
936     netDaysGridSizer->AddSpacer(15);
937 
938     m_chkNetFriday = new wxCheckBox( netSpecialTimesStaticBox, ID_CHKNETFRIDAY, _("Friday"), wxDefaultPosition, wxDefaultSize, 0 );
939     netDaysGridSizer->Add( m_chkNetFriday, 0, wxTOP, 5 );
940 
941     m_txtNetFridayStart = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETFRIDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
942     netDaysGridSizer->Add( m_txtNetFridayStart, 0, wxALL, 1 );
943 
944     wxStaticText* toStringNetFriday = new wxStaticText( netSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
945     toStringNetFriday->SetToolTip(netDaysTimeTT);
946     netDaysGridSizer->Add(toStringNetFriday , 0, wxTOP, 5 );
947 
948     m_txtNetFridayStop = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETFRIDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
949     netDaysGridSizer->Add( m_txtNetFridayStop, 0, wxALL, 1 );
950 
951     m_chkNetTuesday = new wxCheckBox( netSpecialTimesStaticBox, ID_CHKNETTUESDAY, _("Tuesday"), wxDefaultPosition, wxDefaultSize, 0 );
952     netDaysGridSizer->Add( m_chkNetTuesday, 0, wxTOP, 5 );
953 
954     m_txtNetTuesdayStart = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETTUESDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
955     netDaysGridSizer->Add( m_txtNetTuesdayStart, 0, wxALL, 1 );
956 
957     wxStaticText* toStringNetTuesay = new wxStaticText( netSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
958     toStringNetTuesay->SetToolTip(netDaysTimeTT);
959     netDaysGridSizer->Add(toStringNetTuesay , 0, wxTOP, 5 );
960 
961     m_txtNetTuesdayStop = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETTUESDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
962     netDaysGridSizer->Add( m_txtNetTuesdayStop, 0, wxALL, 1 );
963 
964     netDaysGridSizer->AddSpacer(15);
965 
966     m_chkNetSaturday = new wxCheckBox( netSpecialTimesStaticBox, ID_CHKNETSATURDAY, _("Saturday"), wxDefaultPosition, wxDefaultSize, 0 );
967     netDaysGridSizer->Add( m_chkNetSaturday, 0, wxTOP, 5 );
968 
969     m_txtNetSaturdayStart = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETSATURDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
970     netDaysGridSizer->Add( m_txtNetSaturdayStart, 0, wxALL, 1 );
971 
972     wxStaticText* toStringNetSaturday = new wxStaticText( netSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
973     toStringNetSaturday->SetToolTip(netDaysTimeTT);
974     netDaysGridSizer->Add(toStringNetSaturday , 0, wxTOP, 5 );
975 
976     m_txtNetSaturdayStop = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETSATURDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
977     netDaysGridSizer->Add( m_txtNetSaturdayStop, 0, wxALL, 1 );
978 
979     m_chkNetWednesday = new wxCheckBox( netSpecialTimesStaticBox, ID_CHKNETWEDNESDAY, _("Wednesday"), wxDefaultPosition, wxDefaultSize, 0 );
980     netDaysGridSizer->Add( m_chkNetWednesday, 0, wxTOP, 5 );
981 
982     m_txtNetWednesdayStart = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETWEDNESDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
983     netDaysGridSizer->Add( m_txtNetWednesdayStart, 0, wxALL, 1 );
984 
985     wxStaticText* toStringNetWednesday = new wxStaticText( netSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
986     toStringNetWednesday->SetToolTip(netDaysTimeTT);
987     netDaysGridSizer->Add(toStringNetWednesday , 0, wxTOP, 5 );
988 
989     m_txtNetWednesdayStop = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETWEDNESDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
990     netDaysGridSizer->Add( m_txtNetWednesdayStop, 0, wxALL, 1 );
991 
992     netDaysGridSizer->AddSpacer(15);
993 
994     m_chkNetSunday = new wxCheckBox( netSpecialTimesStaticBox, ID_CHKNETSUNDAY, _("Sunday"), wxDefaultPosition, wxDefaultSize, 0 );
995     netDaysGridSizer->Add( m_chkNetSunday, 0, wxTOP, 5 );
996 
997     m_txtNetSundayStart = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETSUNDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
998     netDaysGridSizer->Add( m_txtNetSundayStart, 0, wxALL, 1 );
999 
1000     wxStaticText* toStringNetSunday = new wxStaticText( netSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
1001     toStringNetSunday->SetToolTip(netDaysTimeTT);
1002     netDaysGridSizer->Add(toStringNetSunday , 0, wxTOP, 5 );
1003 
1004     m_txtNetSundayStop = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETSUNDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
1005     netDaysGridSizer->Add( m_txtNetSundayStop, 0, wxALL, 1 );
1006 
1007     m_chkNetThursday = new wxCheckBox( netSpecialTimesStaticBox, ID_CHKNETTHURSDAY, _("Thursday"), wxDefaultPosition, wxDefaultSize, 0 );
1008     netDaysGridSizer->Add( m_chkNetThursday, 0, wxTOP, 5 );
1009 
1010     m_txtNetThursdayStart = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETTHURSDAYSTART, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
1011     netDaysGridSizer->Add( m_txtNetThursdayStart, 0, wxALL, 1 );
1012 
1013     wxStaticText* toStringNetThursday = new wxStaticText( netSpecialTimesStaticBox, ID_DEFAULT, toString, wxDefaultPosition, wxDefaultSize, 0 );
1014     toStringNetThursday->SetToolTip(netDaysTimeTT);
1015     netDaysGridSizer->Add(toStringNetThursday , 0, wxTOP, 5 );
1016 
1017     m_txtNetThursdayStop = new wxTextCtrl( netSpecialTimesStaticBox, ID_TXTNETTHURSDAYSTOP, wxEmptyString, wxDefaultPosition, textCtrlSize, 0 );
1018     netDaysGridSizer->Add( m_txtNetThursdayStop, 0, wxALL, 1 );
1019 
1020 #ifdef __WXMAC__
1021     netSpecialTimesStaticBoxSizer->Add( netDaysGridSizer, 1, wxRIGHT | wxBOTTOM, DAYOFWEEKBORDERSIZE );
1022     networkTimesBoxSizer->Add(netSpecialTimesStaticBoxSizer, 1, wxRIGHT | wxBOTTOM, STATICBOXBORDERSIZE +3 );
1023 #else
1024     netSpecialTimesStaticBoxSizer->Add( netDaysGridSizer, 1, wxRIGHT | wxLEFT | wxBOTTOM, DAYOFWEEKBORDERSIZE );
1025     networkTimesBoxSizer->Add(netSpecialTimesStaticBoxSizer, 1, wxRIGHT | wxLEFT | wxBOTTOM, STATICBOXBORDERSIZE );
1026 #endif
1027     dailySchedulesTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
1028     dailySchedulesTabSizer->Add( networkTimesBoxSizer, 1, wxRIGHT | wxLEFT | wxEXPAND, STATICBOXBORDERSIZE );
1029     dailySchedulesTabSizer->AddSpacer( STATICBOXVERTICALSPACER );
1030 
1031     dailySchedulesTab->SetSizer( dailySchedulesTabSizer );
1032     dailySchedulesTab->Layout();
1033     dailySchedulesTabSizer->Fit( dailySchedulesTab );
1034 
1035     return dailySchedulesTab;
1036 }
1037 
1038 
getTextCtrlSize(wxString maxText)1039 wxSize CDlgAdvPreferencesBase::getTextCtrlSize(wxString maxText) {
1040     int w, h, margin;
1041     wxSize sz;
1042     wxFont f = GetParent()->GetFont();
1043     GetTextExtent(maxText, &w, &h, NULL, NULL, &f);
1044     margin = w/3;
1045     if (margin < 9) margin = 9;
1046     sz.x = w + margin;
1047     sz.y = wxDefaultCoord;
1048     return sz;
1049 }
1050 
doesLocalPrefsFileExist()1051 bool CDlgAdvPreferencesBase::doesLocalPrefsFileExist() {
1052     std::string s;
1053     int retval;
1054     bool local_prefs_found = false;
1055     MIOFILE mf;
1056     bool found_venue;
1057     GLOBAL_PREFS web_prefs;
1058     GLOBAL_PREFS_MASK mask;
1059     CMainDocument* pDoc = wxGetApp().GetDocument();
1060 
1061     wxASSERT(pDoc);
1062     wxASSERT(wxDynamicCast(pDoc, CMainDocument));
1063 
1064     retval = pDoc->rpc.get_global_prefs_override(s);
1065     local_prefs_found = (retval == BOINC_SUCCESS);
1066 
1067     s.clear();
1068     web_prefs.init();
1069 
1070     retval = pDoc->rpc.get_global_prefs_file(s);
1071     if (retval) {
1072         web_prefs_url = new wxString(wxEmptyString);
1073     } else {
1074         mf.init_buf_read(s.c_str());
1075         XML_PARSER xp(&mf);
1076         web_prefs.parse(xp, "", found_venue, mask);
1077         web_prefs_url = new wxString(web_prefs.source_project);
1078     }
1079 
1080     return local_prefs_found;
1081 }
1082 
makeStaticBoxLabelItalic(wxStaticBox * staticBox)1083 void CDlgAdvPreferencesBase::makeStaticBoxLabelItalic(wxStaticBox* staticBox) {
1084 #if defined(__WXMSW__) || defined(__WXGTK__)
1085     wxFont myFont = staticBox->GetFont();
1086     myFont.MakeItalic();
1087     myFont.MakeBold();
1088     staticBox->SetOwnFont(myFont);
1089 #endif
1090 }
1091 
1092