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