]> git.saurik.com Git - wxWidgets.git/blob - samples/dialogs/dialogs.cpp
No changes, just fix a typo in a variable name.
[wxWidgets.git] / samples / dialogs / dialogs.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: dialogs.cpp
3 // Purpose: Common dialogs demo
4 // Author: Julian Smart, Vadim Zeitlin, ABX
5 // Created: 04/01/98
6 // RCS-ID: $Id$
7 // Copyright: (c) Julian Smart
8 // (c) 2004 ABX
9 // (c) Vadim Zeitlin
10 // Licence: wxWindows licence
11 /////////////////////////////////////////////////////////////////////////////
12
13 // For compilers that support precompilation, includes "wx/wx.h".
14 #include "wx/wxprec.h"
15
16 #ifdef __BORLANDC__
17 #pragma hdrstop
18 #endif
19
20 #ifndef WX_PRECOMP
21 #include "wx/wx.h"
22 #endif
23
24 #include "../sample.xpm"
25
26 #include "wx/apptrait.h"
27 #include "wx/datetime.h"
28 #include "wx/image.h"
29 #include "wx/bookctrl.h"
30 #include "wx/artprov.h"
31 #include "wx/imaglist.h"
32 #include "wx/minifram.h"
33 #include "wx/sysopt.h"
34 #include "wx/notifmsg.h"
35
36 #if wxUSE_RICHMSGDLG
37 #include "wx/richmsgdlg.h"
38 #endif // wxUSE_RICHMSGDLG
39
40 #if wxUSE_COLOURDLG
41 #include "wx/colordlg.h"
42 #endif // wxUSE_COLOURDLG
43
44 #if wxUSE_CHOICEDLG
45 #include "wx/choicdlg.h"
46 #endif // wxUSE_CHOICEDLG
47
48 #include "wx/rearrangectrl.h"
49
50 #if wxUSE_STARTUP_TIPS
51 #include "wx/tipdlg.h"
52 #endif // wxUSE_STARTUP_TIPS
53
54 #if wxUSE_PROGRESSDLG
55 #if wxUSE_STOPWATCH && wxUSE_LONGLONG
56 #include "wx/datetime.h" // wxDateTime
57 #endif
58
59 #include "wx/progdlg.h"
60 #endif // wxUSE_PROGRESSDLG
61
62 #if wxUSE_ABOUTDLG
63 #include "wx/aboutdlg.h"
64
65 // these headers are only needed for custom about dialog
66 #include "wx/statline.h"
67 #include "wx/generic/aboutdlgg.h"
68 #endif // wxUSE_ABOUTDLG
69
70 #if wxUSE_BUSYINFO
71 #include "wx/busyinfo.h"
72 #endif // wxUSE_BUSYINFO
73
74 #if wxUSE_NUMBERDLG
75 #include "wx/numdlg.h"
76 #endif // wxUSE_NUMBERDLG
77
78 #if wxUSE_FILEDLG
79 #include "wx/filedlg.h"
80 #endif // wxUSE_FILEDLG
81
82 #if wxUSE_DIRDLG
83 #include "wx/dirdlg.h"
84 #endif // wxUSE_DIRDLG
85
86 #if wxUSE_FONTDLG
87 #include "wx/fontdlg.h"
88 #endif // wxUSE_FONTDLG
89
90 #if wxUSE_FINDREPLDLG
91 #include "wx/fdrepdlg.h"
92 #endif // wxUSE_FINDREPLDLG
93
94 #if wxUSE_INFOBAR
95 #include "wx/infobar.h"
96 #endif // wxUSE_INFOBAR
97
98 #include "wx/spinctrl.h"
99 #include "wx/propdlg.h"
100
101 #include "dialogs.h"
102
103 #if USE_COLOURDLG_GENERIC
104 #include "wx/generic/colrdlgg.h"
105 #endif // USE_COLOURDLG_GENERIC
106
107 #if USE_DIRDLG_GENERIC
108 #include "wx/generic/dirdlgg.h"
109 #endif // USE_DIRDLG_GENERIC
110
111 #if USE_FILEDLG_GENERIC
112 #include "wx/generic/filedlgg.h"
113 #endif // USE_FILEDLG_GENERIC
114
115 #if USE_FONTDLG_GENERIC
116 #include "wx/generic/fontdlgg.h"
117 #endif // USE_FONTDLG_GENERIC
118
119 IMPLEMENT_APP(MyApp)
120
121 BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
122 EVT_PAINT(MyCanvas::OnPaint)
123 END_EVENT_TABLE()
124
125
126
127 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
128 #if wxUSE_MSGDLG
129 EVT_MENU(DIALOGS_MESSAGE_BOX, MyFrame::MessageBox)
130 EVT_MENU(DIALOGS_MESSAGE_BOX_WINDOW_MODAL, MyFrame::MessageBoxWindowModal)
131 EVT_MENU(DIALOGS_MESSAGE_DIALOG, MyFrame::MessageBoxDialog)
132 EVT_MENU(DIALOGS_MESSAGE_BOX_WXINFO, MyFrame::MessageBoxInfo)
133 #endif // wxUSE_MSGDLG
134 #if wxUSE_RICHMSGDLG
135 EVT_MENU(DIALOGS_RICH_MESSAGE_DIALOG, MyFrame::RichMessageDialog)
136 #endif // wxUSE_RICHMSGDLG
137 #if wxUSE_COLOURDLG
138 EVT_MENU(DIALOGS_CHOOSE_COLOUR, MyFrame::ChooseColour)
139 EVT_MENU(DIALOGS_GET_COLOUR, MyFrame::GetColour)
140 #endif // wxUSE_COLOURDLG
141
142 #if wxUSE_FONTDLG
143 EVT_MENU(DIALOGS_CHOOSE_FONT, MyFrame::ChooseFont)
144 #endif // wxUSE_FONTDLG
145
146 #if wxUSE_LOG_DIALOG
147 EVT_MENU(DIALOGS_LOG_DIALOG, MyFrame::LogDialog)
148 #endif // wxUSE_LOG_DIALOG
149 #if wxUSE_INFOBAR
150 EVT_MENU(DIALOGS_INFOBAR_SIMPLE, MyFrame::InfoBarSimple)
151 EVT_MENU(DIALOGS_INFOBAR_ADVANCED, MyFrame::InfoBarAdvanced)
152 #endif // wxUSE_INFOBAR
153
154 #if wxUSE_TEXTDLG
155 EVT_MENU(DIALOGS_TEXT_ENTRY, MyFrame::TextEntry)
156 EVT_MENU(DIALOGS_PASSWORD_ENTRY, MyFrame::PasswordEntry)
157 #endif // wxUSE_TEXTDLG
158
159 #if wxUSE_NUMBERDLG
160 EVT_MENU(DIALOGS_NUM_ENTRY, MyFrame::NumericEntry)
161 #endif // wxUSE_NUMBERDLG
162
163 #if wxUSE_CHOICEDLG
164 EVT_MENU(DIALOGS_SINGLE_CHOICE, MyFrame::SingleChoice)
165 EVT_MENU(DIALOGS_MULTI_CHOICE, MyFrame::MultiChoice)
166 #endif // wxUSE_CHOICEDLG
167
168 #if wxUSE_REARRANGECTRL
169 EVT_MENU(DIALOGS_REARRANGE, MyFrame::Rearrange)
170 #endif // wxUSE_REARRANGECTRL
171
172 #if wxUSE_FILEDLG
173 EVT_MENU(DIALOGS_FILE_OPEN, MyFrame::FileOpen)
174 EVT_MENU(DIALOGS_FILE_OPEN2, MyFrame::FileOpen2)
175 EVT_MENU(DIALOGS_FILES_OPEN, MyFrame::FilesOpen)
176 EVT_MENU(DIALOGS_FILE_SAVE, MyFrame::FileSave)
177 #endif // wxUSE_FILEDLG
178
179 #if USE_FILEDLG_GENERIC
180 EVT_MENU(DIALOGS_FILE_OPEN_GENERIC, MyFrame::FileOpenGeneric)
181 EVT_MENU(DIALOGS_FILES_OPEN_GENERIC, MyFrame::FilesOpenGeneric)
182 EVT_MENU(DIALOGS_FILE_SAVE_GENERIC, MyFrame::FileSaveGeneric)
183 #endif // USE_FILEDLG_GENERIC
184
185 #if wxUSE_DIRDLG
186 EVT_MENU(DIALOGS_DIR_CHOOSE, MyFrame::DirChoose)
187 EVT_MENU(DIALOGS_DIRNEW_CHOOSE, MyFrame::DirChooseNew)
188 #endif // wxUSE_DIRDLG
189
190 #if USE_MODAL_PRESENTATION
191 EVT_MENU(DIALOGS_MODAL, MyFrame::ModalDlg)
192 #endif // USE_MODAL_PRESENTATION
193 EVT_MENU(DIALOGS_MODELESS, MyFrame::ModelessDlg)
194 EVT_MENU(DIALOGS_CENTRE_SCREEN, MyFrame::DlgCenteredScreen)
195 EVT_MENU(DIALOGS_CENTRE_PARENT, MyFrame::DlgCenteredParent)
196 #if wxUSE_MINIFRAME
197 EVT_MENU(DIALOGS_MINIFRAME, MyFrame::MiniFrame)
198 #endif // wxUSE_MINIFRAME
199 EVT_MENU(DIALOGS_ONTOP, MyFrame::DlgOnTop)
200
201 #if wxUSE_STARTUP_TIPS
202 EVT_MENU(DIALOGS_TIP, MyFrame::ShowTip)
203 #endif // wxUSE_STARTUP_TIPS
204
205 #if USE_FONTDLG_GENERIC
206 EVT_MENU(DIALOGS_CHOOSE_FONT_GENERIC, MyFrame::ChooseFontGeneric)
207 #endif // USE_FONTDLG_GENERIC
208
209 #if USE_DIRDLG_GENERIC
210 EVT_MENU(DIALOGS_GENERIC_DIR_CHOOSE, MyFrame::GenericDirChoose)
211 #endif // wxMSW || wxMAC
212
213 #if USE_COLOURDLG_GENERIC
214 EVT_MENU(DIALOGS_CHOOSE_COLOUR_GENERIC, MyFrame::ChooseColourGeneric)
215 #endif // USE_COLOURDLG_GENERIC
216
217 #if wxUSE_PROGRESSDLG
218 EVT_MENU(DIALOGS_PROGRESS, MyFrame::ShowProgress)
219 #endif // wxUSE_PROGRESSDLG
220
221 #if wxUSE_ABOUTDLG
222 EVT_MENU(DIALOGS_ABOUTDLG_SIMPLE, MyFrame::ShowSimpleAboutDialog)
223 EVT_MENU(DIALOGS_ABOUTDLG_FANCY, MyFrame::ShowFancyAboutDialog)
224 EVT_MENU(DIALOGS_ABOUTDLG_FULL, MyFrame::ShowFullAboutDialog)
225 EVT_MENU(DIALOGS_ABOUTDLG_CUSTOM, MyFrame::ShowCustomAboutDialog)
226 #endif // wxUSE_ABOUTDLG
227
228 #if wxUSE_BUSYINFO
229 EVT_MENU(DIALOGS_BUSYINFO, MyFrame::ShowBusyInfo)
230 #endif // wxUSE_BUSYINFO
231
232 #if wxUSE_FINDREPLDLG
233 EVT_MENU(DIALOGS_FIND, MyFrame::ShowFindDialog)
234 EVT_MENU(DIALOGS_REPLACE, MyFrame::ShowReplaceDialog)
235
236 EVT_FIND(wxID_ANY, MyFrame::OnFindDialog)
237 EVT_FIND_NEXT(wxID_ANY, MyFrame::OnFindDialog)
238 EVT_FIND_REPLACE(wxID_ANY, MyFrame::OnFindDialog)
239 EVT_FIND_REPLACE_ALL(wxID_ANY, MyFrame::OnFindDialog)
240 EVT_FIND_CLOSE(wxID_ANY, MyFrame::OnFindDialog)
241 #endif // wxUSE_FINDREPLDLG
242
243 #if USE_SETTINGS_DIALOG
244 EVT_MENU(DIALOGS_PROPERTY_SHEET, MyFrame::OnPropertySheet)
245 EVT_MENU(DIALOGS_PROPERTY_SHEET_TOOLBOOK, MyFrame::OnPropertySheet)
246 EVT_MENU(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, MyFrame::OnPropertySheet)
247 #endif // USE_SETTINGS_DIALOG
248
249 EVT_MENU(DIALOGS_STANDARD_BUTTON_SIZER_DIALOG, MyFrame::OnStandardButtonsSizerDialog)
250 EVT_MENU(DIALOGS_TEST_DEFAULT_ACTION, MyFrame::OnTestDefaultActionDialog)
251
252 EVT_MENU(DIALOGS_REQUEST, MyFrame::OnRequestUserAttention)
253 #if wxUSE_NOTIFICATION_MESSAGE
254 EVT_MENU(DIALOGS_NOTIFY_AUTO, MyFrame::OnNotifMsgAuto)
255 EVT_MENU(DIALOGS_NOTIFY_SHOW, MyFrame::OnNotifMsgShow)
256 EVT_MENU(DIALOGS_NOTIFY_HIDE, MyFrame::OnNotifMsgHide)
257 #endif // wxUSE_NOTIFICATION_MESSAGE
258
259 EVT_MENU(wxID_EXIT, MyFrame::OnExit)
260 END_EVENT_TABLE()
261
262 #if USE_MODAL_PRESENTATION
263
264 BEGIN_EVENT_TABLE(MyModalDialog, wxDialog)
265 EVT_BUTTON(wxID_ANY, MyModalDialog::OnButton)
266 END_EVENT_TABLE()
267
268 BEGIN_EVENT_TABLE(MyModelessDialog, wxDialog)
269 EVT_BUTTON(DIALOGS_MODELESS_BTN, MyModelessDialog::OnButton)
270 EVT_CLOSE(MyModelessDialog::OnClose)
271 END_EVENT_TABLE()
272
273 #endif // USE_MODAL_PRESENTATION
274
275 BEGIN_EVENT_TABLE(StdButtonSizerDialog, wxDialog)
276 EVT_CHECKBOX(wxID_ANY, StdButtonSizerDialog::OnEvent)
277 EVT_RADIOBUTTON(wxID_ANY, StdButtonSizerDialog::OnEvent)
278 END_EVENT_TABLE()
279
280 #if wxUSE_CMDLINE_PARSER
281
282 #include "wx/cmdline.h"
283
284 static const char *PROGRESS_SWITCH = "progress";
285
286 void MyApp::OnInitCmdLine(wxCmdLineParser& parser)
287 {
288 wxApp::OnInitCmdLine(parser);
289
290 parser.AddOption("", PROGRESS_SWITCH,
291 "Style for the startup progress dialog (wxPD_XXX)",
292 wxCMD_LINE_VAL_NUMBER);
293 }
294
295 bool MyApp::OnCmdLineParsed(wxCmdLineParser& parser)
296 {
297 if ( !wxApp::OnCmdLineParsed(parser) )
298 return false;
299
300 parser.Found(PROGRESS_SWITCH, &m_startupProgressStyle);
301
302 return true;
303 }
304
305 #endif // wxUSE_CMDLINE_PARSER
306
307 // `Main program' equivalent, creating windows and returning main app frame
308 bool MyApp::OnInit()
309 {
310 if ( !wxApp::OnInit() )
311 return false;
312
313 #if wxUSE_PROGRESSDLG
314 if ( m_startupProgressStyle != -1 )
315 {
316 // Show a test progress dialog before the main event loop is started:
317 // it should still work.
318 const int PROGRESS_COUNT = 100;
319 wxProgressDialog dlg
320 (
321 "Progress in progress",
322 "Please wait, starting...",
323 PROGRESS_COUNT,
324 NULL,
325 m_startupProgressStyle
326 );
327 for ( int i = 0; i <= PROGRESS_COUNT; i++ )
328 {
329 if ( !dlg.Update(i) )
330 break;
331
332 wxMilliSleep(50);
333 }
334 }
335 #endif // wxUSE_PROGRESSDLG
336
337 #if wxUSE_IMAGE
338 wxInitAllImageHandlers();
339 #endif
340
341 // Create the main frame window
342 MyFrame *frame = new MyFrame(wxT("wxWidgets dialogs example"));
343
344 // Make a menubar
345 wxMenu *menuDlg = new wxMenu;
346
347 menuDlg->Append(DIALOGS_MESSAGE_BOX, wxT("&Message box\tCtrl-M"));
348 menuDlg->Append(DIALOGS_MESSAGE_BOX_WINDOW_MODAL, wxT("Window-Modal Message box "));
349 menuDlg->Append(DIALOGS_MESSAGE_DIALOG, wxT("Message dialog\tShift-Ctrl-M"));
350 #if wxUSE_RICHMSGDLG
351 menuDlg->Append(DIALOGS_RICH_MESSAGE_DIALOG, wxT("Rich message dialog"));
352 #endif // wxUSE_RICHMSGDLG
353
354
355 #if wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
356
357 wxMenu *choices_menu = new wxMenu;
358
359 #if wxUSE_COLOURDLG
360 choices_menu->Append(DIALOGS_CHOOSE_COLOUR, wxT("&Choose bg colour"));
361 choices_menu->Append(DIALOGS_GET_COLOUR, wxT("&Choose fg colour"));
362 #endif // wxUSE_COLOURDLG
363
364 #if wxUSE_FONTDLG
365 choices_menu->Append(DIALOGS_CHOOSE_FONT, wxT("Choose &font"));
366 #endif // wxUSE_FONTDLG
367
368 #if wxUSE_CHOICEDLG
369 choices_menu->Append(DIALOGS_SINGLE_CHOICE, wxT("&Single choice\tCtrl-C"));
370 choices_menu->Append(DIALOGS_MULTI_CHOICE, wxT("M&ultiple choice\tCtrl-U"));
371 #endif // wxUSE_CHOICEDLG
372
373 #if wxUSE_REARRANGECTRL
374 choices_menu->Append(DIALOGS_REARRANGE, wxT("&Rearrange dialog\tCtrl-R"));
375 #endif // wxUSE_REARRANGECTRL
376
377 #if USE_COLOURDLG_GENERIC || USE_FONTDLG_GENERIC
378 choices_menu->AppendSeparator();
379 #endif // USE_COLOURDLG_GENERIC || USE_FONTDLG_GENERIC
380
381 #if USE_COLOURDLG_GENERIC
382 choices_menu->Append(DIALOGS_CHOOSE_COLOUR_GENERIC, wxT("&Choose colour (generic)"));
383 #endif // USE_COLOURDLG_GENERIC
384
385 #if USE_FONTDLG_GENERIC
386 choices_menu->Append(DIALOGS_CHOOSE_FONT_GENERIC, wxT("Choose &font (generic)"));
387 #endif // USE_FONTDLG_GENERIC
388
389 menuDlg->Append(wxID_ANY,wxT("&Choices and selectors"),choices_menu);
390 #endif // wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
391
392
393 #if wxUSE_TEXTDLG || wxUSE_NUMBERDLG
394
395 wxMenu *entry_menu = new wxMenu;
396
397 #if wxUSE_TEXTDLG
398 entry_menu->Append(DIALOGS_TEXT_ENTRY, wxT("Text &entry\tCtrl-E"));
399 entry_menu->Append(DIALOGS_PASSWORD_ENTRY, wxT("&Password entry\tCtrl-P"));
400 #endif // wxUSE_TEXTDLG
401
402 #if wxUSE_NUMBERDLG
403 entry_menu->Append(DIALOGS_NUM_ENTRY, wxT("&Numeric entry\tCtrl-N"));
404 #endif // wxUSE_NUMBERDLG
405
406 menuDlg->Append(wxID_ANY,wxT("&Entry dialogs"),entry_menu);
407
408 #endif // wxUSE_TEXTDLG || wxUSE_NUMBERDLG
409
410
411 #if wxUSE_FILEDLG
412
413 wxMenu *filedlg_menu = new wxMenu;
414 filedlg_menu->Append(DIALOGS_FILE_OPEN, wxT("&Open file\tCtrl-O"));
415 filedlg_menu->Append(DIALOGS_FILE_OPEN2, wxT("&Second open file\tCtrl-2"));
416 filedlg_menu->Append(DIALOGS_FILES_OPEN, wxT("Open &files\tCtrl-Q"));
417 filedlg_menu->Append(DIALOGS_FILE_SAVE, wxT("Sa&ve file\tCtrl-S"));
418
419 #if USE_FILEDLG_GENERIC
420 filedlg_menu->AppendSeparator();
421 filedlg_menu->Append(DIALOGS_FILE_OPEN_GENERIC, wxT("&Open file (generic)"));
422 filedlg_menu->Append(DIALOGS_FILES_OPEN_GENERIC, wxT("Open &files (generic)"));
423 filedlg_menu->Append(DIALOGS_FILE_SAVE_GENERIC, wxT("Sa&ve file (generic)"));
424 #endif // USE_FILEDLG_GENERIC
425
426 menuDlg->Append(wxID_ANY,wxT("&File operations"),filedlg_menu);
427
428 #endif // wxUSE_FILEDLG
429
430 #if wxUSE_DIRDLG
431 wxMenu *dir_menu = new wxMenu;
432
433 dir_menu->Append(DIALOGS_DIR_CHOOSE, wxT("&Choose a directory\tCtrl-D"));
434 dir_menu->Append(DIALOGS_DIRNEW_CHOOSE, wxT("Choose a directory (with \"Ne&w\" button)\tShift-Ctrl-D"));
435 menuDlg->Append(wxID_ANY,wxT("&Directory operations"),dir_menu);
436
437 #if USE_DIRDLG_GENERIC
438 dir_menu->AppendSeparator();
439 dir_menu->Append(DIALOGS_GENERIC_DIR_CHOOSE, wxT("&Choose a directory (generic)"));
440 #endif // USE_DIRDLG_GENERIC
441
442 #endif // wxUSE_DIRDLG
443
444
445 #if wxUSE_STARTUP_TIPS || \
446 wxUSE_PROGRESSDLG || \
447 wxUSE_BUSYINFO || \
448 wxUSE_LOG_DIALOG || \
449 wxUSE_MSGDLG
450
451 wxMenu *info_menu = new wxMenu;
452
453 #if wxUSE_STARTUP_TIPS
454 info_menu->Append(DIALOGS_TIP, wxT("&Tip of the day\tCtrl-T"));
455 #endif // wxUSE_STARTUP_TIPS
456
457 #if wxUSE_PROGRESSDLG
458 info_menu->Append(DIALOGS_PROGRESS, wxT("Pro&gress dialog\tCtrl-G"));
459 #endif // wxUSE_PROGRESSDLG
460
461 #if wxUSE_BUSYINFO
462 info_menu->Append(DIALOGS_BUSYINFO, wxT("&Busy info dialog\tCtrl-B"));
463 #endif // wxUSE_BUSYINFO
464
465 #if wxUSE_LOG_DIALOG
466 info_menu->Append(DIALOGS_LOG_DIALOG, wxT("&Log dialog\tCtrl-L"));
467 #endif // wxUSE_LOG_DIALOG
468
469 #if wxUSE_INFOBAR
470 info_menu->Append(DIALOGS_INFOBAR_SIMPLE, "Simple &info bar\tCtrl-I");
471 info_menu->Append(DIALOGS_INFOBAR_ADVANCED, "&Advanced info bar\tShift-Ctrl-I");
472 #endif // wxUSE_INFOBAR
473
474 #if wxUSE_MSGDLG
475 info_menu->Append(DIALOGS_MESSAGE_BOX_WXINFO,
476 wxT("&wxWidgets information\tCtrl-W"));
477 #endif // wxUSE_MSGDLG
478
479 menuDlg->Append(wxID_ANY,wxT("&Informative dialogs"),info_menu);
480
481 #endif // wxUSE_STARTUP_TIPS || wxUSE_PROGRESSDLG || wxUSE_BUSYINFO || wxUSE_LOG_DIALOG
482
483
484 #if wxUSE_FINDREPLDLG
485 wxMenu *find_menu = new wxMenu;
486 find_menu->AppendCheckItem(DIALOGS_FIND, wxT("&Find dialog\tCtrl-F"));
487 find_menu->AppendCheckItem(DIALOGS_REPLACE, wxT("Find and &replace dialog\tShift-Ctrl-F"));
488 menuDlg->Append(wxID_ANY,wxT("&Searching"),find_menu);
489 #endif // wxUSE_FINDREPLDLG
490
491 wxMenu *dialogs_menu = new wxMenu;
492 #if USE_MODAL_PRESENTATION
493 dialogs_menu->Append(DIALOGS_MODAL, wxT("&Modal dialog\tShift-Ctrl-W"));
494 #endif // USE_MODAL_PRESENTATION
495 dialogs_menu->AppendCheckItem(DIALOGS_MODELESS, wxT("Mode&less dialog\tShift-Ctrl-Z"));
496 dialogs_menu->Append(DIALOGS_CENTRE_SCREEN, wxT("Centered on &screen\tShift-Ctrl-1"));
497 dialogs_menu->Append(DIALOGS_CENTRE_PARENT, wxT("Centered on &parent\tShift-Ctrl-2"));
498 #if wxUSE_MINIFRAME
499 dialogs_menu->Append(DIALOGS_MINIFRAME, wxT("&Mini frame"));
500 #endif // wxUSE_MINIFRAME
501 dialogs_menu->Append(DIALOGS_ONTOP, wxT("Dialog staying on &top"));
502 menuDlg->Append(wxID_ANY, wxT("&Generic dialogs"), dialogs_menu);
503
504 #if USE_SETTINGS_DIALOG
505 wxMenu *sheet_menu = new wxMenu;
506 sheet_menu->Append(DIALOGS_PROPERTY_SHEET, wxT("&Standard property sheet\tShift-Ctrl-P"));
507 sheet_menu->Append(DIALOGS_PROPERTY_SHEET_TOOLBOOK, wxT("&Toolbook sheet\tShift-Ctrl-T"));
508
509 if (wxPlatformIs(wxPORT_MAC))
510 sheet_menu->Append(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, wxT("Button &Toolbook sheet\tShift-Ctrl-U"));
511 /*
512 #ifdef __WXMAC__
513 sheet_menu->Append(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, wxT("Button &Toolbook sheet\tShift-Ctrl-U"));
514 #endif
515 */
516 menuDlg->Append(wxID_ANY, wxT("&Property sheets"), sheet_menu);
517 #endif // USE_SETTINGS_DIALOG
518
519 wxMenu *menuNotif = new wxMenu;
520 menuNotif->Append(DIALOGS_REQUEST, wxT("&Request user attention\tCtrl-Shift-R"));
521 #if wxUSE_NOTIFICATION_MESSAGE
522 menuNotif->Append(DIALOGS_NOTIFY_AUTO, "&Automatically hidden notification");
523 menuNotif->Append(DIALOGS_NOTIFY_SHOW, "&Show manual notification");
524 menuNotif->Append(DIALOGS_NOTIFY_HIDE, "&Hide manual notification");
525 #endif // wxUSE_NOTIFICATION_MESSAGE
526 menuDlg->AppendSubMenu(menuNotif, "&User notifications");
527
528 menuDlg->Append(DIALOGS_STANDARD_BUTTON_SIZER_DIALOG, wxT("&Standard Buttons Sizer Dialog"));
529 menuDlg->Append(DIALOGS_TEST_DEFAULT_ACTION, wxT("&Test dialog default action"));
530
531 menuDlg->AppendSeparator();
532 menuDlg->Append(wxID_EXIT, wxT("E&xit\tAlt-X"));
533
534 #if wxUSE_ABOUTDLG
535 wxMenu *menuHelp = new wxMenu;
536 menuHelp->Append(DIALOGS_ABOUTDLG_SIMPLE, wxT("&About (simple)...\tF1"));
537 menuHelp->Append(DIALOGS_ABOUTDLG_FANCY, wxT("About (&fancy)...\tShift-F1"));
538 menuHelp->Append(DIALOGS_ABOUTDLG_FULL, wxT("About (f&ull)...\tCtrl-F1"));
539 menuHelp->Append(DIALOGS_ABOUTDLG_CUSTOM, wxT("About (&custom)...\tCtrl-Shift-F1"));
540 #endif // wxUSE_ABOUTDLG
541
542 wxMenuBar *menubar = new wxMenuBar;
543 menubar->Append(menuDlg, wxT("&Dialogs"));
544 #if wxUSE_ABOUTDLG
545 menubar->Append(menuHelp, wxT("&Help"));
546 #endif // wxUSE_ABOUTDLG
547
548 frame->SetMenuBar(menubar);
549
550 frame->Centre(wxBOTH);
551 frame->Show(true);
552
553 return true;
554 }
555
556 // My frame constructor
557 MyFrame::MyFrame(const wxString& title)
558 : wxFrame(NULL, wxID_ANY, title)
559 {
560 SetIcon(wxICON(sample));
561
562 #if USE_MODAL_PRESENTATION
563 m_dialog = (MyModelessDialog *)NULL;
564 #endif // USE_MODAL_PRESENTATION
565
566 #if wxUSE_FINDREPLDLG
567 m_dlgFind =
568 m_dlgReplace = NULL;
569 #endif
570
571 #if wxUSE_COLOURDLG
572 m_clrData.SetChooseFull(true);
573 for (int i = 0; i < wxColourData::NUM_CUSTOM; i++)
574 {
575 unsigned char n = i*16;
576 m_clrData.SetCustomColour(i, wxColour(n, n, n));
577 }
578 #endif // wxUSE_COLOURDLG
579
580 #if wxUSE_NOTIFICATION_MESSAGE
581 m_notifMsg = NULL;
582 #endif // wxUSE_NOTIFICATION_MESSAGE
583
584 #if wxUSE_STATUSBAR
585 CreateStatusBar();
586 #endif // wxUSE_STATUSBAR
587
588 m_canvas = new MyCanvas(this);
589
590 #if wxUSE_INFOBAR
591 // an info bar can be created very simply and used without any extra effort
592 m_infoBarSimple = new wxInfoBar(this);
593
594 // or it can also be customized by
595 m_infoBarAdvanced = new wxInfoBar(this);
596
597 // ... adding extra buttons (but more than two will usually be too many)
598 m_infoBarAdvanced->AddButton(wxID_UNDO);
599 m_infoBarAdvanced->AddButton(wxID_REDO);
600
601 m_infoBarAdvanced->Connect(wxID_REDO, wxEVT_COMMAND_BUTTON_CLICKED,
602 wxCommandEventHandler(MyFrame::OnInfoBarRedo),
603 NULL,
604 this);
605
606 // adding and removing a button immediately doesn't make sense here, of
607 // course, it's done just to show that it is possible
608 m_infoBarAdvanced->AddButton(wxID_EXIT);
609 m_infoBarAdvanced->RemoveButton(wxID_EXIT);
610
611 // ... changing the colours and/or fonts
612 m_infoBarAdvanced->SetOwnBackgroundColour(0xc8ffff);
613 m_infoBarAdvanced->SetFont(GetFont().Bold().Larger());
614
615 // ... and changing the effect (only does anything under MSW currently)
616 m_infoBarAdvanced->SetShowHideEffects(wxSHOW_EFFECT_EXPAND,
617 wxSHOW_EFFECT_EXPAND);
618 m_infoBarAdvanced->SetEffectDuration(1500);
619
620
621 // to use the info bars we need to use sizer for the window layout
622 wxBoxSizer * const sizer = new wxBoxSizer(wxVERTICAL);
623 sizer->Add(m_infoBarSimple, wxSizerFlags().Expand());
624 sizer->Add(m_canvas, wxSizerFlags(1).Expand());
625 sizer->Add(m_infoBarAdvanced, wxSizerFlags().Expand());
626 SetSizer(sizer);
627
628 // final touch: under MSW the info bars are shown progressively and parts
629 // of the parent window can be seen during the process, so use the same
630 // background colour for our background as for the canvas window which
631 // covers our entire client area to avoid jarring colour jumps
632 SetOwnBackgroundColour(m_canvas->GetBackgroundColour());
633 #endif // wxUSE_INFOBAR
634 }
635
636 MyFrame::~MyFrame()
637 {
638 #if wxUSE_NOTIFICATION_MESSAGE
639 delete m_notifMsg;
640 #endif // wxUSE_NOTIFICATION_MESSAGE
641 }
642
643 #if wxUSE_COLOURDLG
644
645 void MyFrame::ChooseColour(wxCommandEvent& WXUNUSED(event))
646 {
647 m_clrData.SetColour(m_canvas->GetBackgroundColour());
648
649 wxColourDialog dialog(this, &m_clrData);
650 dialog.SetTitle(_("Please choose the background colour"));
651 if ( dialog.ShowModal() == wxID_OK )
652 {
653 m_clrData = dialog.GetColourData();
654 m_canvas->SetBackgroundColour(m_clrData.GetColour());
655 m_canvas->ClearBackground();
656 m_canvas->Refresh();
657 }
658 }
659
660 void MyFrame::GetColour(wxCommandEvent& WXUNUSED(event))
661 {
662 wxColour clr = wxGetColourFromUser
663 (
664 this,
665 m_canvas->GetForegroundColour(),
666 "Please choose the foreground colour"
667 );
668 if ( clr.IsOk() )
669 {
670 m_canvas->SetForegroundColour(clr);
671 m_canvas->Refresh();
672 }
673 //else: dialog cancelled by user
674 }
675
676 #endif // wxUSE_COLOURDLG
677
678
679 #if USE_COLOURDLG_GENERIC
680 void MyFrame::ChooseColourGeneric(wxCommandEvent& WXUNUSED(event))
681 {
682 m_clrData.SetColour(m_canvas->GetBackgroundColour());
683
684 //FIXME:TODO:This has no effect...
685 m_clrData.SetChooseFull(true);
686
687 for (int i = 0; i < 16; i++)
688 {
689 wxColour colour(
690 (unsigned char)(i*16),
691 (unsigned char)(i*16),
692 (unsigned char)(i*16)
693 );
694 m_clrData.SetCustomColour(i, colour);
695 }
696
697 wxGenericColourDialog *dialog = new wxGenericColourDialog(this, &m_clrData);
698 if (dialog->ShowModal() == wxID_OK)
699 {
700 m_clrData = dialog->GetColourData();
701 m_canvas->SetBackgroundColour(m_clrData.GetColour());
702 m_canvas->ClearBackground();
703 m_canvas->Refresh();
704 }
705 dialog->Destroy();
706 }
707 #endif // USE_COLOURDLG_GENERIC
708
709 #if wxUSE_FONTDLG
710 void MyFrame::ChooseFont(wxCommandEvent& WXUNUSED(event) )
711 {
712 wxFontData data;
713 data.SetInitialFont(m_canvas->GetFont());
714 data.SetColour(m_canvas->GetForegroundColour());
715
716 // you might also do this:
717 //
718 // wxFontDialog dialog;
719 // if ( !dialog.Create(this, data) { ... error ... }
720 //
721 wxFontDialog dialog(this, data);
722
723 if (dialog.ShowModal() == wxID_OK)
724 {
725 wxFontData retData = dialog.GetFontData();
726 m_canvas->SetFont(retData.GetChosenFont());
727 m_canvas->SetForegroundColour(retData.GetColour());
728 m_canvas->Refresh();
729 }
730 //else: cancelled by the user, don't change the font
731 }
732 #endif // wxUSE_FONTDLG
733
734 #if USE_FONTDLG_GENERIC
735 void MyFrame::ChooseFontGeneric(wxCommandEvent& WXUNUSED(event) )
736 {
737 wxFontData data;
738 data.SetInitialFont(m_canvas->GetFont());
739 data.SetColour(m_canvas->GetForegroundColour());
740
741 wxGenericFontDialog *dialog = new wxGenericFontDialog(this, data);
742 if (dialog->ShowModal() == wxID_OK)
743 {
744 wxFontData retData = dialog->GetFontData();
745 m_canvas->SetFont(retData.GetChosenFont());
746 m_canvas->SetForegroundColour(retData.GetColour());
747 m_canvas->Refresh();
748 }
749 dialog->Destroy();
750 }
751 #endif // USE_FONTDLG_GENERIC
752
753 #if wxUSE_LOG_DIALOG
754 void MyFrame::LogDialog(wxCommandEvent& WXUNUSED(event))
755 {
756 // calling wxYield() (as ~wxBusyCursor does) shouldn't result in messages
757 // being flushed -- test it
758 {
759 wxBusyCursor bc;
760 wxLogMessage(wxT("This is some message - everything is ok so far."));
761 wxLogMessage(wxT("Another message...\n... this one is on multiple lines"));
762 wxLogWarning(wxT("And then something went wrong!"));
763
764 // and if ~wxBusyCursor doesn't do it, then call it manually
765 wxYield();
766 }
767
768 wxLogError(wxT("Intermediary error handler decided to abort."));
769 wxLogError(wxT("The top level caller detected an unrecoverable error."));
770
771 wxLog::FlushActive();
772
773 wxLogMessage(wxT("And this is the same dialog but with only one message."));
774 }
775 #endif // wxUSE_LOG_DIALOG
776
777 #if wxUSE_INFOBAR
778
779 void MyFrame::InfoBarSimple(wxCommandEvent& WXUNUSED(event))
780 {
781 static int s_count = 0;
782 m_infoBarSimple->ShowMessage
783 (
784 wxString::Format("Message #%d in the info bar.", ++s_count)
785 );
786 }
787
788 void MyFrame::InfoBarAdvanced(wxCommandEvent& WXUNUSED(event))
789 {
790 m_infoBarAdvanced->ShowMessage("Sorry, it didn't work out.", wxICON_WARNING);
791 }
792
793 void MyFrame::OnInfoBarRedo(wxCommandEvent& WXUNUSED(event))
794 {
795 m_infoBarAdvanced->ShowMessage("Still no, sorry again.", wxICON_ERROR);
796 }
797
798 #endif // wxUSE_INFOBAR
799
800
801 #if wxUSE_MSGDLG
802 void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event))
803 {
804 wxMessageDialog dialog(this,
805 "This is a message box\n"
806 "This is a long, long string to test out if the message box "
807 "is laid out properly.",
808 "Message box text",
809 wxCENTER |
810 wxNO_DEFAULT | wxYES_NO | wxCANCEL |
811 wxICON_INFORMATION);
812
813 wxString extmsg;
814 if ( dialog.SetYesNoCancelLabels
815 (
816 "Answer &Yes",
817 "Answer &No",
818 "Refuse to answer"
819 ) )
820 {
821 extmsg = "This platform supports custom button labels,\n"
822 "so you should see the descriptive labels below.";
823 }
824 else
825 {
826 extmsg = "Custom button labels are not supported on this platform,\n"
827 "so the default \"Yes\"/\"No\"/\"Cancel\" buttons are used.";
828 }
829 dialog.SetExtendedMessage(extmsg);
830
831 switch ( dialog.ShowModal() )
832 {
833 case wxID_YES:
834 wxLogStatus(wxT("You pressed \"Yes\""));
835 break;
836
837 case wxID_NO:
838 wxLogStatus(wxT("You pressed \"No\""));
839 break;
840
841 case wxID_CANCEL:
842 wxLogStatus(wxT("You pressed \"Cancel\""));
843 break;
844
845 default:
846 wxLogError(wxT("Unexpected wxMessageDialog return code!"));
847 }
848 }
849
850 void MyFrame::MessageBoxWindowModal(wxCommandEvent& WXUNUSED(event))
851 {
852 wxMessageDialog* dialog = new wxMessageDialog(this,
853 "This is a message box\n"
854 "This is a long, long string to test out if the message box "
855 "is laid out properly.",
856 "Message box text",
857 wxCENTER |
858 wxNO_DEFAULT | wxYES_NO | wxCANCEL |
859 wxICON_INFORMATION);
860
861 wxString extmsg;
862 if ( dialog->SetYesNoCancelLabels
863 (
864 "Answer &Yes",
865 "Answer &No",
866 "Refuse to answer"
867 ) )
868 {
869 extmsg = "This platform supports custom button labels,\n"
870 "so you should see the descriptive labels below.";
871 }
872 else
873 {
874 extmsg = "Custom button labels are not supported on this platform,\n"
875 "so the default \"Yes\"/\"No\"/\"Cancel\" buttons are used.";
876 }
877 dialog->SetExtendedMessage(extmsg);
878 dialog->Connect( wxEVT_WINDOW_MODAL_DIALOG_CLOSED, wxWindowModalDialogEventHandler(MyFrame::MessageBoxWindowModalClosed), NULL, this );
879 dialog->ShowWindowModal();
880 }
881
882 void MyFrame::MessageBoxWindowModalClosed(wxWindowModalDialogEvent& event)
883 {
884 wxDialog* dialog = event.GetDialog();
885 switch ( dialog->GetReturnCode() )
886 {
887 case wxID_YES:
888 wxLogStatus(wxT("You pressed \"Yes\""));
889 break;
890
891 case wxID_NO:
892 wxLogStatus(wxT("You pressed \"No\""));
893 break;
894
895 case wxID_CANCEL:
896 wxLogStatus(wxT("You pressed \"Cancel\""));
897 break;
898
899 default:
900 wxLogError(wxT("Unexpected wxMessageDialog return code!"));
901 }
902 delete dialog;
903 }
904
905 void MyFrame::MessageBoxDialog(wxCommandEvent& WXUNUSED(event))
906 {
907 TestMessageBoxDialog dlg(this);
908 dlg.Create();
909 dlg.ShowModal();
910 }
911
912 void MyFrame::MessageBoxInfo(wxCommandEvent& WXUNUSED(event))
913 {
914 ::wxInfoMessageBox(this);
915 }
916 #endif // wxUSE_MSGDLG
917
918 #if wxUSE_RICHMSGDLG
919 void MyFrame::RichMessageDialog(wxCommandEvent& WXUNUSED(event))
920 {
921 TestRichMessageDialog dlg(this);
922 dlg.Create();
923 dlg.ShowModal();
924 }
925 #endif // wxUSE_RICHMSGDLG
926
927 #if wxUSE_NUMBERDLG
928 void MyFrame::NumericEntry(wxCommandEvent& WXUNUSED(event))
929 {
930 long res = wxGetNumberFromUser( wxT("This is some text, actually a lot of text.\n")
931 wxT("Even two rows of text."),
932 wxT("Enter a number:"), wxT("Numeric input test"),
933 50, 0, 100, this );
934
935 wxString msg;
936 int icon;
937 if ( res == -1 )
938 {
939 msg = wxT("Invalid number entered or dialog cancelled.");
940 icon = wxICON_HAND;
941 }
942 else
943 {
944 msg.Printf(wxT("You've entered %lu"), res );
945 icon = wxICON_INFORMATION;
946 }
947
948 wxMessageBox(msg, wxT("Numeric test result"), wxOK | icon, this);
949 }
950 #endif // wxUSE_NUMBERDLG
951
952 #if wxUSE_TEXTDLG
953 void MyFrame::PasswordEntry(wxCommandEvent& WXUNUSED(event))
954 {
955 wxString pwd = wxGetPasswordFromUser(wxT("Enter password:"),
956 wxT("Password entry dialog"),
957 wxEmptyString,
958 this);
959 if ( !pwd.empty() )
960 {
961 wxMessageBox(wxString::Format(wxT("Your password is '%s'"), pwd.c_str()),
962 wxT("Got password"), wxOK | wxICON_INFORMATION, this);
963 }
964 }
965
966 void MyFrame::TextEntry(wxCommandEvent& WXUNUSED(event))
967 {
968 wxTextEntryDialog dialog(this,
969 wxT("This is a small sample\n")
970 wxT("A long, long string to test out the text entrybox"),
971 wxT("Please enter a string"),
972 wxT("Default value"),
973 wxOK | wxCANCEL);
974
975 if (dialog.ShowModal() == wxID_OK)
976 {
977 wxMessageBox(dialog.GetValue(), wxT("Got string"), wxOK | wxICON_INFORMATION, this);
978 }
979 }
980 #endif // wxUSE_TEXTDLG
981
982 #if wxUSE_CHOICEDLG
983 void MyFrame::SingleChoice(wxCommandEvent& WXUNUSED(event) )
984 {
985 const wxString choices[] = { wxT("One"), wxT("Two"), wxT("Three"), wxT("Four"), wxT("Five") } ;
986
987 wxSingleChoiceDialog dialog(this,
988 wxT("This is a small sample\n")
989 wxT("A single-choice convenience dialog"),
990 wxT("Please select a value"),
991 WXSIZEOF(choices), choices);
992
993 dialog.SetSelection(2);
994
995 if (dialog.ShowModal() == wxID_OK)
996 {
997 wxMessageDialog dialog2(this, dialog.GetStringSelection(), wxT("Got string"));
998 dialog2.ShowModal();
999 }
1000 }
1001
1002 void MyFrame::MultiChoice(wxCommandEvent& WXUNUSED(event) )
1003 {
1004 const wxString choices[] =
1005 {
1006 wxT("One"), wxT("Two"), wxT("Three"), wxT("Four"), wxT("Five"),
1007 wxT("Six"), wxT("Seven"), wxT("Eight"), wxT("Nine"), wxT("Ten"),
1008 wxT("Eleven"), wxT("Twelve"), wxT("Seventeen"),
1009 };
1010
1011 wxArrayInt selections;
1012 const int count = wxGetSelectedChoices(selections,
1013 wxT("This is a small sample\n")
1014 wxT("A multi-choice convenience dialog"),
1015 wxT("Please select a value"),
1016 WXSIZEOF(choices), choices,
1017 this);
1018 if ( count >= 0 )
1019 {
1020 wxString msg;
1021 if ( count == 0 )
1022 {
1023 msg = wxT("You did not select any items");
1024 }
1025 else
1026 {
1027 msg.Printf(wxT("You selected %u items:\n"), (unsigned)count);
1028 for ( int n = 0; n < count; n++ )
1029 {
1030 msg += wxString::Format(wxT("\t%u: %u (%s)\n"),
1031 (unsigned)n, (unsigned)selections[n],
1032 choices[selections[n]].c_str());
1033 }
1034 }
1035 wxLogMessage(msg);
1036 }
1037 //else: cancelled
1038 }
1039 #endif // wxUSE_CHOICEDLG
1040
1041 #if wxUSE_REARRANGECTRL
1042 // custom rearrange dialog: it adds the possibility to rename an item to the
1043 // base class functionality
1044 class MyRearrangeDialog : public wxRearrangeDialog
1045 {
1046 public:
1047 MyRearrangeDialog(wxWindow *parent,
1048 wxArrayInt& order,
1049 wxArrayString& labels,
1050 wxArrayString& labelsOrig)
1051 : wxRearrangeDialog
1052 (
1053 parent,
1054 "Configure the columns shown:",
1055 "wxRearrangeDialog example",
1056 order,
1057 labels
1058 ),
1059 m_order(order),
1060 m_labels(labels),
1061 m_labelsOrig(labelsOrig)
1062 {
1063 m_sel = wxNOT_FOUND;
1064
1065 wxPanel * const panel = new wxPanel(this);
1066 wxSizer * const sizer = new wxBoxSizer(wxHORIZONTAL);
1067
1068 m_labelOrig = new wxStaticText(panel, wxID_ANY, "");
1069 sizer->Add(m_labelOrig, wxSizerFlags().Centre().Border(wxRIGHT));
1070
1071 m_text = new wxTextCtrl(panel, wxID_ANY, "",
1072 wxDefaultPosition, wxDefaultSize,
1073 wxTE_PROCESS_ENTER);
1074 sizer->Add(m_text, wxSizerFlags().Centre().Border(wxRIGHT));
1075
1076 sizer->Add(new wxButton(panel, wxID_APPLY, "&Rename"),
1077 wxSizerFlags().Centre());
1078
1079 panel->SetSizer(sizer);
1080
1081 // call this first to ensure that the controls have a reasonable best
1082 // size before they're added
1083 DoUpdateExtraControls(GetList()->GetSelection());
1084
1085 AddExtraControls(panel);
1086
1087
1088 // another customization not directly supported by the dialog: add a
1089 // custom button
1090 wxWindow * const btnOk = FindWindow(wxID_OK);
1091 wxCHECK_RET( btnOk, "no Ok button?" );
1092
1093 wxSizer * const sizerBtns = btnOk->GetContainingSizer();
1094 wxCHECK_RET( sizerBtns, "no buttons sizer?" );
1095
1096 sizerBtns->Add(new wxButton(this, wxID_RESET, "&Reset all"),
1097 wxSizerFlags().Border(wxLEFT));
1098 }
1099
1100 // call this instead of ShowModal() to update order and labels array in
1101 // case the dialog was not cancelled
1102 bool Rearrange()
1103 {
1104 switch ( ShowModal() )
1105 {
1106 case wxID_CANCEL:
1107 return false;
1108
1109 case wxID_OK:
1110 m_order = GetOrder();
1111 break;
1112
1113 case wxID_RESET:
1114 // order already reset
1115 break;
1116 }
1117
1118 return true;
1119 }
1120
1121 private:
1122 void OnSelChange(wxCommandEvent& event)
1123 {
1124 DoUpdateExtraControls(event.GetInt());
1125 }
1126
1127 void OnUpdateUIRename(wxUpdateUIEvent& event)
1128 {
1129 event.Enable( CanRename() );
1130 }
1131
1132 void OnRename(wxCommandEvent& WXUNUSED(event))
1133 {
1134 if ( !CanRename() )
1135 return;
1136
1137 m_labels[m_sel] = m_text->GetValue();
1138 GetList()->SetString(m_sel, m_labels[m_sel]);
1139 }
1140
1141 void OnReset(wxCommandEvent& WXUNUSED(event))
1142 {
1143 // in a real program we should probably ask if the user really wants to
1144 // do this but here we just go ahead and reset all columns labels and
1145 // their order without confirmation
1146 const unsigned count = m_order.size();
1147 for ( unsigned n = 0; n < count; n++ )
1148 {
1149 m_order[n] = n;
1150 m_labels[n] = m_labelsOrig[n];
1151 }
1152
1153 EndModal(wxID_RESET);
1154 }
1155
1156 bool CanRename() const
1157 {
1158 // only allow renaming if the user modified the currently selected item
1159 // text (which presupposes that we do have a current item)
1160 return m_sel != wxNOT_FOUND && m_text->GetValue() != m_labels[m_sel];
1161 }
1162
1163 void DoUpdateExtraControls(int sel)
1164 {
1165 m_sel = sel;
1166
1167 if ( m_sel == wxNOT_FOUND )
1168 {
1169 m_labelOrig->SetLabel("<no selection>");
1170 m_text->Clear();
1171 m_text->Disable();
1172 }
1173 else // have valid item
1174 {
1175 m_labelOrig->SetLabelText(m_labelsOrig[m_sel]);
1176 m_text->Enable();
1177 m_text->SetValue(m_labels[m_sel]);
1178 }
1179 }
1180
1181 wxArrayInt& m_order;
1182 wxArrayString& m_labels,
1183 m_labelsOrig;
1184
1185 int m_sel;
1186 wxStaticText *m_labelOrig;
1187 wxTextCtrl *m_text;
1188
1189 DECLARE_EVENT_TABLE()
1190 wxDECLARE_NO_COPY_CLASS(MyRearrangeDialog);
1191 };
1192
1193 BEGIN_EVENT_TABLE(MyRearrangeDialog, wxRearrangeDialog)
1194 EVT_LISTBOX(wxID_ANY, MyRearrangeDialog::OnSelChange)
1195
1196 EVT_UPDATE_UI(wxID_APPLY, MyRearrangeDialog::OnUpdateUIRename)
1197
1198 EVT_TEXT_ENTER(wxID_ANY, MyRearrangeDialog::OnRename)
1199 EVT_BUTTON(wxID_APPLY, MyRearrangeDialog::OnRename)
1200 EVT_BUTTON(wxID_RESET, MyRearrangeDialog::OnReset)
1201 END_EVENT_TABLE()
1202
1203 void MyFrame::Rearrange(wxCommandEvent& WXUNUSED(event))
1204 {
1205 // the arrays are static so that we preserve the items order between calls
1206 // to this function
1207 static wxArrayInt s_order;
1208 static wxArrayString s_labels,
1209 s_labelsOrig;
1210
1211 // initialize them on the first call
1212 if ( s_labelsOrig.empty() )
1213 {
1214 static const struct ItemInfo
1215 {
1216 const char *label;
1217 const char *labelOrig;
1218 int order;
1219 } items[] =
1220 {
1221 { "File name", "Name", 0 },
1222 { "File type", "Ext", 1 },
1223 { "Size", "Size", 2 },
1224 { "Creation time", "Ctime", ~3 }, // negated so hidden
1225 { "Last accessed", "Atime", ~4 },
1226 { "Last modified", "Mtime", 5 },
1227 };
1228
1229 s_order.reserve(WXSIZEOF(items));
1230 s_labels.reserve(WXSIZEOF(items));
1231 s_labelsOrig.reserve(WXSIZEOF(items));
1232 for ( unsigned n = 0; n < WXSIZEOF(items); n++ )
1233 {
1234 const ItemInfo& item = items[n];
1235 s_order.push_back(item.order);
1236 s_labels.push_back(item.label);
1237 s_labelsOrig.push_back(item.labelOrig);
1238 }
1239 }
1240
1241 MyRearrangeDialog dlg(this, s_order, s_labels, s_labelsOrig);
1242 if ( !dlg.Rearrange() )
1243 return;
1244
1245 wxString columns;
1246 for ( unsigned n = 0; n < s_order.size(); n++ )
1247 {
1248 columns += wxString::Format("\n %u: ", n);
1249 int idx = s_order[n];
1250 if ( idx < 0 )
1251 {
1252 columns += "[hidden] ";
1253 idx = ~idx;
1254 }
1255
1256 columns += s_labels[idx];
1257 if ( s_labels[idx] != s_labelsOrig[idx] )
1258 {
1259 columns += wxString::Format(" (original label: \"%s\")",
1260 s_labelsOrig[idx]);
1261 }
1262 }
1263
1264 wxLogMessage("The columns order now is:%s", columns);
1265 }
1266 #endif // wxUSE_REARRANGECTRL
1267
1268 #if wxUSE_FILEDLG
1269
1270 // panel with custom controls for file dialog
1271 class MyExtraPanel : public wxPanel
1272 {
1273 public:
1274 MyExtraPanel(wxWindow *parent);
1275 void OnCheckBox(wxCommandEvent& event) { m_btn->Enable(event.IsChecked()); }
1276 wxString GetInfo() const
1277 {
1278 return wxString::Format("checkbox value = %d", (int) m_cb->GetValue());
1279 }
1280 private:
1281 wxButton *m_btn;
1282 wxCheckBox *m_cb;
1283 };
1284
1285 MyExtraPanel::MyExtraPanel(wxWindow *parent)
1286 : wxPanel(parent)
1287 {
1288 m_btn = new wxButton(this, -1, wxT("Custom Button"));
1289 m_btn->Enable(false);
1290 m_cb = new wxCheckBox(this, -1, wxT("Enable Custom Button"));
1291 m_cb->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED,
1292 wxCommandEventHandler(MyExtraPanel::OnCheckBox), NULL, this);
1293 wxBoxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
1294 sizerTop->Add(m_cb, wxSizerFlags().Centre().Border());
1295 sizerTop->AddStretchSpacer();
1296 sizerTop->Add(m_btn, wxSizerFlags().Right().Border());
1297 SetSizerAndFit(sizerTop);
1298 }
1299
1300 // a static method can be used instead of a function with most of compilers
1301 static wxWindow* createMyExtraPanel(wxWindow *parent)
1302 {
1303 return new MyExtraPanel(parent);
1304 }
1305
1306 void MyFrame::FileOpen(wxCommandEvent& WXUNUSED(event) )
1307 {
1308 wxFileDialog dialog
1309 (
1310 this,
1311 wxT("Testing open file dialog"),
1312 wxEmptyString,
1313 wxEmptyString,
1314 #ifdef __WXMOTIF__
1315 wxT("C++ files (*.cpp)|*.cpp")
1316 #else
1317 wxT("C++ files (*.cpp;*.h)|*.cpp;*.h")
1318 #endif
1319 );
1320
1321 dialog.SetExtraControlCreator(&createMyExtraPanel);
1322 dialog.CentreOnParent();
1323 dialog.SetDirectory(wxGetHomeDir());
1324
1325 if (dialog.ShowModal() == wxID_OK)
1326 {
1327 wxString info;
1328 wxWindow * const extra = dialog.GetExtraControl();
1329 info.Printf(wxT("Full file name: %s\n")
1330 wxT("Path: %s\n")
1331 wxT("Name: %s\n")
1332 wxT("Custom window: %s"),
1333 dialog.GetPath().c_str(),
1334 dialog.GetDirectory().c_str(),
1335 dialog.GetFilename().c_str(),
1336 extra ? static_cast<MyExtraPanel*>(extra)->GetInfo()
1337 : wxString("None"));
1338 wxMessageDialog dialog2(this, info, wxT("Selected file"));
1339 dialog2.ShowModal();
1340 }
1341 }
1342
1343 // this shows how to take advantage of specifying a default extension in the
1344 // call to wxFileSelector: it is remembered after each new call and the next
1345 // one will use it by default
1346 void MyFrame::FileOpen2(wxCommandEvent& WXUNUSED(event) )
1347 {
1348 static wxString s_extDef;
1349 wxString path = wxFileSelector(
1350 wxT("Select the file to load"),
1351 wxEmptyString, wxEmptyString,
1352 s_extDef,
1353 wxString::Format
1354 (
1355 wxT("Waveform (*.wav)|*.wav|Plain text (*.txt)|*.txt|All files (%s)|%s"),
1356 wxFileSelectorDefaultWildcardStr,
1357 wxFileSelectorDefaultWildcardStr
1358 ),
1359 wxFD_OPEN|wxFD_CHANGE_DIR|wxFD_PREVIEW,
1360 this
1361 );
1362
1363 if ( !path )
1364 return;
1365
1366 // it is just a sample, would use wxSplitPath in real program
1367 s_extDef = path.AfterLast(wxT('.'));
1368
1369 wxLogMessage(wxT("You selected the file '%s', remembered extension '%s'"),
1370 path, s_extDef);
1371 }
1372
1373 void MyFrame::FilesOpen(wxCommandEvent& WXUNUSED(event) )
1374 {
1375 wxString wildcards =
1376 #ifdef __WXMOTIF__
1377 wxT("C++ files (*.cpp)|*.cpp");
1378 #else
1379 wxString::Format
1380 (
1381 wxT("All files (%s)|%s|C++ files (*.cpp;*.h)|*.cpp;*.h"),
1382 wxFileSelectorDefaultWildcardStr,
1383 wxFileSelectorDefaultWildcardStr
1384 );
1385 #endif
1386 wxFileDialog dialog(this, wxT("Testing open multiple file dialog"),
1387 wxEmptyString, wxEmptyString, wildcards,
1388 wxFD_OPEN|wxFD_MULTIPLE);
1389
1390 if (dialog.ShowModal() == wxID_OK)
1391 {
1392 wxArrayString paths, filenames;
1393
1394 dialog.GetPaths(paths);
1395 dialog.GetFilenames(filenames);
1396
1397 wxString msg, s;
1398 size_t count = paths.GetCount();
1399 for ( size_t n = 0; n < count; n++ )
1400 {
1401 s.Printf(wxT("File %d: %s (%s)\n"),
1402 (int)n, paths[n].c_str(), filenames[n].c_str());
1403
1404 msg += s;
1405 }
1406 s.Printf(wxT("Filter index: %d"), dialog.GetFilterIndex());
1407 msg += s;
1408
1409 wxMessageDialog dialog2(this, msg, wxT("Selected files"));
1410 dialog2.ShowModal();
1411 }
1412 }
1413
1414 void MyFrame::FileSave(wxCommandEvent& WXUNUSED(event) )
1415 {
1416 wxFileDialog dialog(this,
1417 wxT("Testing save file dialog"),
1418 wxEmptyString,
1419 wxT("myletter.doc"),
1420 wxT("Text files (*.txt)|*.txt|Document files (*.doc;*.ods)|*.doc;*.ods"),
1421 wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
1422
1423 dialog.SetFilterIndex(1);
1424
1425 if (dialog.ShowModal() == wxID_OK)
1426 {
1427 wxLogMessage(wxT("%s, filter %d"),
1428 dialog.GetPath().c_str(), dialog.GetFilterIndex());
1429 }
1430 }
1431 #endif // wxUSE_FILEDLG
1432
1433 #if USE_FILEDLG_GENERIC
1434 void MyFrame::FileOpenGeneric(wxCommandEvent& WXUNUSED(event) )
1435 {
1436 wxGenericFileDialog dialog
1437 (
1438 this,
1439 wxT("Testing open file dialog"),
1440 wxEmptyString,
1441 wxEmptyString,
1442 wxT("C++ files (*.cpp;*.h)|*.cpp;*.h")
1443 );
1444
1445 dialog.SetExtraControlCreator(&createMyExtraPanel);
1446 dialog.SetDirectory(wxGetHomeDir());
1447
1448 if (dialog.ShowModal() == wxID_OK)
1449 {
1450 wxString info;
1451 info.Printf(wxT("Full file name: %s\n")
1452 wxT("Path: %s\n")
1453 wxT("Name: %s"),
1454 dialog.GetPath().c_str(),
1455 dialog.GetDirectory().c_str(),
1456 dialog.GetFilename().c_str());
1457 wxMessageDialog dialog2(this, info, wxT("Selected file"));
1458 dialog2.ShowModal();
1459 }
1460 }
1461
1462 void MyFrame::FilesOpenGeneric(wxCommandEvent& WXUNUSED(event) )
1463 {
1464 // On PocketPC you can disable OK-only dialogs policy using system option
1465 int buttons = wxSystemOptions::GetOptionInt(wxT("wince.dialog.real-ok-cancel"));
1466 wxSystemOptions::SetOption(wxT("wince.dialog.real-ok-cancel"), 1);
1467
1468 wxString wildcards = wxT("All files (*.*)|*.*|C++ files (*.cpp;*.h)|*.cpp;*.h");
1469 wxGenericFileDialog dialog(this, wxT("Testing open multiple file dialog"),
1470 wxEmptyString, wxEmptyString, wildcards,
1471 wxFD_MULTIPLE);
1472
1473 if (dialog.ShowModal() == wxID_OK)
1474 {
1475 wxArrayString paths, filenames;
1476
1477 dialog.GetPaths(paths);
1478 dialog.GetFilenames(filenames);
1479
1480 wxString msg, s;
1481 size_t count = paths.GetCount();
1482 for ( size_t n = 0; n < count; n++ )
1483 {
1484 s.Printf(wxT("File %d: %s (%s)\n"),
1485 (int)n, paths[n].c_str(), filenames[n].c_str());
1486
1487 msg += s;
1488 }
1489 s.Printf(wxT("Filter index: %d"), dialog.GetFilterIndex());
1490 msg += s;
1491
1492 wxMessageDialog dialog2(this, msg, wxT("Selected files"));
1493 dialog2.ShowModal();
1494 }
1495
1496 // restore system option
1497 wxSystemOptions::SetOption(wxT("wince.dialog.real-ok-cancel"), buttons);
1498 }
1499
1500 void MyFrame::FileSaveGeneric(wxCommandEvent& WXUNUSED(event) )
1501 {
1502 wxGenericFileDialog dialog(this,
1503 wxT("Testing save file dialog"),
1504 wxEmptyString,
1505 wxT("myletter.doc"),
1506 wxT("Text files (*.txt)|*.txt|Document files (*.doc;*.ods)|*.doc;*.ods"),
1507 wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
1508
1509 dialog.SetFilterIndex(1);
1510
1511 if (dialog.ShowModal() == wxID_OK)
1512 {
1513 wxLogMessage(wxT("%s, filter %d"),
1514 dialog.GetPath().c_str(), dialog.GetFilterIndex());
1515 }
1516 }
1517 #endif // USE_FILEDLG_GENERIC
1518
1519 #if wxUSE_DIRDLG
1520 void MyFrame::DoDirChoose(int style)
1521 {
1522 // pass some initial dir to wxDirDialog
1523 wxString dirHome;
1524 wxGetHomeDir(&dirHome);
1525
1526 wxDirDialog dialog(this, wxT("Testing directory picker"), dirHome, style);
1527
1528 if (dialog.ShowModal() == wxID_OK)
1529 {
1530 wxLogMessage(wxT("Selected path: %s"), dialog.GetPath().c_str());
1531 }
1532 }
1533
1534 void MyFrame::DirChoose(wxCommandEvent& WXUNUSED(event) )
1535 {
1536 DoDirChoose(wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST);
1537 }
1538
1539 void MyFrame::DirChooseNew(wxCommandEvent& WXUNUSED(event) )
1540 {
1541 DoDirChoose(wxDD_DEFAULT_STYLE & ~wxDD_DIR_MUST_EXIST);
1542 }
1543 #endif // wxUSE_DIRDLG
1544
1545 #if USE_DIRDLG_GENERIC
1546 void MyFrame::GenericDirChoose(wxCommandEvent& WXUNUSED(event) )
1547 {
1548 // pass some initial dir to wxDirDialog
1549 wxString dirHome;
1550 wxGetHomeDir(&dirHome);
1551
1552 wxGenericDirDialog dialog(this, wxT("Testing generic directory picker"), dirHome);
1553
1554 if (dialog.ShowModal() == wxID_OK)
1555 {
1556 wxMessageDialog dialog2(this, dialog.GetPath(), wxT("Selected path"));
1557 dialog2.ShowModal();
1558 }
1559 }
1560 #endif // USE_DIRDLG_GENERIC
1561
1562 #if USE_MODAL_PRESENTATION
1563 void MyFrame::ModalDlg(wxCommandEvent& WXUNUSED(event))
1564 {
1565 MyModalDialog dlg(this);
1566 dlg.ShowModal();
1567 }
1568 #endif // USE_MODAL_PRESENTATION
1569
1570 void MyFrame::ModelessDlg(wxCommandEvent& event)
1571 {
1572 bool show = GetMenuBar()->IsChecked(event.GetId());
1573
1574 if ( show )
1575 {
1576 if ( !m_dialog )
1577 {
1578 m_dialog = new MyModelessDialog(this);
1579 }
1580
1581 m_dialog->Show(true);
1582 }
1583 else // hide
1584 {
1585 // If m_dialog is NULL, then possibly the system
1586 // didn't report the checked menu item status correctly.
1587 // It should be true just after the menu item was selected,
1588 // if there was no modeless dialog yet.
1589
1590 wxASSERT( m_dialog != NULL );
1591 if (m_dialog)
1592 m_dialog->Hide();
1593 }
1594 }
1595
1596 void MyFrame::DlgCenteredScreen(wxCommandEvent& WXUNUSED(event))
1597 {
1598 wxDialog dlg(this, wxID_ANY, wxT("Dialog centered on screen"),
1599 wxDefaultPosition, wxSize(200, 100));
1600 (new wxButton(&dlg, wxID_OK, wxT("Close")))->Centre();
1601 dlg.CentreOnScreen();
1602 dlg.ShowModal();
1603 }
1604
1605 void MyFrame::DlgCenteredParent(wxCommandEvent& WXUNUSED(event))
1606 {
1607 wxDialog dlg(this, wxID_ANY, wxT("Dialog centered on parent"),
1608 wxDefaultPosition, wxSize(200, 100));
1609 (new wxButton(&dlg, wxID_OK, wxT("Close")))->Centre();
1610 dlg.CentreOnParent();
1611 dlg.ShowModal();
1612 }
1613
1614 #if wxUSE_MINIFRAME
1615 void MyFrame::MiniFrame(wxCommandEvent& WXUNUSED(event))
1616 {
1617 wxFrame *frame = new wxMiniFrame(this, wxID_ANY, wxT("Mini frame"),
1618 wxDefaultPosition, wxSize(300, 100),
1619 wxCAPTION | wxCLOSE_BOX);
1620 new wxStaticText(frame,
1621 wxID_ANY,
1622 wxT("Mini frames have slightly different appearance"),
1623 wxPoint(5, 5));
1624 new wxStaticText(frame,
1625 wxID_ANY,
1626 wxT("from the normal frames but that's the only difference."),
1627 wxPoint(5, 25));
1628
1629 frame->CentreOnParent();
1630 frame->Show();
1631 }
1632 #endif // wxUSE_MINIFRAME
1633
1634 void MyFrame::DlgOnTop(wxCommandEvent& WXUNUSED(event))
1635 {
1636 wxDialog dlg(this, wxID_ANY, wxT("Dialog staying on top of other windows"),
1637 wxDefaultPosition, wxSize(300, 100),
1638 wxDEFAULT_DIALOG_STYLE | wxSTAY_ON_TOP);
1639 (new wxButton(&dlg, wxID_OK, wxT("Close")))->Centre();
1640 dlg.ShowModal();
1641 }
1642
1643 #if wxUSE_STARTUP_TIPS
1644 void MyFrame::ShowTip(wxCommandEvent& WXUNUSED(event))
1645 {
1646 static size_t s_index = (size_t)-1;
1647
1648 if ( s_index == (size_t)-1 )
1649 {
1650 srand(time(NULL));
1651
1652 // this is completely bogus, we don't know how many lines are there
1653 // in the file, but who cares, it's a demo only...
1654 s_index = rand() % 5;
1655 }
1656
1657 wxTipProvider *tipProvider = wxCreateFileTipProvider(wxT("tips.txt"), s_index);
1658
1659 bool showAtStartup = wxShowTip(this, tipProvider);
1660
1661 if ( showAtStartup )
1662 {
1663 wxMessageBox(wxT("Will show tips on startup"), wxT("Tips dialog"),
1664 wxOK | wxICON_INFORMATION, this);
1665 }
1666
1667 s_index = tipProvider->GetCurrentTip();
1668 delete tipProvider;
1669 }
1670 #endif // wxUSE_STARTUP_TIPS
1671
1672 #if USE_SETTINGS_DIALOG
1673 void MyFrame::OnPropertySheet(wxCommandEvent& event)
1674 {
1675 SettingsDialog dialog(this, event.GetId());
1676 dialog.ShowModal();
1677 }
1678 #endif // USE_SETTINGS_DIALOG
1679
1680 void MyFrame::OnRequestUserAttention(wxCommandEvent& WXUNUSED(event))
1681 {
1682 wxLogStatus(wxT("Sleeping for 3 seconds to allow you to switch to another window"));
1683
1684 wxSleep(3);
1685
1686 RequestUserAttention(wxUSER_ATTENTION_ERROR);
1687 }
1688
1689 #if wxUSE_NOTIFICATION_MESSAGE
1690
1691 void MyFrame::OnNotifMsgAuto(wxCommandEvent& WXUNUSED(event))
1692 {
1693 if ( !wxNotificationMessage
1694 (
1695 "Automatic Notification",
1696 "Nothing important has happened\n"
1697 "this notification will disappear soon."
1698 ).Show() )
1699 {
1700 wxLogStatus("Failed to show notification message");
1701 }
1702 }
1703
1704 void MyFrame::OnNotifMsgShow(wxCommandEvent& WXUNUSED(event))
1705 {
1706 if ( !m_notifMsg )
1707 {
1708 m_notifMsg = new wxNotificationMessage
1709 (
1710 "wxWidgets Manual Notification",
1711 "You can hide this notification from the menu",
1712 this
1713 );
1714 }
1715
1716 if ( !m_notifMsg->Show(wxNotificationMessage::Timeout_Never) )
1717 {
1718 wxLogStatus("Failed to show manual notification message");
1719 }
1720 }
1721
1722 void MyFrame::OnNotifMsgHide(wxCommandEvent& WXUNUSED(event))
1723 {
1724 if ( m_notifMsg && !m_notifMsg->Close() )
1725 {
1726 wxLogStatus("Failed to hide manual notification message");
1727 }
1728 }
1729
1730 #endif // wxUSE_NOTIFICATION_MESSAGE
1731
1732 void MyFrame::OnStandardButtonsSizerDialog(wxCommandEvent& WXUNUSED(event))
1733 {
1734 StdButtonSizerDialog dialog(this);
1735 dialog.ShowModal();
1736 }
1737
1738 // TestDefaultAction
1739
1740 #define ID_CATCH_LISTBOX_DCLICK 100
1741 #define ID_LISTBOX 101
1742
1743 BEGIN_EVENT_TABLE(TestDefaultActionDialog, wxDialog)
1744 EVT_CHECKBOX(ID_CATCH_LISTBOX_DCLICK, TestDefaultActionDialog::OnCatchListBoxDClick)
1745 EVT_LISTBOX_DCLICK(ID_LISTBOX, TestDefaultActionDialog::OnListBoxDClick)
1746 END_EVENT_TABLE()
1747
1748 TestDefaultActionDialog::TestDefaultActionDialog( wxWindow *parent ) :
1749 wxDialog( parent, -1, "Test default action" )
1750 {
1751 m_catchListBoxDClick = false;
1752
1753 wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
1754
1755 wxFlexGridSizer *grid_sizer = new wxFlexGridSizer( 2, 5, 5 );
1756
1757 #if wxUSE_LISTBOX
1758 wxListBox *listbox = new wxListBox( this, ID_LISTBOX );
1759 listbox->Append( "String 1" );
1760 listbox->Append( "String 2" );
1761 listbox->Append( "String 3" );
1762 listbox->Append( "String 4" );
1763 grid_sizer->Add( listbox );
1764 #endif // wxUSE_LISTBOX
1765
1766 grid_sizer->Add( new wxCheckBox( this, ID_CATCH_LISTBOX_DCLICK, "Catch DoubleClick from wxListBox" ), 0, wxALIGN_CENTRE_VERTICAL );
1767
1768 grid_sizer->Add( new wxTextCtrl( this, -1, "", wxDefaultPosition, wxSize(80,-1), 0 ), 0, wxALIGN_CENTRE_VERTICAL );
1769 grid_sizer->Add( new wxStaticText( this, -1, "wxTextCtrl without wxTE_PROCESS_ENTER" ), 0, wxALIGN_CENTRE_VERTICAL );
1770
1771 grid_sizer->Add( new wxTextCtrl( this, -1, "", wxDefaultPosition, wxSize(80,-1), wxTE_PROCESS_ENTER ), 0, wxALIGN_CENTRE_VERTICAL );
1772 grid_sizer->Add( new wxStaticText( this, -1, "wxTextCtrl with wxTE_PROCESS_ENTER" ), 0, wxALIGN_CENTRE_VERTICAL );
1773
1774 main_sizer->Add( grid_sizer, 0, wxALL, 10 );
1775
1776 wxSizer *button_sizer = CreateSeparatedButtonSizer( wxOK|wxCANCEL );
1777 if (button_sizer)
1778 main_sizer->Add( button_sizer, 0, wxALL|wxGROW, 5 );
1779
1780 SetSizerAndFit( main_sizer );
1781 }
1782
1783 void TestDefaultActionDialog::OnListBoxDClick(wxCommandEvent& event)
1784 {
1785 event.Skip( !m_catchListBoxDClick );
1786 }
1787
1788 void TestDefaultActionDialog::OnCatchListBoxDClick(wxCommandEvent& WXUNUSED(event))
1789 {
1790 m_catchListBoxDClick = !m_catchListBoxDClick;
1791 }
1792
1793 void MyFrame::OnTestDefaultActionDialog(wxCommandEvent& WXUNUSED(event))
1794 {
1795 TestDefaultActionDialog dialog( this );
1796 dialog.ShowModal();
1797 }
1798
1799 void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event) )
1800 {
1801 Close(true);
1802 }
1803
1804 #if wxUSE_PROGRESSDLG
1805
1806 void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
1807 {
1808 static const int max = 100;
1809
1810 wxProgressDialog dialog("Progress dialog example",
1811 // "Reserve" enough space for the multiline
1812 // messages below, we'll change it anyhow
1813 // immediately in the loop below
1814 wxString(' ', 100) + "\n\n\n\n",
1815 max, // range
1816 this, // parent
1817 wxPD_CAN_ABORT |
1818 wxPD_CAN_SKIP |
1819 wxPD_APP_MODAL |
1820 //wxPD_AUTO_HIDE | // -- try this as well
1821 wxPD_ELAPSED_TIME |
1822 wxPD_ESTIMATED_TIME |
1823 wxPD_REMAINING_TIME |
1824 wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small
1825 );
1826
1827 bool cont = true;
1828 for ( int i = 0; i <= max; i++ )
1829 {
1830 wxString msg;
1831
1832 // test both modes of wxProgressDialog behaviour: start in
1833 // indeterminate mode but switch to the determinate one later
1834 const bool determinate = i > max/2;
1835
1836 if ( i == max )
1837 {
1838 msg = "That's all, folks!\n"
1839 "\n"
1840 "Nothing to see here any more.";
1841 }
1842 else if ( !determinate )
1843 {
1844 msg = "Testing indeterminate mode\n"
1845 "\n"
1846 "This mode allows you to show to the user\n"
1847 "that something is going on even if you don't know\n"
1848 "when exactly will you finish.";
1849 }
1850 else if ( determinate )
1851 {
1852 msg = "Now in standard determinate mode\n"
1853 "\n"
1854 "This is the standard usage mode in which you\n"
1855 "update the dialog after performing each new step of work.\n"
1856 "It requires knowing the total number of steps in advance.";
1857 }
1858
1859 // will be set to true if "Skip" button was pressed
1860 bool skip = false;
1861 if ( determinate )
1862 {
1863 cont = dialog.Update(i, msg, &skip);
1864 }
1865 else
1866 {
1867 cont = dialog.Pulse(msg, &skip);
1868 }
1869
1870 // each skip will move progress about quarter forward
1871 if ( skip )
1872 {
1873 i += max/4;
1874
1875 if ( i >= 100 )
1876 i = 99;
1877 }
1878
1879 if ( !cont )
1880 {
1881 if ( wxMessageBox(wxT("Do you really want to cancel?"),
1882 wxT("Progress dialog question"), // caption
1883 wxYES_NO | wxICON_QUESTION) == wxYES )
1884 break;
1885
1886 cont = true;
1887 dialog.Resume();
1888 }
1889
1890 wxMilliSleep(200);
1891 }
1892
1893 if ( !cont )
1894 {
1895 wxLogStatus(wxT("Progress dialog aborted!"));
1896 }
1897 else
1898 {
1899 wxLogStatus(wxT("Countdown from %d finished"), max);
1900 }
1901 }
1902
1903 #endif // wxUSE_PROGRESSDLG
1904
1905 #if wxUSE_ABOUTDLG
1906
1907 static void InitAboutInfoMinimal(wxAboutDialogInfo& info)
1908 {
1909 info.SetName(wxT("Dialogs Sample"));
1910 info.SetVersion(wxVERSION_NUM_DOT_STRING,
1911 wxString::Format
1912 (
1913 "%s version %s",
1914 wxMINOR_VERSION % 2 ? "Development" : "Stable",
1915 wxVERSION_NUM_DOT_STRING
1916 ));
1917 info.SetDescription(wxT("This sample shows different wxWidgets dialogs"));
1918 info.SetCopyright(wxT("(C) 1998-2006 wxWidgets dev team"));
1919 info.AddDeveloper(wxT("Vadim Zeitlin"));
1920 }
1921
1922 static void InitAboutInfoWebsite(wxAboutDialogInfo& info)
1923 {
1924 InitAboutInfoMinimal(info);
1925
1926 info.SetWebSite(wxT("http://www.wxwidgets.org/"), wxT("wxWidgets web site"));
1927 }
1928
1929 static void InitAboutInfoAll(wxAboutDialogInfo& info)
1930 {
1931 InitAboutInfoWebsite(info);
1932
1933 // we can add a second developer
1934 info.AddDeveloper(wxT("A.N. Other"));
1935
1936 // or we can add several persons at once like this
1937 static const wxChar *docwriters[] =
1938 {
1939 wxT("First D. Writer"),
1940 wxT("Second One"),
1941 };
1942
1943 info.SetDocWriters(wxArrayString(WXSIZEOF(docwriters), docwriters));
1944 info.SetLicence(wxString::FromAscii(
1945 " wxWindows Library Licence, Version 3.1\n"
1946 " ======================================\n"
1947 "\n"
1948 " Copyright (c) 1998-2005 Julian Smart, Robert Roebling et al\n"
1949 "\n"
1950 " Everyone is permitted to copy and distribute verbatim copies\n"
1951 " of this licence document, but changing it is not allowed.\n"
1952 "\n"
1953 " WXWINDOWS LIBRARY LICENCE\n"
1954 " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n"
1955 "\n"
1956 " ...and so on and so forth...\n"
1957 ));
1958
1959 info.AddTranslator(wxT("Wun Ngo Wen (Martian)"));
1960 }
1961
1962 void MyFrame::ShowSimpleAboutDialog(wxCommandEvent& WXUNUSED(event))
1963 {
1964 wxAboutDialogInfo info;
1965 InitAboutInfoMinimal(info);
1966
1967 wxAboutBox(info, this);
1968 }
1969
1970 void MyFrame::ShowFancyAboutDialog(wxCommandEvent& WXUNUSED(event))
1971 {
1972 wxAboutDialogInfo info;
1973 InitAboutInfoWebsite(info);
1974
1975 wxAboutBox(info, this);
1976 }
1977
1978 void MyFrame::ShowFullAboutDialog(wxCommandEvent& WXUNUSED(event))
1979 {
1980 wxAboutDialogInfo info;
1981 InitAboutInfoAll(info);
1982
1983 wxAboutBox(info, this);
1984 }
1985
1986 // a trivial example of a custom dialog class
1987 class MyAboutDialog : public wxGenericAboutDialog
1988 {
1989 public:
1990 MyAboutDialog(const wxAboutDialogInfo& info, wxWindow* parent)
1991 {
1992 Create(info, parent);
1993 }
1994
1995 // add some custom controls
1996 virtual void DoAddCustomControls()
1997 {
1998 AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
1999 AddText(wxT("Some custom text"));
2000 AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
2001 }
2002 };
2003
2004 void MyFrame::ShowCustomAboutDialog(wxCommandEvent& WXUNUSED(event))
2005 {
2006 wxAboutDialogInfo info;
2007 InitAboutInfoAll(info);
2008
2009 MyAboutDialog dlg(info, this);
2010 dlg.ShowModal();
2011 }
2012
2013 #endif // wxUSE_ABOUTDLG
2014
2015 #if wxUSE_BUSYINFO
2016
2017 void MyFrame::ShowBusyInfo(wxCommandEvent& WXUNUSED(event))
2018 {
2019 wxWindowDisabler disableAll;
2020
2021 wxBusyInfo info(wxT("Working, please wait..."), this);
2022
2023 for ( int i = 0; i < 18; i++ )
2024 {
2025 wxMilliSleep(100);
2026 wxTheApp->Yield();
2027 }
2028
2029 wxSleep(2);
2030 //wxWakeUpIdle();
2031 }
2032
2033 #endif // wxUSE_BUSYINFO
2034
2035 #if wxUSE_FINDREPLDLG
2036
2037 void MyFrame::ShowReplaceDialog( wxCommandEvent& WXUNUSED(event) )
2038 {
2039 if ( m_dlgReplace )
2040 {
2041 wxDELETE(m_dlgReplace);
2042 }
2043 else
2044 {
2045 m_dlgReplace = new wxFindReplaceDialog
2046 (
2047 this,
2048 &m_findData,
2049 wxT("Find and replace dialog"),
2050 wxFR_REPLACEDIALOG
2051 );
2052
2053 m_dlgReplace->Show(true);
2054 }
2055 }
2056
2057 void MyFrame::ShowFindDialog( wxCommandEvent& WXUNUSED(event) )
2058 {
2059 if ( m_dlgFind )
2060 {
2061 wxDELETE(m_dlgFind);
2062 }
2063 else
2064 {
2065 m_dlgFind = new wxFindReplaceDialog
2066 (
2067 this,
2068 &m_findData,
2069 wxT("Find dialog"),
2070 // just for testing
2071 wxFR_NOWHOLEWORD
2072 );
2073
2074 m_dlgFind->Show(true);
2075 }
2076 }
2077
2078 static wxString DecodeFindDialogEventFlags(int flags)
2079 {
2080 wxString str;
2081 str << (flags & wxFR_DOWN ? wxT("down") : wxT("up")) << wxT(", ")
2082 << (flags & wxFR_WHOLEWORD ? wxT("whole words only, ") : wxT(""))
2083 << (flags & wxFR_MATCHCASE ? wxT("") : wxT("not "))
2084 << wxT("case sensitive");
2085
2086 return str;
2087 }
2088
2089 void MyFrame::OnFindDialog(wxFindDialogEvent& event)
2090 {
2091 wxEventType type = event.GetEventType();
2092
2093 if ( type == wxEVT_COMMAND_FIND || type == wxEVT_COMMAND_FIND_NEXT )
2094 {
2095 wxLogMessage(wxT("Find %s'%s' (flags: %s)"),
2096 type == wxEVT_COMMAND_FIND_NEXT ? wxT("next ") : wxT(""),
2097 event.GetFindString().c_str(),
2098 DecodeFindDialogEventFlags(event.GetFlags()).c_str());
2099 }
2100 else if ( type == wxEVT_COMMAND_FIND_REPLACE ||
2101 type == wxEVT_COMMAND_FIND_REPLACE_ALL )
2102 {
2103 wxLogMessage(wxT("Replace %s'%s' with '%s' (flags: %s)"),
2104 type == wxEVT_COMMAND_FIND_REPLACE_ALL ? wxT("all ") : wxT(""),
2105 event.GetFindString().c_str(),
2106 event.GetReplaceString().c_str(),
2107 DecodeFindDialogEventFlags(event.GetFlags()).c_str());
2108 }
2109 else if ( type == wxEVT_COMMAND_FIND_CLOSE )
2110 {
2111 wxFindReplaceDialog *dlg = event.GetDialog();
2112
2113 int idMenu;
2114 const wxChar *txt;
2115 if ( dlg == m_dlgFind )
2116 {
2117 txt = wxT("Find");
2118 idMenu = DIALOGS_FIND;
2119 m_dlgFind = NULL;
2120 }
2121 else if ( dlg == m_dlgReplace )
2122 {
2123 txt = wxT("Replace");
2124 idMenu = DIALOGS_REPLACE;
2125 m_dlgReplace = NULL;
2126 }
2127 else
2128 {
2129 txt = wxT("Unknown");
2130 idMenu = wxID_ANY;
2131
2132 wxFAIL_MSG( wxT("unexpected event") );
2133 }
2134
2135 wxLogMessage(wxT("%s dialog is being closed."), txt);
2136
2137 if ( idMenu != wxID_ANY )
2138 {
2139 GetMenuBar()->Check(idMenu, false);
2140 }
2141
2142 dlg->Destroy();
2143 }
2144 else
2145 {
2146 wxLogError(wxT("Unknown find dialog event!"));
2147 }
2148 }
2149
2150 #endif // wxUSE_FINDREPLDLG
2151
2152 // ----------------------------------------------------------------------------
2153 // MyCanvas
2154 // ----------------------------------------------------------------------------
2155
2156 void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event) )
2157 {
2158 wxPaintDC dc(this);
2159 dc.SetBackgroundMode(wxTRANSPARENT);
2160 dc.DrawText(
2161 wxT("wxWidgets common dialogs")
2162 #if !defined(__SMARTPHONE__)
2163 wxT(" test application")
2164 #endif
2165 , 10, 10);
2166 }
2167
2168 #if USE_MODAL_PRESENTATION
2169
2170 // ----------------------------------------------------------------------------
2171 // MyModelessDialog
2172 // ----------------------------------------------------------------------------
2173
2174 MyModelessDialog::MyModelessDialog(wxWindow *parent)
2175 : wxDialog(parent, wxID_ANY, wxString(wxT("Modeless dialog")))
2176 {
2177 wxBoxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
2178
2179 wxButton *btn = new wxButton(this, DIALOGS_MODELESS_BTN, wxT("Press me"));
2180 wxCheckBox *check = new wxCheckBox(this, wxID_ANY, wxT("Should be disabled"));
2181 check->Disable();
2182
2183 sizerTop->Add(btn, 1, wxEXPAND | wxALL, 5);
2184 sizerTop->Add(check, 1, wxEXPAND | wxALL, 5);
2185
2186 SetSizerAndFit(sizerTop);
2187 }
2188
2189 void MyModelessDialog::OnButton(wxCommandEvent& WXUNUSED(event))
2190 {
2191 wxMessageBox(wxT("Button pressed in modeless dialog"), wxT("Info"),
2192 wxOK | wxICON_INFORMATION, this);
2193 }
2194
2195 void MyModelessDialog::OnClose(wxCloseEvent& event)
2196 {
2197 if ( event.CanVeto() )
2198 {
2199 wxMessageBox(wxT("Use the menu item to close this dialog"),
2200 wxT("Modeless dialog"),
2201 wxOK | wxICON_INFORMATION, this);
2202
2203 event.Veto();
2204 }
2205 }
2206
2207 // ----------------------------------------------------------------------------
2208 // MyModalDialog
2209 // ----------------------------------------------------------------------------
2210
2211 MyModalDialog::MyModalDialog(wxWindow *parent)
2212 : wxDialog(parent, wxID_ANY, wxString(wxT("Modal dialog")))
2213 {
2214 wxBoxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
2215
2216 m_btnModal = new wxButton(this, wxID_ANY, wxT("&Modal dialog..."));
2217 m_btnModeless = new wxButton(this, wxID_ANY, wxT("Mode&less dialog"));
2218 m_btnDelete = new wxButton(this, wxID_ANY, wxT("&Delete button"));
2219
2220 sizerTop->Add(m_btnModal, 0, wxALIGN_CENTER | wxALL, 5);
2221 sizerTop->Add(m_btnModeless, 0, wxALIGN_CENTER | wxALL, 5);
2222 sizerTop->Add(m_btnDelete, 0, wxALIGN_CENTER | wxALL, 5);
2223 sizerTop->Add(new wxButton(this, wxID_CLOSE), 0, wxALIGN_CENTER | wxALL, 5);
2224
2225 SetSizerAndFit(sizerTop);
2226
2227 SetEscapeId(wxID_CLOSE);
2228
2229 m_btnModal->SetFocus();
2230 m_btnModal->SetDefault();
2231 }
2232
2233 void MyModalDialog::OnButton(wxCommandEvent& event)
2234 {
2235 if ( event.GetEventObject() == m_btnDelete )
2236 {
2237 wxDELETE(m_btnModal);
2238 m_btnDelete->Disable();
2239 }
2240 else if ( event.GetEventObject() == m_btnModal )
2241 {
2242 #if wxUSE_TEXTDLG
2243 wxGetTextFromUser(wxT("Dummy prompt"),
2244 wxT("Modal dialog called from dialog"),
2245 wxEmptyString, this);
2246 #else
2247 wxMessageBox(wxT("Modal dialog called from dialog"));
2248 #endif // wxUSE_TEXTDLG
2249 }
2250 else if ( event.GetEventObject() == m_btnModeless )
2251 {
2252 (new MyModelessDialog(this))->Show();
2253 }
2254 else
2255 {
2256 event.Skip();
2257 }
2258 }
2259
2260 #endif // USE_MODAL_PRESENTATION
2261
2262 // ----------------------------------------------------------------------------
2263 // StdButtonSizerDialog
2264 // ----------------------------------------------------------------------------
2265
2266 StdButtonSizerDialog::StdButtonSizerDialog(wxWindow *parent)
2267 : wxDialog(parent, wxID_ANY, wxString(wxT("StdButtonSizer dialog")),
2268 wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER),
2269 m_buttonsSizer(NULL)
2270 {
2271 wxBoxSizer *const sizerTop = new wxBoxSizer(wxVERTICAL);
2272
2273 wxBoxSizer *const sizer = new wxBoxSizer(wxHORIZONTAL);
2274 wxBoxSizer *const sizerInside1 = new wxBoxSizer(wxVERTICAL);
2275
2276 m_chkboxAffirmativeButton = new wxCheckBox(this, wxID_ANY, _("Enable Affirmative Button"));
2277
2278 wxStaticBoxSizer *const sizer1 = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Affirmative Button"));
2279
2280 m_radiobtnOk = new wxRadioButton(this, wxID_ANY, _("Ok"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
2281 m_radiobtnYes = new wxRadioButton(this, wxID_ANY, _("Yes"));
2282
2283 wxBoxSizer *const sizerInside2 = new wxBoxSizer(wxVERTICAL);
2284
2285 m_chkboxDismissButton = new wxCheckBox(this, wxID_ANY, _("Enable Dismiss Button"));
2286
2287 wxStaticBoxSizer *const sizer2 = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Dismiss Button"));
2288
2289 m_radiobtnCancel = new wxRadioButton(this, wxID_ANY, _("Cancel"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
2290 m_radiobtnClose = new wxRadioButton(this, wxID_ANY, _("Close"));
2291
2292 wxBoxSizer *const sizer3 = new wxBoxSizer(wxHORIZONTAL);
2293
2294 m_chkboxNo = new wxCheckBox(this, wxID_ANY, _("No"));
2295 m_chkboxHelp = new wxCheckBox(this, wxID_ANY, _("Help"));
2296 m_chkboxApply = new wxCheckBox(this, wxID_ANY, _("Apply"));
2297
2298 m_chkboxNoDefault = new wxCheckBox(this, wxID_ANY, wxT("No Default"));
2299
2300 sizer1->Add(m_radiobtnOk, 0, wxALL, 5);
2301 sizer1->Add(m_radiobtnYes, 0, wxALL, 5);
2302
2303 sizer->Add(sizerInside1, 0, 0, 0);
2304 sizerInside1->Add(m_chkboxAffirmativeButton, 0, wxALL, 5);
2305 sizerInside1->Add(sizer1, 0, wxALL, 5);
2306 sizerInside1->SetItemMinSize(sizer1, sizer1->GetStaticBox()->GetBestSize()); // to prevent wrapping of static box label
2307
2308 sizer2->Add(m_radiobtnCancel, 0, wxALL, 5);
2309 sizer2->Add(m_radiobtnClose, 0, wxALL, 5);
2310
2311 sizer->Add(sizerInside2, 0, 0, 0);
2312 sizerInside2->Add(m_chkboxDismissButton, 0, wxALL, 5);
2313 sizerInside2->Add(sizer2, 0, wxALL, 5);
2314 sizerInside2->SetItemMinSize(sizer2, sizer2->GetStaticBox()->GetBestSize()); // to prevent wrapping of static box label
2315
2316 sizerTop->Add(sizer, 0, wxALL, 5);
2317
2318 sizer3->Add(m_chkboxNo, 0, wxALL, 5);
2319 sizer3->Add(m_chkboxHelp, 0, wxALL, 5);
2320 sizer3->Add(m_chkboxApply, 0, wxALL, 5);
2321
2322 sizerTop->Add(sizer3, 0, wxALL, 5);
2323
2324 sizerTop->Add(m_chkboxNoDefault, 0, wxLEFT|wxRIGHT, 10);
2325
2326 EnableDisableControls();
2327
2328 SetSizerAndFit(sizerTop);
2329
2330 wxCommandEvent ev;
2331 OnEvent(ev);
2332 }
2333
2334 void StdButtonSizerDialog::OnEvent(wxCommandEvent& WXUNUSED(event))
2335 {
2336 if (m_buttonsSizer)
2337 {
2338 m_buttonsSizer->DeleteWindows();
2339 GetSizer()->Remove(m_buttonsSizer);
2340 }
2341
2342 EnableDisableControls();
2343
2344 long flags = 0;
2345 unsigned long numButtons = 0;
2346
2347 if (m_chkboxAffirmativeButton->IsChecked())
2348 {
2349 if (m_radiobtnOk->GetValue())
2350 {
2351 flags |= wxOK;
2352 numButtons ++;
2353 }
2354 else if (m_radiobtnYes->GetValue())
2355 {
2356 flags |= wxYES;
2357 numButtons ++;
2358 }
2359 }
2360
2361 if (m_chkboxDismissButton->IsChecked())
2362 {
2363 if (m_radiobtnCancel->GetValue())
2364 {
2365 flags |= wxCANCEL;
2366 numButtons ++;
2367 }
2368
2369 else if (m_radiobtnClose->GetValue())
2370 {
2371 flags |= wxCLOSE;
2372 numButtons ++;
2373 }
2374
2375 }
2376
2377 if (m_chkboxApply->IsChecked())
2378 {
2379 flags |= wxAPPLY;
2380 numButtons ++;
2381 }
2382
2383 if (m_chkboxNo->IsChecked())
2384 {
2385 flags |= wxNO;
2386 numButtons ++;
2387 }
2388
2389 if (m_chkboxHelp->IsChecked())
2390 {
2391 flags |= wxHELP;
2392 numButtons ++;
2393 }
2394
2395 if (m_chkboxNoDefault->IsChecked())
2396 {
2397 flags |= wxNO_DEFAULT;
2398 }
2399
2400 m_buttonsSizer = CreateStdDialogButtonSizer(flags);
2401 GetSizer()->Add(m_buttonsSizer, 0, wxGROW|wxALL, 5);
2402
2403 Layout();
2404 GetSizer()->SetSizeHints(this);
2405 }
2406
2407 void StdButtonSizerDialog::EnableDisableControls()
2408 {
2409 const bool affButtonEnabled = m_chkboxAffirmativeButton->IsChecked();
2410
2411 m_radiobtnOk->Enable(affButtonEnabled);
2412 m_radiobtnYes->Enable(affButtonEnabled);
2413
2414 const bool dismissButtonEnabled = m_chkboxDismissButton->IsChecked();
2415
2416 m_radiobtnCancel->Enable(dismissButtonEnabled);
2417 m_radiobtnClose->Enable(dismissButtonEnabled);
2418 }
2419
2420 #if USE_SETTINGS_DIALOG
2421 // ----------------------------------------------------------------------------
2422 // SettingsDialog
2423 // ----------------------------------------------------------------------------
2424
2425 IMPLEMENT_CLASS(SettingsDialog, wxPropertySheetDialog)
2426
2427 BEGIN_EVENT_TABLE(SettingsDialog, wxPropertySheetDialog)
2428 END_EVENT_TABLE()
2429
2430 SettingsDialog::SettingsDialog(wxWindow* win, int dialogType)
2431 {
2432 SetExtraStyle(wxDIALOG_EX_CONTEXTHELP|wxWS_EX_VALIDATE_RECURSIVELY);
2433
2434 int tabImage1 = -1;
2435 int tabImage2 = -1;
2436
2437 bool useToolBook = (dialogType == DIALOGS_PROPERTY_SHEET_TOOLBOOK || dialogType == DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK);
2438 int resizeBorder = wxRESIZE_BORDER;
2439
2440 if (useToolBook)
2441 {
2442 resizeBorder = 0;
2443 tabImage1 = 0;
2444 tabImage2 = 1;
2445
2446 int sheetStyle = wxPROPSHEET_SHRINKTOFIT;
2447 if (dialogType == DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK)
2448 sheetStyle |= wxPROPSHEET_BUTTONTOOLBOOK;
2449 else
2450 sheetStyle |= wxPROPSHEET_TOOLBOOK;
2451
2452 SetSheetStyle(sheetStyle);
2453 SetSheetInnerBorder(0);
2454 SetSheetOuterBorder(0);
2455
2456 // create a dummy image list with a few icons
2457 const wxSize imageSize(32, 32);
2458
2459 m_imageList = new wxImageList(imageSize.GetWidth(), imageSize.GetHeight());
2460 m_imageList->
2461 Add(wxArtProvider::GetIcon(wxART_INFORMATION, wxART_OTHER, imageSize));
2462 m_imageList->
2463 Add(wxArtProvider::GetIcon(wxART_QUESTION, wxART_OTHER, imageSize));
2464 m_imageList->
2465 Add(wxArtProvider::GetIcon(wxART_WARNING, wxART_OTHER, imageSize));
2466 m_imageList->
2467 Add(wxArtProvider::GetIcon(wxART_ERROR, wxART_OTHER, imageSize));
2468 }
2469 else
2470 m_imageList = NULL;
2471
2472 Create(win, wxID_ANY, _("Preferences"), wxDefaultPosition, wxDefaultSize,
2473 wxDEFAULT_DIALOG_STYLE| (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, resizeBorder)
2474 );
2475
2476 // If using a toolbook, also follow Mac style and don't create buttons
2477 if (!useToolBook)
2478 CreateButtons(wxOK | wxCANCEL |
2479 (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, wxHELP)
2480 );
2481
2482 wxBookCtrlBase* notebook = GetBookCtrl();
2483 notebook->SetImageList(m_imageList);
2484
2485 wxPanel* generalSettings = CreateGeneralSettingsPage(notebook);
2486 wxPanel* aestheticSettings = CreateAestheticSettingsPage(notebook);
2487
2488 notebook->AddPage(generalSettings, _("General"), true, tabImage1);
2489 notebook->AddPage(aestheticSettings, _("Aesthetics"), false, tabImage2);
2490
2491 LayoutDialog();
2492 }
2493
2494 SettingsDialog::~SettingsDialog()
2495 {
2496 delete m_imageList;
2497 }
2498
2499 wxPanel* SettingsDialog::CreateGeneralSettingsPage(wxWindow* parent)
2500 {
2501 wxPanel* panel = new wxPanel(parent, wxID_ANY);
2502
2503 wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
2504 wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
2505
2506 //// LOAD LAST FILE
2507
2508 wxBoxSizer* itemSizer3 = new wxBoxSizer( wxHORIZONTAL );
2509 wxCheckBox* checkBox3 = new wxCheckBox(panel, ID_LOAD_LAST_PROJECT, _("&Load last project on startup"), wxDefaultPosition, wxDefaultSize);
2510 itemSizer3->Add(checkBox3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
2511 item0->Add(itemSizer3, 0, wxGROW|wxALL, 0);
2512
2513 //// AUTOSAVE
2514
2515 wxString autoSaveLabel = _("&Auto-save every");
2516 wxString minsLabel = _("mins");
2517
2518 wxBoxSizer* itemSizer12 = new wxBoxSizer( wxHORIZONTAL );
2519 wxCheckBox* checkBox12 = new wxCheckBox(panel, ID_AUTO_SAVE, autoSaveLabel, wxDefaultPosition, wxDefaultSize);
2520
2521 #if wxUSE_SPINCTRL
2522 wxSpinCtrl* spinCtrl12 = new wxSpinCtrl(panel, ID_AUTO_SAVE_MINS, wxEmptyString,
2523 wxDefaultPosition, wxSize(40, wxDefaultCoord), wxSP_ARROW_KEYS, 1, 60, 1);
2524 #endif
2525
2526 itemSizer12->Add(checkBox12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
2527 #if wxUSE_SPINCTRL
2528 itemSizer12->Add(spinCtrl12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
2529 #endif
2530 itemSizer12->Add(new wxStaticText(panel, wxID_STATIC, minsLabel), 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
2531 item0->Add(itemSizer12, 0, wxGROW|wxALL, 0);
2532
2533 //// TOOLTIPS
2534
2535 wxBoxSizer* itemSizer8 = new wxBoxSizer( wxHORIZONTAL );
2536 wxCheckBox* checkBox6 = new wxCheckBox(panel, ID_SHOW_TOOLTIPS, _("Show &tooltips"), wxDefaultPosition, wxDefaultSize);
2537 itemSizer8->Add(checkBox6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
2538 item0->Add(itemSizer8, 0, wxGROW|wxALL, 0);
2539
2540 topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );
2541
2542 panel->SetSizerAndFit(topSizer);
2543
2544 return panel;
2545 }
2546
2547 wxPanel* SettingsDialog::CreateAestheticSettingsPage(wxWindow* parent)
2548 {
2549 wxPanel* panel = new wxPanel(parent, wxID_ANY);
2550
2551 wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
2552 wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
2553
2554 //// PROJECT OR GLOBAL
2555 wxString globalOrProjectChoices[2];
2556 globalOrProjectChoices[0] = _("&New projects");
2557 globalOrProjectChoices[1] = _("&This project");
2558
2559 wxRadioBox* projectOrGlobal = new wxRadioBox(panel, ID_APPLY_SETTINGS_TO, _("&Apply settings to:"),
2560 wxDefaultPosition, wxDefaultSize, 2, globalOrProjectChoices);
2561 item0->Add(projectOrGlobal, 0, wxGROW|wxALL, 5);
2562
2563 projectOrGlobal->SetSelection(0);
2564
2565 //// BACKGROUND STYLE
2566 wxArrayString backgroundStyleChoices;
2567 backgroundStyleChoices.Add(wxT("Colour"));
2568 backgroundStyleChoices.Add(wxT("Image"));
2569 wxStaticBox* staticBox3 = new wxStaticBox(panel, wxID_ANY, _("Background style:"));
2570
2571 wxBoxSizer* styleSizer = new wxStaticBoxSizer( staticBox3, wxVERTICAL );
2572 item0->Add(styleSizer, 0, wxGROW|wxALL, 5);
2573
2574 wxBoxSizer* itemSizer2 = new wxBoxSizer( wxHORIZONTAL );
2575
2576 wxChoice* choice2 = new wxChoice(panel, ID_BACKGROUND_STYLE, wxDefaultPosition, wxDefaultSize, backgroundStyleChoices);
2577
2578 itemSizer2->Add(new wxStaticText(panel, wxID_ANY, _("&Window:")), 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
2579 itemSizer2->Add(5, 5, 1, wxALL, 0);
2580 itemSizer2->Add(choice2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
2581
2582 styleSizer->Add(itemSizer2, 0, wxGROW|wxALL, 5);
2583
2584 #if wxUSE_SPINCTRL
2585 //// FONT SIZE SELECTION
2586
2587 wxStaticBox* staticBox1 = new wxStaticBox(panel, wxID_ANY, _("Tile font size:"));
2588 wxBoxSizer* itemSizer5 = new wxStaticBoxSizer( staticBox1, wxHORIZONTAL );
2589
2590 wxSpinCtrl* spinCtrl = new wxSpinCtrl(panel, ID_FONT_SIZE, wxEmptyString, wxDefaultPosition,
2591 wxSize(80, wxDefaultCoord));
2592 itemSizer5->Add(spinCtrl, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
2593
2594 item0->Add(itemSizer5, 0, wxGROW|wxLEFT|wxRIGHT, 5);
2595 #endif
2596
2597 topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );
2598 topSizer->AddSpacer(5);
2599
2600 panel->SetSizerAndFit(topSizer);
2601
2602 return panel;
2603 }
2604
2605 #endif // USE_SETTINGS_DIALOG
2606
2607 #if wxUSE_MSGDLG
2608 // ----------------------------------------------------------------------------
2609 // TestMessageBoxDialog
2610 // ----------------------------------------------------------------------------
2611
2612 /* static */
2613 const TestMessageBoxDialog::BtnInfo TestMessageBoxDialog::ms_btnInfo[] =
2614 {
2615 { wxYES, "&Yes" },
2616 { wxNO, "&No" },
2617 { wxOK, "&Ok" },
2618 { wxCANCEL, "&Cancel" },
2619 };
2620
2621 BEGIN_EVENT_TABLE(TestMessageBoxDialog, wxDialog)
2622 EVT_BUTTON(wxID_APPLY, TestMessageBoxDialog::OnApply)
2623 EVT_BUTTON(wxID_CLOSE, TestMessageBoxDialog::OnClose)
2624 END_EVENT_TABLE()
2625
2626 TestMessageBoxDialog::TestMessageBoxDialog(wxWindow *parent)
2627 : wxDialog(parent, wxID_ANY, "Message Box Test Dialog",
2628 wxDefaultPosition, wxDefaultSize,
2629 wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
2630 {
2631 }
2632
2633 bool TestMessageBoxDialog::Create()
2634 {
2635 wxSizer * const sizerTop = new wxBoxSizer(wxVERTICAL);
2636
2637 // this sizer allows to configure the messages shown in the message box
2638 wxSizer * const
2639 sizerMsgs = new wxStaticBoxSizer(wxVERTICAL, this, "&Messages");
2640 sizerMsgs->Add(new wxStaticText(this, wxID_ANY, "&Main message:"));
2641 m_textMsg = new wxTextCtrl(this, wxID_ANY, "Hello from a box!",
2642 wxDefaultPosition, wxDefaultSize,
2643 wxTE_MULTILINE);
2644 sizerMsgs->Add(m_textMsg, wxSizerFlags(1).Expand().Border(wxBOTTOM));
2645
2646 sizerMsgs->Add(new wxStaticText(this, wxID_ANY, "&Extended message:"));
2647 m_textExtMsg = new wxTextCtrl(this, wxID_ANY, "",
2648 wxDefaultPosition, wxDefaultSize,
2649 wxTE_MULTILINE);
2650 sizerMsgs->Add(m_textExtMsg, wxSizerFlags(1).Expand());
2651
2652 sizerTop->Add(sizerMsgs, wxSizerFlags(1).Expand().Border());
2653
2654 // if a derived class provides more message configurations, add these.
2655 AddAdditionalTextOptions(sizerTop);
2656
2657 // this one is for configuring the buttons
2658 wxSizer * const
2659 sizerBtnsBox = new wxStaticBoxSizer(wxVERTICAL, this, "&Buttons");
2660
2661 wxFlexGridSizer * const sizerBtns = new wxFlexGridSizer(2, 5, 5);
2662 sizerBtns->AddGrowableCol(1);
2663
2664 sizerBtns->Add(new wxStaticText(this, wxID_ANY, "Button(s)"));
2665 sizerBtns->Add(new wxStaticText(this, wxID_ANY, "Custom label"));
2666
2667 for ( int n = 0; n < Btn_Max; n++ )
2668 {
2669 m_buttons[n] = new wxCheckBox(this, wxID_ANY, ms_btnInfo[n].name);
2670 sizerBtns->Add(m_buttons[n], wxSizerFlags().Centre().Left());
2671
2672 m_labels[n] = new wxTextCtrl(this, wxID_ANY);
2673 sizerBtns->Add(m_labels[n], wxSizerFlags(1).Centre().Expand());
2674
2675 m_labels[n]->Connect(wxEVT_UPDATE_UI,
2676 wxUpdateUIEventHandler(
2677 TestMessageBoxDialog::OnUpdateLabelUI),
2678 NULL,
2679 this);
2680 }
2681
2682 sizerBtnsBox->Add(sizerBtns, wxSizerFlags(1).Expand());
2683 sizerTop->Add(sizerBtnsBox, wxSizerFlags().Expand().Border());
2684
2685
2686 // icon choice
2687 const wxString icons[] =
2688 {
2689 "&Not specified",
2690 "E&xplicitly none",
2691 "&Information icon",
2692 "&Question icon",
2693 "&Warning icon",
2694 "&Error icon"
2695 };
2696
2697 wxCOMPILE_TIME_ASSERT( WXSIZEOF(icons) == MsgDlgIcon_Max, IconMismatch );
2698
2699 m_icons = new wxRadioBox(this, wxID_ANY, "&Icon style",
2700 wxDefaultPosition, wxDefaultSize,
2701 WXSIZEOF(icons), icons,
2702 2, wxRA_SPECIFY_ROWS);
2703 // Make the 'Information' icon the default one:
2704 m_icons->SetSelection(MsgDlgIcon_Info);
2705 sizerTop->Add(m_icons, wxSizerFlags().Expand().Border());
2706
2707
2708 // miscellaneous other stuff
2709 wxSizer * const
2710 sizerFlags = new wxStaticBoxSizer(wxHORIZONTAL, this, "&Other flags");
2711
2712 m_chkNoDefault = new wxCheckBox(this, wxID_ANY, "Make \"No\" &default");
2713 m_chkNoDefault->Connect(wxEVT_UPDATE_UI,
2714 wxUpdateUIEventHandler(
2715 TestMessageBoxDialog::OnUpdateNoDefaultUI),
2716 NULL,
2717 this);
2718 sizerFlags->Add(m_chkNoDefault, wxSizerFlags(1).Border());
2719
2720 m_chkCentre = new wxCheckBox(this, wxID_ANY, "Centre on &parent");
2721 sizerFlags->Add(m_chkCentre, wxSizerFlags(1).Border());
2722
2723 // add any additional flag from subclasses
2724 AddAdditionalFlags(sizerFlags);
2725
2726 sizerTop->Add(sizerFlags, wxSizerFlags().Expand().Border());
2727
2728 // finally buttons to show the resulting message box and close this dialog
2729 sizerTop->Add(CreateStdDialogButtonSizer(wxAPPLY | wxCLOSE),
2730 wxSizerFlags().Right().Border());
2731
2732 SetSizerAndFit(sizerTop);
2733
2734 m_buttons[Btn_Ok]->SetValue(true);
2735
2736 return true;
2737 }
2738
2739 void TestMessageBoxDialog::OnUpdateLabelUI(wxUpdateUIEvent& event)
2740 {
2741 for ( int n = 0; n < Btn_Max; n++ )
2742 {
2743 if ( event.GetEventObject() == m_labels[n] )
2744 {
2745 event.Enable( m_buttons[n]->IsChecked() );
2746 return;
2747 }
2748 }
2749
2750 wxFAIL_MSG( "called for unknown label" );
2751 }
2752
2753 void TestMessageBoxDialog::OnUpdateNoDefaultUI(wxUpdateUIEvent& event)
2754 {
2755 event.Enable( m_buttons[Btn_No]->IsChecked() );
2756 }
2757
2758 long TestMessageBoxDialog::GetStyle()
2759 {
2760 long style = 0;
2761
2762 for ( int n = 0; n < Btn_Max; n++ )
2763 {
2764 if ( m_buttons[n]->IsChecked() )
2765 style |= ms_btnInfo[n].flag;
2766 }
2767
2768 switch ( m_icons->GetSelection() )
2769 {
2770 case MsgDlgIcon_Max:
2771 wxFAIL_MSG( "unexpected selection" );
2772
2773 case MsgDlgIcon_No:
2774 break;
2775
2776 case MsgDlgIcon_None:
2777 style |= wxICON_NONE;
2778 break;
2779
2780 case MsgDlgIcon_Info:
2781 style |= wxICON_INFORMATION;
2782 break;
2783
2784 case MsgDlgIcon_Question:
2785 style |= wxICON_QUESTION;
2786 break;
2787
2788 case MsgDlgIcon_Warning:
2789 style |= wxICON_WARNING;
2790 break;
2791
2792 case MsgDlgIcon_Error:
2793 style |= wxICON_ERROR;
2794 break;
2795 }
2796
2797 if ( m_chkCentre->IsChecked() )
2798 style |= wxCENTRE;
2799
2800 if ( m_chkNoDefault->IsEnabled() && m_chkNoDefault->IsChecked() )
2801 style |= wxNO_DEFAULT;
2802
2803 return style;
2804 }
2805
2806 void TestMessageBoxDialog::PrepareMessageDialog(wxMessageDialogBase &dlg)
2807 {
2808 long style = dlg.GetMessageDialogStyle();
2809
2810 if ( !m_textExtMsg->IsEmpty() )
2811 dlg.SetExtendedMessage(m_textExtMsg->GetValue());
2812
2813 if ( style & wxYES_NO )
2814 {
2815 if ( style & wxCANCEL )
2816 {
2817 dlg.SetYesNoCancelLabels(m_labels[Btn_Yes]->GetValue(),
2818 m_labels[Btn_No]->GetValue(),
2819 m_labels[Btn_Cancel]->GetValue());
2820 }
2821 else
2822 {
2823 dlg.SetYesNoLabels(m_labels[Btn_Yes]->GetValue(),
2824 m_labels[Btn_No]->GetValue());
2825 }
2826 }
2827 else
2828 {
2829 if ( style & wxCANCEL )
2830 {
2831 dlg.SetOKCancelLabels(m_labels[Btn_Ok]->GetValue(),
2832 m_labels[Btn_Cancel]->GetValue());
2833 }
2834 else
2835 {
2836 dlg.SetOKLabel(m_labels[Btn_Ok]->GetValue());
2837 }
2838 }
2839 }
2840
2841 void TestMessageBoxDialog::OnApply(wxCommandEvent& WXUNUSED(event))
2842 {
2843 wxMessageDialog dlg(this, GetMessage(), "Test Message Box", GetStyle());
2844 PrepareMessageDialog(dlg);
2845
2846 dlg.ShowModal();
2847 }
2848
2849 void TestMessageBoxDialog::OnClose(wxCommandEvent& WXUNUSED(event))
2850 {
2851 EndModal(wxID_CANCEL);
2852 }
2853 #endif // wxUSE_MSGDLG
2854
2855 #if wxUSE_RICHMSGDLG
2856 // ----------------------------------------------------------------------------
2857 // TestRichMessageDialog
2858 // ----------------------------------------------------------------------------
2859
2860 BEGIN_EVENT_TABLE(TestRichMessageDialog, TestMessageBoxDialog)
2861 EVT_BUTTON(wxID_APPLY, TestRichMessageDialog::OnApply)
2862 END_EVENT_TABLE()
2863
2864 TestRichMessageDialog::TestRichMessageDialog(wxWindow *parent)
2865 : TestMessageBoxDialog(parent)
2866 {
2867 SetTitle("Rich Message Dialog Test Dialog");
2868 }
2869
2870 void TestRichMessageDialog::AddAdditionalTextOptions(wxSizer *sizer)
2871 {
2872 wxSizer * const sizerMsgs = new wxStaticBoxSizer(wxVERTICAL, this,
2873 "&Additional Elements");
2874
2875 // add a option to show a check box.
2876 wxFlexGridSizer * const sizerCheckBox = new wxFlexGridSizer(2, 5, 5);
2877 sizerCheckBox->AddGrowableCol(1);
2878 sizerCheckBox->Add(new wxStaticText(this, wxID_ANY, "&Check box:"));
2879 m_textCheckBox = new wxTextCtrl(this, wxID_ANY);
2880 sizerCheckBox->Add(m_textCheckBox, wxSizerFlags(1).Expand().Border(wxBOTTOM));
2881 sizerMsgs->Add(sizerCheckBox, wxSizerFlags(1).Expand());
2882
2883 // add option to show a detailed text.
2884 sizerMsgs->Add(new wxStaticText(this, wxID_ANY, "&Detailed message:"));
2885 m_textDetailed = new wxTextCtrl(this, wxID_ANY, "",
2886 wxDefaultPosition, wxDefaultSize,
2887 wxTE_MULTILINE);
2888 sizerMsgs->Add(m_textDetailed, wxSizerFlags(1).Expand());
2889
2890 sizer->Add(sizerMsgs, wxSizerFlags(1).Expand().Border());
2891 }
2892
2893 void TestRichMessageDialog::AddAdditionalFlags(wxSizer *sizer)
2894 {
2895 // add checkbox to set the initial state for the checkbox shown
2896 // in the dialog.
2897 m_initialValueCheckBox =
2898 new wxCheckBox(this, wxID_ANY, "Checkbox initially checked");
2899 sizer->Add(m_initialValueCheckBox, wxSizerFlags(1).Border());
2900 }
2901
2902 void TestRichMessageDialog::OnApply(wxCommandEvent& WXUNUSED(event))
2903 {
2904 wxRichMessageDialog dlg(this, GetMessage(), "Test Rich Message Dialog",
2905 GetStyle());
2906 PrepareMessageDialog(dlg);
2907
2908 dlg.ShowCheckBox(m_textCheckBox->GetValue(),
2909 m_initialValueCheckBox->GetValue());
2910 dlg.ShowDetailedText(m_textDetailed->GetValue());
2911
2912 dlg.ShowModal();
2913 }
2914
2915 #endif // wxUSE_RICHMSGDLG
2916
2917 #if wxUSE_LOG
2918
2919 // ----------------------------------------------------------------------------
2920 // custom log target
2921 // ----------------------------------------------------------------------------
2922
2923 class MyLogGui : public wxLogGui
2924 {
2925 private:
2926 virtual void DoShowSingleLogMessage(const wxString& message,
2927 const wxString& title,
2928 int style)
2929 {
2930 wxMessageDialog dlg(NULL, message, title,
2931 wxOK | wxCANCEL | wxCANCEL_DEFAULT | style);
2932 dlg.SetOKCancelLabels(wxID_COPY, wxID_OK);
2933 dlg.SetExtendedMessage("Note that this is a custom log dialog.");
2934 dlg.ShowModal();
2935 }
2936 };
2937
2938 wxLog *MyAppTraits::CreateLogTarget()
2939 {
2940 return new MyLogGui;
2941 }
2942
2943 #endif // wxUSE_LOG