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