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