1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Common dialogs demo
4 // Author: Julian Smart, Vadim Zeitlin, ABX
7 // Copyright: (c) Julian Smart
10 // Licence: wxWindows licence
11 /////////////////////////////////////////////////////////////////////////////
13 // For compilers that support precompilation, includes "wx/wx.h".
14 #include "wx/wxprec.h"
24 #include "../sample.xpm"
26 #include "wx/apptrait.h"
27 #include "wx/datetime.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"
37 #include "wx/richmsgdlg.h"
38 #endif // wxUSE_RICHMSGDLG
41 #include "wx/colordlg.h"
42 #endif // wxUSE_COLOURDLG
45 #include "wx/choicdlg.h"
46 #endif // wxUSE_CHOICEDLG
48 #include "wx/rearrangectrl.h"
50 #if wxUSE_STARTUP_TIPS
51 #include "wx/tipdlg.h"
52 #endif // wxUSE_STARTUP_TIPS
55 #if wxUSE_STOPWATCH && wxUSE_LONGLONG
56 #include "wx/datetime.h" // wxDateTime
59 #include "wx/progdlg.h"
60 #endif // wxUSE_PROGRESSDLG
63 #include "wx/aboutdlg.h"
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
71 #include "wx/busyinfo.h"
72 #endif // wxUSE_BUSYINFO
75 #include "wx/numdlg.h"
76 #endif // wxUSE_NUMBERDLG
79 #include "wx/filedlg.h"
80 #endif // wxUSE_FILEDLG
83 #include "wx/dirdlg.h"
84 #endif // wxUSE_DIRDLG
87 #include "wx/fontdlg.h"
88 #endif // wxUSE_FONTDLG
91 #include "wx/fdrepdlg.h"
92 #endif // wxUSE_FINDREPLDLG
95 #include "wx/infobar.h"
96 #endif // wxUSE_INFOBAR
98 #include "wx/spinctrl.h"
99 #include "wx/propdlg.h"
103 #if USE_COLOURDLG_GENERIC
104 #include "wx/generic/colrdlgg.h"
105 #endif // USE_COLOURDLG_GENERIC
107 #if USE_DIRDLG_GENERIC
108 #include "wx/generic/dirdlgg.h"
109 #endif // USE_DIRDLG_GENERIC
111 #if USE_FILEDLG_GENERIC
112 #include "wx/generic/filedlgg.h"
113 #endif // USE_FILEDLG_GENERIC
115 #if USE_FONTDLG_GENERIC
116 #include "wx/generic/fontdlgg.h"
117 #endif // USE_FONTDLG_GENERIC
121 BEGIN_EVENT_TABLE(MyCanvas
, wxScrolledWindow
)
122 EVT_PAINT(MyCanvas::OnPaint
)
127 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
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
135 EVT_MENU(DIALOGS_RICH_MESSAGE_DIALOG
, MyFrame::RichMessageDialog
)
136 #endif // wxUSE_RICHMSGDLG
138 EVT_MENU(DIALOGS_CHOOSE_COLOUR
, MyFrame::ChooseColour
)
139 EVT_MENU(DIALOGS_GET_COLOUR
, MyFrame::GetColour
)
140 #endif // wxUSE_COLOURDLG
143 EVT_MENU(DIALOGS_CHOOSE_FONT
, MyFrame::ChooseFont
)
144 #endif // wxUSE_FONTDLG
147 EVT_MENU(DIALOGS_LOG_DIALOG
, MyFrame::LogDialog
)
148 #endif // wxUSE_LOG_DIALOG
150 EVT_MENU(DIALOGS_INFOBAR_SIMPLE
, MyFrame::InfoBarSimple
)
151 EVT_MENU(DIALOGS_INFOBAR_ADVANCED
, MyFrame::InfoBarAdvanced
)
152 #endif // wxUSE_INFOBAR
155 EVT_MENU(DIALOGS_LINE_ENTRY
, MyFrame::LineEntry
)
156 EVT_MENU(DIALOGS_TEXT_ENTRY
, MyFrame::TextEntry
)
157 EVT_MENU(DIALOGS_PASSWORD_ENTRY
, MyFrame::PasswordEntry
)
158 #endif // wxUSE_TEXTDLG
161 EVT_MENU(DIALOGS_NUM_ENTRY
, MyFrame::NumericEntry
)
162 #endif // wxUSE_NUMBERDLG
165 EVT_MENU(DIALOGS_SINGLE_CHOICE
, MyFrame::SingleChoice
)
166 EVT_MENU(DIALOGS_MULTI_CHOICE
, MyFrame::MultiChoice
)
167 #endif // wxUSE_CHOICEDLG
169 #if wxUSE_REARRANGECTRL
170 EVT_MENU(DIALOGS_REARRANGE
, MyFrame::Rearrange
)
171 #endif // wxUSE_REARRANGECTRL
174 EVT_MENU(DIALOGS_FILE_OPEN
, MyFrame::FileOpen
)
175 EVT_MENU(DIALOGS_FILE_OPEN2
, MyFrame::FileOpen2
)
176 EVT_MENU(DIALOGS_FILES_OPEN
, MyFrame::FilesOpen
)
177 EVT_MENU(DIALOGS_FILE_SAVE
, MyFrame::FileSave
)
178 #endif // wxUSE_FILEDLG
180 #if USE_FILEDLG_GENERIC
181 EVT_MENU(DIALOGS_FILE_OPEN_GENERIC
, MyFrame::FileOpenGeneric
)
182 EVT_MENU(DIALOGS_FILES_OPEN_GENERIC
, MyFrame::FilesOpenGeneric
)
183 EVT_MENU(DIALOGS_FILE_SAVE_GENERIC
, MyFrame::FileSaveGeneric
)
184 #endif // USE_FILEDLG_GENERIC
187 EVT_MENU(DIALOGS_DIR_CHOOSE
, MyFrame::DirChoose
)
188 EVT_MENU(DIALOGS_DIRNEW_CHOOSE
, MyFrame::DirChooseNew
)
189 #endif // wxUSE_DIRDLG
191 #if USE_MODAL_PRESENTATION
192 EVT_MENU(DIALOGS_MODAL
, MyFrame::ModalDlg
)
193 #endif // USE_MODAL_PRESENTATION
194 EVT_MENU(DIALOGS_MODELESS
, MyFrame::ModelessDlg
)
195 EVT_MENU(DIALOGS_CENTRE_SCREEN
, MyFrame::DlgCenteredScreen
)
196 EVT_MENU(DIALOGS_CENTRE_PARENT
, MyFrame::DlgCenteredParent
)
198 EVT_MENU(DIALOGS_MINIFRAME
, MyFrame::MiniFrame
)
199 #endif // wxUSE_MINIFRAME
200 EVT_MENU(DIALOGS_ONTOP
, MyFrame::DlgOnTop
)
202 #if wxUSE_STARTUP_TIPS
203 EVT_MENU(DIALOGS_TIP
, MyFrame::ShowTip
)
204 #endif // wxUSE_STARTUP_TIPS
206 #if USE_FONTDLG_GENERIC
207 EVT_MENU(DIALOGS_CHOOSE_FONT_GENERIC
, MyFrame::ChooseFontGeneric
)
208 #endif // USE_FONTDLG_GENERIC
210 #if USE_DIRDLG_GENERIC
211 EVT_MENU(DIALOGS_GENERIC_DIR_CHOOSE
, MyFrame::GenericDirChoose
)
212 #endif // wxMSW || wxMAC
214 #if USE_COLOURDLG_GENERIC
215 EVT_MENU(DIALOGS_CHOOSE_COLOUR_GENERIC
, MyFrame::ChooseColourGeneric
)
216 #endif // USE_COLOURDLG_GENERIC
218 #if wxUSE_PROGRESSDLG
219 EVT_MENU(DIALOGS_PROGRESS
, MyFrame::ShowProgress
)
220 #endif // wxUSE_PROGRESSDLG
223 EVT_MENU(DIALOGS_ABOUTDLG_SIMPLE
, MyFrame::ShowSimpleAboutDialog
)
224 EVT_MENU(DIALOGS_ABOUTDLG_FANCY
, MyFrame::ShowFancyAboutDialog
)
225 EVT_MENU(DIALOGS_ABOUTDLG_FULL
, MyFrame::ShowFullAboutDialog
)
226 EVT_MENU(DIALOGS_ABOUTDLG_CUSTOM
, MyFrame::ShowCustomAboutDialog
)
227 #endif // wxUSE_ABOUTDLG
230 EVT_MENU(DIALOGS_BUSYINFO
, MyFrame::ShowBusyInfo
)
231 #endif // wxUSE_BUSYINFO
233 #if wxUSE_FINDREPLDLG
234 EVT_MENU(DIALOGS_FIND
, MyFrame::ShowFindDialog
)
235 EVT_MENU(DIALOGS_REPLACE
, MyFrame::ShowReplaceDialog
)
237 EVT_FIND(wxID_ANY
, MyFrame::OnFindDialog
)
238 EVT_FIND_NEXT(wxID_ANY
, MyFrame::OnFindDialog
)
239 EVT_FIND_REPLACE(wxID_ANY
, MyFrame::OnFindDialog
)
240 EVT_FIND_REPLACE_ALL(wxID_ANY
, MyFrame::OnFindDialog
)
241 EVT_FIND_CLOSE(wxID_ANY
, MyFrame::OnFindDialog
)
242 #endif // wxUSE_FINDREPLDLG
244 #if USE_SETTINGS_DIALOG
245 EVT_MENU(DIALOGS_PROPERTY_SHEET
, MyFrame::OnPropertySheet
)
246 EVT_MENU(DIALOGS_PROPERTY_SHEET_TOOLBOOK
, MyFrame::OnPropertySheet
)
247 EVT_MENU(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK
, MyFrame::OnPropertySheet
)
248 #endif // USE_SETTINGS_DIALOG
250 EVT_MENU(DIALOGS_STANDARD_BUTTON_SIZER_DIALOG
, MyFrame::OnStandardButtonsSizerDialog
)
251 EVT_MENU(DIALOGS_TEST_DEFAULT_ACTION
, MyFrame::OnTestDefaultActionDialog
)
253 EVT_MENU(DIALOGS_REQUEST
, MyFrame::OnRequestUserAttention
)
254 #if wxUSE_NOTIFICATION_MESSAGE
255 EVT_MENU(DIALOGS_NOTIFY_AUTO
, MyFrame::OnNotifMsgAuto
)
256 EVT_MENU(DIALOGS_NOTIFY_SHOW
, MyFrame::OnNotifMsgShow
)
257 EVT_MENU(DIALOGS_NOTIFY_HIDE
, MyFrame::OnNotifMsgHide
)
258 #endif // wxUSE_NOTIFICATION_MESSAGE
260 EVT_MENU(wxID_EXIT
, MyFrame::OnExit
)
263 #if USE_MODAL_PRESENTATION
265 BEGIN_EVENT_TABLE(MyModalDialog
, wxDialog
)
266 EVT_BUTTON(wxID_ANY
, MyModalDialog::OnButton
)
269 BEGIN_EVENT_TABLE(MyModelessDialog
, wxDialog
)
270 EVT_BUTTON(DIALOGS_MODELESS_BTN
, MyModelessDialog::OnButton
)
271 EVT_CLOSE(MyModelessDialog::OnClose
)
274 #endif // USE_MODAL_PRESENTATION
276 BEGIN_EVENT_TABLE(StdButtonSizerDialog
, wxDialog
)
277 EVT_CHECKBOX(wxID_ANY
, StdButtonSizerDialog::OnEvent
)
278 EVT_RADIOBUTTON(wxID_ANY
, StdButtonSizerDialog::OnEvent
)
281 #if wxUSE_CMDLINE_PARSER
283 #include "wx/cmdline.h"
285 static const char *PROGRESS_SWITCH
= "progress";
287 void MyApp::OnInitCmdLine(wxCmdLineParser
& parser
)
289 wxApp::OnInitCmdLine(parser
);
291 parser
.AddOption("", PROGRESS_SWITCH
,
292 "Style for the startup progress dialog (wxPD_XXX)",
293 wxCMD_LINE_VAL_NUMBER
);
296 bool MyApp::OnCmdLineParsed(wxCmdLineParser
& parser
)
298 if ( !wxApp::OnCmdLineParsed(parser
) )
301 parser
.Found(PROGRESS_SWITCH
, &m_startupProgressStyle
);
306 #endif // wxUSE_CMDLINE_PARSER
308 // `Main program' equivalent, creating windows and returning main app frame
311 if ( !wxApp::OnInit() )
314 #if wxUSE_PROGRESSDLG
315 if ( m_startupProgressStyle
!= -1 )
317 // Show a test progress dialog before the main event loop is started:
318 // it should still work.
319 const int PROGRESS_COUNT
= 100;
322 "Progress in progress",
323 "Please wait, starting...",
326 m_startupProgressStyle
328 for ( int i
= 0; i
<= PROGRESS_COUNT
; i
++ )
330 if ( !dlg
.Update(i
) )
336 #endif // wxUSE_PROGRESSDLG
339 wxInitAllImageHandlers();
342 // Create the main frame window
343 MyFrame
*frame
= new MyFrame(wxT("wxWidgets dialogs example"));
346 wxMenu
*menuDlg
= new wxMenu
;
348 menuDlg
->Append(DIALOGS_MESSAGE_BOX
, wxT("&Message box\tCtrl-M"));
349 menuDlg
->Append(DIALOGS_MESSAGE_BOX_WINDOW_MODAL
, wxT("Window-Modal Message box "));
350 menuDlg
->Append(DIALOGS_MESSAGE_DIALOG
, wxT("Message dialog\tShift-Ctrl-M"));
352 menuDlg
->Append(DIALOGS_RICH_MESSAGE_DIALOG
, wxT("Rich message dialog"));
353 #endif // wxUSE_RICHMSGDLG
356 #if wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
358 wxMenu
*choices_menu
= new wxMenu
;
361 choices_menu
->Append(DIALOGS_CHOOSE_COLOUR
, wxT("&Choose bg colour"));
362 choices_menu
->Append(DIALOGS_GET_COLOUR
, wxT("&Choose fg colour"));
363 #endif // wxUSE_COLOURDLG
366 choices_menu
->Append(DIALOGS_CHOOSE_FONT
, wxT("Choose &font"));
367 #endif // wxUSE_FONTDLG
370 choices_menu
->Append(DIALOGS_SINGLE_CHOICE
, wxT("&Single choice\tCtrl-C"));
371 choices_menu
->Append(DIALOGS_MULTI_CHOICE
, wxT("M&ultiple choice\tCtrl-U"));
372 #endif // wxUSE_CHOICEDLG
374 #if wxUSE_REARRANGECTRL
375 choices_menu
->Append(DIALOGS_REARRANGE
, wxT("&Rearrange dialog\tCtrl-R"));
376 #endif // wxUSE_REARRANGECTRL
378 #if USE_COLOURDLG_GENERIC || USE_FONTDLG_GENERIC
379 choices_menu
->AppendSeparator();
380 #endif // USE_COLOURDLG_GENERIC || USE_FONTDLG_GENERIC
382 #if USE_COLOURDLG_GENERIC
383 choices_menu
->Append(DIALOGS_CHOOSE_COLOUR_GENERIC
, wxT("&Choose colour (generic)"));
384 #endif // USE_COLOURDLG_GENERIC
386 #if USE_FONTDLG_GENERIC
387 choices_menu
->Append(DIALOGS_CHOOSE_FONT_GENERIC
, wxT("Choose &font (generic)"));
388 #endif // USE_FONTDLG_GENERIC
390 menuDlg
->Append(wxID_ANY
,wxT("&Choices and selectors"),choices_menu
);
391 #endif // wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
394 #if wxUSE_TEXTDLG || wxUSE_NUMBERDLG
396 wxMenu
*entry_menu
= new wxMenu
;
399 entry_menu
->Append(DIALOGS_LINE_ENTRY
, wxT("Single line &entry\tCtrl-E"));
400 entry_menu
->Append(DIALOGS_TEXT_ENTRY
, wxT("Multi line text &entry\tShift-Ctrl-E"));
401 entry_menu
->Append(DIALOGS_PASSWORD_ENTRY
, wxT("&Password entry\tCtrl-P"));
402 #endif // wxUSE_TEXTDLG
405 entry_menu
->Append(DIALOGS_NUM_ENTRY
, wxT("&Numeric entry\tCtrl-N"));
406 #endif // wxUSE_NUMBERDLG
408 menuDlg
->Append(wxID_ANY
,wxT("&Entry dialogs"),entry_menu
);
410 #endif // wxUSE_TEXTDLG || wxUSE_NUMBERDLG
415 wxMenu
*filedlg_menu
= new wxMenu
;
416 filedlg_menu
->Append(DIALOGS_FILE_OPEN
, wxT("&Open file\tCtrl-O"));
417 filedlg_menu
->Append(DIALOGS_FILE_OPEN2
, wxT("&Second open file\tCtrl-2"));
418 filedlg_menu
->Append(DIALOGS_FILES_OPEN
, wxT("Open &files\tCtrl-Q"));
419 filedlg_menu
->Append(DIALOGS_FILE_SAVE
, wxT("Sa&ve file\tCtrl-S"));
421 #if USE_FILEDLG_GENERIC
422 filedlg_menu
->AppendSeparator();
423 filedlg_menu
->Append(DIALOGS_FILE_OPEN_GENERIC
, wxT("&Open file (generic)"));
424 filedlg_menu
->Append(DIALOGS_FILES_OPEN_GENERIC
, wxT("Open &files (generic)"));
425 filedlg_menu
->Append(DIALOGS_FILE_SAVE_GENERIC
, wxT("Sa&ve file (generic)"));
426 #endif // USE_FILEDLG_GENERIC
428 menuDlg
->Append(wxID_ANY
,wxT("&File operations"),filedlg_menu
);
430 #endif // wxUSE_FILEDLG
433 wxMenu
*dir_menu
= new wxMenu
;
435 dir_menu
->Append(DIALOGS_DIR_CHOOSE
, wxT("&Choose a directory\tCtrl-D"));
436 dir_menu
->Append(DIALOGS_DIRNEW_CHOOSE
, wxT("Choose a directory (with \"Ne&w\" button)\tShift-Ctrl-D"));
437 menuDlg
->Append(wxID_ANY
,wxT("&Directory operations"),dir_menu
);
439 #if USE_DIRDLG_GENERIC
440 dir_menu
->AppendSeparator();
441 dir_menu
->Append(DIALOGS_GENERIC_DIR_CHOOSE
, wxT("&Choose a directory (generic)"));
442 #endif // USE_DIRDLG_GENERIC
444 #endif // wxUSE_DIRDLG
447 #if wxUSE_STARTUP_TIPS || \
448 wxUSE_PROGRESSDLG || \
450 wxUSE_LOG_DIALOG || \
453 wxMenu
*info_menu
= new wxMenu
;
455 #if wxUSE_STARTUP_TIPS
456 info_menu
->Append(DIALOGS_TIP
, wxT("&Tip of the day\tCtrl-T"));
457 #endif // wxUSE_STARTUP_TIPS
459 #if wxUSE_PROGRESSDLG
460 info_menu
->Append(DIALOGS_PROGRESS
, wxT("Pro&gress dialog\tCtrl-G"));
461 #endif // wxUSE_PROGRESSDLG
464 info_menu
->Append(DIALOGS_BUSYINFO
, wxT("&Busy info dialog\tCtrl-B"));
465 #endif // wxUSE_BUSYINFO
468 info_menu
->Append(DIALOGS_LOG_DIALOG
, wxT("&Log dialog\tCtrl-L"));
469 #endif // wxUSE_LOG_DIALOG
472 info_menu
->Append(DIALOGS_INFOBAR_SIMPLE
, "Simple &info bar\tCtrl-I");
473 info_menu
->Append(DIALOGS_INFOBAR_ADVANCED
, "&Advanced info bar\tShift-Ctrl-I");
474 #endif // wxUSE_INFOBAR
477 info_menu
->Append(DIALOGS_MESSAGE_BOX_WXINFO
,
478 wxT("&wxWidgets information\tCtrl-W"));
479 #endif // wxUSE_MSGDLG
481 menuDlg
->Append(wxID_ANY
,wxT("&Informative dialogs"),info_menu
);
483 #endif // wxUSE_STARTUP_TIPS || wxUSE_PROGRESSDLG || wxUSE_BUSYINFO || wxUSE_LOG_DIALOG
486 #if wxUSE_FINDREPLDLG
487 wxMenu
*find_menu
= new wxMenu
;
488 find_menu
->AppendCheckItem(DIALOGS_FIND
, wxT("&Find dialog\tCtrl-F"));
489 find_menu
->AppendCheckItem(DIALOGS_REPLACE
, wxT("Find and &replace dialog\tShift-Ctrl-F"));
490 menuDlg
->Append(wxID_ANY
,wxT("&Searching"),find_menu
);
491 #endif // wxUSE_FINDREPLDLG
493 wxMenu
*dialogs_menu
= new wxMenu
;
494 #if USE_MODAL_PRESENTATION
495 dialogs_menu
->Append(DIALOGS_MODAL
, wxT("&Modal dialog\tShift-Ctrl-W"));
496 #endif // USE_MODAL_PRESENTATION
497 dialogs_menu
->AppendCheckItem(DIALOGS_MODELESS
, wxT("Mode&less dialog\tShift-Ctrl-Z"));
498 dialogs_menu
->Append(DIALOGS_CENTRE_SCREEN
, wxT("Centered on &screen\tShift-Ctrl-1"));
499 dialogs_menu
->Append(DIALOGS_CENTRE_PARENT
, wxT("Centered on &parent\tShift-Ctrl-2"));
501 dialogs_menu
->Append(DIALOGS_MINIFRAME
, wxT("&Mini frame"));
502 #endif // wxUSE_MINIFRAME
503 dialogs_menu
->Append(DIALOGS_ONTOP
, wxT("Dialog staying on &top"));
504 menuDlg
->Append(wxID_ANY
, wxT("&Generic dialogs"), dialogs_menu
);
506 #if USE_SETTINGS_DIALOG
507 wxMenu
*sheet_menu
= new wxMenu
;
508 sheet_menu
->Append(DIALOGS_PROPERTY_SHEET
, wxT("&Standard property sheet\tShift-Ctrl-P"));
509 sheet_menu
->Append(DIALOGS_PROPERTY_SHEET_TOOLBOOK
, wxT("&Toolbook sheet\tShift-Ctrl-T"));
511 if (wxPlatformIs(wxPORT_MAC
))
512 sheet_menu
->Append(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK
, wxT("Button &Toolbook sheet\tShift-Ctrl-U"));
515 sheet_menu->Append(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, wxT("Button &Toolbook sheet\tShift-Ctrl-U"));
518 menuDlg
->Append(wxID_ANY
, wxT("&Property sheets"), sheet_menu
);
519 #endif // USE_SETTINGS_DIALOG
521 wxMenu
*menuNotif
= new wxMenu
;
522 menuNotif
->Append(DIALOGS_REQUEST
, wxT("&Request user attention\tCtrl-Shift-R"));
523 #if wxUSE_NOTIFICATION_MESSAGE
524 menuNotif
->Append(DIALOGS_NOTIFY_AUTO
, "&Automatically hidden notification");
525 menuNotif
->Append(DIALOGS_NOTIFY_SHOW
, "&Show manual notification");
526 menuNotif
->Append(DIALOGS_NOTIFY_HIDE
, "&Hide manual notification");
527 #endif // wxUSE_NOTIFICATION_MESSAGE
528 menuDlg
->AppendSubMenu(menuNotif
, "&User notifications");
530 menuDlg
->Append(DIALOGS_STANDARD_BUTTON_SIZER_DIALOG
, wxT("&Standard Buttons Sizer Dialog"));
531 menuDlg
->Append(DIALOGS_TEST_DEFAULT_ACTION
, wxT("&Test dialog default action"));
533 menuDlg
->AppendSeparator();
534 menuDlg
->Append(wxID_EXIT
, wxT("E&xit\tAlt-X"));
537 wxMenu
*menuHelp
= new wxMenu
;
538 menuHelp
->Append(DIALOGS_ABOUTDLG_SIMPLE
, wxT("&About (simple)...\tF1"));
539 menuHelp
->Append(DIALOGS_ABOUTDLG_FANCY
, wxT("About (&fancy)...\tShift-F1"));
540 menuHelp
->Append(DIALOGS_ABOUTDLG_FULL
, wxT("About (f&ull)...\tCtrl-F1"));
541 menuHelp
->Append(DIALOGS_ABOUTDLG_CUSTOM
, wxT("About (&custom)...\tCtrl-Shift-F1"));
542 #endif // wxUSE_ABOUTDLG
544 wxMenu
* editMenu
= new wxMenu
;
545 editMenu
->Append(wxID_UNDO
, _("&Undo\tCtrl+Z"));
546 editMenu
->Append(wxID_REDO
, _("&Redo\tCtrl+Y"));
547 editMenu
->AppendSeparator();
548 editMenu
->Append(wxID_CUT
, _("Cu&t\tCtrl+X"));
549 editMenu
->Append(wxID_COPY
, _("&Copy\tCtrl+C"));
550 editMenu
->Append(wxID_PASTE
, _("&Paste\tCtrl+V"));
551 editMenu
->Append(wxID_CLEAR
, _("&Delete"));
553 editMenu
->AppendSeparator();
554 editMenu
->Append(wxID_SELECTALL
, _("Select All\tCtrl+A"));
556 wxMenuBar
*menubar
= new wxMenuBar
;
557 menubar
->Append(menuDlg
, wxT("&Dialogs"));
559 menubar
->Append(editMenu
, wxT("&Edit"));
562 menubar
->Append(menuHelp
, wxT("&Help"));
563 #endif // wxUSE_ABOUTDLG
565 frame
->SetMenuBar(menubar
);
567 frame
->Centre(wxBOTH
);
573 // My frame constructor
574 MyFrame::MyFrame(const wxString
& title
)
575 : wxFrame(NULL
, wxID_ANY
, title
)
577 SetIcon(wxICON(sample
));
579 #if USE_MODAL_PRESENTATION
580 m_dialog
= (MyModelessDialog
*)NULL
;
581 #endif // USE_MODAL_PRESENTATION
583 #if wxUSE_FINDREPLDLG
589 m_clrData
.SetChooseFull(true);
590 for (int i
= 0; i
< wxColourData::NUM_CUSTOM
; i
++)
592 unsigned char n
= i
*16;
593 m_clrData
.SetCustomColour(i
, wxColour(n
, n
, n
));
595 #endif // wxUSE_COLOURDLG
597 #if wxUSE_NOTIFICATION_MESSAGE
599 #endif // wxUSE_NOTIFICATION_MESSAGE
603 #endif // wxUSE_STATUSBAR
605 m_canvas
= new MyCanvas(this);
608 // an info bar can be created very simply and used without any extra effort
609 m_infoBarSimple
= new wxInfoBar(this);
611 // or it can also be customized by
612 m_infoBarAdvanced
= new wxInfoBar(this);
614 // ... adding extra buttons (but more than two will usually be too many)
615 m_infoBarAdvanced
->AddButton(wxID_UNDO
);
616 m_infoBarAdvanced
->AddButton(wxID_REDO
);
618 m_infoBarAdvanced
->Connect(wxID_REDO
, wxEVT_COMMAND_BUTTON_CLICKED
,
619 wxCommandEventHandler(MyFrame::OnInfoBarRedo
),
623 // adding and removing a button immediately doesn't make sense here, of
624 // course, it's done just to show that it is possible
625 m_infoBarAdvanced
->AddButton(wxID_EXIT
);
626 m_infoBarAdvanced
->RemoveButton(wxID_EXIT
);
628 // ... changing the colours and/or fonts
629 m_infoBarAdvanced
->SetOwnBackgroundColour(0xc8ffff);
630 m_infoBarAdvanced
->SetFont(GetFont().Bold().Larger());
632 // ... and changing the effect (only does anything under MSW currently)
633 m_infoBarAdvanced
->SetShowHideEffects(wxSHOW_EFFECT_EXPAND
,
634 wxSHOW_EFFECT_EXPAND
);
635 m_infoBarAdvanced
->SetEffectDuration(1500);
638 // to use the info bars we need to use sizer for the window layout
639 wxBoxSizer
* const sizer
= new wxBoxSizer(wxVERTICAL
);
640 sizer
->Add(m_infoBarSimple
, wxSizerFlags().Expand());
641 sizer
->Add(m_canvas
, wxSizerFlags(1).Expand());
642 sizer
->Add(m_infoBarAdvanced
, wxSizerFlags().Expand());
645 // final touch: under MSW the info bars are shown progressively and parts
646 // of the parent window can be seen during the process, so use the same
647 // background colour for our background as for the canvas window which
648 // covers our entire client area to avoid jarring colour jumps
649 SetOwnBackgroundColour(m_canvas
->GetBackgroundColour());
650 #endif // wxUSE_INFOBAR
653 // Test MSW-specific function allowing to access the "system" menu.
654 wxMenu
* const menu
= MSWGetSystemMenu();
657 menu
->AppendSeparator();
659 // The ids of the menu commands in MSW system menu must be multiple of
660 // 16 so we can't use DIALOGS_ABOUTDLG_SIMPLE here because it might not
661 // satisfy this condition and need to define and connect a separate id.
662 static const int DIALOGS_SYSTEM_ABOUT
= 0x4010;
664 menu
->Append(DIALOGS_SYSTEM_ABOUT
, "&About...");
665 Connect(DIALOGS_SYSTEM_ABOUT
, wxEVT_COMMAND_MENU_SELECTED
,
666 wxCommandEventHandler(MyFrame::ShowSimpleAboutDialog
));
673 #if wxUSE_NOTIFICATION_MESSAGE
675 #endif // wxUSE_NOTIFICATION_MESSAGE
680 void MyFrame::ChooseColour(wxCommandEvent
& WXUNUSED(event
))
682 m_clrData
.SetColour(m_canvas
->GetBackgroundColour());
684 wxColourDialog
dialog(this, &m_clrData
);
685 dialog
.SetTitle(_("Please choose the background colour"));
686 if ( dialog
.ShowModal() == wxID_OK
)
688 m_clrData
= dialog
.GetColourData();
689 m_canvas
->SetBackgroundColour(m_clrData
.GetColour());
690 m_canvas
->ClearBackground();
695 void MyFrame::GetColour(wxCommandEvent
& WXUNUSED(event
))
697 wxColour clr
= wxGetColourFromUser
700 m_canvas
->GetForegroundColour(),
701 "Please choose the foreground colour"
705 m_canvas
->SetForegroundColour(clr
);
708 //else: dialog cancelled by user
711 #endif // wxUSE_COLOURDLG
714 #if USE_COLOURDLG_GENERIC
715 void MyFrame::ChooseColourGeneric(wxCommandEvent
& WXUNUSED(event
))
717 m_clrData
.SetColour(m_canvas
->GetBackgroundColour());
719 //FIXME:TODO:This has no effect...
720 m_clrData
.SetChooseFull(true);
722 for (int i
= 0; i
< 16; i
++)
725 (unsigned char)(i
*16),
726 (unsigned char)(i
*16),
727 (unsigned char)(i
*16)
729 m_clrData
.SetCustomColour(i
, colour
);
732 wxGenericColourDialog
*dialog
= new wxGenericColourDialog(this, &m_clrData
);
733 if (dialog
->ShowModal() == wxID_OK
)
735 m_clrData
= dialog
->GetColourData();
736 m_canvas
->SetBackgroundColour(m_clrData
.GetColour());
737 m_canvas
->ClearBackground();
742 #endif // USE_COLOURDLG_GENERIC
745 void MyFrame::ChooseFont(wxCommandEvent
& WXUNUSED(event
) )
748 data
.SetInitialFont(m_canvas
->GetFont());
749 data
.SetColour(m_canvas
->GetForegroundColour());
751 // you might also do this:
753 // wxFontDialog dialog;
754 // if ( !dialog.Create(this, data) { ... error ... }
756 wxFontDialog
dialog(this, data
);
758 if (dialog
.ShowModal() == wxID_OK
)
760 wxFontData retData
= dialog
.GetFontData();
761 m_canvas
->SetFont(retData
.GetChosenFont());
762 m_canvas
->SetForegroundColour(retData
.GetColour());
765 //else: cancelled by the user, don't change the font
767 #endif // wxUSE_FONTDLG
769 #if USE_FONTDLG_GENERIC
770 void MyFrame::ChooseFontGeneric(wxCommandEvent
& WXUNUSED(event
) )
773 data
.SetInitialFont(m_canvas
->GetFont());
774 data
.SetColour(m_canvas
->GetForegroundColour());
776 wxGenericFontDialog
*dialog
= new wxGenericFontDialog(this, data
);
777 if (dialog
->ShowModal() == wxID_OK
)
779 wxFontData retData
= dialog
->GetFontData();
780 m_canvas
->SetFont(retData
.GetChosenFont());
781 m_canvas
->SetForegroundColour(retData
.GetColour());
786 #endif // USE_FONTDLG_GENERIC
789 void MyFrame::LogDialog(wxCommandEvent
& WXUNUSED(event
))
791 // calling wxYield() (as ~wxBusyCursor does) shouldn't result in messages
792 // being flushed -- test it
795 wxLogMessage(wxT("This is some message - everything is ok so far."));
796 wxLogMessage(wxT("Another message...\n... this one is on multiple lines"));
797 wxLogWarning(wxT("And then something went wrong!"));
799 // and if ~wxBusyCursor doesn't do it, then call it manually
803 wxLogError(wxT("Intermediary error handler decided to abort."));
804 wxLogError(wxT("The top level caller detected an unrecoverable error."));
806 wxLog::FlushActive();
808 wxLogMessage(wxT("And this is the same dialog but with only one message."));
810 #endif // wxUSE_LOG_DIALOG
814 void MyFrame::InfoBarSimple(wxCommandEvent
& WXUNUSED(event
))
816 static int s_count
= 0;
817 m_infoBarSimple
->ShowMessage
819 wxString::Format("Message #%d in the info bar.", ++s_count
)
823 void MyFrame::InfoBarAdvanced(wxCommandEvent
& WXUNUSED(event
))
825 m_infoBarAdvanced
->ShowMessage("Sorry, it didn't work out.", wxICON_WARNING
);
828 void MyFrame::OnInfoBarRedo(wxCommandEvent
& WXUNUSED(event
))
830 m_infoBarAdvanced
->ShowMessage("Still no, sorry again.", wxICON_ERROR
);
833 #endif // wxUSE_INFOBAR
837 void MyFrame::MessageBox(wxCommandEvent
& WXUNUSED(event
))
839 wxMessageDialog
dialog(this,
840 "This is a message box\n"
841 "This is a long, long string to test out if the message box "
842 "is laid out properly.",
845 wxNO_DEFAULT
| wxYES_NO
| wxCANCEL
|
849 if ( dialog
.SetYesNoCancelLabels
856 extmsg
= "This platform supports custom button labels,\n"
857 "so you should see the descriptive labels below.";
861 extmsg
= "Custom button labels are not supported on this platform,\n"
862 "so the default \"Yes\"/\"No\"/\"Cancel\" buttons are used.";
864 dialog
.SetExtendedMessage(extmsg
);
866 switch ( dialog
.ShowModal() )
869 wxLogStatus(wxT("You pressed \"Yes\""));
873 wxLogStatus(wxT("You pressed \"No\""));
877 wxLogStatus(wxT("You pressed \"Cancel\""));
881 wxLogError(wxT("Unexpected wxMessageDialog return code!"));
885 void MyFrame::MessageBoxWindowModal(wxCommandEvent
& WXUNUSED(event
))
887 wxMessageDialog
* dialog
= new wxMessageDialog(this,
888 "This is a message box\n"
889 "This is a long, long string to test out if the message box "
890 "is laid out properly.",
893 wxNO_DEFAULT
| wxYES_NO
| wxCANCEL
|
897 if ( dialog
->SetYesNoCancelLabels
904 extmsg
= "This platform supports custom button labels,\n"
905 "so you should see the descriptive labels below.";
909 extmsg
= "Custom button labels are not supported on this platform,\n"
910 "so the default \"Yes\"/\"No\"/\"Cancel\" buttons are used.";
912 dialog
->SetExtendedMessage(extmsg
);
913 dialog
->Connect( wxEVT_WINDOW_MODAL_DIALOG_CLOSED
, wxWindowModalDialogEventHandler(MyFrame::MessageBoxWindowModalClosed
), NULL
, this );
914 dialog
->ShowWindowModal();
917 void MyFrame::MessageBoxWindowModalClosed(wxWindowModalDialogEvent
& event
)
919 wxDialog
* dialog
= event
.GetDialog();
920 switch ( dialog
->GetReturnCode() )
923 wxLogStatus(wxT("You pressed \"Yes\""));
927 wxLogStatus(wxT("You pressed \"No\""));
931 wxLogStatus(wxT("You pressed \"Cancel\""));
935 wxLogError(wxT("Unexpected wxMessageDialog return code!"));
940 void MyFrame::MessageBoxDialog(wxCommandEvent
& WXUNUSED(event
))
942 TestMessageBoxDialog
dlg(this);
947 void MyFrame::MessageBoxInfo(wxCommandEvent
& WXUNUSED(event
))
949 ::wxInfoMessageBox(this);
951 #endif // wxUSE_MSGDLG
954 void MyFrame::RichMessageDialog(wxCommandEvent
& WXUNUSED(event
))
956 TestRichMessageDialog
dlg(this);
960 #endif // wxUSE_RICHMSGDLG
963 void MyFrame::NumericEntry(wxCommandEvent
& WXUNUSED(event
))
965 long res
= wxGetNumberFromUser( wxT("This is some text, actually a lot of text.\n")
966 wxT("Even two rows of text."),
967 wxT("Enter a number:"), wxT("Numeric input test"),
974 msg
= wxT("Invalid number entered or dialog cancelled.");
979 msg
.Printf(wxT("You've entered %lu"), res
);
980 icon
= wxICON_INFORMATION
;
983 wxMessageBox(msg
, wxT("Numeric test result"), wxOK
| icon
, this);
985 #endif // wxUSE_NUMBERDLG
988 void MyFrame::PasswordEntry(wxCommandEvent
& WXUNUSED(event
))
990 wxString pwd
= wxGetPasswordFromUser(wxT("Enter password:"),
991 wxT("Password entry dialog"),
996 wxMessageBox(wxString::Format(wxT("Your password is '%s'"), pwd
.c_str()),
997 wxT("Got password"), wxOK
| wxICON_INFORMATION
, this);
1001 void MyFrame::LineEntry(wxCommandEvent
& WXUNUSED(event
))
1003 wxTextEntryDialog
dialog(this,
1004 wxT("This is a small sample\n")
1005 wxT("A long, long string to test out the text entrybox"),
1006 wxT("Please enter a string"),
1007 wxT("Default value"),
1010 if (dialog
.ShowModal() == wxID_OK
)
1012 wxMessageBox(dialog
.GetValue(), wxT("Got string"), wxOK
| wxICON_INFORMATION
, this);
1016 void MyFrame::TextEntry(wxCommandEvent
& WXUNUSED(event
))
1018 wxTextEntryDialog
dialog(this, "You can enter a multiline string here.",
1019 "Please enter some text",
1020 "First line\nSecond one\nAnd another one too",
1021 wxOK
| wxCANCEL
| wxTE_MULTILINE
);
1023 if (dialog
.ShowModal() == wxID_OK
)
1025 wxMessageBox(dialog
.GetValue(), wxT("Got text"), wxOK
| wxICON_INFORMATION
, this);
1028 #endif // wxUSE_TEXTDLG
1031 void MyFrame::SingleChoice(wxCommandEvent
& WXUNUSED(event
) )
1033 const wxString choices
[] = { wxT("One"), wxT("Two"), wxT("Three"), wxT("Four"), wxT("Five") } ;
1035 wxSingleChoiceDialog
dialog(this,
1036 wxT("This is a small sample\n")
1037 wxT("A single-choice convenience dialog"),
1038 wxT("Please select a value"),
1039 WXSIZEOF(choices
), choices
);
1041 dialog
.SetSelection(2);
1043 if (dialog
.ShowModal() == wxID_OK
)
1045 wxMessageDialog
dialog2(this, dialog
.GetStringSelection(), wxT("Got string"));
1046 dialog2
.ShowModal();
1050 void MyFrame::MultiChoice(wxCommandEvent
& WXUNUSED(event
) )
1052 const wxString choices
[] =
1054 wxT("One"), wxT("Two"), wxT("Three"), wxT("Four"), wxT("Five"),
1055 wxT("Six"), wxT("Seven"), wxT("Eight"), wxT("Nine"), wxT("Ten"),
1056 wxT("Eleven"), wxT("Twelve"), wxT("Seventeen"),
1059 wxArrayInt selections
;
1060 const int count
= wxGetSelectedChoices(selections
,
1061 wxT("This is a small sample\n")
1062 wxT("A multi-choice convenience dialog"),
1063 wxT("Please select a value"),
1064 WXSIZEOF(choices
), choices
,
1071 msg
= wxT("You did not select any items");
1075 msg
.Printf(wxT("You selected %u items:\n"), (unsigned)count
);
1076 for ( int n
= 0; n
< count
; n
++ )
1078 msg
+= wxString::Format(wxT("\t%u: %u (%s)\n"),
1079 (unsigned)n
, (unsigned)selections
[n
],
1080 choices
[selections
[n
]].c_str());
1087 #endif // wxUSE_CHOICEDLG
1089 #if wxUSE_REARRANGECTRL
1090 // custom rearrange dialog: it adds the possibility to rename an item to the
1091 // base class functionality
1092 class MyRearrangeDialog
: public wxRearrangeDialog
1095 MyRearrangeDialog(wxWindow
*parent
,
1097 wxArrayString
& labels
,
1098 wxArrayString
& labelsOrig
)
1102 "Configure the columns shown:",
1103 "wxRearrangeDialog example",
1109 m_labelsOrig(labelsOrig
)
1111 m_sel
= wxNOT_FOUND
;
1113 wxPanel
* const panel
= new wxPanel(this);
1114 wxSizer
* const sizer
= new wxBoxSizer(wxHORIZONTAL
);
1116 m_labelOrig
= new wxStaticText(panel
, wxID_ANY
, "");
1117 sizer
->Add(m_labelOrig
, wxSizerFlags().Centre().Border(wxRIGHT
));
1119 m_text
= new wxTextCtrl(panel
, wxID_ANY
, "",
1120 wxDefaultPosition
, wxDefaultSize
,
1121 wxTE_PROCESS_ENTER
);
1122 sizer
->Add(m_text
, wxSizerFlags().Centre().Border(wxRIGHT
));
1124 sizer
->Add(new wxButton(panel
, wxID_APPLY
, "&Rename"),
1125 wxSizerFlags().Centre());
1127 panel
->SetSizer(sizer
);
1129 // call this first to ensure that the controls have a reasonable best
1130 // size before they're added
1131 DoUpdateExtraControls(GetList()->GetSelection());
1133 AddExtraControls(panel
);
1136 // another customization not directly supported by the dialog: add a
1138 wxWindow
* const btnOk
= FindWindow(wxID_OK
);
1139 wxCHECK_RET( btnOk
, "no Ok button?" );
1141 wxSizer
* const sizerBtns
= btnOk
->GetContainingSizer();
1142 wxCHECK_RET( sizerBtns
, "no buttons sizer?" );
1144 sizerBtns
->Add(new wxButton(this, wxID_RESET
, "&Reset all"),
1145 wxSizerFlags().Border(wxLEFT
));
1148 // call this instead of ShowModal() to update order and labels array in
1149 // case the dialog was not cancelled
1152 switch ( ShowModal() )
1158 m_order
= GetOrder();
1162 // order already reset
1170 void OnSelChange(wxCommandEvent
& event
)
1172 DoUpdateExtraControls(event
.GetInt());
1175 void OnUpdateUIRename(wxUpdateUIEvent
& event
)
1177 event
.Enable( CanRename() );
1180 void OnRename(wxCommandEvent
& WXUNUSED(event
))
1185 m_labels
[m_sel
] = m_text
->GetValue();
1186 GetList()->SetString(m_sel
, m_labels
[m_sel
]);
1189 void OnReset(wxCommandEvent
& WXUNUSED(event
))
1191 // in a real program we should probably ask if the user really wants to
1192 // do this but here we just go ahead and reset all columns labels and
1193 // their order without confirmation
1194 const unsigned count
= m_order
.size();
1195 for ( unsigned n
= 0; n
< count
; n
++ )
1198 m_labels
[n
] = m_labelsOrig
[n
];
1201 EndModal(wxID_RESET
);
1204 bool CanRename() const
1206 // only allow renaming if the user modified the currently selected item
1207 // text (which presupposes that we do have a current item)
1208 return m_sel
!= wxNOT_FOUND
&& m_text
->GetValue() != m_labels
[m_sel
];
1211 void DoUpdateExtraControls(int sel
)
1215 if ( m_sel
== wxNOT_FOUND
)
1217 m_labelOrig
->SetLabel("<no selection>");
1221 else // have valid item
1223 m_labelOrig
->SetLabelText(m_labelsOrig
[m_sel
]);
1225 m_text
->SetValue(m_labels
[m_sel
]);
1229 wxArrayInt
& m_order
;
1230 wxArrayString
& m_labels
,
1234 wxStaticText
*m_labelOrig
;
1237 DECLARE_EVENT_TABLE()
1238 wxDECLARE_NO_COPY_CLASS(MyRearrangeDialog
);
1241 BEGIN_EVENT_TABLE(MyRearrangeDialog
, wxRearrangeDialog
)
1242 EVT_LISTBOX(wxID_ANY
, MyRearrangeDialog::OnSelChange
)
1244 EVT_UPDATE_UI(wxID_APPLY
, MyRearrangeDialog::OnUpdateUIRename
)
1246 EVT_TEXT_ENTER(wxID_ANY
, MyRearrangeDialog::OnRename
)
1247 EVT_BUTTON(wxID_APPLY
, MyRearrangeDialog::OnRename
)
1248 EVT_BUTTON(wxID_RESET
, MyRearrangeDialog::OnReset
)
1251 void MyFrame::Rearrange(wxCommandEvent
& WXUNUSED(event
))
1253 // the arrays are static so that we preserve the items order between calls
1255 static wxArrayInt s_order
;
1256 static wxArrayString s_labels
,
1259 // initialize them on the first call
1260 if ( s_labelsOrig
.empty() )
1262 static const struct ItemInfo
1265 const char *labelOrig
;
1269 { "File name", "Name", 0 },
1270 { "File type", "Ext", 1 },
1271 { "Size", "Size", 2 },
1272 { "Creation time", "Ctime", ~3 }, // negated so hidden
1273 { "Last accessed", "Atime", ~4 },
1274 { "Last modified", "Mtime", 5 },
1277 s_order
.reserve(WXSIZEOF(items
));
1278 s_labels
.reserve(WXSIZEOF(items
));
1279 s_labelsOrig
.reserve(WXSIZEOF(items
));
1280 for ( unsigned n
= 0; n
< WXSIZEOF(items
); n
++ )
1282 const ItemInfo
& item
= items
[n
];
1283 s_order
.push_back(item
.order
);
1284 s_labels
.push_back(item
.label
);
1285 s_labelsOrig
.push_back(item
.labelOrig
);
1289 MyRearrangeDialog
dlg(this, s_order
, s_labels
, s_labelsOrig
);
1290 if ( !dlg
.Rearrange() )
1294 for ( unsigned n
= 0; n
< s_order
.size(); n
++ )
1296 columns
+= wxString::Format("\n %u: ", n
);
1297 int idx
= s_order
[n
];
1300 columns
+= "[hidden] ";
1304 columns
+= s_labels
[idx
];
1305 if ( s_labels
[idx
] != s_labelsOrig
[idx
] )
1307 columns
+= wxString::Format(" (original label: \"%s\")",
1312 wxLogMessage("The columns order now is:%s", columns
);
1314 #endif // wxUSE_REARRANGECTRL
1318 // panel with custom controls for file dialog
1319 class MyExtraPanel
: public wxPanel
1322 MyExtraPanel(wxWindow
*parent
);
1323 void OnCheckBox(wxCommandEvent
& event
) { m_btn
->Enable(event
.IsChecked()); }
1324 wxString
GetInfo() const
1326 return wxString::Format("checkbox value = %d", (int) m_cb
->GetValue());
1333 MyExtraPanel::MyExtraPanel(wxWindow
*parent
)
1336 m_btn
= new wxButton(this, -1, wxT("Custom Button"));
1337 m_btn
->Enable(false);
1338 m_cb
= new wxCheckBox(this, -1, wxT("Enable Custom Button"));
1339 m_cb
->Connect(wxID_ANY
, wxEVT_COMMAND_CHECKBOX_CLICKED
,
1340 wxCommandEventHandler(MyExtraPanel::OnCheckBox
), NULL
, this);
1341 wxBoxSizer
*sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
1342 sizerTop
->Add(m_cb
, wxSizerFlags().Centre().Border());
1343 sizerTop
->AddStretchSpacer();
1344 sizerTop
->Add(m_btn
, wxSizerFlags().Right().Border());
1345 SetSizerAndFit(sizerTop
);
1348 // a static method can be used instead of a function with most of compilers
1349 static wxWindow
* createMyExtraPanel(wxWindow
*parent
)
1351 return new MyExtraPanel(parent
);
1354 void MyFrame::FileOpen(wxCommandEvent
& WXUNUSED(event
) )
1359 wxT("Testing open file dialog"),
1363 wxT("C++ files (*.cpp)|*.cpp")
1365 wxT("C++ files (*.cpp;*.h)|*.cpp;*.h")
1369 dialog
.SetExtraControlCreator(&createMyExtraPanel
);
1370 dialog
.CentreOnParent();
1371 dialog
.SetDirectory(wxGetHomeDir());
1373 if (dialog
.ShowModal() == wxID_OK
)
1376 wxWindow
* const extra
= dialog
.GetExtraControl();
1377 info
.Printf(wxT("Full file name: %s\n")
1380 wxT("Custom window: %s"),
1381 dialog
.GetPath().c_str(),
1382 dialog
.GetDirectory().c_str(),
1383 dialog
.GetFilename().c_str(),
1384 extra
? static_cast<MyExtraPanel
*>(extra
)->GetInfo()
1385 : wxString("None"));
1386 wxMessageDialog
dialog2(this, info
, wxT("Selected file"));
1387 dialog2
.ShowModal();
1391 // this shows how to take advantage of specifying a default extension in the
1392 // call to wxFileSelector: it is remembered after each new call and the next
1393 // one will use it by default
1394 void MyFrame::FileOpen2(wxCommandEvent
& WXUNUSED(event
) )
1396 static wxString s_extDef
;
1397 wxString path
= wxFileSelector(
1398 wxT("Select the file to load"),
1399 wxEmptyString
, wxEmptyString
,
1403 wxT("Waveform (*.wav)|*.wav|Plain text (*.txt)|*.txt|All files (%s)|%s"),
1404 wxFileSelectorDefaultWildcardStr
,
1405 wxFileSelectorDefaultWildcardStr
1407 wxFD_OPEN
|wxFD_CHANGE_DIR
|wxFD_PREVIEW
,
1414 // it is just a sample, would use wxSplitPath in real program
1415 s_extDef
= path
.AfterLast(wxT('.'));
1417 wxLogMessage(wxT("You selected the file '%s', remembered extension '%s'"),
1421 void MyFrame::FilesOpen(wxCommandEvent
& WXUNUSED(event
) )
1423 wxString wildcards
=
1425 wxT("C++ files (*.cpp)|*.cpp");
1429 wxT("All files (%s)|%s|C++ files (*.cpp;*.h)|*.cpp;*.h"),
1430 wxFileSelectorDefaultWildcardStr
,
1431 wxFileSelectorDefaultWildcardStr
1434 wxFileDialog
dialog(this, wxT("Testing open multiple file dialog"),
1435 wxEmptyString
, wxEmptyString
, wildcards
,
1436 wxFD_OPEN
|wxFD_MULTIPLE
);
1438 if (dialog
.ShowModal() == wxID_OK
)
1440 wxArrayString paths
, filenames
;
1442 dialog
.GetPaths(paths
);
1443 dialog
.GetFilenames(filenames
);
1446 size_t count
= paths
.GetCount();
1447 for ( size_t n
= 0; n
< count
; n
++ )
1449 s
.Printf(wxT("File %d: %s (%s)\n"),
1450 (int)n
, paths
[n
].c_str(), filenames
[n
].c_str());
1454 s
.Printf(wxT("Filter index: %d"), dialog
.GetFilterIndex());
1457 wxMessageDialog
dialog2(this, msg
, wxT("Selected files"));
1458 dialog2
.ShowModal();
1462 void MyFrame::FileSave(wxCommandEvent
& WXUNUSED(event
) )
1464 wxFileDialog
dialog(this,
1465 wxT("Testing save file dialog"),
1467 wxT("myletter.doc"),
1468 wxT("Text files (*.txt)|*.txt|Document files (*.doc;*.ods)|*.doc;*.ods"),
1469 wxFD_SAVE
|wxFD_OVERWRITE_PROMPT
);
1471 dialog
.SetFilterIndex(1);
1473 if (dialog
.ShowModal() == wxID_OK
)
1475 wxLogMessage(wxT("%s, filter %d"),
1476 dialog
.GetPath().c_str(), dialog
.GetFilterIndex());
1479 #endif // wxUSE_FILEDLG
1481 #if USE_FILEDLG_GENERIC
1482 void MyFrame::FileOpenGeneric(wxCommandEvent
& WXUNUSED(event
) )
1484 wxGenericFileDialog dialog
1487 wxT("Testing open file dialog"),
1490 wxT("C++ files (*.cpp;*.h)|*.cpp;*.h")
1493 dialog
.SetExtraControlCreator(&createMyExtraPanel
);
1494 dialog
.SetDirectory(wxGetHomeDir());
1496 if (dialog
.ShowModal() == wxID_OK
)
1499 info
.Printf(wxT("Full file name: %s\n")
1502 dialog
.GetPath().c_str(),
1503 dialog
.GetDirectory().c_str(),
1504 dialog
.GetFilename().c_str());
1505 wxMessageDialog
dialog2(this, info
, wxT("Selected file"));
1506 dialog2
.ShowModal();
1510 void MyFrame::FilesOpenGeneric(wxCommandEvent
& WXUNUSED(event
) )
1512 // On PocketPC you can disable OK-only dialogs policy using system option
1513 int buttons
= wxSystemOptions::GetOptionInt(wxT("wince.dialog.real-ok-cancel"));
1514 wxSystemOptions::SetOption(wxT("wince.dialog.real-ok-cancel"), 1);
1516 wxString wildcards
= wxT("All files (*.*)|*.*|C++ files (*.cpp;*.h)|*.cpp;*.h");
1517 wxGenericFileDialog
dialog(this, wxT("Testing open multiple file dialog"),
1518 wxEmptyString
, wxEmptyString
, wildcards
,
1521 if (dialog
.ShowModal() == wxID_OK
)
1523 wxArrayString paths
, filenames
;
1525 dialog
.GetPaths(paths
);
1526 dialog
.GetFilenames(filenames
);
1529 size_t count
= paths
.GetCount();
1530 for ( size_t n
= 0; n
< count
; n
++ )
1532 s
.Printf(wxT("File %d: %s (%s)\n"),
1533 (int)n
, paths
[n
].c_str(), filenames
[n
].c_str());
1537 s
.Printf(wxT("Filter index: %d"), dialog
.GetFilterIndex());
1540 wxMessageDialog
dialog2(this, msg
, wxT("Selected files"));
1541 dialog2
.ShowModal();
1544 // restore system option
1545 wxSystemOptions::SetOption(wxT("wince.dialog.real-ok-cancel"), buttons
);
1548 void MyFrame::FileSaveGeneric(wxCommandEvent
& WXUNUSED(event
) )
1550 wxGenericFileDialog
dialog(this,
1551 wxT("Testing save file dialog"),
1553 wxT("myletter.doc"),
1554 wxT("Text files (*.txt)|*.txt|Document files (*.doc;*.ods)|*.doc;*.ods"),
1555 wxFD_SAVE
|wxFD_OVERWRITE_PROMPT
);
1557 dialog
.SetFilterIndex(1);
1559 if (dialog
.ShowModal() == wxID_OK
)
1561 wxLogMessage(wxT("%s, filter %d"),
1562 dialog
.GetPath().c_str(), dialog
.GetFilterIndex());
1565 #endif // USE_FILEDLG_GENERIC
1568 void MyFrame::DoDirChoose(int style
)
1570 // pass some initial dir to wxDirDialog
1572 wxGetHomeDir(&dirHome
);
1574 wxDirDialog
dialog(this, wxT("Testing directory picker"), dirHome
, style
);
1576 if (dialog
.ShowModal() == wxID_OK
)
1578 wxLogMessage(wxT("Selected path: %s"), dialog
.GetPath().c_str());
1582 void MyFrame::DirChoose(wxCommandEvent
& WXUNUSED(event
) )
1584 DoDirChoose(wxDD_DEFAULT_STYLE
| wxDD_DIR_MUST_EXIST
);
1587 void MyFrame::DirChooseNew(wxCommandEvent
& WXUNUSED(event
) )
1589 DoDirChoose(wxDD_DEFAULT_STYLE
& ~wxDD_DIR_MUST_EXIST
);
1591 #endif // wxUSE_DIRDLG
1593 #if USE_DIRDLG_GENERIC
1594 void MyFrame::GenericDirChoose(wxCommandEvent
& WXUNUSED(event
) )
1596 // pass some initial dir to wxDirDialog
1598 wxGetHomeDir(&dirHome
);
1600 wxGenericDirDialog
dialog(this, wxT("Testing generic directory picker"), dirHome
);
1602 if (dialog
.ShowModal() == wxID_OK
)
1604 wxMessageDialog
dialog2(this, dialog
.GetPath(), wxT("Selected path"));
1605 dialog2
.ShowModal();
1608 #endif // USE_DIRDLG_GENERIC
1610 #if USE_MODAL_PRESENTATION
1611 void MyFrame::ModalDlg(wxCommandEvent
& WXUNUSED(event
))
1613 MyModalDialog
dlg(this);
1616 #endif // USE_MODAL_PRESENTATION
1618 void MyFrame::ModelessDlg(wxCommandEvent
& event
)
1620 bool show
= GetMenuBar()->IsChecked(event
.GetId());
1626 m_dialog
= new MyModelessDialog(this);
1629 m_dialog
->Show(true);
1633 // If m_dialog is NULL, then possibly the system
1634 // didn't report the checked menu item status correctly.
1635 // It should be true just after the menu item was selected,
1636 // if there was no modeless dialog yet.
1638 wxASSERT( m_dialog
!= NULL
);
1644 void MyFrame::DlgCenteredScreen(wxCommandEvent
& WXUNUSED(event
))
1646 wxDialog
dlg(this, wxID_ANY
, wxT("Dialog centered on screen"),
1647 wxDefaultPosition
, wxSize(200, 100));
1648 (new wxButton(&dlg
, wxID_OK
, wxT("Close")))->Centre();
1649 dlg
.CentreOnScreen();
1653 void MyFrame::DlgCenteredParent(wxCommandEvent
& WXUNUSED(event
))
1655 wxDialog
dlg(this, wxID_ANY
, wxT("Dialog centered on parent"),
1656 wxDefaultPosition
, wxSize(200, 100));
1657 (new wxButton(&dlg
, wxID_OK
, wxT("Close")))->Centre();
1658 dlg
.CentreOnParent();
1663 void MyFrame::MiniFrame(wxCommandEvent
& WXUNUSED(event
))
1665 wxFrame
*frame
= new wxMiniFrame(this, wxID_ANY
, wxT("Mini frame"),
1666 wxDefaultPosition
, wxSize(300, 100),
1667 wxCAPTION
| wxCLOSE_BOX
);
1668 new wxStaticText(frame
,
1670 wxT("Mini frames have slightly different appearance"),
1672 new wxStaticText(frame
,
1674 wxT("from the normal frames but that's the only difference."),
1677 frame
->CentreOnParent();
1680 #endif // wxUSE_MINIFRAME
1682 void MyFrame::DlgOnTop(wxCommandEvent
& WXUNUSED(event
))
1684 wxDialog
dlg(this, wxID_ANY
, wxT("Dialog staying on top of other windows"),
1685 wxDefaultPosition
, wxSize(300, 100),
1686 wxDEFAULT_DIALOG_STYLE
| wxSTAY_ON_TOP
);
1687 (new wxButton(&dlg
, wxID_OK
, wxT("Close")))->Centre();
1691 #if wxUSE_STARTUP_TIPS
1692 void MyFrame::ShowTip(wxCommandEvent
& WXUNUSED(event
))
1694 static size_t s_index
= (size_t)-1;
1696 if ( s_index
== (size_t)-1 )
1700 // this is completely bogus, we don't know how many lines are there
1701 // in the file, but who cares, it's a demo only...
1702 s_index
= rand() % 5;
1705 wxTipProvider
*tipProvider
= wxCreateFileTipProvider(wxT("tips.txt"), s_index
);
1707 bool showAtStartup
= wxShowTip(this, tipProvider
);
1709 if ( showAtStartup
)
1711 wxMessageBox(wxT("Will show tips on startup"), wxT("Tips dialog"),
1712 wxOK
| wxICON_INFORMATION
, this);
1715 s_index
= tipProvider
->GetCurrentTip();
1718 #endif // wxUSE_STARTUP_TIPS
1720 #if USE_SETTINGS_DIALOG
1721 void MyFrame::OnPropertySheet(wxCommandEvent
& event
)
1723 SettingsDialog
dialog(this, event
.GetId());
1726 #endif // USE_SETTINGS_DIALOG
1728 void MyFrame::OnRequestUserAttention(wxCommandEvent
& WXUNUSED(event
))
1730 wxLogStatus(wxT("Sleeping for 3 seconds to allow you to switch to another window"));
1734 RequestUserAttention(wxUSER_ATTENTION_ERROR
);
1737 #if wxUSE_NOTIFICATION_MESSAGE
1739 void MyFrame::OnNotifMsgAuto(wxCommandEvent
& WXUNUSED(event
))
1741 if ( !wxNotificationMessage
1743 "Automatic Notification",
1744 "Nothing important has happened\n"
1745 "this notification will disappear soon."
1748 wxLogStatus("Failed to show notification message");
1752 void MyFrame::OnNotifMsgShow(wxCommandEvent
& WXUNUSED(event
))
1756 m_notifMsg
= new wxNotificationMessage
1758 "wxWidgets Manual Notification",
1759 "You can hide this notification from the menu",
1764 if ( !m_notifMsg
->Show(wxNotificationMessage::Timeout_Never
) )
1766 wxLogStatus("Failed to show manual notification message");
1770 void MyFrame::OnNotifMsgHide(wxCommandEvent
& WXUNUSED(event
))
1772 if ( m_notifMsg
&& !m_notifMsg
->Close() )
1774 wxLogStatus("Failed to hide manual notification message");
1778 #endif // wxUSE_NOTIFICATION_MESSAGE
1780 void MyFrame::OnStandardButtonsSizerDialog(wxCommandEvent
& WXUNUSED(event
))
1782 StdButtonSizerDialog
dialog(this);
1786 // TestDefaultAction
1788 #define ID_CATCH_LISTBOX_DCLICK 100
1789 #define ID_LISTBOX 101
1790 #define ID_DISABLE_OK 102
1791 #define ID_DISABLE_CANCEL 103
1793 BEGIN_EVENT_TABLE(TestDefaultActionDialog
, wxDialog
)
1794 EVT_CHECKBOX(ID_CATCH_LISTBOX_DCLICK
, TestDefaultActionDialog::OnCatchListBoxDClick
)
1795 EVT_CHECKBOX(ID_DISABLE_OK
, TestDefaultActionDialog::OnDisableOK
)
1796 EVT_CHECKBOX(ID_DISABLE_CANCEL
, TestDefaultActionDialog::OnDisableCancel
)
1797 EVT_LISTBOX_DCLICK(ID_LISTBOX
, TestDefaultActionDialog::OnListBoxDClick
)
1798 EVT_TEXT_ENTER(wxID_ANY
, TestDefaultActionDialog::OnTextEnter
)
1801 TestDefaultActionDialog::TestDefaultActionDialog( wxWindow
*parent
) :
1802 wxDialog( parent
, -1, "Test default action" )
1804 m_catchListBoxDClick
= false;
1806 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxVERTICAL
);
1808 wxFlexGridSizer
*grid_sizer
= new wxFlexGridSizer( 2, 5, 5 );
1811 wxListBox
*listbox
= new wxListBox( this, ID_LISTBOX
);
1812 listbox
->Append( "String 1" );
1813 listbox
->Append( "String 2" );
1814 listbox
->Append( "String 3" );
1815 listbox
->Append( "String 4" );
1816 grid_sizer
->Add( listbox
);
1817 #endif // wxUSE_LISTBOX
1819 grid_sizer
->Add( new wxCheckBox( this, ID_CATCH_LISTBOX_DCLICK
, "Catch DoubleClick from wxListBox" ), 0, wxALIGN_CENTRE_VERTICAL
);
1821 grid_sizer
->Add( new wxTextCtrl( this, -1, "", wxDefaultPosition
, wxSize(80,-1), 0 ), 0, wxALIGN_CENTRE_VERTICAL
);
1822 grid_sizer
->Add( new wxStaticText( this, -1, "wxTextCtrl without wxTE_PROCESS_ENTER" ), 0, wxALIGN_CENTRE_VERTICAL
);
1824 grid_sizer
->Add( new wxTextCtrl( this, -1, "", wxDefaultPosition
, wxSize(80,-1), wxTE_PROCESS_ENTER
), 0, wxALIGN_CENTRE_VERTICAL
);
1825 grid_sizer
->Add( new wxStaticText( this, -1, "wxTextCtrl with wxTE_PROCESS_ENTER" ), 0, wxALIGN_CENTRE_VERTICAL
);
1827 grid_sizer
->Add( new wxCheckBox(this, ID_DISABLE_OK
, "Disable \"OK\""), 0, wxALIGN_CENTRE_VERTICAL
);
1828 grid_sizer
->Add( new wxCheckBox(this, ID_DISABLE_CANCEL
, "Disable \"Cancel\""), 0, wxALIGN_CENTRE_VERTICAL
);
1830 main_sizer
->Add( grid_sizer
, 0, wxALL
, 10 );
1832 wxSizer
*button_sizer
= CreateSeparatedButtonSizer( wxOK
|wxCANCEL
);
1834 main_sizer
->Add( button_sizer
, 0, wxALL
|wxGROW
, 5 );
1836 SetSizerAndFit( main_sizer
);
1839 void TestDefaultActionDialog::OnDisableOK(wxCommandEvent
& event
)
1841 FindWindow(wxID_OK
)->Enable(!event
.IsChecked());
1844 void TestDefaultActionDialog::OnDisableCancel(wxCommandEvent
& event
)
1846 FindWindow(wxID_CANCEL
)->Enable(!event
.IsChecked());
1849 void TestDefaultActionDialog::OnListBoxDClick(wxCommandEvent
& event
)
1851 event
.Skip( !m_catchListBoxDClick
);
1854 void TestDefaultActionDialog::OnCatchListBoxDClick(wxCommandEvent
& WXUNUSED(event
))
1856 m_catchListBoxDClick
= !m_catchListBoxDClick
;
1859 void TestDefaultActionDialog::OnTextEnter(wxCommandEvent
& event
)
1861 wxLogMessage("Text \"%s\" entered.", event
.GetString());
1864 void MyFrame::OnTestDefaultActionDialog(wxCommandEvent
& WXUNUSED(event
))
1866 TestDefaultActionDialog
dialog( this );
1870 void MyFrame::OnExit(wxCommandEvent
& WXUNUSED(event
) )
1875 #if wxUSE_PROGRESSDLG
1877 void MyFrame::ShowProgress( wxCommandEvent
& WXUNUSED(event
) )
1879 static const int max
= 100;
1881 wxProgressDialog
dialog("Progress dialog example",
1882 // "Reserve" enough space for the multiline
1883 // messages below, we'll change it anyhow
1884 // immediately in the loop below
1885 wxString(' ', 100) + "\n\n\n\n",
1891 //wxPD_AUTO_HIDE | // -- try this as well
1893 wxPD_ESTIMATED_TIME
|
1894 wxPD_REMAINING_TIME
|
1895 wxPD_SMOOTH
// - makes indeterminate mode bar on WinXP very small
1899 for ( int i
= 0; i
<= max
; i
++ )
1903 // test both modes of wxProgressDialog behaviour: start in
1904 // indeterminate mode but switch to the determinate one later
1905 const bool determinate
= i
> max
/2;
1909 msg
= "That's all, folks!\n"
1911 "Nothing to see here any more.";
1913 else if ( !determinate
)
1915 msg
= "Testing indeterminate mode\n"
1917 "This mode allows you to show to the user\n"
1918 "that something is going on even if you don't know\n"
1919 "when exactly will you finish.";
1921 else if ( determinate
)
1923 msg
= "Now in standard determinate mode\n"
1925 "This is the standard usage mode in which you\n"
1926 "update the dialog after performing each new step of work.\n"
1927 "It requires knowing the total number of steps in advance.";
1930 // will be set to true if "Skip" button was pressed
1934 cont
= dialog
.Update(i
, msg
, &skip
);
1938 cont
= dialog
.Pulse(msg
, &skip
);
1941 // each skip will move progress about quarter forward
1952 if ( wxMessageBox(wxT("Do you really want to cancel?"),
1953 wxT("Progress dialog question"), // caption
1954 wxYES_NO
| wxICON_QUESTION
) == wxYES
)
1966 wxLogStatus(wxT("Progress dialog aborted!"));
1970 wxLogStatus(wxT("Countdown from %d finished"), max
);
1974 #endif // wxUSE_PROGRESSDLG
1978 static void InitAboutInfoMinimal(wxAboutDialogInfo
& info
)
1980 info
.SetName(wxT("Dialogs Sample"));
1981 info
.SetVersion(wxVERSION_NUM_DOT_STRING
,
1985 wxMINOR_VERSION
% 2 ? "Development" : "Stable",
1986 wxVERSION_NUM_DOT_STRING
1988 info
.SetDescription(wxT("This sample shows different wxWidgets dialogs"));
1989 info
.SetCopyright(wxT("(C) 1998-2006 wxWidgets dev team"));
1990 info
.AddDeveloper(wxT("Vadim Zeitlin"));
1993 static void InitAboutInfoWebsite(wxAboutDialogInfo
& info
)
1995 InitAboutInfoMinimal(info
);
1997 info
.SetWebSite(wxT("http://www.wxwidgets.org/"), wxT("wxWidgets web site"));
2000 static void InitAboutInfoAll(wxAboutDialogInfo
& info
)
2002 InitAboutInfoWebsite(info
);
2004 // we can add a second developer
2005 info
.AddDeveloper(wxT("A.N. Other"));
2007 // or we can add several persons at once like this
2008 static const wxChar
*docwriters
[] =
2010 wxT("First D. Writer"),
2014 info
.SetDocWriters(wxArrayString(WXSIZEOF(docwriters
), docwriters
));
2015 info
.SetLicence(wxString::FromAscii(
2016 " wxWindows Library Licence, Version 3.1\n"
2017 " ======================================\n"
2019 " Copyright (c) 1998-2005 Julian Smart, Robert Roebling et al\n"
2021 " Everyone is permitted to copy and distribute verbatim copies\n"
2022 " of this licence document, but changing it is not allowed.\n"
2024 " WXWINDOWS LIBRARY LICENCE\n"
2025 " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n"
2027 " ...and so on and so forth...\n"
2030 info
.AddTranslator(wxT("Wun Ngo Wen (Martian)"));
2033 void MyFrame::ShowSimpleAboutDialog(wxCommandEvent
& WXUNUSED(event
))
2035 wxAboutDialogInfo info
;
2036 InitAboutInfoMinimal(info
);
2038 wxAboutBox(info
, this);
2041 void MyFrame::ShowFancyAboutDialog(wxCommandEvent
& WXUNUSED(event
))
2043 wxAboutDialogInfo info
;
2044 InitAboutInfoWebsite(info
);
2046 wxAboutBox(info
, this);
2049 void MyFrame::ShowFullAboutDialog(wxCommandEvent
& WXUNUSED(event
))
2051 wxAboutDialogInfo info
;
2052 InitAboutInfoAll(info
);
2054 wxAboutBox(info
, this);
2057 // a trivial example of a custom dialog class
2058 class MyAboutDialog
: public wxGenericAboutDialog
2061 MyAboutDialog(const wxAboutDialogInfo
& info
, wxWindow
* parent
)
2063 Create(info
, parent
);
2066 // add some custom controls
2067 virtual void DoAddCustomControls()
2069 AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
2070 AddText(wxT("Some custom text"));
2071 AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
2075 void MyFrame::ShowCustomAboutDialog(wxCommandEvent
& WXUNUSED(event
))
2077 wxAboutDialogInfo info
;
2078 InitAboutInfoAll(info
);
2080 MyAboutDialog
dlg(info
, this);
2084 #endif // wxUSE_ABOUTDLG
2088 void MyFrame::ShowBusyInfo(wxCommandEvent
& WXUNUSED(event
))
2090 wxWindowDisabler disableAll
;
2092 wxBusyInfo
info(wxT("Working, please wait..."), this);
2094 for ( int i
= 0; i
< 18; i
++ )
2104 #endif // wxUSE_BUSYINFO
2106 #if wxUSE_FINDREPLDLG
2108 void MyFrame::ShowReplaceDialog( wxCommandEvent
& WXUNUSED(event
) )
2112 wxDELETE(m_dlgReplace
);
2116 m_dlgReplace
= new wxFindReplaceDialog
2120 wxT("Find and replace dialog"),
2124 m_dlgReplace
->Show(true);
2128 void MyFrame::ShowFindDialog( wxCommandEvent
& WXUNUSED(event
) )
2132 wxDELETE(m_dlgFind
);
2136 m_dlgFind
= new wxFindReplaceDialog
2145 m_dlgFind
->Show(true);
2149 static wxString
DecodeFindDialogEventFlags(int flags
)
2152 str
<< (flags
& wxFR_DOWN
? wxT("down") : wxT("up")) << wxT(", ")
2153 << (flags
& wxFR_WHOLEWORD
? wxT("whole words only, ") : wxT(""))
2154 << (flags
& wxFR_MATCHCASE
? wxT("") : wxT("not "))
2155 << wxT("case sensitive");
2160 void MyFrame::OnFindDialog(wxFindDialogEvent
& event
)
2162 wxEventType type
= event
.GetEventType();
2164 if ( type
== wxEVT_COMMAND_FIND
|| type
== wxEVT_COMMAND_FIND_NEXT
)
2166 wxLogMessage(wxT("Find %s'%s' (flags: %s)"),
2167 type
== wxEVT_COMMAND_FIND_NEXT
? wxT("next ") : wxT(""),
2168 event
.GetFindString().c_str(),
2169 DecodeFindDialogEventFlags(event
.GetFlags()).c_str());
2171 else if ( type
== wxEVT_COMMAND_FIND_REPLACE
||
2172 type
== wxEVT_COMMAND_FIND_REPLACE_ALL
)
2174 wxLogMessage(wxT("Replace %s'%s' with '%s' (flags: %s)"),
2175 type
== wxEVT_COMMAND_FIND_REPLACE_ALL
? wxT("all ") : wxT(""),
2176 event
.GetFindString().c_str(),
2177 event
.GetReplaceString().c_str(),
2178 DecodeFindDialogEventFlags(event
.GetFlags()).c_str());
2180 else if ( type
== wxEVT_COMMAND_FIND_CLOSE
)
2182 wxFindReplaceDialog
*dlg
= event
.GetDialog();
2186 if ( dlg
== m_dlgFind
)
2189 idMenu
= DIALOGS_FIND
;
2192 else if ( dlg
== m_dlgReplace
)
2194 txt
= wxT("Replace");
2195 idMenu
= DIALOGS_REPLACE
;
2196 m_dlgReplace
= NULL
;
2200 txt
= wxT("Unknown");
2203 wxFAIL_MSG( wxT("unexpected event") );
2206 wxLogMessage(wxT("%s dialog is being closed."), txt
);
2208 if ( idMenu
!= wxID_ANY
)
2210 GetMenuBar()->Check(idMenu
, false);
2217 wxLogError(wxT("Unknown find dialog event!"));
2221 #endif // wxUSE_FINDREPLDLG
2223 // ----------------------------------------------------------------------------
2225 // ----------------------------------------------------------------------------
2227 void MyCanvas::OnPaint(wxPaintEvent
& WXUNUSED(event
) )
2230 dc
.SetBackgroundMode(wxTRANSPARENT
);
2232 wxT("wxWidgets common dialogs")
2233 #if !defined(__SMARTPHONE__)
2234 wxT(" test application")
2239 #if USE_MODAL_PRESENTATION
2241 // ----------------------------------------------------------------------------
2243 // ----------------------------------------------------------------------------
2245 MyModelessDialog::MyModelessDialog(wxWindow
*parent
)
2246 : wxDialog(parent
, wxID_ANY
, wxString(wxT("Modeless dialog")))
2248 wxBoxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
);
2250 wxButton
*btn
= new wxButton(this, DIALOGS_MODELESS_BTN
, wxT("Press me"));
2251 wxCheckBox
*check
= new wxCheckBox(this, wxID_ANY
, wxT("Should be disabled"));
2254 sizerTop
->Add(btn
, 1, wxEXPAND
| wxALL
, 5);
2255 sizerTop
->Add(check
, 1, wxEXPAND
| wxALL
, 5);
2257 SetSizerAndFit(sizerTop
);
2260 void MyModelessDialog::OnButton(wxCommandEvent
& WXUNUSED(event
))
2262 wxMessageBox(wxT("Button pressed in modeless dialog"), wxT("Info"),
2263 wxOK
| wxICON_INFORMATION
, this);
2266 void MyModelessDialog::OnClose(wxCloseEvent
& event
)
2268 if ( event
.CanVeto() )
2270 wxMessageBox(wxT("Use the menu item to close this dialog"),
2271 wxT("Modeless dialog"),
2272 wxOK
| wxICON_INFORMATION
, this);
2278 // ----------------------------------------------------------------------------
2280 // ----------------------------------------------------------------------------
2282 MyModalDialog::MyModalDialog(wxWindow
*parent
)
2283 : wxDialog(parent
, wxID_ANY
, wxString(wxT("Modal dialog")))
2285 wxBoxSizer
*sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
2287 m_btnModal
= new wxButton(this, wxID_ANY
, wxT("&Modal dialog..."));
2288 m_btnModeless
= new wxButton(this, wxID_ANY
, wxT("Mode&less dialog"));
2289 m_btnDelete
= new wxButton(this, wxID_ANY
, wxT("&Delete button"));
2291 sizerTop
->Add(m_btnModal
, 0, wxALIGN_CENTER
| wxALL
, 5);
2292 sizerTop
->Add(m_btnModeless
, 0, wxALIGN_CENTER
| wxALL
, 5);
2293 sizerTop
->Add(m_btnDelete
, 0, wxALIGN_CENTER
| wxALL
, 5);
2294 sizerTop
->Add(new wxButton(this, wxID_CLOSE
), 0, wxALIGN_CENTER
| wxALL
, 5);
2296 SetSizerAndFit(sizerTop
);
2298 SetEscapeId(wxID_CLOSE
);
2300 m_btnModal
->SetFocus();
2301 m_btnModal
->SetDefault();
2304 void MyModalDialog::OnButton(wxCommandEvent
& event
)
2306 if ( event
.GetEventObject() == m_btnDelete
)
2308 wxDELETE(m_btnModal
);
2309 m_btnDelete
->Disable();
2311 else if ( event
.GetEventObject() == m_btnModal
)
2314 wxGetTextFromUser(wxT("Dummy prompt"),
2315 wxT("Modal dialog called from dialog"),
2316 wxEmptyString
, this);
2318 wxMessageBox(wxT("Modal dialog called from dialog"));
2319 #endif // wxUSE_TEXTDLG
2321 else if ( event
.GetEventObject() == m_btnModeless
)
2323 (new MyModelessDialog(this))->Show();
2331 #endif // USE_MODAL_PRESENTATION
2333 // ----------------------------------------------------------------------------
2334 // StdButtonSizerDialog
2335 // ----------------------------------------------------------------------------
2337 StdButtonSizerDialog::StdButtonSizerDialog(wxWindow
*parent
)
2338 : wxDialog(parent
, wxID_ANY
, wxString(wxT("StdButtonSizer dialog")),
2339 wxDefaultPosition
, wxDefaultSize
, wxDEFAULT_DIALOG_STYLE
|wxRESIZE_BORDER
),
2340 m_buttonsSizer(NULL
)
2342 wxBoxSizer
*const sizerTop
= new wxBoxSizer(wxVERTICAL
);
2344 wxBoxSizer
*const sizer
= new wxBoxSizer(wxHORIZONTAL
);
2345 wxBoxSizer
*const sizerInside1
= new wxBoxSizer(wxVERTICAL
);
2347 m_chkboxAffirmativeButton
= new wxCheckBox(this, wxID_ANY
, _("Enable Affirmative Button"));
2349 wxStaticBoxSizer
*const sizer1
= new wxStaticBoxSizer(wxVERTICAL
, this, wxT("Affirmative Button"));
2351 m_radiobtnOk
= new wxRadioButton(this, wxID_ANY
, _("Ok"), wxDefaultPosition
, wxDefaultSize
, wxRB_GROUP
);
2352 m_radiobtnYes
= new wxRadioButton(this, wxID_ANY
, _("Yes"));
2354 wxBoxSizer
*const sizerInside2
= new wxBoxSizer(wxVERTICAL
);
2356 m_chkboxDismissButton
= new wxCheckBox(this, wxID_ANY
, _("Enable Dismiss Button"));
2358 wxStaticBoxSizer
*const sizer2
= new wxStaticBoxSizer(wxVERTICAL
, this, wxT("Dismiss Button"));
2360 m_radiobtnCancel
= new wxRadioButton(this, wxID_ANY
, _("Cancel"), wxDefaultPosition
, wxDefaultSize
, wxRB_GROUP
);
2361 m_radiobtnClose
= new wxRadioButton(this, wxID_ANY
, _("Close"));
2363 wxBoxSizer
*const sizer3
= new wxBoxSizer(wxHORIZONTAL
);
2365 m_chkboxNo
= new wxCheckBox(this, wxID_ANY
, _("No"));
2366 m_chkboxHelp
= new wxCheckBox(this, wxID_ANY
, _("Help"));
2367 m_chkboxApply
= new wxCheckBox(this, wxID_ANY
, _("Apply"));
2369 m_chkboxNoDefault
= new wxCheckBox(this, wxID_ANY
, wxT("No Default"));
2371 sizer1
->Add(m_radiobtnOk
, 0, wxALL
, 5);
2372 sizer1
->Add(m_radiobtnYes
, 0, wxALL
, 5);
2374 sizer
->Add(sizerInside1
, 0, 0, 0);
2375 sizerInside1
->Add(m_chkboxAffirmativeButton
, 0, wxALL
, 5);
2376 sizerInside1
->Add(sizer1
, 0, wxALL
, 5);
2377 sizerInside1
->SetItemMinSize(sizer1
, sizer1
->GetStaticBox()->GetBestSize()); // to prevent wrapping of static box label
2379 sizer2
->Add(m_radiobtnCancel
, 0, wxALL
, 5);
2380 sizer2
->Add(m_radiobtnClose
, 0, wxALL
, 5);
2382 sizer
->Add(sizerInside2
, 0, 0, 0);
2383 sizerInside2
->Add(m_chkboxDismissButton
, 0, wxALL
, 5);
2384 sizerInside2
->Add(sizer2
, 0, wxALL
, 5);
2385 sizerInside2
->SetItemMinSize(sizer2
, sizer2
->GetStaticBox()->GetBestSize()); // to prevent wrapping of static box label
2387 sizerTop
->Add(sizer
, 0, wxALL
, 5);
2389 sizer3
->Add(m_chkboxNo
, 0, wxALL
, 5);
2390 sizer3
->Add(m_chkboxHelp
, 0, wxALL
, 5);
2391 sizer3
->Add(m_chkboxApply
, 0, wxALL
, 5);
2393 sizerTop
->Add(sizer3
, 0, wxALL
, 5);
2395 sizerTop
->Add(m_chkboxNoDefault
, 0, wxLEFT
|wxRIGHT
, 10);
2397 EnableDisableControls();
2399 SetSizerAndFit(sizerTop
);
2405 void StdButtonSizerDialog::OnEvent(wxCommandEvent
& WXUNUSED(event
))
2409 m_buttonsSizer
->DeleteWindows();
2410 GetSizer()->Remove(m_buttonsSizer
);
2413 EnableDisableControls();
2416 unsigned long numButtons
= 0;
2418 if (m_chkboxAffirmativeButton
->IsChecked())
2420 if (m_radiobtnOk
->GetValue())
2425 else if (m_radiobtnYes
->GetValue())
2432 if (m_chkboxDismissButton
->IsChecked())
2434 if (m_radiobtnCancel
->GetValue())
2440 else if (m_radiobtnClose
->GetValue())
2448 if (m_chkboxApply
->IsChecked())
2454 if (m_chkboxNo
->IsChecked())
2460 if (m_chkboxHelp
->IsChecked())
2466 if (m_chkboxNoDefault
->IsChecked())
2468 flags
|= wxNO_DEFAULT
;
2471 m_buttonsSizer
= CreateStdDialogButtonSizer(flags
);
2472 GetSizer()->Add(m_buttonsSizer
, 0, wxGROW
|wxALL
, 5);
2475 GetSizer()->SetSizeHints(this);
2478 void StdButtonSizerDialog::EnableDisableControls()
2480 const bool affButtonEnabled
= m_chkboxAffirmativeButton
->IsChecked();
2482 m_radiobtnOk
->Enable(affButtonEnabled
);
2483 m_radiobtnYes
->Enable(affButtonEnabled
);
2485 const bool dismissButtonEnabled
= m_chkboxDismissButton
->IsChecked();
2487 m_radiobtnCancel
->Enable(dismissButtonEnabled
);
2488 m_radiobtnClose
->Enable(dismissButtonEnabled
);
2491 #if USE_SETTINGS_DIALOG
2492 // ----------------------------------------------------------------------------
2494 // ----------------------------------------------------------------------------
2496 IMPLEMENT_CLASS(SettingsDialog
, wxPropertySheetDialog
)
2498 BEGIN_EVENT_TABLE(SettingsDialog
, wxPropertySheetDialog
)
2501 SettingsDialog::SettingsDialog(wxWindow
* win
, int dialogType
)
2503 SetExtraStyle(wxDIALOG_EX_CONTEXTHELP
|wxWS_EX_VALIDATE_RECURSIVELY
);
2508 bool useToolBook
= (dialogType
== DIALOGS_PROPERTY_SHEET_TOOLBOOK
|| dialogType
== DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK
);
2509 int resizeBorder
= wxRESIZE_BORDER
;
2517 int sheetStyle
= wxPROPSHEET_SHRINKTOFIT
;
2518 if (dialogType
== DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK
)
2519 sheetStyle
|= wxPROPSHEET_BUTTONTOOLBOOK
;
2521 sheetStyle
|= wxPROPSHEET_TOOLBOOK
;
2523 SetSheetStyle(sheetStyle
);
2524 SetSheetInnerBorder(0);
2525 SetSheetOuterBorder(0);
2527 // create a dummy image list with a few icons
2528 const wxSize
imageSize(32, 32);
2530 m_imageList
= new wxImageList(imageSize
.GetWidth(), imageSize
.GetHeight());
2532 Add(wxArtProvider::GetIcon(wxART_INFORMATION
, wxART_OTHER
, imageSize
));
2534 Add(wxArtProvider::GetIcon(wxART_QUESTION
, wxART_OTHER
, imageSize
));
2536 Add(wxArtProvider::GetIcon(wxART_WARNING
, wxART_OTHER
, imageSize
));
2538 Add(wxArtProvider::GetIcon(wxART_ERROR
, wxART_OTHER
, imageSize
));
2543 Create(win
, wxID_ANY
, _("Preferences"), wxDefaultPosition
, wxDefaultSize
,
2544 wxDEFAULT_DIALOG_STYLE
| (int)wxPlatform::IfNot(wxOS_WINDOWS_CE
, resizeBorder
)
2547 // If using a toolbook, also follow Mac style and don't create buttons
2549 CreateButtons(wxOK
| wxCANCEL
|
2550 (int)wxPlatform::IfNot(wxOS_WINDOWS_CE
, wxHELP
)
2553 wxBookCtrlBase
* notebook
= GetBookCtrl();
2554 notebook
->SetImageList(m_imageList
);
2556 wxPanel
* generalSettings
= CreateGeneralSettingsPage(notebook
);
2557 wxPanel
* aestheticSettings
= CreateAestheticSettingsPage(notebook
);
2559 notebook
->AddPage(generalSettings
, _("General"), true, tabImage1
);
2560 notebook
->AddPage(aestheticSettings
, _("Aesthetics"), false, tabImage2
);
2565 SettingsDialog::~SettingsDialog()
2570 wxPanel
* SettingsDialog::CreateGeneralSettingsPage(wxWindow
* parent
)
2572 wxPanel
* panel
= new wxPanel(parent
, wxID_ANY
);
2574 wxBoxSizer
*topSizer
= new wxBoxSizer( wxVERTICAL
);
2575 wxBoxSizer
*item0
= new wxBoxSizer( wxVERTICAL
);
2579 wxBoxSizer
* itemSizer3
= new wxBoxSizer( wxHORIZONTAL
);
2580 wxCheckBox
* checkBox3
= new wxCheckBox(panel
, ID_LOAD_LAST_PROJECT
, _("&Load last project on startup"), wxDefaultPosition
, wxDefaultSize
);
2581 itemSizer3
->Add(checkBox3
, 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2582 item0
->Add(itemSizer3
, 0, wxGROW
|wxALL
, 0);
2586 wxString autoSaveLabel
= _("&Auto-save every");
2587 wxString minsLabel
= _("mins");
2589 wxBoxSizer
* itemSizer12
= new wxBoxSizer( wxHORIZONTAL
);
2590 wxCheckBox
* checkBox12
= new wxCheckBox(panel
, ID_AUTO_SAVE
, autoSaveLabel
, wxDefaultPosition
, wxDefaultSize
);
2593 wxSpinCtrl
* spinCtrl12
= new wxSpinCtrl(panel
, ID_AUTO_SAVE_MINS
, wxEmptyString
,
2594 wxDefaultPosition
, wxSize(40, wxDefaultCoord
), wxSP_ARROW_KEYS
, 1, 60, 1);
2597 itemSizer12
->Add(checkBox12
, 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2599 itemSizer12
->Add(spinCtrl12
, 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2601 itemSizer12
->Add(new wxStaticText(panel
, wxID_STATIC
, minsLabel
), 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2602 item0
->Add(itemSizer12
, 0, wxGROW
|wxALL
, 0);
2606 wxBoxSizer
* itemSizer8
= new wxBoxSizer( wxHORIZONTAL
);
2607 wxCheckBox
* checkBox6
= new wxCheckBox(panel
, ID_SHOW_TOOLTIPS
, _("Show &tooltips"), wxDefaultPosition
, wxDefaultSize
);
2608 itemSizer8
->Add(checkBox6
, 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2609 item0
->Add(itemSizer8
, 0, wxGROW
|wxALL
, 0);
2611 topSizer
->Add( item0
, 1, wxGROW
|wxALIGN_CENTRE
|wxALL
, 5 );
2613 panel
->SetSizerAndFit(topSizer
);
2618 wxPanel
* SettingsDialog::CreateAestheticSettingsPage(wxWindow
* parent
)
2620 wxPanel
* panel
= new wxPanel(parent
, wxID_ANY
);
2622 wxBoxSizer
*topSizer
= new wxBoxSizer( wxVERTICAL
);
2623 wxBoxSizer
*item0
= new wxBoxSizer( wxVERTICAL
);
2625 //// PROJECT OR GLOBAL
2626 wxString globalOrProjectChoices
[2];
2627 globalOrProjectChoices
[0] = _("&New projects");
2628 globalOrProjectChoices
[1] = _("&This project");
2630 wxRadioBox
* projectOrGlobal
= new wxRadioBox(panel
, ID_APPLY_SETTINGS_TO
, _("&Apply settings to:"),
2631 wxDefaultPosition
, wxDefaultSize
, 2, globalOrProjectChoices
);
2632 item0
->Add(projectOrGlobal
, 0, wxGROW
|wxALL
, 5);
2634 projectOrGlobal
->SetSelection(0);
2636 //// BACKGROUND STYLE
2637 wxArrayString backgroundStyleChoices
;
2638 backgroundStyleChoices
.Add(wxT("Colour"));
2639 backgroundStyleChoices
.Add(wxT("Image"));
2640 wxStaticBox
* staticBox3
= new wxStaticBox(panel
, wxID_ANY
, _("Background style:"));
2642 wxBoxSizer
* styleSizer
= new wxStaticBoxSizer( staticBox3
, wxVERTICAL
);
2643 item0
->Add(styleSizer
, 0, wxGROW
|wxALL
, 5);
2645 wxBoxSizer
* itemSizer2
= new wxBoxSizer( wxHORIZONTAL
);
2647 wxChoice
* choice2
= new wxChoice(panel
, ID_BACKGROUND_STYLE
, wxDefaultPosition
, wxDefaultSize
, backgroundStyleChoices
);
2649 itemSizer2
->Add(new wxStaticText(panel
, wxID_ANY
, _("&Window:")), 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2650 itemSizer2
->Add(5, 5, 1, wxALL
, 0);
2651 itemSizer2
->Add(choice2
, 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2653 styleSizer
->Add(itemSizer2
, 0, wxGROW
|wxALL
, 5);
2656 //// FONT SIZE SELECTION
2658 wxStaticBox
* staticBox1
= new wxStaticBox(panel
, wxID_ANY
, _("Tile font size:"));
2659 wxBoxSizer
* itemSizer5
= new wxStaticBoxSizer( staticBox1
, wxHORIZONTAL
);
2661 wxSpinCtrl
* spinCtrl
= new wxSpinCtrl(panel
, ID_FONT_SIZE
, wxEmptyString
, wxDefaultPosition
,
2662 wxSize(80, wxDefaultCoord
));
2663 itemSizer5
->Add(spinCtrl
, 0, wxALL
|wxALIGN_CENTER_HORIZONTAL
|wxALIGN_CENTER_VERTICAL
, 5);
2665 item0
->Add(itemSizer5
, 0, wxGROW
|wxLEFT
|wxRIGHT
, 5);
2668 topSizer
->Add( item0
, 1, wxGROW
|wxALIGN_CENTRE
|wxALL
, 5 );
2669 topSizer
->AddSpacer(5);
2671 panel
->SetSizerAndFit(topSizer
);
2676 #endif // USE_SETTINGS_DIALOG
2679 // ----------------------------------------------------------------------------
2680 // TestMessageBoxDialog
2681 // ----------------------------------------------------------------------------
2684 const TestMessageBoxDialog::BtnInfo
TestMessageBoxDialog::ms_btnInfo
[] =
2689 { wxCANCEL
, "&Cancel" },
2690 { wxHELP
, "&Help" },
2693 BEGIN_EVENT_TABLE(TestMessageBoxDialog
, wxDialog
)
2694 EVT_BUTTON(wxID_APPLY
, TestMessageBoxDialog::OnApply
)
2695 EVT_BUTTON(wxID_CLOSE
, TestMessageBoxDialog::OnClose
)
2698 TestMessageBoxDialog::TestMessageBoxDialog(wxWindow
*parent
)
2699 : wxDialog(parent
, wxID_ANY
, "Message Box Test Dialog",
2700 wxDefaultPosition
, wxDefaultSize
,
2701 wxDEFAULT_DIALOG_STYLE
| wxRESIZE_BORDER
)
2705 bool TestMessageBoxDialog::Create()
2707 wxSizer
* const sizerTop
= new wxBoxSizer(wxVERTICAL
);
2709 // this sizer allows to configure the messages shown in the message box
2711 sizerMsgs
= new wxStaticBoxSizer(wxVERTICAL
, this, "&Messages");
2712 sizerMsgs
->Add(new wxStaticText(this, wxID_ANY
, "&Main message:"));
2713 m_textMsg
= new wxTextCtrl(this, wxID_ANY
, "Hello from a box!",
2714 wxDefaultPosition
, wxDefaultSize
,
2716 sizerMsgs
->Add(m_textMsg
, wxSizerFlags(1).Expand().Border(wxBOTTOM
));
2718 sizerMsgs
->Add(new wxStaticText(this, wxID_ANY
, "&Extended message:"));
2719 m_textExtMsg
= new wxTextCtrl(this, wxID_ANY
, "",
2720 wxDefaultPosition
, wxDefaultSize
,
2722 sizerMsgs
->Add(m_textExtMsg
, wxSizerFlags(1).Expand());
2724 sizerTop
->Add(sizerMsgs
, wxSizerFlags(1).Expand().Border());
2726 // if a derived class provides more message configurations, add these.
2727 AddAdditionalTextOptions(sizerTop
);
2729 // this one is for configuring the buttons
2731 sizerBtnsBox
= new wxStaticBoxSizer(wxVERTICAL
, this, "&Buttons");
2733 wxFlexGridSizer
* const sizerBtns
= new wxFlexGridSizer(2, 5, 5);
2734 sizerBtns
->AddGrowableCol(1);
2736 sizerBtns
->Add(new wxStaticText(this, wxID_ANY
, "Button(s)"));
2737 sizerBtns
->Add(new wxStaticText(this, wxID_ANY
, "Custom label"));
2739 for ( int n
= 0; n
< Btn_Max
; n
++ )
2741 m_buttons
[n
] = new wxCheckBox(this, wxID_ANY
, ms_btnInfo
[n
].name
);
2742 sizerBtns
->Add(m_buttons
[n
], wxSizerFlags().Centre().Left());
2744 m_labels
[n
] = new wxTextCtrl(this, wxID_ANY
);
2745 sizerBtns
->Add(m_labels
[n
], wxSizerFlags(1).Centre().Expand());
2747 m_labels
[n
]->Connect(wxEVT_UPDATE_UI
,
2748 wxUpdateUIEventHandler(
2749 TestMessageBoxDialog::OnUpdateLabelUI
),
2754 sizerBtnsBox
->Add(sizerBtns
, wxSizerFlags(1).Expand());
2755 sizerTop
->Add(sizerBtnsBox
, wxSizerFlags().Expand().Border());
2759 const wxString icons
[] =
2763 "&Information icon",
2769 wxCOMPILE_TIME_ASSERT( WXSIZEOF(icons
) == MsgDlgIcon_Max
, IconMismatch
);
2771 m_icons
= new wxRadioBox(this, wxID_ANY
, "&Icon style",
2772 wxDefaultPosition
, wxDefaultSize
,
2773 WXSIZEOF(icons
), icons
,
2774 2, wxRA_SPECIFY_ROWS
);
2775 // Make the 'Information' icon the default one:
2776 m_icons
->SetSelection(MsgDlgIcon_Info
);
2777 sizerTop
->Add(m_icons
, wxSizerFlags().Expand().Border());
2780 // miscellaneous other stuff
2782 sizerFlags
= new wxStaticBoxSizer(wxHORIZONTAL
, this, "&Other flags");
2784 m_chkNoDefault
= new wxCheckBox(this, wxID_ANY
, "Make \"No\" &default");
2785 m_chkNoDefault
->Connect(wxEVT_UPDATE_UI
,
2786 wxUpdateUIEventHandler(
2787 TestMessageBoxDialog::OnUpdateNoDefaultUI
),
2790 sizerFlags
->Add(m_chkNoDefault
, wxSizerFlags(1).Border());
2792 m_chkCentre
= new wxCheckBox(this, wxID_ANY
, "Centre on &parent");
2793 sizerFlags
->Add(m_chkCentre
, wxSizerFlags(1).Border());
2795 // add any additional flag from subclasses
2796 AddAdditionalFlags(sizerFlags
);
2798 sizerTop
->Add(sizerFlags
, wxSizerFlags().Expand().Border());
2800 // finally buttons to show the resulting message box and close this dialog
2801 sizerTop
->Add(CreateStdDialogButtonSizer(wxAPPLY
| wxCLOSE
),
2802 wxSizerFlags().Right().Border());
2804 SetSizerAndFit(sizerTop
);
2806 m_buttons
[Btn_Ok
]->SetValue(true);
2811 void TestMessageBoxDialog::OnUpdateLabelUI(wxUpdateUIEvent
& event
)
2813 for ( int n
= 0; n
< Btn_Max
; n
++ )
2815 if ( event
.GetEventObject() == m_labels
[n
] )
2817 event
.Enable( m_buttons
[n
]->IsChecked() );
2822 wxFAIL_MSG( "called for unknown label" );
2825 void TestMessageBoxDialog::OnUpdateNoDefaultUI(wxUpdateUIEvent
& event
)
2827 event
.Enable( m_buttons
[Btn_No
]->IsChecked() );
2830 long TestMessageBoxDialog::GetStyle()
2834 for ( int n
= 0; n
< Btn_Max
; n
++ )
2836 if ( m_buttons
[n
]->IsChecked() )
2837 style
|= ms_btnInfo
[n
].flag
;
2840 switch ( m_icons
->GetSelection() )
2842 case MsgDlgIcon_Max
:
2843 wxFAIL_MSG( "unexpected selection" );
2848 case MsgDlgIcon_None
:
2849 style
|= wxICON_NONE
;
2852 case MsgDlgIcon_Info
:
2853 style
|= wxICON_INFORMATION
;
2856 case MsgDlgIcon_Question
:
2857 style
|= wxICON_QUESTION
;
2860 case MsgDlgIcon_Warning
:
2861 style
|= wxICON_WARNING
;
2864 case MsgDlgIcon_Error
:
2865 style
|= wxICON_ERROR
;
2869 if ( m_chkCentre
->IsChecked() )
2872 if ( m_chkNoDefault
->IsEnabled() && m_chkNoDefault
->IsChecked() )
2873 style
|= wxNO_DEFAULT
;
2878 void TestMessageBoxDialog::PrepareMessageDialog(wxMessageDialogBase
&dlg
)
2880 long style
= dlg
.GetMessageDialogStyle();
2882 if ( !m_textExtMsg
->IsEmpty() )
2883 dlg
.SetExtendedMessage(m_textExtMsg
->GetValue());
2885 if ( style
& wxYES_NO
)
2887 if ( style
& wxCANCEL
)
2889 dlg
.SetYesNoCancelLabels(m_labels
[Btn_Yes
]->GetValue(),
2890 m_labels
[Btn_No
]->GetValue(),
2891 m_labels
[Btn_Cancel
]->GetValue());
2895 dlg
.SetYesNoLabels(m_labels
[Btn_Yes
]->GetValue(),
2896 m_labels
[Btn_No
]->GetValue());
2901 if ( style
& wxCANCEL
)
2903 dlg
.SetOKCancelLabels(m_labels
[Btn_Ok
]->GetValue(),
2904 m_labels
[Btn_Cancel
]->GetValue());
2908 dlg
.SetOKLabel(m_labels
[Btn_Ok
]->GetValue());
2912 if ( style
& wxHELP
)
2914 dlg
.SetHelpLabel(m_labels
[Btn_Help
]->GetValue());
2918 void TestMessageBoxDialog::OnApply(wxCommandEvent
& WXUNUSED(event
))
2920 wxMessageDialog
dlg(this, GetMessage(), "Test Message Box", GetStyle());
2921 PrepareMessageDialog(dlg
);
2924 switch ( dlg
.ShowModal() )
2931 // Avoid the extra message box if the dialog was cancelled.
2947 btnName
= "Unknown";
2950 wxLogMessage("Dialog was closed with the \"%s\" button.", btnName
);
2953 void TestMessageBoxDialog::OnClose(wxCommandEvent
& WXUNUSED(event
))
2955 EndModal(wxID_CANCEL
);
2957 #endif // wxUSE_MSGDLG
2959 #if wxUSE_RICHMSGDLG
2960 // ----------------------------------------------------------------------------
2961 // TestRichMessageDialog
2962 // ----------------------------------------------------------------------------
2964 BEGIN_EVENT_TABLE(TestRichMessageDialog
, TestMessageBoxDialog
)
2965 EVT_BUTTON(wxID_APPLY
, TestRichMessageDialog::OnApply
)
2968 TestRichMessageDialog::TestRichMessageDialog(wxWindow
*parent
)
2969 : TestMessageBoxDialog(parent
)
2971 SetTitle("Rich Message Dialog Test Dialog");
2974 void TestRichMessageDialog::AddAdditionalTextOptions(wxSizer
*sizer
)
2976 wxSizer
* const sizerMsgs
= new wxStaticBoxSizer(wxVERTICAL
, this,
2977 "&Additional Elements");
2979 // add a option to show a check box.
2980 wxFlexGridSizer
* const sizerCheckBox
= new wxFlexGridSizer(2, 5, 5);
2981 sizerCheckBox
->AddGrowableCol(1);
2982 sizerCheckBox
->Add(new wxStaticText(this, wxID_ANY
, "&Check box:"));
2983 m_textCheckBox
= new wxTextCtrl(this, wxID_ANY
);
2984 sizerCheckBox
->Add(m_textCheckBox
, wxSizerFlags(1).Expand().Border(wxBOTTOM
));
2985 sizerMsgs
->Add(sizerCheckBox
, wxSizerFlags(1).Expand());
2987 // add option to show a detailed text.
2988 sizerMsgs
->Add(new wxStaticText(this, wxID_ANY
, "&Detailed message:"));
2989 m_textDetailed
= new wxTextCtrl(this, wxID_ANY
, "",
2990 wxDefaultPosition
, wxDefaultSize
,
2992 sizerMsgs
->Add(m_textDetailed
, wxSizerFlags(1).Expand());
2994 sizer
->Add(sizerMsgs
, wxSizerFlags(1).Expand().Border());
2997 void TestRichMessageDialog::AddAdditionalFlags(wxSizer
*sizer
)
2999 // add checkbox to set the initial state for the checkbox shown
3001 m_initialValueCheckBox
=
3002 new wxCheckBox(this, wxID_ANY
, "Checkbox initially checked");
3003 sizer
->Add(m_initialValueCheckBox
, wxSizerFlags(1).Border());
3006 void TestRichMessageDialog::OnApply(wxCommandEvent
& WXUNUSED(event
))
3008 wxRichMessageDialog
dlg(this, GetMessage(), "Test Rich Message Dialog",
3010 PrepareMessageDialog(dlg
);
3012 dlg
.ShowCheckBox(m_textCheckBox
->GetValue(),
3013 m_initialValueCheckBox
->GetValue());
3014 dlg
.ShowDetailedText(m_textDetailed
->GetValue());
3019 #endif // wxUSE_RICHMSGDLG
3023 // ----------------------------------------------------------------------------
3024 // custom log target
3025 // ----------------------------------------------------------------------------
3027 class MyLogGui
: public wxLogGui
3030 virtual void DoShowSingleLogMessage(const wxString
& message
,
3031 const wxString
& title
,
3034 wxMessageDialog
dlg(NULL
, message
, title
,
3035 wxOK
| wxCANCEL
| wxCANCEL_DEFAULT
| style
);
3036 dlg
.SetOKCancelLabels(wxID_COPY
, wxID_OK
);
3037 dlg
.SetExtendedMessage("Note that this is a custom log dialog.");
3042 wxLog
*MyAppTraits::CreateLogTarget()
3044 return new MyLogGui
;