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_TEXT_ENTRY
, MyFrame::TextEntry
)
156 EVT_MENU(DIALOGS_PASSWORD_ENTRY
, MyFrame::PasswordEntry
)
157 #endif // wxUSE_TEXTDLG
160 EVT_MENU(DIALOGS_NUM_ENTRY
, MyFrame::NumericEntry
)
161 #endif // wxUSE_NUMBERDLG
164 EVT_MENU(DIALOGS_SINGLE_CHOICE
, MyFrame::SingleChoice
)
165 EVT_MENU(DIALOGS_MULTI_CHOICE
, MyFrame::MultiChoice
)
166 #endif // wxUSE_CHOICEDLG
168 #if wxUSE_REARRANGECTRL
169 EVT_MENU(DIALOGS_REARRANGE
, MyFrame::Rearrange
)
170 #endif // wxUSE_REARRANGECTRL
173 EVT_MENU(DIALOGS_FILE_OPEN
, MyFrame::FileOpen
)
174 EVT_MENU(DIALOGS_FILE_OPEN2
, MyFrame::FileOpen2
)
175 EVT_MENU(DIALOGS_FILES_OPEN
, MyFrame::FilesOpen
)
176 EVT_MENU(DIALOGS_FILE_SAVE
, MyFrame::FileSave
)
177 #endif // wxUSE_FILEDLG
179 #if USE_FILEDLG_GENERIC
180 EVT_MENU(DIALOGS_FILE_OPEN_GENERIC
, MyFrame::FileOpenGeneric
)
181 EVT_MENU(DIALOGS_FILES_OPEN_GENERIC
, MyFrame::FilesOpenGeneric
)
182 EVT_MENU(DIALOGS_FILE_SAVE_GENERIC
, MyFrame::FileSaveGeneric
)
183 #endif // USE_FILEDLG_GENERIC
186 EVT_MENU(DIALOGS_DIR_CHOOSE
, MyFrame::DirChoose
)
187 EVT_MENU(DIALOGS_DIRNEW_CHOOSE
, MyFrame::DirChooseNew
)
188 #endif // wxUSE_DIRDLG
190 #if USE_MODAL_PRESENTATION
191 EVT_MENU(DIALOGS_MODAL
, MyFrame::ModalDlg
)
192 #endif // USE_MODAL_PRESENTATION
193 EVT_MENU(DIALOGS_MODELESS
, MyFrame::ModelessDlg
)
194 EVT_MENU(DIALOGS_CENTRE_SCREEN
, MyFrame::DlgCenteredScreen
)
195 EVT_MENU(DIALOGS_CENTRE_PARENT
, MyFrame::DlgCenteredParent
)
197 EVT_MENU(DIALOGS_MINIFRAME
, MyFrame::MiniFrame
)
198 #endif // wxUSE_MINIFRAME
199 EVT_MENU(DIALOGS_ONTOP
, MyFrame::DlgOnTop
)
201 #if wxUSE_STARTUP_TIPS
202 EVT_MENU(DIALOGS_TIP
, MyFrame::ShowTip
)
203 #endif // wxUSE_STARTUP_TIPS
205 #if USE_FONTDLG_GENERIC
206 EVT_MENU(DIALOGS_CHOOSE_FONT_GENERIC
, MyFrame::ChooseFontGeneric
)
207 #endif // USE_FONTDLG_GENERIC
209 #if USE_DIRDLG_GENERIC
210 EVT_MENU(DIALOGS_GENERIC_DIR_CHOOSE
, MyFrame::GenericDirChoose
)
211 #endif // wxMSW || wxMAC
213 #if USE_COLOURDLG_GENERIC
214 EVT_MENU(DIALOGS_CHOOSE_COLOUR_GENERIC
, MyFrame::ChooseColourGeneric
)
215 #endif // USE_COLOURDLG_GENERIC
217 #if wxUSE_PROGRESSDLG
218 EVT_MENU(DIALOGS_PROGRESS
, MyFrame::ShowProgress
)
219 #endif // wxUSE_PROGRESSDLG
222 EVT_MENU(DIALOGS_ABOUTDLG_SIMPLE
, MyFrame::ShowSimpleAboutDialog
)
223 EVT_MENU(DIALOGS_ABOUTDLG_FANCY
, MyFrame::ShowFancyAboutDialog
)
224 EVT_MENU(DIALOGS_ABOUTDLG_FULL
, MyFrame::ShowFullAboutDialog
)
225 EVT_MENU(DIALOGS_ABOUTDLG_CUSTOM
, MyFrame::ShowCustomAboutDialog
)
226 #endif // wxUSE_ABOUTDLG
229 EVT_MENU(DIALOGS_BUSYINFO
, MyFrame::ShowBusyInfo
)
230 #endif // wxUSE_BUSYINFO
232 #if wxUSE_FINDREPLDLG
233 EVT_MENU(DIALOGS_FIND
, MyFrame::ShowFindDialog
)
234 EVT_MENU(DIALOGS_REPLACE
, MyFrame::ShowReplaceDialog
)
236 EVT_FIND(wxID_ANY
, MyFrame::OnFindDialog
)
237 EVT_FIND_NEXT(wxID_ANY
, MyFrame::OnFindDialog
)
238 EVT_FIND_REPLACE(wxID_ANY
, MyFrame::OnFindDialog
)
239 EVT_FIND_REPLACE_ALL(wxID_ANY
, MyFrame::OnFindDialog
)
240 EVT_FIND_CLOSE(wxID_ANY
, MyFrame::OnFindDialog
)
241 #endif // wxUSE_FINDREPLDLG
243 #if USE_SETTINGS_DIALOG
244 EVT_MENU(DIALOGS_PROPERTY_SHEET
, MyFrame::OnPropertySheet
)
245 EVT_MENU(DIALOGS_PROPERTY_SHEET_TOOLBOOK
, MyFrame::OnPropertySheet
)
246 EVT_MENU(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK
, MyFrame::OnPropertySheet
)
247 #endif // USE_SETTINGS_DIALOG
249 EVT_MENU(DIALOGS_STANDARD_BUTTON_SIZER_DIALOG
, MyFrame::OnStandardButtonsSizerDialog
)
250 EVT_MENU(DIALOGS_TEST_DEFAULT_ACTION
, MyFrame::OnTestDefaultActionDialog
)
252 EVT_MENU(DIALOGS_REQUEST
, MyFrame::OnRequestUserAttention
)
253 #if wxUSE_NOTIFICATION_MESSAGE
254 EVT_MENU(DIALOGS_NOTIFY_AUTO
, MyFrame::OnNotifMsgAuto
)
255 EVT_MENU(DIALOGS_NOTIFY_SHOW
, MyFrame::OnNotifMsgShow
)
256 EVT_MENU(DIALOGS_NOTIFY_HIDE
, MyFrame::OnNotifMsgHide
)
257 #endif // wxUSE_NOTIFICATION_MESSAGE
259 EVT_MENU(wxID_EXIT
, MyFrame::OnExit
)
262 #if USE_MODAL_PRESENTATION
264 BEGIN_EVENT_TABLE(MyModalDialog
, wxDialog
)
265 EVT_BUTTON(wxID_ANY
, MyModalDialog::OnButton
)
268 BEGIN_EVENT_TABLE(MyModelessDialog
, wxDialog
)
269 EVT_BUTTON(DIALOGS_MODELESS_BTN
, MyModelessDialog::OnButton
)
270 EVT_CLOSE(MyModelessDialog::OnClose
)
273 #endif // USE_MODAL_PRESENTATION
275 BEGIN_EVENT_TABLE(StdButtonSizerDialog
, wxDialog
)
276 EVT_CHECKBOX(wxID_ANY
, StdButtonSizerDialog::OnEvent
)
277 EVT_RADIOBUTTON(wxID_ANY
, StdButtonSizerDialog::OnEvent
)
280 #if wxUSE_CMDLINE_PARSER
282 #include "wx/cmdline.h"
284 static const char *PROGRESS_SWITCH
= "progress";
286 void MyApp::OnInitCmdLine(wxCmdLineParser
& parser
)
288 wxApp::OnInitCmdLine(parser
);
290 parser
.AddOption("", PROGRESS_SWITCH
,
291 "Style for the startup progress dialog (wxPD_XXX)",
292 wxCMD_LINE_VAL_NUMBER
);
295 bool MyApp::OnCmdLineParsed(wxCmdLineParser
& parser
)
297 if ( !wxApp::OnCmdLineParsed(parser
) )
300 parser
.Found(PROGRESS_SWITCH
, &m_startupProgressStyle
);
305 #endif // wxUSE_CMDLINE_PARSER
307 // `Main program' equivalent, creating windows and returning main app frame
310 if ( !wxApp::OnInit() )
313 #if wxUSE_PROGRESSDLG
314 if ( m_startupProgressStyle
!= -1 )
316 // Show a test progress dialog before the main event loop is started:
317 // it should still work.
318 const int PROGRESS_COUNT
= 100;
321 "Progress in progress",
322 "Please wait, starting...",
325 m_startupProgressStyle
327 for ( int i
= 0; i
<= PROGRESS_COUNT
; i
++ )
329 if ( !dlg
.Update(i
) )
335 #endif // wxUSE_PROGRESSDLG
338 wxInitAllImageHandlers();
341 // Create the main frame window
342 MyFrame
*frame
= new MyFrame(wxT("wxWidgets dialogs example"));
345 wxMenu
*menuDlg
= new wxMenu
;
347 menuDlg
->Append(DIALOGS_MESSAGE_BOX
, wxT("&Message box\tCtrl-M"));
348 menuDlg
->Append(DIALOGS_MESSAGE_BOX_WINDOW_MODAL
, wxT("Window-Modal Message box "));
349 menuDlg
->Append(DIALOGS_MESSAGE_DIALOG
, wxT("Message dialog\tShift-Ctrl-M"));
351 menuDlg
->Append(DIALOGS_RICH_MESSAGE_DIALOG
, wxT("Rich message dialog"));
352 #endif // wxUSE_RICHMSGDLG
355 #if wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
357 wxMenu
*choices_menu
= new wxMenu
;
360 choices_menu
->Append(DIALOGS_CHOOSE_COLOUR
, wxT("&Choose bg colour"));
361 choices_menu
->Append(DIALOGS_GET_COLOUR
, wxT("&Choose fg colour"));
362 #endif // wxUSE_COLOURDLG
365 choices_menu
->Append(DIALOGS_CHOOSE_FONT
, wxT("Choose &font"));
366 #endif // wxUSE_FONTDLG
369 choices_menu
->Append(DIALOGS_SINGLE_CHOICE
, wxT("&Single choice\tCtrl-C"));
370 choices_menu
->Append(DIALOGS_MULTI_CHOICE
, wxT("M&ultiple choice\tCtrl-U"));
371 #endif // wxUSE_CHOICEDLG
373 #if wxUSE_REARRANGECTRL
374 choices_menu
->Append(DIALOGS_REARRANGE
, wxT("&Rearrange dialog\tCtrl-R"));
375 #endif // wxUSE_REARRANGECTRL
377 #if USE_COLOURDLG_GENERIC || USE_FONTDLG_GENERIC
378 choices_menu
->AppendSeparator();
379 #endif // USE_COLOURDLG_GENERIC || USE_FONTDLG_GENERIC
381 #if USE_COLOURDLG_GENERIC
382 choices_menu
->Append(DIALOGS_CHOOSE_COLOUR_GENERIC
, wxT("&Choose colour (generic)"));
383 #endif // USE_COLOURDLG_GENERIC
385 #if USE_FONTDLG_GENERIC
386 choices_menu
->Append(DIALOGS_CHOOSE_FONT_GENERIC
, wxT("Choose &font (generic)"));
387 #endif // USE_FONTDLG_GENERIC
389 menuDlg
->Append(wxID_ANY
,wxT("&Choices and selectors"),choices_menu
);
390 #endif // wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
393 #if wxUSE_TEXTDLG || wxUSE_NUMBERDLG
395 wxMenu
*entry_menu
= new wxMenu
;
398 entry_menu
->Append(DIALOGS_TEXT_ENTRY
, wxT("Text &entry\tCtrl-E"));
399 entry_menu
->Append(DIALOGS_PASSWORD_ENTRY
, wxT("&Password entry\tCtrl-P"));
400 #endif // wxUSE_TEXTDLG
403 entry_menu
->Append(DIALOGS_NUM_ENTRY
, wxT("&Numeric entry\tCtrl-N"));
404 #endif // wxUSE_NUMBERDLG
406 menuDlg
->Append(wxID_ANY
,wxT("&Entry dialogs"),entry_menu
);
408 #endif // wxUSE_TEXTDLG || wxUSE_NUMBERDLG
413 wxMenu
*filedlg_menu
= new wxMenu
;
414 filedlg_menu
->Append(DIALOGS_FILE_OPEN
, wxT("&Open file\tCtrl-O"));
415 filedlg_menu
->Append(DIALOGS_FILE_OPEN2
, wxT("&Second open file\tCtrl-2"));
416 filedlg_menu
->Append(DIALOGS_FILES_OPEN
, wxT("Open &files\tCtrl-Q"));
417 filedlg_menu
->Append(DIALOGS_FILE_SAVE
, wxT("Sa&ve file\tCtrl-S"));
419 #if USE_FILEDLG_GENERIC
420 filedlg_menu
->AppendSeparator();
421 filedlg_menu
->Append(DIALOGS_FILE_OPEN_GENERIC
, wxT("&Open file (generic)"));
422 filedlg_menu
->Append(DIALOGS_FILES_OPEN_GENERIC
, wxT("Open &files (generic)"));
423 filedlg_menu
->Append(DIALOGS_FILE_SAVE_GENERIC
, wxT("Sa&ve file (generic)"));
424 #endif // USE_FILEDLG_GENERIC
426 menuDlg
->Append(wxID_ANY
,wxT("&File operations"),filedlg_menu
);
428 #endif // wxUSE_FILEDLG
431 wxMenu
*dir_menu
= new wxMenu
;
433 dir_menu
->Append(DIALOGS_DIR_CHOOSE
, wxT("&Choose a directory\tCtrl-D"));
434 dir_menu
->Append(DIALOGS_DIRNEW_CHOOSE
, wxT("Choose a directory (with \"Ne&w\" button)\tShift-Ctrl-D"));
435 menuDlg
->Append(wxID_ANY
,wxT("&Directory operations"),dir_menu
);
437 #if USE_DIRDLG_GENERIC
438 dir_menu
->AppendSeparator();
439 dir_menu
->Append(DIALOGS_GENERIC_DIR_CHOOSE
, wxT("&Choose a directory (generic)"));
440 #endif // USE_DIRDLG_GENERIC
442 #endif // wxUSE_DIRDLG
445 #if wxUSE_STARTUP_TIPS || \
446 wxUSE_PROGRESSDLG || \
448 wxUSE_LOG_DIALOG || \
451 wxMenu
*info_menu
= new wxMenu
;
453 #if wxUSE_STARTUP_TIPS
454 info_menu
->Append(DIALOGS_TIP
, wxT("&Tip of the day\tCtrl-T"));
455 #endif // wxUSE_STARTUP_TIPS
457 #if wxUSE_PROGRESSDLG
458 info_menu
->Append(DIALOGS_PROGRESS
, wxT("Pro&gress dialog\tCtrl-G"));
459 #endif // wxUSE_PROGRESSDLG
462 info_menu
->Append(DIALOGS_BUSYINFO
, wxT("&Busy info dialog\tCtrl-B"));
463 #endif // wxUSE_BUSYINFO
466 info_menu
->Append(DIALOGS_LOG_DIALOG
, wxT("&Log dialog\tCtrl-L"));
467 #endif // wxUSE_LOG_DIALOG
470 info_menu
->Append(DIALOGS_INFOBAR_SIMPLE
, "Simple &info bar\tCtrl-I");
471 info_menu
->Append(DIALOGS_INFOBAR_ADVANCED
, "&Advanced info bar\tShift-Ctrl-I");
472 #endif // wxUSE_INFOBAR
475 info_menu
->Append(DIALOGS_MESSAGE_BOX_WXINFO
,
476 wxT("&wxWidgets information\tCtrl-W"));
477 #endif // wxUSE_MSGDLG
479 menuDlg
->Append(wxID_ANY
,wxT("&Informative dialogs"),info_menu
);
481 #endif // wxUSE_STARTUP_TIPS || wxUSE_PROGRESSDLG || wxUSE_BUSYINFO || wxUSE_LOG_DIALOG
484 #if wxUSE_FINDREPLDLG
485 wxMenu
*find_menu
= new wxMenu
;
486 find_menu
->AppendCheckItem(DIALOGS_FIND
, wxT("&Find dialog\tCtrl-F"));
487 find_menu
->AppendCheckItem(DIALOGS_REPLACE
, wxT("Find and &replace dialog\tShift-Ctrl-F"));
488 menuDlg
->Append(wxID_ANY
,wxT("&Searching"),find_menu
);
489 #endif // wxUSE_FINDREPLDLG
491 wxMenu
*dialogs_menu
= new wxMenu
;
492 #if USE_MODAL_PRESENTATION
493 dialogs_menu
->Append(DIALOGS_MODAL
, wxT("&Modal dialog\tShift-Ctrl-W"));
494 #endif // USE_MODAL_PRESENTATION
495 dialogs_menu
->AppendCheckItem(DIALOGS_MODELESS
, wxT("Mode&less dialog\tShift-Ctrl-Z"));
496 dialogs_menu
->Append(DIALOGS_CENTRE_SCREEN
, wxT("Centered on &screen\tShift-Ctrl-1"));
497 dialogs_menu
->Append(DIALOGS_CENTRE_PARENT
, wxT("Centered on &parent\tShift-Ctrl-2"));
499 dialogs_menu
->Append(DIALOGS_MINIFRAME
, wxT("&Mini frame"));
500 #endif // wxUSE_MINIFRAME
501 dialogs_menu
->Append(DIALOGS_ONTOP
, wxT("Dialog staying on &top"));
502 menuDlg
->Append(wxID_ANY
, wxT("&Generic dialogs"), dialogs_menu
);
504 #if USE_SETTINGS_DIALOG
505 wxMenu
*sheet_menu
= new wxMenu
;
506 sheet_menu
->Append(DIALOGS_PROPERTY_SHEET
, wxT("&Standard property sheet\tShift-Ctrl-P"));
507 sheet_menu
->Append(DIALOGS_PROPERTY_SHEET_TOOLBOOK
, wxT("&Toolbook sheet\tShift-Ctrl-T"));
509 if (wxPlatformIs(wxPORT_MAC
))
510 sheet_menu
->Append(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK
, wxT("Button &Toolbook sheet\tShift-Ctrl-U"));
513 sheet_menu->Append(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, wxT("Button &Toolbook sheet\tShift-Ctrl-U"));
516 menuDlg
->Append(wxID_ANY
, wxT("&Property sheets"), sheet_menu
);
517 #endif // USE_SETTINGS_DIALOG
519 wxMenu
*menuNotif
= new wxMenu
;
520 menuNotif
->Append(DIALOGS_REQUEST
, wxT("&Request user attention\tCtrl-Shift-R"));
521 #if wxUSE_NOTIFICATION_MESSAGE
522 menuNotif
->Append(DIALOGS_NOTIFY_AUTO
, "&Automatically hidden notification");
523 menuNotif
->Append(DIALOGS_NOTIFY_SHOW
, "&Show manual notification");
524 menuNotif
->Append(DIALOGS_NOTIFY_HIDE
, "&Hide manual notification");
525 #endif // wxUSE_NOTIFICATION_MESSAGE
526 menuDlg
->AppendSubMenu(menuNotif
, "&User notifications");
528 menuDlg
->Append(DIALOGS_STANDARD_BUTTON_SIZER_DIALOG
, wxT("&Standard Buttons Sizer Dialog"));
529 menuDlg
->Append(DIALOGS_TEST_DEFAULT_ACTION
, wxT("&Test dialog default action"));
531 menuDlg
->AppendSeparator();
532 menuDlg
->Append(wxID_EXIT
, wxT("E&xit\tAlt-X"));
535 wxMenu
*menuHelp
= new wxMenu
;
536 menuHelp
->Append(DIALOGS_ABOUTDLG_SIMPLE
, wxT("&About (simple)...\tF1"));
537 menuHelp
->Append(DIALOGS_ABOUTDLG_FANCY
, wxT("About (&fancy)...\tShift-F1"));
538 menuHelp
->Append(DIALOGS_ABOUTDLG_FULL
, wxT("About (f&ull)...\tCtrl-F1"));
539 menuHelp
->Append(DIALOGS_ABOUTDLG_CUSTOM
, wxT("About (&custom)...\tCtrl-Shift-F1"));
540 #endif // wxUSE_ABOUTDLG
542 wxMenuBar
*menubar
= new wxMenuBar
;
543 menubar
->Append(menuDlg
, wxT("&Dialogs"));
545 menubar
->Append(menuHelp
, wxT("&Help"));
546 #endif // wxUSE_ABOUTDLG
548 frame
->SetMenuBar(menubar
);
550 frame
->Centre(wxBOTH
);
556 // My frame constructor
557 MyFrame::MyFrame(const wxString
& title
)
558 : wxFrame(NULL
, wxID_ANY
, title
)
560 SetIcon(wxICON(sample
));
562 #if USE_MODAL_PRESENTATION
563 m_dialog
= (MyModelessDialog
*)NULL
;
564 #endif // USE_MODAL_PRESENTATION
566 #if wxUSE_FINDREPLDLG
572 m_clrData
.SetChooseFull(true);
573 for (int i
= 0; i
< wxColourData::NUM_CUSTOM
; i
++)
575 unsigned char n
= i
*16;
576 m_clrData
.SetCustomColour(i
, wxColour(n
, n
, n
));
578 #endif // wxUSE_COLOURDLG
580 #if wxUSE_NOTIFICATION_MESSAGE
582 #endif // wxUSE_NOTIFICATION_MESSAGE
586 #endif // wxUSE_STATUSBAR
588 m_canvas
= new MyCanvas(this);
591 // an info bar can be created very simply and used without any extra effort
592 m_infoBarSimple
= new wxInfoBar(this);
594 // or it can also be customized by
595 m_infoBarAdvanced
= new wxInfoBar(this);
597 // ... adding extra buttons (but more than two will usually be too many)
598 m_infoBarAdvanced
->AddButton(wxID_UNDO
);
599 m_infoBarAdvanced
->AddButton(wxID_REDO
);
601 m_infoBarAdvanced
->Connect(wxID_REDO
, wxEVT_COMMAND_BUTTON_CLICKED
,
602 wxCommandEventHandler(MyFrame::OnInfoBarRedo
),
606 // adding and removing a button immediately doesn't make sense here, of
607 // course, it's done just to show that it is possible
608 m_infoBarAdvanced
->AddButton(wxID_EXIT
);
609 m_infoBarAdvanced
->RemoveButton(wxID_EXIT
);
611 // ... changing the colours and/or fonts
612 m_infoBarAdvanced
->SetOwnBackgroundColour(0xc8ffff);
613 m_infoBarAdvanced
->SetFont(GetFont().Bold().Larger());
615 // ... and changing the effect (only does anything under MSW currently)
616 m_infoBarAdvanced
->SetShowHideEffects(wxSHOW_EFFECT_EXPAND
,
617 wxSHOW_EFFECT_EXPAND
);
618 m_infoBarAdvanced
->SetEffectDuration(1500);
621 // to use the info bars we need to use sizer for the window layout
622 wxBoxSizer
* const sizer
= new wxBoxSizer(wxVERTICAL
);
623 sizer
->Add(m_infoBarSimple
, wxSizerFlags().Expand());
624 sizer
->Add(m_canvas
, wxSizerFlags(1).Expand());
625 sizer
->Add(m_infoBarAdvanced
, wxSizerFlags().Expand());
628 // final touch: under MSW the info bars are shown progressively and parts
629 // of the parent window can be seen during the process, so use the same
630 // background colour for our background as for the canvas window which
631 // covers our entire client area to avoid jarring colour jumps
632 SetOwnBackgroundColour(m_canvas
->GetBackgroundColour());
633 #endif // wxUSE_INFOBAR
638 #if wxUSE_NOTIFICATION_MESSAGE
640 #endif // wxUSE_NOTIFICATION_MESSAGE
645 void MyFrame::ChooseColour(wxCommandEvent
& WXUNUSED(event
))
647 m_clrData
.SetColour(m_canvas
->GetBackgroundColour());
649 wxColourDialog
dialog(this, &m_clrData
);
650 dialog
.SetTitle(_("Please choose the background colour"));
651 if ( dialog
.ShowModal() == wxID_OK
)
653 m_clrData
= dialog
.GetColourData();
654 m_canvas
->SetBackgroundColour(m_clrData
.GetColour());
655 m_canvas
->ClearBackground();
660 void MyFrame::GetColour(wxCommandEvent
& WXUNUSED(event
))
662 wxColour clr
= wxGetColourFromUser
665 m_canvas
->GetForegroundColour(),
666 "Please choose the foreground colour"
670 m_canvas
->SetForegroundColour(clr
);
673 //else: dialog cancelled by user
676 #endif // wxUSE_COLOURDLG
679 #if USE_COLOURDLG_GENERIC
680 void MyFrame::ChooseColourGeneric(wxCommandEvent
& WXUNUSED(event
))
682 m_clrData
.SetColour(m_canvas
->GetBackgroundColour());
684 //FIXME:TODO:This has no effect...
685 m_clrData
.SetChooseFull(true);
687 for (int i
= 0; i
< 16; i
++)
690 (unsigned char)(i
*16),
691 (unsigned char)(i
*16),
692 (unsigned char)(i
*16)
694 m_clrData
.SetCustomColour(i
, colour
);
697 wxGenericColourDialog
*dialog
= new wxGenericColourDialog(this, &m_clrData
);
698 if (dialog
->ShowModal() == wxID_OK
)
700 m_clrData
= dialog
->GetColourData();
701 m_canvas
->SetBackgroundColour(m_clrData
.GetColour());
702 m_canvas
->ClearBackground();
707 #endif // USE_COLOURDLG_GENERIC
710 void MyFrame::ChooseFont(wxCommandEvent
& WXUNUSED(event
) )
713 data
.SetInitialFont(m_canvas
->GetFont());
714 data
.SetColour(m_canvas
->GetForegroundColour());
716 // you might also do this:
718 // wxFontDialog dialog;
719 // if ( !dialog.Create(this, data) { ... error ... }
721 wxFontDialog
dialog(this, data
);
723 if (dialog
.ShowModal() == wxID_OK
)
725 wxFontData retData
= dialog
.GetFontData();
726 m_canvas
->SetFont(retData
.GetChosenFont());
727 m_canvas
->SetForegroundColour(retData
.GetColour());
730 //else: cancelled by the user, don't change the font
732 #endif // wxUSE_FONTDLG
734 #if USE_FONTDLG_GENERIC
735 void MyFrame::ChooseFontGeneric(wxCommandEvent
& WXUNUSED(event
) )
738 data
.SetInitialFont(m_canvas
->GetFont());
739 data
.SetColour(m_canvas
->GetForegroundColour());
741 wxGenericFontDialog
*dialog
= new wxGenericFontDialog(this, data
);
742 if (dialog
->ShowModal() == wxID_OK
)
744 wxFontData retData
= dialog
->GetFontData();
745 m_canvas
->SetFont(retData
.GetChosenFont());
746 m_canvas
->SetForegroundColour(retData
.GetColour());
751 #endif // USE_FONTDLG_GENERIC
754 void MyFrame::LogDialog(wxCommandEvent
& WXUNUSED(event
))
756 // calling wxYield() (as ~wxBusyCursor does) shouldn't result in messages
757 // being flushed -- test it
760 wxLogMessage(wxT("This is some message - everything is ok so far."));
761 wxLogMessage(wxT("Another message...\n... this one is on multiple lines"));
762 wxLogWarning(wxT("And then something went wrong!"));
764 // and if ~wxBusyCursor doesn't do it, then call it manually
768 wxLogError(wxT("Intermediary error handler decided to abort."));
769 wxLogError(wxT("The top level caller detected an unrecoverable error."));
771 wxLog::FlushActive();
773 wxLogMessage(wxT("And this is the same dialog but with only one message."));
775 #endif // wxUSE_LOG_DIALOG
779 void MyFrame::InfoBarSimple(wxCommandEvent
& WXUNUSED(event
))
781 static int s_count
= 0;
782 m_infoBarSimple
->ShowMessage
784 wxString::Format("Message #%d in the info bar.", ++s_count
)
788 void MyFrame::InfoBarAdvanced(wxCommandEvent
& WXUNUSED(event
))
790 m_infoBarAdvanced
->ShowMessage("Sorry, it didn't work out.", wxICON_WARNING
);
793 void MyFrame::OnInfoBarRedo(wxCommandEvent
& WXUNUSED(event
))
795 m_infoBarAdvanced
->ShowMessage("Still no, sorry again.", wxICON_ERROR
);
798 #endif // wxUSE_INFOBAR
802 void MyFrame::MessageBox(wxCommandEvent
& WXUNUSED(event
))
804 wxMessageDialog
dialog(this,
805 "This is a message box\n"
806 "This is a long, long string to test out if the message box "
807 "is laid out properly.",
810 wxNO_DEFAULT
| wxYES_NO
| wxCANCEL
|
814 if ( dialog
.SetYesNoCancelLabels
821 extmsg
= "This platform supports custom button labels,\n"
822 "so you should see the descriptive labels below.";
826 extmsg
= "Custom button labels are not supported on this platform,\n"
827 "so the default \"Yes\"/\"No\"/\"Cancel\" buttons are used.";
829 dialog
.SetExtendedMessage(extmsg
);
831 switch ( dialog
.ShowModal() )
834 wxLogStatus(wxT("You pressed \"Yes\""));
838 wxLogStatus(wxT("You pressed \"No\""));
842 wxLogStatus(wxT("You pressed \"Cancel\""));
846 wxLogError(wxT("Unexpected wxMessageDialog return code!"));
850 void MyFrame::MessageBoxWindowModal(wxCommandEvent
& WXUNUSED(event
))
852 wxMessageDialog
* dialog
= new wxMessageDialog(this,
853 "This is a message box\n"
854 "This is a long, long string to test out if the message box "
855 "is laid out properly.",
858 wxNO_DEFAULT
| wxYES_NO
| wxCANCEL
|
862 if ( dialog
->SetYesNoCancelLabels
869 extmsg
= "This platform supports custom button labels,\n"
870 "so you should see the descriptive labels below.";
874 extmsg
= "Custom button labels are not supported on this platform,\n"
875 "so the default \"Yes\"/\"No\"/\"Cancel\" buttons are used.";
877 dialog
->SetExtendedMessage(extmsg
);
878 dialog
->Connect( wxEVT_WINDOW_MODAL_DIALOG_CLOSED
, wxWindowModalDialogEventHandler(MyFrame::MessageBoxWindowModalClosed
), NULL
, this );
879 dialog
->ShowWindowModal();
882 void MyFrame::MessageBoxWindowModalClosed(wxWindowModalDialogEvent
& event
)
884 wxDialog
* dialog
= event
.GetDialog();
885 switch ( dialog
->GetReturnCode() )
888 wxLogStatus(wxT("You pressed \"Yes\""));
892 wxLogStatus(wxT("You pressed \"No\""));
896 wxLogStatus(wxT("You pressed \"Cancel\""));
900 wxLogError(wxT("Unexpected wxMessageDialog return code!"));
905 void MyFrame::MessageBoxDialog(wxCommandEvent
& WXUNUSED(event
))
907 TestMessageBoxDialog
dlg(this);
912 void MyFrame::MessageBoxInfo(wxCommandEvent
& WXUNUSED(event
))
914 ::wxInfoMessageBox(this);
916 #endif // wxUSE_MSGDLG
919 void MyFrame::RichMessageDialog(wxCommandEvent
& WXUNUSED(event
))
921 TestRichMessageDialog
dlg(this);
925 #endif // wxUSE_RICHMSGDLG
928 void MyFrame::NumericEntry(wxCommandEvent
& WXUNUSED(event
))
930 long res
= wxGetNumberFromUser( wxT("This is some text, actually a lot of text.\n")
931 wxT("Even two rows of text."),
932 wxT("Enter a number:"), wxT("Numeric input test"),
939 msg
= wxT("Invalid number entered or dialog cancelled.");
944 msg
.Printf(wxT("You've entered %lu"), res
);
945 icon
= wxICON_INFORMATION
;
948 wxMessageBox(msg
, wxT("Numeric test result"), wxOK
| icon
, this);
950 #endif // wxUSE_NUMBERDLG
953 void MyFrame::PasswordEntry(wxCommandEvent
& WXUNUSED(event
))
955 wxString pwd
= wxGetPasswordFromUser(wxT("Enter password:"),
956 wxT("Password entry dialog"),
961 wxMessageBox(wxString::Format(wxT("Your password is '%s'"), pwd
.c_str()),
962 wxT("Got password"), wxOK
| wxICON_INFORMATION
, this);
966 void MyFrame::TextEntry(wxCommandEvent
& WXUNUSED(event
))
968 wxTextEntryDialog
dialog(this,
969 wxT("This is a small sample\n")
970 wxT("A long, long string to test out the text entrybox"),
971 wxT("Please enter a string"),
972 wxT("Default value"),
975 if (dialog
.ShowModal() == wxID_OK
)
977 wxMessageBox(dialog
.GetValue(), wxT("Got string"), wxOK
| wxICON_INFORMATION
, this);
980 #endif // wxUSE_TEXTDLG
983 void MyFrame::SingleChoice(wxCommandEvent
& WXUNUSED(event
) )
985 const wxString choices
[] = { wxT("One"), wxT("Two"), wxT("Three"), wxT("Four"), wxT("Five") } ;
987 wxSingleChoiceDialog
dialog(this,
988 wxT("This is a small sample\n")
989 wxT("A single-choice convenience dialog"),
990 wxT("Please select a value"),
991 WXSIZEOF(choices
), choices
);
993 dialog
.SetSelection(2);
995 if (dialog
.ShowModal() == wxID_OK
)
997 wxMessageDialog
dialog2(this, dialog
.GetStringSelection(), wxT("Got string"));
1002 void MyFrame::MultiChoice(wxCommandEvent
& WXUNUSED(event
) )
1004 const wxString choices
[] =
1006 wxT("One"), wxT("Two"), wxT("Three"), wxT("Four"), wxT("Five"),
1007 wxT("Six"), wxT("Seven"), wxT("Eight"), wxT("Nine"), wxT("Ten"),
1008 wxT("Eleven"), wxT("Twelve"), wxT("Seventeen"),
1011 wxArrayInt selections
;
1012 const int count
= wxGetSelectedChoices(selections
,
1013 wxT("This is a small sample\n")
1014 wxT("A multi-choice convenience dialog"),
1015 wxT("Please select a value"),
1016 WXSIZEOF(choices
), choices
,
1023 msg
= wxT("You did not select any items");
1027 msg
.Printf(wxT("You selected %u items:\n"), (unsigned)count
);
1028 for ( int n
= 0; n
< count
; n
++ )
1030 msg
+= wxString::Format(wxT("\t%u: %u (%s)\n"),
1031 (unsigned)n
, (unsigned)selections
[n
],
1032 choices
[selections
[n
]].c_str());
1039 #endif // wxUSE_CHOICEDLG
1041 #if wxUSE_REARRANGECTRL
1042 // custom rearrange dialog: it adds the possibility to rename an item to the
1043 // base class functionality
1044 class MyRearrangeDialog
: public wxRearrangeDialog
1047 MyRearrangeDialog(wxWindow
*parent
,
1049 wxArrayString
& labels
,
1050 wxArrayString
& labelsOrig
)
1054 "Configure the columns shown:",
1055 "wxRearrangeDialog example",
1061 m_labelsOrig(labelsOrig
)
1063 m_sel
= wxNOT_FOUND
;
1065 wxPanel
* const panel
= new wxPanel(this);
1066 wxSizer
* const sizer
= new wxBoxSizer(wxHORIZONTAL
);
1068 m_labelOrig
= new wxStaticText(panel
, wxID_ANY
, "");
1069 sizer
->Add(m_labelOrig
, wxSizerFlags().Centre().Border(wxRIGHT
));
1071 m_text
= new wxTextCtrl(panel
, wxID_ANY
, "",
1072 wxDefaultPosition
, wxDefaultSize
,
1073 wxTE_PROCESS_ENTER
);
1074 sizer
->Add(m_text
, wxSizerFlags().Centre().Border(wxRIGHT
));
1076 sizer
->Add(new wxButton(panel
, wxID_APPLY
, "&Rename"),
1077 wxSizerFlags().Centre());
1079 panel
->SetSizer(sizer
);
1081 // call this first to ensure that the controls have a reasonable best
1082 // size before they're added
1083 DoUpdateExtraControls(GetList()->GetSelection());
1085 AddExtraControls(panel
);
1088 // another customization not directly supported by the dialog: add a
1090 wxWindow
* const btnOk
= FindWindow(wxID_OK
);
1091 wxCHECK_RET( btnOk
, "no Ok button?" );
1093 wxSizer
* const sizerBtns
= btnOk
->GetContainingSizer();
1094 wxCHECK_RET( sizerBtns
, "no buttons sizer?" );
1096 sizerBtns
->Add(new wxButton(this, wxID_RESET
, "&Reset all"),
1097 wxSizerFlags().Border(wxLEFT
));
1100 // call this instead of ShowModal() to update order and labels array in
1101 // case the dialog was not cancelled
1104 switch ( ShowModal() )
1110 m_order
= GetOrder();
1114 // order already reset
1122 void OnSelChange(wxCommandEvent
& event
)
1124 DoUpdateExtraControls(event
.GetInt());
1127 void OnUpdateUIRename(wxUpdateUIEvent
& event
)
1129 event
.Enable( CanRename() );
1132 void OnRename(wxCommandEvent
& WXUNUSED(event
))
1137 m_labels
[m_sel
] = m_text
->GetValue();
1138 GetList()->SetString(m_sel
, m_labels
[m_sel
]);
1141 void OnReset(wxCommandEvent
& WXUNUSED(event
))
1143 // in a real program we should probably ask if the user really wants to
1144 // do this but here we just go ahead and reset all columns labels and
1145 // their order without confirmation
1146 const unsigned count
= m_order
.size();
1147 for ( unsigned n
= 0; n
< count
; n
++ )
1150 m_labels
[n
] = m_labelsOrig
[n
];
1153 EndModal(wxID_RESET
);
1156 bool CanRename() const
1158 // only allow renaming if the user modified the currently selected item
1159 // text (which presupposes that we do have a current item)
1160 return m_sel
!= wxNOT_FOUND
&& m_text
->GetValue() != m_labels
[m_sel
];
1163 void DoUpdateExtraControls(int sel
)
1167 if ( m_sel
== wxNOT_FOUND
)
1169 m_labelOrig
->SetLabel("<no selection>");
1173 else // have valid item
1175 m_labelOrig
->SetLabelText(m_labelsOrig
[m_sel
]);
1177 m_text
->SetValue(m_labels
[m_sel
]);
1181 wxArrayInt
& m_order
;
1182 wxArrayString
& m_labels
,
1186 wxStaticText
*m_labelOrig
;
1189 DECLARE_EVENT_TABLE()
1190 wxDECLARE_NO_COPY_CLASS(MyRearrangeDialog
);
1193 BEGIN_EVENT_TABLE(MyRearrangeDialog
, wxRearrangeDialog
)
1194 EVT_LISTBOX(wxID_ANY
, MyRearrangeDialog::OnSelChange
)
1196 EVT_UPDATE_UI(wxID_APPLY
, MyRearrangeDialog::OnUpdateUIRename
)
1198 EVT_TEXT_ENTER(wxID_ANY
, MyRearrangeDialog::OnRename
)
1199 EVT_BUTTON(wxID_APPLY
, MyRearrangeDialog::OnRename
)
1200 EVT_BUTTON(wxID_RESET
, MyRearrangeDialog::OnReset
)
1203 void MyFrame::Rearrange(wxCommandEvent
& WXUNUSED(event
))
1205 // the arrays are static so that we preserve the items order between calls
1207 static wxArrayInt s_order
;
1208 static wxArrayString s_labels
,
1211 // initialize them on the first call
1212 if ( s_labelsOrig
.empty() )
1214 static const struct ItemInfo
1217 const char *labelOrig
;
1221 { "File name", "Name", 0 },
1222 { "File type", "Ext", 1 },
1223 { "Size", "Size", 2 },
1224 { "Creation time", "Ctime", ~3 }, // negated so hidden
1225 { "Last accessed", "Atime", ~4 },
1226 { "Last modified", "Mtime", 5 },
1229 s_order
.reserve(WXSIZEOF(items
));
1230 s_labels
.reserve(WXSIZEOF(items
));
1231 s_labelsOrig
.reserve(WXSIZEOF(items
));
1232 for ( unsigned n
= 0; n
< WXSIZEOF(items
); n
++ )
1234 const ItemInfo
& item
= items
[n
];
1235 s_order
.push_back(item
.order
);
1236 s_labels
.push_back(item
.label
);
1237 s_labelsOrig
.push_back(item
.labelOrig
);
1241 MyRearrangeDialog
dlg(this, s_order
, s_labels
, s_labelsOrig
);
1242 if ( !dlg
.Rearrange() )
1246 for ( unsigned n
= 0; n
< s_order
.size(); n
++ )
1248 columns
+= wxString::Format("\n %u: ", n
);
1249 int idx
= s_order
[n
];
1252 columns
+= "[hidden] ";
1256 columns
+= s_labels
[idx
];
1257 if ( s_labels
[idx
] != s_labelsOrig
[idx
] )
1259 columns
+= wxString::Format(" (original label: \"%s\")",
1264 wxLogMessage("The columns order now is:%s", columns
);
1266 #endif // wxUSE_REARRANGECTRL
1270 // panel with custom controls for file dialog
1271 class MyExtraPanel
: public wxPanel
1274 MyExtraPanel(wxWindow
*parent
);
1275 void OnCheckBox(wxCommandEvent
& event
) { m_btn
->Enable(event
.IsChecked()); }
1276 wxString
GetInfo() const
1278 return wxString::Format("checkbox value = %d", (int) m_cb
->GetValue());
1285 MyExtraPanel::MyExtraPanel(wxWindow
*parent
)
1288 m_btn
= new wxButton(this, -1, wxT("Custom Button"));
1289 m_btn
->Enable(false);
1290 m_cb
= new wxCheckBox(this, -1, wxT("Enable Custom Button"));
1291 m_cb
->Connect(wxID_ANY
, wxEVT_COMMAND_CHECKBOX_CLICKED
,
1292 wxCommandEventHandler(MyExtraPanel::OnCheckBox
), NULL
, this);
1293 wxBoxSizer
*sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
1294 sizerTop
->Add(m_cb
, wxSizerFlags().Centre().Border());
1295 sizerTop
->AddStretchSpacer();
1296 sizerTop
->Add(m_btn
, wxSizerFlags().Right().Border());
1297 SetSizerAndFit(sizerTop
);
1300 // a static method can be used instead of a function with most of compilers
1301 static wxWindow
* createMyExtraPanel(wxWindow
*parent
)
1303 return new MyExtraPanel(parent
);
1306 void MyFrame::FileOpen(wxCommandEvent
& WXUNUSED(event
) )
1311 wxT("Testing open file dialog"),
1315 wxT("C++ files (*.cpp)|*.cpp")
1317 wxT("C++ files (*.cpp;*.h)|*.cpp;*.h")
1321 dialog
.SetExtraControlCreator(&createMyExtraPanel
);
1322 dialog
.CentreOnParent();
1323 dialog
.SetDirectory(wxGetHomeDir());
1325 if (dialog
.ShowModal() == wxID_OK
)
1328 wxWindow
* const extra
= dialog
.GetExtraControl();
1329 info
.Printf(wxT("Full file name: %s\n")
1332 wxT("Custom window: %s"),
1333 dialog
.GetPath().c_str(),
1334 dialog
.GetDirectory().c_str(),
1335 dialog
.GetFilename().c_str(),
1336 extra
? static_cast<MyExtraPanel
*>(extra
)->GetInfo()
1337 : wxString("None"));
1338 wxMessageDialog
dialog2(this, info
, wxT("Selected file"));
1339 dialog2
.ShowModal();
1343 // this shows how to take advantage of specifying a default extension in the
1344 // call to wxFileSelector: it is remembered after each new call and the next
1345 // one will use it by default
1346 void MyFrame::FileOpen2(wxCommandEvent
& WXUNUSED(event
) )
1348 static wxString s_extDef
;
1349 wxString path
= wxFileSelector(
1350 wxT("Select the file to load"),
1351 wxEmptyString
, wxEmptyString
,
1355 wxT("Waveform (*.wav)|*.wav|Plain text (*.txt)|*.txt|All files (%s)|%s"),
1356 wxFileSelectorDefaultWildcardStr
,
1357 wxFileSelectorDefaultWildcardStr
1359 wxFD_OPEN
|wxFD_CHANGE_DIR
|wxFD_PREVIEW
,
1366 // it is just a sample, would use wxSplitPath in real program
1367 s_extDef
= path
.AfterLast(wxT('.'));
1369 wxLogMessage(wxT("You selected the file '%s', remembered extension '%s'"),
1373 void MyFrame::FilesOpen(wxCommandEvent
& WXUNUSED(event
) )
1375 wxString wildcards
=
1377 wxT("C++ files (*.cpp)|*.cpp");
1381 wxT("All files (%s)|%s|C++ files (*.cpp;*.h)|*.cpp;*.h"),
1382 wxFileSelectorDefaultWildcardStr
,
1383 wxFileSelectorDefaultWildcardStr
1386 wxFileDialog
dialog(this, wxT("Testing open multiple file dialog"),
1387 wxEmptyString
, wxEmptyString
, wildcards
,
1388 wxFD_OPEN
|wxFD_MULTIPLE
);
1390 if (dialog
.ShowModal() == wxID_OK
)
1392 wxArrayString paths
, filenames
;
1394 dialog
.GetPaths(paths
);
1395 dialog
.GetFilenames(filenames
);
1398 size_t count
= paths
.GetCount();
1399 for ( size_t n
= 0; n
< count
; n
++ )
1401 s
.Printf(wxT("File %d: %s (%s)\n"),
1402 (int)n
, paths
[n
].c_str(), filenames
[n
].c_str());
1406 s
.Printf(wxT("Filter index: %d"), dialog
.GetFilterIndex());
1409 wxMessageDialog
dialog2(this, msg
, wxT("Selected files"));
1410 dialog2
.ShowModal();
1414 void MyFrame::FileSave(wxCommandEvent
& WXUNUSED(event
) )
1416 wxFileDialog
dialog(this,
1417 wxT("Testing save file dialog"),
1419 wxT("myletter.doc"),
1420 wxT("Text files (*.txt)|*.txt|Document files (*.doc;*.ods)|*.doc;*.ods"),
1421 wxFD_SAVE
|wxFD_OVERWRITE_PROMPT
);
1423 dialog
.SetFilterIndex(1);
1425 if (dialog
.ShowModal() == wxID_OK
)
1427 wxLogMessage(wxT("%s, filter %d"),
1428 dialog
.GetPath().c_str(), dialog
.GetFilterIndex());
1431 #endif // wxUSE_FILEDLG
1433 #if USE_FILEDLG_GENERIC
1434 void MyFrame::FileOpenGeneric(wxCommandEvent
& WXUNUSED(event
) )
1436 wxGenericFileDialog dialog
1439 wxT("Testing open file dialog"),
1442 wxT("C++ files (*.cpp;*.h)|*.cpp;*.h")
1445 dialog
.SetExtraControlCreator(&createMyExtraPanel
);
1446 dialog
.SetDirectory(wxGetHomeDir());
1448 if (dialog
.ShowModal() == wxID_OK
)
1451 info
.Printf(wxT("Full file name: %s\n")
1454 dialog
.GetPath().c_str(),
1455 dialog
.GetDirectory().c_str(),
1456 dialog
.GetFilename().c_str());
1457 wxMessageDialog
dialog2(this, info
, wxT("Selected file"));
1458 dialog2
.ShowModal();
1462 void MyFrame::FilesOpenGeneric(wxCommandEvent
& WXUNUSED(event
) )
1464 // On PocketPC you can disable OK-only dialogs policy using system option
1465 int buttons
= wxSystemOptions::GetOptionInt(wxT("wince.dialog.real-ok-cancel"));
1466 wxSystemOptions::SetOption(wxT("wince.dialog.real-ok-cancel"), 1);
1468 wxString wildcards
= wxT("All files (*.*)|*.*|C++ files (*.cpp;*.h)|*.cpp;*.h");
1469 wxGenericFileDialog
dialog(this, wxT("Testing open multiple file dialog"),
1470 wxEmptyString
, wxEmptyString
, wildcards
,
1473 if (dialog
.ShowModal() == wxID_OK
)
1475 wxArrayString paths
, filenames
;
1477 dialog
.GetPaths(paths
);
1478 dialog
.GetFilenames(filenames
);
1481 size_t count
= paths
.GetCount();
1482 for ( size_t n
= 0; n
< count
; n
++ )
1484 s
.Printf(wxT("File %d: %s (%s)\n"),
1485 (int)n
, paths
[n
].c_str(), filenames
[n
].c_str());
1489 s
.Printf(wxT("Filter index: %d"), dialog
.GetFilterIndex());
1492 wxMessageDialog
dialog2(this, msg
, wxT("Selected files"));
1493 dialog2
.ShowModal();
1496 // restore system option
1497 wxSystemOptions::SetOption(wxT("wince.dialog.real-ok-cancel"), buttons
);
1500 void MyFrame::FileSaveGeneric(wxCommandEvent
& WXUNUSED(event
) )
1502 wxGenericFileDialog
dialog(this,
1503 wxT("Testing save file dialog"),
1505 wxT("myletter.doc"),
1506 wxT("Text files (*.txt)|*.txt|Document files (*.doc;*.ods)|*.doc;*.ods"),
1507 wxFD_SAVE
|wxFD_OVERWRITE_PROMPT
);
1509 dialog
.SetFilterIndex(1);
1511 if (dialog
.ShowModal() == wxID_OK
)
1513 wxLogMessage(wxT("%s, filter %d"),
1514 dialog
.GetPath().c_str(), dialog
.GetFilterIndex());
1517 #endif // USE_FILEDLG_GENERIC
1520 void MyFrame::DoDirChoose(int style
)
1522 // pass some initial dir to wxDirDialog
1524 wxGetHomeDir(&dirHome
);
1526 wxDirDialog
dialog(this, wxT("Testing directory picker"), dirHome
, style
);
1528 if (dialog
.ShowModal() == wxID_OK
)
1530 wxLogMessage(wxT("Selected path: %s"), dialog
.GetPath().c_str());
1534 void MyFrame::DirChoose(wxCommandEvent
& WXUNUSED(event
) )
1536 DoDirChoose(wxDD_DEFAULT_STYLE
| wxDD_DIR_MUST_EXIST
);
1539 void MyFrame::DirChooseNew(wxCommandEvent
& WXUNUSED(event
) )
1541 DoDirChoose(wxDD_DEFAULT_STYLE
& ~wxDD_DIR_MUST_EXIST
);
1543 #endif // wxUSE_DIRDLG
1545 #if USE_DIRDLG_GENERIC
1546 void MyFrame::GenericDirChoose(wxCommandEvent
& WXUNUSED(event
) )
1548 // pass some initial dir to wxDirDialog
1550 wxGetHomeDir(&dirHome
);
1552 wxGenericDirDialog
dialog(this, wxT("Testing generic directory picker"), dirHome
);
1554 if (dialog
.ShowModal() == wxID_OK
)
1556 wxMessageDialog
dialog2(this, dialog
.GetPath(), wxT("Selected path"));
1557 dialog2
.ShowModal();
1560 #endif // USE_DIRDLG_GENERIC
1562 #if USE_MODAL_PRESENTATION
1563 void MyFrame::ModalDlg(wxCommandEvent
& WXUNUSED(event
))
1565 MyModalDialog
dlg(this);
1568 #endif // USE_MODAL_PRESENTATION
1570 void MyFrame::ModelessDlg(wxCommandEvent
& event
)
1572 bool show
= GetMenuBar()->IsChecked(event
.GetId());
1578 m_dialog
= new MyModelessDialog(this);
1581 m_dialog
->Show(true);
1585 // If m_dialog is NULL, then possibly the system
1586 // didn't report the checked menu item status correctly.
1587 // It should be true just after the menu item was selected,
1588 // if there was no modeless dialog yet.
1590 wxASSERT( m_dialog
!= NULL
);
1596 void MyFrame::DlgCenteredScreen(wxCommandEvent
& WXUNUSED(event
))
1598 wxDialog
dlg(this, wxID_ANY
, wxT("Dialog centered on screen"),
1599 wxDefaultPosition
, wxSize(200, 100));
1600 (new wxButton(&dlg
, wxID_OK
, wxT("Close")))->Centre();
1601 dlg
.CentreOnScreen();
1605 void MyFrame::DlgCenteredParent(wxCommandEvent
& WXUNUSED(event
))
1607 wxDialog
dlg(this, wxID_ANY
, wxT("Dialog centered on parent"),
1608 wxDefaultPosition
, wxSize(200, 100));
1609 (new wxButton(&dlg
, wxID_OK
, wxT("Close")))->Centre();
1610 dlg
.CentreOnParent();
1615 void MyFrame::MiniFrame(wxCommandEvent
& WXUNUSED(event
))
1617 wxFrame
*frame
= new wxMiniFrame(this, wxID_ANY
, wxT("Mini frame"),
1618 wxDefaultPosition
, wxSize(300, 100),
1619 wxCAPTION
| wxCLOSE_BOX
);
1620 new wxStaticText(frame
,
1622 wxT("Mini frames have slightly different appearance"),
1624 new wxStaticText(frame
,
1626 wxT("from the normal frames but that's the only difference."),
1629 frame
->CentreOnParent();
1632 #endif // wxUSE_MINIFRAME
1634 void MyFrame::DlgOnTop(wxCommandEvent
& WXUNUSED(event
))
1636 wxDialog
dlg(this, wxID_ANY
, wxT("Dialog staying on top of other windows"),
1637 wxDefaultPosition
, wxSize(300, 100),
1638 wxDEFAULT_DIALOG_STYLE
| wxSTAY_ON_TOP
);
1639 (new wxButton(&dlg
, wxID_OK
, wxT("Close")))->Centre();
1643 #if wxUSE_STARTUP_TIPS
1644 void MyFrame::ShowTip(wxCommandEvent
& WXUNUSED(event
))
1646 static size_t s_index
= (size_t)-1;
1648 if ( s_index
== (size_t)-1 )
1652 // this is completely bogus, we don't know how many lines are there
1653 // in the file, but who cares, it's a demo only...
1654 s_index
= rand() % 5;
1657 wxTipProvider
*tipProvider
= wxCreateFileTipProvider(wxT("tips.txt"), s_index
);
1659 bool showAtStartup
= wxShowTip(this, tipProvider
);
1661 if ( showAtStartup
)
1663 wxMessageBox(wxT("Will show tips on startup"), wxT("Tips dialog"),
1664 wxOK
| wxICON_INFORMATION
, this);
1667 s_index
= tipProvider
->GetCurrentTip();
1670 #endif // wxUSE_STARTUP_TIPS
1672 #if USE_SETTINGS_DIALOG
1673 void MyFrame::OnPropertySheet(wxCommandEvent
& event
)
1675 SettingsDialog
dialog(this, event
.GetId());
1678 #endif // USE_SETTINGS_DIALOG
1680 void MyFrame::OnRequestUserAttention(wxCommandEvent
& WXUNUSED(event
))
1682 wxLogStatus(wxT("Sleeping for 3 seconds to allow you to switch to another window"));
1686 RequestUserAttention(wxUSER_ATTENTION_ERROR
);
1689 #if wxUSE_NOTIFICATION_MESSAGE
1691 void MyFrame::OnNotifMsgAuto(wxCommandEvent
& WXUNUSED(event
))
1693 if ( !wxNotificationMessage
1695 "Automatic Notification",
1696 "Nothing important has happened\n"
1697 "this notification will disappear soon."
1700 wxLogStatus("Failed to show notification message");
1704 void MyFrame::OnNotifMsgShow(wxCommandEvent
& WXUNUSED(event
))
1708 m_notifMsg
= new wxNotificationMessage
1710 "wxWidgets Manual Notification",
1711 "You can hide this notification from the menu",
1716 if ( !m_notifMsg
->Show(wxNotificationMessage::Timeout_Never
) )
1718 wxLogStatus("Failed to show manual notification message");
1722 void MyFrame::OnNotifMsgHide(wxCommandEvent
& WXUNUSED(event
))
1724 if ( m_notifMsg
&& !m_notifMsg
->Close() )
1726 wxLogStatus("Failed to hide manual notification message");
1730 #endif // wxUSE_NOTIFICATION_MESSAGE
1732 void MyFrame::OnStandardButtonsSizerDialog(wxCommandEvent
& WXUNUSED(event
))
1734 StdButtonSizerDialog
dialog(this);
1738 // TestDefaultAction
1740 #define ID_CATCH_LISTBOX_DCLICK 100
1741 #define ID_LISTBOX 101
1743 BEGIN_EVENT_TABLE(TestDefaultActionDialog
, wxDialog
)
1744 EVT_CHECKBOX(ID_CATCH_LISTBOX_DCLICK
, TestDefaultActionDialog::OnCatchListBoxDClick
)
1745 EVT_LISTBOX_DCLICK(ID_LISTBOX
, TestDefaultActionDialog::OnListBoxDClick
)
1748 TestDefaultActionDialog::TestDefaultActionDialog( wxWindow
*parent
) :
1749 wxDialog( parent
, -1, "Test default action" )
1751 m_catchListBoxDClick
= false;
1753 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxVERTICAL
);
1755 wxFlexGridSizer
*grid_sizer
= new wxFlexGridSizer( 2, 5, 5 );
1758 wxListBox
*listbox
= new wxListBox( this, ID_LISTBOX
);
1759 listbox
->Append( "String 1" );
1760 listbox
->Append( "String 2" );
1761 listbox
->Append( "String 3" );
1762 listbox
->Append( "String 4" );
1763 grid_sizer
->Add( listbox
);
1764 #endif // wxUSE_LISTBOX
1766 grid_sizer
->Add( new wxCheckBox( this, ID_CATCH_LISTBOX_DCLICK
, "Catch DoubleClick from wxListBox" ), 0, wxALIGN_CENTRE_VERTICAL
);
1768 grid_sizer
->Add( new wxTextCtrl( this, -1, "", wxDefaultPosition
, wxSize(80,-1), 0 ), 0, wxALIGN_CENTRE_VERTICAL
);
1769 grid_sizer
->Add( new wxStaticText( this, -1, "wxTextCtrl without wxTE_PROCESS_ENTER" ), 0, wxALIGN_CENTRE_VERTICAL
);
1771 grid_sizer
->Add( new wxTextCtrl( this, -1, "", wxDefaultPosition
, wxSize(80,-1), wxTE_PROCESS_ENTER
), 0, wxALIGN_CENTRE_VERTICAL
);
1772 grid_sizer
->Add( new wxStaticText( this, -1, "wxTextCtrl with wxTE_PROCESS_ENTER" ), 0, wxALIGN_CENTRE_VERTICAL
);
1774 main_sizer
->Add( grid_sizer
, 0, wxALL
, 10 );
1776 wxSizer
*button_sizer
= CreateSeparatedButtonSizer( wxOK
|wxCANCEL
);
1778 main_sizer
->Add( button_sizer
, 0, wxALL
|wxGROW
, 5 );
1780 SetSizerAndFit( main_sizer
);
1783 void TestDefaultActionDialog::OnListBoxDClick(wxCommandEvent
& event
)
1785 event
.Skip( !m_catchListBoxDClick
);
1788 void TestDefaultActionDialog::OnCatchListBoxDClick(wxCommandEvent
& WXUNUSED(event
))
1790 m_catchListBoxDClick
= !m_catchListBoxDClick
;
1793 void MyFrame::OnTestDefaultActionDialog(wxCommandEvent
& WXUNUSED(event
))
1795 TestDefaultActionDialog
dialog( this );
1799 void MyFrame::OnExit(wxCommandEvent
& WXUNUSED(event
) )
1804 #if wxUSE_PROGRESSDLG
1806 void MyFrame::ShowProgress( wxCommandEvent
& WXUNUSED(event
) )
1808 static const int max
= 100;
1810 wxProgressDialog
dialog("Progress dialog example",
1811 // "Reserve" enough space for the multiline
1812 // messages below, we'll change it anyhow
1813 // immediately in the loop below
1814 wxString(' ', 100) + "\n\n\n\n",
1820 //wxPD_AUTO_HIDE | // -- try this as well
1822 wxPD_ESTIMATED_TIME
|
1823 wxPD_REMAINING_TIME
|
1824 wxPD_SMOOTH
// - makes indeterminate mode bar on WinXP very small
1828 for ( int i
= 0; i
<= max
; i
++ )
1832 // test both modes of wxProgressDialog behaviour: start in
1833 // indeterminate mode but switch to the determinate one later
1834 const bool determinate
= i
> max
/2;
1838 msg
= "That's all, folks!\n"
1840 "Nothing to see here any more.";
1842 else if ( !determinate
)
1844 msg
= "Testing indeterminate mode\n"
1846 "This mode allows you to show to the user\n"
1847 "that something is going on even if you don't know\n"
1848 "when exactly will you finish.";
1850 else if ( determinate
)
1852 msg
= "Now in standard determinate mode\n"
1854 "This is the standard usage mode in which you\n"
1855 "update the dialog after performing each new step of work.\n"
1856 "It requires knowing the total number of steps in advance.";
1859 // will be set to true if "Skip" button was pressed
1863 cont
= dialog
.Update(i
, msg
, &skip
);
1867 cont
= dialog
.Pulse(msg
, &skip
);
1870 // each skip will move progress about quarter forward
1881 if ( wxMessageBox(wxT("Do you really want to cancel?"),
1882 wxT("Progress dialog question"), // caption
1883 wxYES_NO
| wxICON_QUESTION
) == wxYES
)
1895 wxLogStatus(wxT("Progress dialog aborted!"));
1899 wxLogStatus(wxT("Countdown from %d finished"), max
);
1903 #endif // wxUSE_PROGRESSDLG
1907 static void InitAboutInfoMinimal(wxAboutDialogInfo
& info
)
1909 info
.SetName(wxT("Dialogs Sample"));
1910 info
.SetVersion(wxVERSION_NUM_DOT_STRING
,
1914 wxMINOR_VERSION
% 2 ? "Development" : "Stable",
1915 wxVERSION_NUM_DOT_STRING
1917 info
.SetDescription(wxT("This sample shows different wxWidgets dialogs"));
1918 info
.SetCopyright(wxT("(C) 1998-2006 wxWidgets dev team"));
1919 info
.AddDeveloper(wxT("Vadim Zeitlin"));
1922 static void InitAboutInfoWebsite(wxAboutDialogInfo
& info
)
1924 InitAboutInfoMinimal(info
);
1926 info
.SetWebSite(wxT("http://www.wxwidgets.org/"), wxT("wxWidgets web site"));
1929 static void InitAboutInfoAll(wxAboutDialogInfo
& info
)
1931 InitAboutInfoWebsite(info
);
1933 // we can add a second developer
1934 info
.AddDeveloper(wxT("A.N. Other"));
1936 // or we can add several persons at once like this
1937 static const wxChar
*docwriters
[] =
1939 wxT("First D. Writer"),
1943 info
.SetDocWriters(wxArrayString(WXSIZEOF(docwriters
), docwriters
));
1944 info
.SetLicence(wxString::FromAscii(
1945 " wxWindows Library Licence, Version 3.1\n"
1946 " ======================================\n"
1948 " Copyright (c) 1998-2005 Julian Smart, Robert Roebling et al\n"
1950 " Everyone is permitted to copy and distribute verbatim copies\n"
1951 " of this licence document, but changing it is not allowed.\n"
1953 " WXWINDOWS LIBRARY LICENCE\n"
1954 " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n"
1956 " ...and so on and so forth...\n"
1959 info
.AddTranslator(wxT("Wun Ngo Wen (Martian)"));
1962 void MyFrame::ShowSimpleAboutDialog(wxCommandEvent
& WXUNUSED(event
))
1964 wxAboutDialogInfo info
;
1965 InitAboutInfoMinimal(info
);
1967 wxAboutBox(info
, this);
1970 void MyFrame::ShowFancyAboutDialog(wxCommandEvent
& WXUNUSED(event
))
1972 wxAboutDialogInfo info
;
1973 InitAboutInfoWebsite(info
);
1975 wxAboutBox(info
, this);
1978 void MyFrame::ShowFullAboutDialog(wxCommandEvent
& WXUNUSED(event
))
1980 wxAboutDialogInfo info
;
1981 InitAboutInfoAll(info
);
1983 wxAboutBox(info
, this);
1986 // a trivial example of a custom dialog class
1987 class MyAboutDialog
: public wxGenericAboutDialog
1990 MyAboutDialog(const wxAboutDialogInfo
& info
, wxWindow
* parent
)
1992 Create(info
, parent
);
1995 // add some custom controls
1996 virtual void DoAddCustomControls()
1998 AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
1999 AddText(wxT("Some custom text"));
2000 AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
2004 void MyFrame::ShowCustomAboutDialog(wxCommandEvent
& WXUNUSED(event
))
2006 wxAboutDialogInfo info
;
2007 InitAboutInfoAll(info
);
2009 MyAboutDialog
dlg(info
, this);
2013 #endif // wxUSE_ABOUTDLG
2017 void MyFrame::ShowBusyInfo(wxCommandEvent
& WXUNUSED(event
))
2019 wxWindowDisabler disableAll
;
2021 wxBusyInfo
info(wxT("Working, please wait..."), this);
2023 for ( int i
= 0; i
< 18; i
++ )
2033 #endif // wxUSE_BUSYINFO
2035 #if wxUSE_FINDREPLDLG
2037 void MyFrame::ShowReplaceDialog( wxCommandEvent
& WXUNUSED(event
) )
2041 wxDELETE(m_dlgReplace
);
2045 m_dlgReplace
= new wxFindReplaceDialog
2049 wxT("Find and replace dialog"),
2053 m_dlgReplace
->Show(true);
2057 void MyFrame::ShowFindDialog( wxCommandEvent
& WXUNUSED(event
) )
2061 wxDELETE(m_dlgFind
);
2065 m_dlgFind
= new wxFindReplaceDialog
2074 m_dlgFind
->Show(true);
2078 static wxString
DecodeFindDialogEventFlags(int flags
)
2081 str
<< (flags
& wxFR_DOWN
? wxT("down") : wxT("up")) << wxT(", ")
2082 << (flags
& wxFR_WHOLEWORD
? wxT("whole words only, ") : wxT(""))
2083 << (flags
& wxFR_MATCHCASE
? wxT("") : wxT("not "))
2084 << wxT("case sensitive");
2089 void MyFrame::OnFindDialog(wxFindDialogEvent
& event
)
2091 wxEventType type
= event
.GetEventType();
2093 if ( type
== wxEVT_COMMAND_FIND
|| type
== wxEVT_COMMAND_FIND_NEXT
)
2095 wxLogMessage(wxT("Find %s'%s' (flags: %s)"),
2096 type
== wxEVT_COMMAND_FIND_NEXT
? wxT("next ") : wxT(""),
2097 event
.GetFindString().c_str(),
2098 DecodeFindDialogEventFlags(event
.GetFlags()).c_str());
2100 else if ( type
== wxEVT_COMMAND_FIND_REPLACE
||
2101 type
== wxEVT_COMMAND_FIND_REPLACE_ALL
)
2103 wxLogMessage(wxT("Replace %s'%s' with '%s' (flags: %s)"),
2104 type
== wxEVT_COMMAND_FIND_REPLACE_ALL
? wxT("all ") : wxT(""),
2105 event
.GetFindString().c_str(),
2106 event
.GetReplaceString().c_str(),
2107 DecodeFindDialogEventFlags(event
.GetFlags()).c_str());
2109 else if ( type
== wxEVT_COMMAND_FIND_CLOSE
)
2111 wxFindReplaceDialog
*dlg
= event
.GetDialog();
2115 if ( dlg
== m_dlgFind
)
2118 idMenu
= DIALOGS_FIND
;
2121 else if ( dlg
== m_dlgReplace
)
2123 txt
= wxT("Replace");
2124 idMenu
= DIALOGS_REPLACE
;
2125 m_dlgReplace
= NULL
;
2129 txt
= wxT("Unknown");
2132 wxFAIL_MSG( wxT("unexpected event") );
2135 wxLogMessage(wxT("%s dialog is being closed."), txt
);
2137 if ( idMenu
!= wxID_ANY
)
2139 GetMenuBar()->Check(idMenu
, false);
2146 wxLogError(wxT("Unknown find dialog event!"));
2150 #endif // wxUSE_FINDREPLDLG
2152 // ----------------------------------------------------------------------------
2154 // ----------------------------------------------------------------------------
2156 void MyCanvas::OnPaint(wxPaintEvent
& WXUNUSED(event
) )
2159 dc
.SetBackgroundMode(wxTRANSPARENT
);
2161 wxT("wxWidgets common dialogs")
2162 #if !defined(__SMARTPHONE__)
2163 wxT(" test application")
2168 #if USE_MODAL_PRESENTATION
2170 // ----------------------------------------------------------------------------
2172 // ----------------------------------------------------------------------------
2174 MyModelessDialog::MyModelessDialog(wxWindow
*parent
)
2175 : wxDialog(parent
, wxID_ANY
, wxString(wxT("Modeless dialog")))
2177 wxBoxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
);
2179 wxButton
*btn
= new wxButton(this, DIALOGS_MODELESS_BTN
, wxT("Press me"));
2180 wxCheckBox
*check
= new wxCheckBox(this, wxID_ANY
, wxT("Should be disabled"));
2183 sizerTop
->Add(btn
, 1, wxEXPAND
| wxALL
, 5);
2184 sizerTop
->Add(check
, 1, wxEXPAND
| wxALL
, 5);
2186 SetSizerAndFit(sizerTop
);
2189 void MyModelessDialog::OnButton(wxCommandEvent
& WXUNUSED(event
))
2191 wxMessageBox(wxT("Button pressed in modeless dialog"), wxT("Info"),
2192 wxOK
| wxICON_INFORMATION
, this);
2195 void MyModelessDialog::OnClose(wxCloseEvent
& event
)
2197 if ( event
.CanVeto() )
2199 wxMessageBox(wxT("Use the menu item to close this dialog"),
2200 wxT("Modeless dialog"),
2201 wxOK
| wxICON_INFORMATION
, this);
2207 // ----------------------------------------------------------------------------
2209 // ----------------------------------------------------------------------------
2211 MyModalDialog::MyModalDialog(wxWindow
*parent
)
2212 : wxDialog(parent
, wxID_ANY
, wxString(wxT("Modal dialog")))
2214 wxBoxSizer
*sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
2216 m_btnModal
= new wxButton(this, wxID_ANY
, wxT("&Modal dialog..."));
2217 m_btnModeless
= new wxButton(this, wxID_ANY
, wxT("Mode&less dialog"));
2218 m_btnDelete
= new wxButton(this, wxID_ANY
, wxT("&Delete button"));
2220 sizerTop
->Add(m_btnModal
, 0, wxALIGN_CENTER
| wxALL
, 5);
2221 sizerTop
->Add(m_btnModeless
, 0, wxALIGN_CENTER
| wxALL
, 5);
2222 sizerTop
->Add(m_btnDelete
, 0, wxALIGN_CENTER
| wxALL
, 5);
2223 sizerTop
->Add(new wxButton(this, wxID_CLOSE
), 0, wxALIGN_CENTER
| wxALL
, 5);
2225 SetSizerAndFit(sizerTop
);
2227 SetEscapeId(wxID_CLOSE
);
2229 m_btnModal
->SetFocus();
2230 m_btnModal
->SetDefault();
2233 void MyModalDialog::OnButton(wxCommandEvent
& event
)
2235 if ( event
.GetEventObject() == m_btnDelete
)
2237 wxDELETE(m_btnModal
);
2238 m_btnDelete
->Disable();
2240 else if ( event
.GetEventObject() == m_btnModal
)
2243 wxGetTextFromUser(wxT("Dummy prompt"),
2244 wxT("Modal dialog called from dialog"),
2245 wxEmptyString
, this);
2247 wxMessageBox(wxT("Modal dialog called from dialog"));
2248 #endif // wxUSE_TEXTDLG
2250 else if ( event
.GetEventObject() == m_btnModeless
)
2252 (new MyModelessDialog(this))->Show();
2260 #endif // USE_MODAL_PRESENTATION
2262 // ----------------------------------------------------------------------------
2263 // StdButtonSizerDialog
2264 // ----------------------------------------------------------------------------
2266 StdButtonSizerDialog::StdButtonSizerDialog(wxWindow
*parent
)
2267 : wxDialog(parent
, wxID_ANY
, wxString(wxT("StdButtonSizer dialog")),
2268 wxDefaultPosition
, wxDefaultSize
, wxDEFAULT_DIALOG_STYLE
|wxRESIZE_BORDER
),
2269 m_buttonsSizer(NULL
)
2271 wxBoxSizer
*const sizerTop
= new wxBoxSizer(wxVERTICAL
);
2273 wxBoxSizer
*const sizer
= new wxBoxSizer(wxHORIZONTAL
);
2274 wxBoxSizer
*const sizerInside1
= new wxBoxSizer(wxVERTICAL
);
2276 m_chkboxAffirmativeButton
= new wxCheckBox(this, wxID_ANY
, _("Enable Affirmative Button"));
2278 wxStaticBoxSizer
*const sizer1
= new wxStaticBoxSizer(wxVERTICAL
, this, wxT("Affirmative Button"));
2280 m_radiobtnOk
= new wxRadioButton(this, wxID_ANY
, _("Ok"), wxDefaultPosition
, wxDefaultSize
, wxRB_GROUP
);
2281 m_radiobtnYes
= new wxRadioButton(this, wxID_ANY
, _("Yes"));
2283 wxBoxSizer
*const sizerInside2
= new wxBoxSizer(wxVERTICAL
);
2285 m_chkboxDismissButton
= new wxCheckBox(this, wxID_ANY
, _("Enable Dismiss Button"));
2287 wxStaticBoxSizer
*const sizer2
= new wxStaticBoxSizer(wxVERTICAL
, this, wxT("Dismiss Button"));
2289 m_radiobtnCancel
= new wxRadioButton(this, wxID_ANY
, _("Cancel"), wxDefaultPosition
, wxDefaultSize
, wxRB_GROUP
);
2290 m_radiobtnClose
= new wxRadioButton(this, wxID_ANY
, _("Close"));
2292 wxBoxSizer
*const sizer3
= new wxBoxSizer(wxHORIZONTAL
);
2294 m_chkboxNo
= new wxCheckBox(this, wxID_ANY
, _("No"));
2295 m_chkboxHelp
= new wxCheckBox(this, wxID_ANY
, _("Help"));
2296 m_chkboxApply
= new wxCheckBox(this, wxID_ANY
, _("Apply"));
2298 m_chkboxNoDefault
= new wxCheckBox(this, wxID_ANY
, wxT("No Default"));
2300 sizer1
->Add(m_radiobtnOk
, 0, wxALL
, 5);
2301 sizer1
->Add(m_radiobtnYes
, 0, wxALL
, 5);
2303 sizer
->Add(sizerInside1
, 0, 0, 0);
2304 sizerInside1
->Add(m_chkboxAffirmativeButton
, 0, wxALL
, 5);
2305 sizerInside1
->Add(sizer1
, 0, wxALL
, 5);
2306 sizerInside1
->SetItemMinSize(sizer1
, sizer1
->GetStaticBox()->GetBestSize()); // to prevent wrapping of static box label
2308 sizer2
->Add(m_radiobtnCancel
, 0, wxALL
, 5);
2309 sizer2
->Add(m_radiobtnClose
, 0, wxALL
, 5);
2311 sizer
->Add(sizerInside2
, 0, 0, 0);
2312 sizerInside2
->Add(m_chkboxDismissButton
, 0, wxALL
, 5);
2313 sizerInside2
->Add(sizer2
, 0, wxALL
, 5);
2314 sizerInside2
->SetItemMinSize(sizer2
, sizer2
->GetStaticBox()->GetBestSize()); // to prevent wrapping of static box label
2316 sizerTop
->Add(sizer
, 0, wxALL
, 5);
2318 sizer3
->Add(m_chkboxNo
, 0, wxALL
, 5);
2319 sizer3
->Add(m_chkboxHelp
, 0, wxALL
, 5);
2320 sizer3
->Add(m_chkboxApply
, 0, wxALL
, 5);
2322 sizerTop
->Add(sizer3
, 0, wxALL
, 5);
2324 sizerTop
->Add(m_chkboxNoDefault
, 0, wxLEFT
|wxRIGHT
, 10);
2326 EnableDisableControls();
2328 SetSizerAndFit(sizerTop
);
2334 void StdButtonSizerDialog::OnEvent(wxCommandEvent
& WXUNUSED(event
))
2338 m_buttonsSizer
->DeleteWindows();
2339 GetSizer()->Remove(m_buttonsSizer
);
2342 EnableDisableControls();
2345 unsigned long numButtons
= 0;
2347 if (m_chkboxAffirmativeButton
->IsChecked())
2349 if (m_radiobtnOk
->GetValue())
2354 else if (m_radiobtnYes
->GetValue())
2361 if (m_chkboxDismissButton
->IsChecked())
2363 if (m_radiobtnCancel
->GetValue())
2369 else if (m_radiobtnClose
->GetValue())
2377 if (m_chkboxApply
->IsChecked())
2383 if (m_chkboxNo
->IsChecked())
2389 if (m_chkboxHelp
->IsChecked())
2395 if (m_chkboxNoDefault
->IsChecked())
2397 flags
|= wxNO_DEFAULT
;
2400 m_buttonsSizer
= CreateStdDialogButtonSizer(flags
);
2401 GetSizer()->Add(m_buttonsSizer
, 0, wxGROW
|wxALL
, 5);
2404 GetSizer()->SetSizeHints(this);
2407 void StdButtonSizerDialog::EnableDisableControls()
2409 const bool affButtonEnabled
= m_chkboxAffirmativeButton
->IsChecked();
2411 m_radiobtnOk
->Enable(affButtonEnabled
);
2412 m_radiobtnYes
->Enable(affButtonEnabled
);
2414 const bool dismissButtonEnabled
= m_chkboxDismissButton
->IsChecked();
2416 m_radiobtnCancel
->Enable(dismissButtonEnabled
);
2417 m_radiobtnClose
->Enable(dismissButtonEnabled
);
2420 #if USE_SETTINGS_DIALOG
2421 // ----------------------------------------------------------------------------
2423 // ----------------------------------------------------------------------------
2425 IMPLEMENT_CLASS(SettingsDialog
, wxPropertySheetDialog
)
2427 BEGIN_EVENT_TABLE(SettingsDialog
, wxPropertySheetDialog
)
2430 SettingsDialog::SettingsDialog(wxWindow
* win
, int dialogType
)
2432 SetExtraStyle(wxDIALOG_EX_CONTEXTHELP
|wxWS_EX_VALIDATE_RECURSIVELY
);
2437 bool useToolBook
= (dialogType
== DIALOGS_PROPERTY_SHEET_TOOLBOOK
|| dialogType
== DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK
);
2438 int resizeBorder
= wxRESIZE_BORDER
;
2446 int sheetStyle
= wxPROPSHEET_SHRINKTOFIT
;
2447 if (dialogType
== DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK
)
2448 sheetStyle
|= wxPROPSHEET_BUTTONTOOLBOOK
;
2450 sheetStyle
|= wxPROPSHEET_TOOLBOOK
;
2452 SetSheetStyle(sheetStyle
);
2453 SetSheetInnerBorder(0);
2454 SetSheetOuterBorder(0);
2456 // create a dummy image list with a few icons
2457 const wxSize
imageSize(32, 32);
2459 m_imageList
= new wxImageList(imageSize
.GetWidth(), imageSize
.GetHeight());
2461 Add(wxArtProvider::GetIcon(wxART_INFORMATION
, wxART_OTHER
, imageSize
));
2463 Add(wxArtProvider::GetIcon(wxART_QUESTION
, wxART_OTHER
, imageSize
));
2465 Add(wxArtProvider::GetIcon(wxART_WARNING
, wxART_OTHER
, imageSize
));
2467 Add(wxArtProvider::GetIcon(wxART_ERROR
, wxART_OTHER
, imageSize
));
2472 Create(win
, wxID_ANY
, _("Preferences"), wxDefaultPosition
, wxDefaultSize
,
2473 wxDEFAULT_DIALOG_STYLE
| (int)wxPlatform::IfNot(wxOS_WINDOWS_CE
, resizeBorder
)
2476 // If using a toolbook, also follow Mac style and don't create buttons
2478 CreateButtons(wxOK
| wxCANCEL
|
2479 (int)wxPlatform::IfNot(wxOS_WINDOWS_CE
, wxHELP
)
2482 wxBookCtrlBase
* notebook
= GetBookCtrl();
2483 notebook
->SetImageList(m_imageList
);
2485 wxPanel
* generalSettings
= CreateGeneralSettingsPage(notebook
);
2486 wxPanel
* aestheticSettings
= CreateAestheticSettingsPage(notebook
);
2488 notebook
->AddPage(generalSettings
, _("General"), true, tabImage1
);
2489 notebook
->AddPage(aestheticSettings
, _("Aesthetics"), false, tabImage2
);
2494 SettingsDialog::~SettingsDialog()
2499 wxPanel
* SettingsDialog::CreateGeneralSettingsPage(wxWindow
* parent
)
2501 wxPanel
* panel
= new wxPanel(parent
, wxID_ANY
);
2503 wxBoxSizer
*topSizer
= new wxBoxSizer( wxVERTICAL
);
2504 wxBoxSizer
*item0
= new wxBoxSizer( wxVERTICAL
);
2508 wxBoxSizer
* itemSizer3
= new wxBoxSizer( wxHORIZONTAL
);
2509 wxCheckBox
* checkBox3
= new wxCheckBox(panel
, ID_LOAD_LAST_PROJECT
, _("&Load last project on startup"), wxDefaultPosition
, wxDefaultSize
);
2510 itemSizer3
->Add(checkBox3
, 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2511 item0
->Add(itemSizer3
, 0, wxGROW
|wxALL
, 0);
2515 wxString autoSaveLabel
= _("&Auto-save every");
2516 wxString minsLabel
= _("mins");
2518 wxBoxSizer
* itemSizer12
= new wxBoxSizer( wxHORIZONTAL
);
2519 wxCheckBox
* checkBox12
= new wxCheckBox(panel
, ID_AUTO_SAVE
, autoSaveLabel
, wxDefaultPosition
, wxDefaultSize
);
2522 wxSpinCtrl
* spinCtrl12
= new wxSpinCtrl(panel
, ID_AUTO_SAVE_MINS
, wxEmptyString
,
2523 wxDefaultPosition
, wxSize(40, wxDefaultCoord
), wxSP_ARROW_KEYS
, 1, 60, 1);
2526 itemSizer12
->Add(checkBox12
, 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2528 itemSizer12
->Add(spinCtrl12
, 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2530 itemSizer12
->Add(new wxStaticText(panel
, wxID_STATIC
, minsLabel
), 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2531 item0
->Add(itemSizer12
, 0, wxGROW
|wxALL
, 0);
2535 wxBoxSizer
* itemSizer8
= new wxBoxSizer( wxHORIZONTAL
);
2536 wxCheckBox
* checkBox6
= new wxCheckBox(panel
, ID_SHOW_TOOLTIPS
, _("Show &tooltips"), wxDefaultPosition
, wxDefaultSize
);
2537 itemSizer8
->Add(checkBox6
, 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2538 item0
->Add(itemSizer8
, 0, wxGROW
|wxALL
, 0);
2540 topSizer
->Add( item0
, 1, wxGROW
|wxALIGN_CENTRE
|wxALL
, 5 );
2542 panel
->SetSizerAndFit(topSizer
);
2547 wxPanel
* SettingsDialog::CreateAestheticSettingsPage(wxWindow
* parent
)
2549 wxPanel
* panel
= new wxPanel(parent
, wxID_ANY
);
2551 wxBoxSizer
*topSizer
= new wxBoxSizer( wxVERTICAL
);
2552 wxBoxSizer
*item0
= new wxBoxSizer( wxVERTICAL
);
2554 //// PROJECT OR GLOBAL
2555 wxString globalOrProjectChoices
[2];
2556 globalOrProjectChoices
[0] = _("&New projects");
2557 globalOrProjectChoices
[1] = _("&This project");
2559 wxRadioBox
* projectOrGlobal
= new wxRadioBox(panel
, ID_APPLY_SETTINGS_TO
, _("&Apply settings to:"),
2560 wxDefaultPosition
, wxDefaultSize
, 2, globalOrProjectChoices
);
2561 item0
->Add(projectOrGlobal
, 0, wxGROW
|wxALL
, 5);
2563 projectOrGlobal
->SetSelection(0);
2565 //// BACKGROUND STYLE
2566 wxArrayString backgroundStyleChoices
;
2567 backgroundStyleChoices
.Add(wxT("Colour"));
2568 backgroundStyleChoices
.Add(wxT("Image"));
2569 wxStaticBox
* staticBox3
= new wxStaticBox(panel
, wxID_ANY
, _("Background style:"));
2571 wxBoxSizer
* styleSizer
= new wxStaticBoxSizer( staticBox3
, wxVERTICAL
);
2572 item0
->Add(styleSizer
, 0, wxGROW
|wxALL
, 5);
2574 wxBoxSizer
* itemSizer2
= new wxBoxSizer( wxHORIZONTAL
);
2576 wxChoice
* choice2
= new wxChoice(panel
, ID_BACKGROUND_STYLE
, wxDefaultPosition
, wxDefaultSize
, backgroundStyleChoices
);
2578 itemSizer2
->Add(new wxStaticText(panel
, wxID_ANY
, _("&Window:")), 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2579 itemSizer2
->Add(5, 5, 1, wxALL
, 0);
2580 itemSizer2
->Add(choice2
, 0, wxALL
|wxALIGN_CENTER_VERTICAL
, 5);
2582 styleSizer
->Add(itemSizer2
, 0, wxGROW
|wxALL
, 5);
2585 //// FONT SIZE SELECTION
2587 wxStaticBox
* staticBox1
= new wxStaticBox(panel
, wxID_ANY
, _("Tile font size:"));
2588 wxBoxSizer
* itemSizer5
= new wxStaticBoxSizer( staticBox1
, wxHORIZONTAL
);
2590 wxSpinCtrl
* spinCtrl
= new wxSpinCtrl(panel
, ID_FONT_SIZE
, wxEmptyString
, wxDefaultPosition
,
2591 wxSize(80, wxDefaultCoord
));
2592 itemSizer5
->Add(spinCtrl
, 0, wxALL
|wxALIGN_CENTER_HORIZONTAL
|wxALIGN_CENTER_VERTICAL
, 5);
2594 item0
->Add(itemSizer5
, 0, wxGROW
|wxLEFT
|wxRIGHT
, 5);
2597 topSizer
->Add( item0
, 1, wxGROW
|wxALIGN_CENTRE
|wxALL
, 5 );
2598 topSizer
->AddSpacer(5);
2600 panel
->SetSizerAndFit(topSizer
);
2605 #endif // USE_SETTINGS_DIALOG
2608 // ----------------------------------------------------------------------------
2609 // TestMessageBoxDialog
2610 // ----------------------------------------------------------------------------
2613 const TestMessageBoxDialog::BtnInfo
TestMessageBoxDialog::ms_btnInfo
[] =
2618 { wxCANCEL
, "&Cancel" },
2621 BEGIN_EVENT_TABLE(TestMessageBoxDialog
, wxDialog
)
2622 EVT_BUTTON(wxID_APPLY
, TestMessageBoxDialog::OnApply
)
2623 EVT_BUTTON(wxID_CLOSE
, TestMessageBoxDialog::OnClose
)
2626 TestMessageBoxDialog::TestMessageBoxDialog(wxWindow
*parent
)
2627 : wxDialog(parent
, wxID_ANY
, "Message Box Test Dialog",
2628 wxDefaultPosition
, wxDefaultSize
,
2629 wxDEFAULT_DIALOG_STYLE
| wxRESIZE_BORDER
)
2633 bool TestMessageBoxDialog::Create()
2635 wxSizer
* const sizerTop
= new wxBoxSizer(wxVERTICAL
);
2637 // this sizer allows to configure the messages shown in the message box
2639 sizerMsgs
= new wxStaticBoxSizer(wxVERTICAL
, this, "&Messages");
2640 sizerMsgs
->Add(new wxStaticText(this, wxID_ANY
, "&Main message:"));
2641 m_textMsg
= new wxTextCtrl(this, wxID_ANY
, "Hello from a box!",
2642 wxDefaultPosition
, wxDefaultSize
,
2644 sizerMsgs
->Add(m_textMsg
, wxSizerFlags(1).Expand().Border(wxBOTTOM
));
2646 sizerMsgs
->Add(new wxStaticText(this, wxID_ANY
, "&Extended message:"));
2647 m_textExtMsg
= new wxTextCtrl(this, wxID_ANY
, "",
2648 wxDefaultPosition
, wxDefaultSize
,
2650 sizerMsgs
->Add(m_textExtMsg
, wxSizerFlags(1).Expand());
2652 sizerTop
->Add(sizerMsgs
, wxSizerFlags(1).Expand().Border());
2654 // if a derived class provides more message configurations, add these.
2655 AddAdditionalTextOptions(sizerTop
);
2657 // this one is for configuring the buttons
2659 sizerBtnsBox
= new wxStaticBoxSizer(wxVERTICAL
, this, "&Buttons");
2661 wxFlexGridSizer
* const sizerBtns
= new wxFlexGridSizer(2, 5, 5);
2662 sizerBtns
->AddGrowableCol(1);
2664 sizerBtns
->Add(new wxStaticText(this, wxID_ANY
, "Button(s)"));
2665 sizerBtns
->Add(new wxStaticText(this, wxID_ANY
, "Custom label"));
2667 for ( int n
= 0; n
< Btn_Max
; n
++ )
2669 m_buttons
[n
] = new wxCheckBox(this, wxID_ANY
, ms_btnInfo
[n
].name
);
2670 sizerBtns
->Add(m_buttons
[n
], wxSizerFlags().Centre().Left());
2672 m_labels
[n
] = new wxTextCtrl(this, wxID_ANY
);
2673 sizerBtns
->Add(m_labels
[n
], wxSizerFlags(1).Centre().Expand());
2675 m_labels
[n
]->Connect(wxEVT_UPDATE_UI
,
2676 wxUpdateUIEventHandler(
2677 TestMessageBoxDialog::OnUpdateLabelUI
),
2682 sizerBtnsBox
->Add(sizerBtns
, wxSizerFlags(1).Expand());
2683 sizerTop
->Add(sizerBtnsBox
, wxSizerFlags().Expand().Border());
2687 const wxString icons
[] =
2691 "&Information icon",
2697 wxCOMPILE_TIME_ASSERT( WXSIZEOF(icons
) == MsgDlgIcon_Max
, IconMismatch
);
2699 m_icons
= new wxRadioBox(this, wxID_ANY
, "&Icon style",
2700 wxDefaultPosition
, wxDefaultSize
,
2701 WXSIZEOF(icons
), icons
,
2702 2, wxRA_SPECIFY_ROWS
);
2703 // Make the 'Information' icon the default one:
2704 m_icons
->SetSelection(MsgDlgIcon_Info
);
2705 sizerTop
->Add(m_icons
, wxSizerFlags().Expand().Border());
2708 // miscellaneous other stuff
2710 sizerFlags
= new wxStaticBoxSizer(wxHORIZONTAL
, this, "&Other flags");
2712 m_chkNoDefault
= new wxCheckBox(this, wxID_ANY
, "Make \"No\" &default");
2713 m_chkNoDefault
->Connect(wxEVT_UPDATE_UI
,
2714 wxUpdateUIEventHandler(
2715 TestMessageBoxDialog::OnUpdateNoDefaultUI
),
2718 sizerFlags
->Add(m_chkNoDefault
, wxSizerFlags(1).Border());
2720 m_chkCentre
= new wxCheckBox(this, wxID_ANY
, "Centre on &parent");
2721 sizerFlags
->Add(m_chkCentre
, wxSizerFlags(1).Border());
2723 // add any additional flag from subclasses
2724 AddAdditionalFlags(sizerFlags
);
2726 sizerTop
->Add(sizerFlags
, wxSizerFlags().Expand().Border());
2728 // finally buttons to show the resulting message box and close this dialog
2729 sizerTop
->Add(CreateStdDialogButtonSizer(wxAPPLY
| wxCLOSE
),
2730 wxSizerFlags().Right().Border());
2732 SetSizerAndFit(sizerTop
);
2734 m_buttons
[Btn_Ok
]->SetValue(true);
2739 void TestMessageBoxDialog::OnUpdateLabelUI(wxUpdateUIEvent
& event
)
2741 for ( int n
= 0; n
< Btn_Max
; n
++ )
2743 if ( event
.GetEventObject() == m_labels
[n
] )
2745 event
.Enable( m_buttons
[n
]->IsChecked() );
2750 wxFAIL_MSG( "called for unknown label" );
2753 void TestMessageBoxDialog::OnUpdateNoDefaultUI(wxUpdateUIEvent
& event
)
2755 event
.Enable( m_buttons
[Btn_No
]->IsChecked() );
2758 long TestMessageBoxDialog::GetStyle()
2762 for ( int n
= 0; n
< Btn_Max
; n
++ )
2764 if ( m_buttons
[n
]->IsChecked() )
2765 style
|= ms_btnInfo
[n
].flag
;
2768 switch ( m_icons
->GetSelection() )
2770 case MsgDlgIcon_Max
:
2771 wxFAIL_MSG( "unexpected selection" );
2776 case MsgDlgIcon_None
:
2777 style
|= wxICON_NONE
;
2780 case MsgDlgIcon_Info
:
2781 style
|= wxICON_INFORMATION
;
2784 case MsgDlgIcon_Question
:
2785 style
|= wxICON_QUESTION
;
2788 case MsgDlgIcon_Warning
:
2789 style
|= wxICON_WARNING
;
2792 case MsgDlgIcon_Error
:
2793 style
|= wxICON_ERROR
;
2797 if ( m_chkCentre
->IsChecked() )
2800 if ( m_chkNoDefault
->IsEnabled() && m_chkNoDefault
->IsChecked() )
2801 style
|= wxNO_DEFAULT
;
2806 void TestMessageBoxDialog::PrepareMessageDialog(wxMessageDialogBase
&dlg
)
2808 long style
= dlg
.GetMessageDialogStyle();
2810 if ( !m_textExtMsg
->IsEmpty() )
2811 dlg
.SetExtendedMessage(m_textExtMsg
->GetValue());
2813 if ( style
& wxYES_NO
)
2815 if ( style
& wxCANCEL
)
2817 dlg
.SetYesNoCancelLabels(m_labels
[Btn_Yes
]->GetValue(),
2818 m_labels
[Btn_No
]->GetValue(),
2819 m_labels
[Btn_Cancel
]->GetValue());
2823 dlg
.SetYesNoLabels(m_labels
[Btn_Yes
]->GetValue(),
2824 m_labels
[Btn_No
]->GetValue());
2829 if ( style
& wxCANCEL
)
2831 dlg
.SetOKCancelLabels(m_labels
[Btn_Ok
]->GetValue(),
2832 m_labels
[Btn_Cancel
]->GetValue());
2836 dlg
.SetOKLabel(m_labels
[Btn_Ok
]->GetValue());
2841 void TestMessageBoxDialog::OnApply(wxCommandEvent
& WXUNUSED(event
))
2843 wxMessageDialog
dlg(this, GetMessage(), "Test Message Box", GetStyle());
2844 PrepareMessageDialog(dlg
);
2849 void TestMessageBoxDialog::OnClose(wxCommandEvent
& WXUNUSED(event
))
2851 EndModal(wxID_CANCEL
);
2853 #endif // wxUSE_MSGDLG
2855 #if wxUSE_RICHMSGDLG
2856 // ----------------------------------------------------------------------------
2857 // TestRichMessageDialog
2858 // ----------------------------------------------------------------------------
2860 BEGIN_EVENT_TABLE(TestRichMessageDialog
, TestMessageBoxDialog
)
2861 EVT_BUTTON(wxID_APPLY
, TestRichMessageDialog::OnApply
)
2864 TestRichMessageDialog::TestRichMessageDialog(wxWindow
*parent
)
2865 : TestMessageBoxDialog(parent
)
2867 SetTitle("Rich Message Dialog Test Dialog");
2870 void TestRichMessageDialog::AddAdditionalTextOptions(wxSizer
*sizer
)
2872 wxSizer
* const sizerMsgs
= new wxStaticBoxSizer(wxVERTICAL
, this,
2873 "&Additional Elements");
2875 // add a option to show a check box.
2876 wxFlexGridSizer
* const sizerCheckBox
= new wxFlexGridSizer(2, 5, 5);
2877 sizerCheckBox
->AddGrowableCol(1);
2878 sizerCheckBox
->Add(new wxStaticText(this, wxID_ANY
, "&Check box:"));
2879 m_textCheckBox
= new wxTextCtrl(this, wxID_ANY
);
2880 sizerCheckBox
->Add(m_textCheckBox
, wxSizerFlags(1).Expand().Border(wxBOTTOM
));
2881 sizerMsgs
->Add(sizerCheckBox
, wxSizerFlags(1).Expand());
2883 // add option to show a detailed text.
2884 sizerMsgs
->Add(new wxStaticText(this, wxID_ANY
, "&Detailed message:"));
2885 m_textDetailed
= new wxTextCtrl(this, wxID_ANY
, "",
2886 wxDefaultPosition
, wxDefaultSize
,
2888 sizerMsgs
->Add(m_textDetailed
, wxSizerFlags(1).Expand());
2890 sizer
->Add(sizerMsgs
, wxSizerFlags(1).Expand().Border());
2893 void TestRichMessageDialog::AddAdditionalFlags(wxSizer
*sizer
)
2895 // add checkbox to set the initial state for the checkbox shown
2897 m_initialValueCheckBox
=
2898 new wxCheckBox(this, wxID_ANY
, "Checkbox initially checked");
2899 sizer
->Add(m_initialValueCheckBox
, wxSizerFlags(1).Border());
2902 void TestRichMessageDialog::OnApply(wxCommandEvent
& WXUNUSED(event
))
2904 wxRichMessageDialog
dlg(this, GetMessage(), "Test Rich Message Dialog",
2906 PrepareMessageDialog(dlg
);
2908 dlg
.ShowCheckBox(m_textCheckBox
->GetValue(),
2909 m_initialValueCheckBox
->GetValue());
2910 dlg
.ShowDetailedText(m_textDetailed
->GetValue());
2915 #endif // wxUSE_RICHMSGDLG
2919 // ----------------------------------------------------------------------------
2920 // custom log target
2921 // ----------------------------------------------------------------------------
2923 class MyLogGui
: public wxLogGui
2926 virtual void DoShowSingleLogMessage(const wxString
& message
,
2927 const wxString
& title
,
2930 wxMessageDialog
dlg(NULL
, message
, title
,
2931 wxOK
| wxCANCEL
| wxCANCEL_DEFAULT
| style
);
2932 dlg
.SetOKCancelLabels(wxID_COPY
, wxID_OK
);
2933 dlg
.SetExtendedMessage("Note that this is a custom log dialog.");
2938 wxLog
*MyAppTraits::CreateLogTarget()
2940 return new MyLogGui
;