]> git.saurik.com Git - wxWidgets.git/blob - samples/dialogs/dialogs.cpp
8f39a054abf149ce4e38e72ce5994e73db159eb1
[wxWidgets.git] / samples / dialogs / dialogs.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: dialogs.cpp
3 // Purpose: Common dialogs demo
4 // Author: Julian Smart
5 // Modified by: ABX (2004) - adjustements for conditional building + new menu
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 // For compilers that support precompilation, includes "wx/wx.h".
13 #include "wx/wxprec.h"
14
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18
19 #ifndef WX_PRECOMP
20 #include "wx/wx.h"
21 #endif
22
23 #include "../sample.xpm"
24
25 #include "wx/datetime.h"
26 #include "wx/image.h"
27 #include "wx/bookctrl.h"
28 #include "wx/artprov.h"
29 #include "wx/imaglist.h"
30 #include "wx/sysopt.h"
31
32 #if wxUSE_COLOURDLG
33 #include "wx/colordlg.h"
34 #endif // wxUSE_COLOURDLG
35
36 #if wxUSE_CHOICEDLG
37 #include "wx/choicdlg.h"
38 #endif // wxUSE_CHOICEDLG
39
40 #if wxUSE_STARTUP_TIPS
41 #include "wx/tipdlg.h"
42 #endif // wxUSE_STARTUP_TIPS
43
44 #if wxUSE_PROGRESSDLG
45 #if wxUSE_STOPWATCH && wxUSE_LONGLONG
46 #include "wx/datetime.h" // wxDateTime
47 #endif
48
49 #include "wx/progdlg.h"
50 #endif // wxUSE_PROGRESSDLG
51
52 #if wxUSE_ABOUTDLG
53 #include "wx/aboutdlg.h"
54
55 // these headers are only needed for custom about dialog
56 #include "wx/statline.h"
57 #include "wx/generic/aboutdlgg.h"
58 #endif // wxUSE_ABOUTDLG
59
60 #if wxUSE_BUSYINFO
61 #include "wx/busyinfo.h"
62 #endif // wxUSE_BUSYINFO
63
64 #if wxUSE_NUMBERDLG
65 #include "wx/numdlg.h"
66 #endif // wxUSE_NUMBERDLG
67
68 #if wxUSE_FILEDLG
69 #include "wx/filedlg.h"
70 #endif // wxUSE_FILEDLG
71
72 #if wxUSE_DIRDLG
73 #include "wx/dirdlg.h"
74 #endif // wxUSE_DIRDLG
75
76 #if wxUSE_FONTDLG
77 #include "wx/fontdlg.h"
78 #endif // wxUSE_FONTDLG
79
80 #if wxUSE_FINDREPLDLG
81 #include "wx/fdrepdlg.h"
82 #endif // wxUSE_FINDREPLDLG
83
84 #if wxUSE_SPINCTRL
85 #include "wx/spinctrl.h"
86 #endif
87
88 #include "wx/propdlg.h"
89
90 #include "dialogs.h"
91
92 #if USE_COLOURDLG_GENERIC
93 #include "wx/generic/colrdlgg.h"
94 #endif // USE_COLOURDLG_GENERIC
95
96 #if USE_DIRDLG_GENERIC
97 #include "wx/generic/dirdlgg.h"
98 #endif // USE_DIRDLG_GENERIC
99
100 #if USE_FILEDLG_GENERIC
101 #include "wx/generic/filedlgg.h"
102 #endif // USE_FILEDLG_GENERIC
103
104 #if USE_FONTDLG_GENERIC
105 #include "wx/generic/fontdlgg.h"
106 #endif // USE_FONTDLG_GENERIC
107
108 IMPLEMENT_APP(MyApp)
109
110 BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
111 EVT_PAINT(MyCanvas::OnPaint)
112 END_EVENT_TABLE()
113
114
115
116 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
117 EVT_MENU(DIALOGS_MESSAGE_BOX, MyFrame::MessageBox)
118
119 #if wxUSE_COLOURDLG
120 EVT_MENU(DIALOGS_CHOOSE_COLOUR, MyFrame::ChooseColour)
121 #endif // wxUSE_COLOURDLG
122
123 #if wxUSE_FONTDLG
124 EVT_MENU(DIALOGS_CHOOSE_FONT, MyFrame::ChooseFont)
125 #endif // wxUSE_FONTDLG
126
127 #if wxUSE_LOG_DIALOG
128 EVT_MENU(DIALOGS_LOG_DIALOG, MyFrame::LogDialog)
129 #endif // wxUSE_LOG_DIALOG
130
131 #if wxUSE_TEXTDLG
132 EVT_MENU(DIALOGS_TEXT_ENTRY, MyFrame::TextEntry)
133 EVT_MENU(DIALOGS_PASSWORD_ENTRY, MyFrame::PasswordEntry)
134 #endif // wxUSE_TEXTDLG
135
136 #if wxUSE_NUMBERDLG
137 EVT_MENU(DIALOGS_NUM_ENTRY, MyFrame::NumericEntry)
138 #endif // wxUSE_NUMBERDLG
139
140 #if wxUSE_CHOICEDLG
141 EVT_MENU(DIALOGS_SINGLE_CHOICE, MyFrame::SingleChoice)
142 EVT_MENU(DIALOGS_MULTI_CHOICE, MyFrame::MultiChoice)
143 #endif // wxUSE_CHOICEDLG
144
145 #if wxUSE_FILEDLG
146 EVT_MENU(DIALOGS_FILE_OPEN, MyFrame::FileOpen)
147 EVT_MENU(DIALOGS_FILE_OPEN2, MyFrame::FileOpen2)
148 EVT_MENU(DIALOGS_FILES_OPEN, MyFrame::FilesOpen)
149 EVT_MENU(DIALOGS_FILE_SAVE, MyFrame::FileSave)
150 #endif // wxUSE_FILEDLG
151
152 #if USE_FILEDLG_GENERIC
153 EVT_MENU(DIALOGS_FILE_OPEN_GENERIC, MyFrame::FileOpenGeneric)
154 EVT_MENU(DIALOGS_FILES_OPEN_GENERIC, MyFrame::FilesOpenGeneric)
155 EVT_MENU(DIALOGS_FILE_SAVE_GENERIC, MyFrame::FileSaveGeneric)
156 #endif // USE_FILEDLG_GENERIC
157
158 #if wxUSE_DIRDLG
159 EVT_MENU(DIALOGS_DIR_CHOOSE, MyFrame::DirChoose)
160 EVT_MENU(DIALOGS_DIRNEW_CHOOSE, MyFrame::DirChooseNew)
161 #endif // wxUSE_DIRDLG
162
163 #if USE_MODAL_PRESENTATION
164 EVT_MENU(DIALOGS_MODAL, MyFrame::ModalDlg)
165 EVT_MENU(DIALOGS_MODELESS, MyFrame::ModelessDlg)
166 EVT_MENU(DIALOGS_CENTRE_SCREEN, MyFrame::DlgCenteredScreen)
167 EVT_MENU(DIALOGS_CENTRE_PARENT, MyFrame::DlgCenteredParent)
168 #endif // USE_MODAL
169
170 #if wxUSE_STARTUP_TIPS
171 EVT_MENU(DIALOGS_TIP, MyFrame::ShowTip)
172 #endif // wxUSE_STARTUP_TIPS
173
174 #if USE_FONTDLG_GENERIC
175 EVT_MENU(DIALOGS_CHOOSE_FONT_GENERIC, MyFrame::ChooseFontGeneric)
176 #endif // USE_FONTDLG_GENERIC
177
178 #if USE_DIRDLG_GENERIC
179 EVT_MENU(DIALOGS_GENERIC_DIR_CHOOSE, MyFrame::GenericDirChoose)
180 #endif // wxMSW || wxMAC
181
182 #if USE_COLOURDLG_GENERIC
183 EVT_MENU(DIALOGS_CHOOSE_COLOUR_GENERIC, MyFrame::ChooseColourGeneric)
184 #endif // USE_COLOURDLG_GENERIC
185
186 #if wxUSE_PROGRESSDLG
187 EVT_MENU(DIALOGS_PROGRESS, MyFrame::ShowProgress)
188 #endif // wxUSE_PROGRESSDLG
189
190 #if wxUSE_ABOUTDLG
191 EVT_MENU(DIALOGS_ABOUTDLG_SIMPLE, MyFrame::ShowSimpleAboutDialog)
192 EVT_MENU(DIALOGS_ABOUTDLG_FANCY, MyFrame::ShowFancyAboutDialog)
193 EVT_MENU(DIALOGS_ABOUTDLG_FULL, MyFrame::ShowFullAboutDialog)
194 EVT_MENU(DIALOGS_ABOUTDLG_CUSTOM, MyFrame::ShowCustomAboutDialog)
195 #endif // wxUSE_ABOUTDLG
196
197 #if wxUSE_BUSYINFO
198 EVT_MENU(DIALOGS_BUSYINFO, MyFrame::ShowBusyInfo)
199 #endif // wxUSE_BUSYINFO
200
201 #if wxUSE_FINDREPLDLG
202 EVT_MENU(DIALOGS_FIND, MyFrame::ShowFindDialog)
203 EVT_MENU(DIALOGS_REPLACE, MyFrame::ShowReplaceDialog)
204
205 EVT_FIND(wxID_ANY, MyFrame::OnFindDialog)
206 EVT_FIND_NEXT(wxID_ANY, MyFrame::OnFindDialog)
207 EVT_FIND_REPLACE(wxID_ANY, MyFrame::OnFindDialog)
208 EVT_FIND_REPLACE_ALL(wxID_ANY, MyFrame::OnFindDialog)
209 EVT_FIND_CLOSE(wxID_ANY, MyFrame::OnFindDialog)
210 #endif // wxUSE_FINDREPLDLG
211
212 #if USE_SETTINGS_DIALOG
213 EVT_MENU(DIALOGS_PROPERTY_SHEET, MyFrame::OnPropertySheet)
214 EVT_MENU(DIALOGS_PROPERTY_SHEET_TOOLBOOK, MyFrame::OnPropertySheet)
215 EVT_MENU(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, MyFrame::OnPropertySheet)
216 #endif
217
218 EVT_MENU(DIALOGS_REQUEST, MyFrame::OnRequestUserAttention)
219
220 EVT_MENU(wxID_EXIT, MyFrame::OnExit)
221 END_EVENT_TABLE()
222
223 #if USE_MODAL_PRESENTATION
224
225 BEGIN_EVENT_TABLE(MyModalDialog, wxDialog)
226 EVT_BUTTON(wxID_ANY, MyModalDialog::OnButton)
227 END_EVENT_TABLE()
228
229 BEGIN_EVENT_TABLE(MyModelessDialog, wxDialog)
230 EVT_BUTTON(DIALOGS_MODELESS_BTN, MyModelessDialog::OnButton)
231 EVT_CLOSE(MyModelessDialog::OnClose)
232 END_EVENT_TABLE()
233
234 #endif // USE_MODAL_PRESENTATION
235
236 MyCanvas *myCanvas = (MyCanvas *) NULL;
237
238 // `Main program' equivalent, creating windows and returning main app frame
239 bool MyApp::OnInit()
240 {
241 #if wxUSE_IMAGE
242 wxInitAllImageHandlers();
243 #endif
244
245 m_canvasTextColour = *wxBLACK;
246 m_canvasFont = *wxNORMAL_FONT;
247
248 // Create the main frame window
249 MyFrame *frame = new MyFrame((wxFrame *) NULL, _T("wxWidgets dialogs example"));
250
251 // Make a menubar
252 wxMenu *menuDlg = new wxMenu;
253
254 menuDlg->Append(DIALOGS_MESSAGE_BOX, _T("&Message box\tCtrl-M"));
255
256
257 #if wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
258
259 wxMenu *choices_menu = new wxMenu;
260
261 #if wxUSE_COLOURDLG
262 choices_menu->Append(DIALOGS_CHOOSE_COLOUR, _T("&Choose colour"));
263 #endif // wxUSE_COLOURDLG
264
265 #if wxUSE_FONTDLG
266 choices_menu->Append(DIALOGS_CHOOSE_FONT, _T("Choose &font"));
267 #endif // wxUSE_FONTDLG
268
269 #if wxUSE_CHOICEDLG
270 choices_menu->Append(DIALOGS_SINGLE_CHOICE, _T("&Single choice\tCtrl-C"));
271 choices_menu->Append(DIALOGS_MULTI_CHOICE, _T("M&ultiple choice\tCtrl-U"));
272 #endif // wxUSE_CHOICEDLG
273
274 #if USE_COLOURDLG_GENERIC || USE_FONTDLG_GENERIC
275 choices_menu->AppendSeparator();
276 #endif // USE_COLOURDLG_GENERIC || USE_FONTDLG_GENERIC
277
278 #if USE_COLOURDLG_GENERIC
279 choices_menu->Append(DIALOGS_CHOOSE_COLOUR_GENERIC, _T("&Choose colour (generic)"));
280 #endif // USE_COLOURDLG_GENERIC
281
282 #if USE_FONTDLG_GENERIC
283 choices_menu->Append(DIALOGS_CHOOSE_FONT_GENERIC, _T("Choose &font (generic)"));
284 #endif // USE_FONTDLG_GENERIC
285
286 menuDlg->Append(wxID_ANY,_T("&Choices and selectors"),choices_menu);
287 #endif // wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
288
289
290 #if wxUSE_TEXTDLG || wxUSE_NUMBERDLG
291
292 wxMenu *entry_menu = new wxMenu;
293
294 #if wxUSE_TEXTDLG
295 entry_menu->Append(DIALOGS_TEXT_ENTRY, _T("Text &entry\tCtrl-E"));
296 entry_menu->Append(DIALOGS_PASSWORD_ENTRY, _T("&Password entry\tCtrl-P"));
297 #endif // wxUSE_TEXTDLG
298
299 #if wxUSE_NUMBERDLG
300 entry_menu->Append(DIALOGS_NUM_ENTRY, _T("&Numeric entry\tCtrl-N"));
301 #endif // wxUSE_NUMBERDLG
302
303 menuDlg->Append(wxID_ANY,_T("&Entry dialogs"),entry_menu);
304
305 #endif // wxUSE_TEXTDLG || wxUSE_NUMBERDLG
306
307
308 #if wxUSE_FILEDLG
309
310 wxMenu *filedlg_menu = new wxMenu;
311 filedlg_menu->Append(DIALOGS_FILE_OPEN, _T("&Open file\tCtrl-O"));
312 filedlg_menu->Append(DIALOGS_FILE_OPEN2, _T("&Second open file\tCtrl-2"));
313 filedlg_menu->Append(DIALOGS_FILES_OPEN, _T("Open &files\tCtrl-Q"));
314 filedlg_menu->Append(DIALOGS_FILE_SAVE, _T("Sa&ve file\tCtrl-S"));
315
316 #if USE_FILEDLG_GENERIC
317 filedlg_menu->AppendSeparator();
318 filedlg_menu->Append(DIALOGS_FILE_OPEN_GENERIC, _T("&Open file (generic)"));
319 filedlg_menu->Append(DIALOGS_FILES_OPEN_GENERIC, _T("Open &files (generic)"));
320 filedlg_menu->Append(DIALOGS_FILE_SAVE_GENERIC, _T("Sa&ve file (generic)"));
321 #endif // USE_FILEDLG_GENERIC
322
323 menuDlg->Append(wxID_ANY,_T("&File operations"),filedlg_menu);
324
325 #endif // wxUSE_FILEDLG
326
327 #if wxUSE_DIRDLG
328 wxMenu *dir_menu = new wxMenu;
329
330 dir_menu->Append(DIALOGS_DIR_CHOOSE, _T("&Choose a directory\tCtrl-D"));
331 dir_menu->Append(DIALOGS_DIRNEW_CHOOSE, _T("Choose a directory (with \"Ne&w\" button)\tShift-Ctrl-D"));
332 menuDlg->Append(wxID_ANY,_T("&Directory operations"),dir_menu);
333
334 #if USE_DIRDLG_GENERIC
335 dir_menu->AppendSeparator();
336 dir_menu->Append(DIALOGS_GENERIC_DIR_CHOOSE, _T("&Choose a directory (generic)"));
337 #endif // USE_DIRDLG_GENERIC
338
339 #endif // wxUSE_DIRDLG
340
341
342 #if wxUSE_STARTUP_TIPS || wxUSE_PROGRESSDLG || wxUSE_BUSYINFO || wxUSE_LOG_DIALOG
343
344 wxMenu *info_menu = new wxMenu;
345
346 #if wxUSE_STARTUP_TIPS
347 info_menu->Append(DIALOGS_TIP, _T("&Tip of the day\tCtrl-T"));
348 #endif // wxUSE_STARTUP_TIPS
349
350 #if wxUSE_PROGRESSDLG
351 info_menu->Append(DIALOGS_PROGRESS, _T("Pro&gress dialog\tCtrl-G"));
352 #endif // wxUSE_PROGRESSDLG
353
354 #if wxUSE_BUSYINFO
355 info_menu->Append(DIALOGS_BUSYINFO, _T("&Busy info dialog\tCtrl-B"));
356 #endif // wxUSE_BUSYINFO
357
358 #if wxUSE_LOG_DIALOG
359 info_menu->Append(DIALOGS_LOG_DIALOG, _T("&Log dialog\tCtrl-L"));
360 #endif // wxUSE_LOG_DIALOG
361
362 menuDlg->Append(wxID_ANY,_T("&Informative dialogs"),info_menu);
363
364 #endif // wxUSE_STARTUP_TIPS || wxUSE_PROGRESSDLG || wxUSE_BUSYINFO || wxUSE_LOG_DIALOG
365
366
367 #if wxUSE_FINDREPLDLG
368 wxMenu *find_menu = new wxMenu;
369 find_menu->AppendCheckItem(DIALOGS_FIND, _T("&Find dialog\tCtrl-F"));
370 find_menu->AppendCheckItem(DIALOGS_REPLACE, _T("Find and &replace dialog\tShift-Ctrl-F"));
371 menuDlg->Append(wxID_ANY,_T("&Searching"),find_menu);
372 #endif // wxUSE_FINDREPLDLG
373
374 #if USE_MODAL_PRESENTATION
375 wxMenu *dialogs_menu = new wxMenu;
376 dialogs_menu->Append(DIALOGS_MODAL, _T("&Modal dialog\tCtrl-W"));
377 dialogs_menu->AppendCheckItem(DIALOGS_MODELESS, _T("Mode&less dialog\tCtrl-Z"));
378 dialogs_menu->Append(DIALOGS_CENTRE_SCREEN, _T("Centered on &screen\tShift-Ctrl-1"));
379 dialogs_menu->Append(DIALOGS_CENTRE_PARENT, _T("Centered on &parent\tShift-Ctrl-2"));
380 menuDlg->Append(wxID_ANY, _T("&Generic dialogs"), dialogs_menu);
381 #endif // USE_MODAL_PRESENTATION
382
383 #if USE_SETTINGS_DIALOG
384 wxMenu *sheet_menu = new wxMenu;
385 sheet_menu->Append(DIALOGS_PROPERTY_SHEET, _T("&Standard property sheet\tShift-Ctrl-P"));
386 sheet_menu->Append(DIALOGS_PROPERTY_SHEET_TOOLBOOK, _T("&Toolbook sheet\tShift-Ctrl-T"));
387
388 if (wxPlatformIs(wxPORT_MAC))
389 sheet_menu->Append(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, _T("Button &Toolbook sheet\tShift-Ctrl-U"));
390 /*
391 #ifdef __WXMAC__
392 sheet_menu->Append(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, _T("Button &Toolbook sheet\tShift-Ctrl-U"));
393 #endif
394 */
395 menuDlg->Append(wxID_ANY, _T("&Property sheets"), sheet_menu);
396 #endif // USE_SETTINGS_DIALOG
397
398 menuDlg->Append(DIALOGS_REQUEST, _T("&Request user attention\tCtrl-R"));
399
400 menuDlg->AppendSeparator();
401 menuDlg->Append(wxID_EXIT, _T("E&xit\tAlt-X"));
402
403 #if wxUSE_ABOUTDLG
404 wxMenu *menuHelp = new wxMenu;
405 menuHelp->Append(DIALOGS_ABOUTDLG_SIMPLE, _T("&About (simple)...\tF1"));
406 menuHelp->Append(DIALOGS_ABOUTDLG_FANCY, _T("About (&fancy)...\tShift-F1"));
407 menuHelp->Append(DIALOGS_ABOUTDLG_FULL, _T("About (f&ull)...\tCtrl-F1"));
408 menuHelp->Append(DIALOGS_ABOUTDLG_CUSTOM, _T("About (&custom)...\tCtrl-Shift-F1"));
409 #endif // wxUSE_ABOUTDLG
410
411 wxMenuBar *menubar = new wxMenuBar;
412 menubar->Append(menuDlg, _T("&Dialogs"));
413 #if wxUSE_ABOUTDLG
414 menubar->Append(menuHelp, _T("&Help"));
415 #endif // wxUSE_ABOUTDLG
416
417 frame->SetMenuBar(menubar);
418
419 myCanvas = new MyCanvas(frame);
420 myCanvas->SetBackgroundColour(*wxWHITE);
421
422 frame->Centre(wxBOTH);
423
424 // Show the frame
425 frame->Show(true);
426
427 SetTopWindow(frame);
428
429 return true;
430 }
431
432 // My frame constructor
433 MyFrame::MyFrame(wxWindow *parent,
434 const wxString& title)
435 : wxFrame(parent, wxID_ANY, title)
436 {
437 SetIcon(sample_xpm);
438
439 #if USE_MODAL_PRESENTATION
440 m_dialog = (MyModelessDialog *)NULL;
441 #endif // USE_MODAL_PRESENTATION
442
443 #if wxUSE_FINDREPLDLG
444 m_dlgFind =
445 m_dlgReplace = NULL;
446 #endif
447
448 #if wxUSE_COLOURDLG
449 m_clrData.SetChooseFull(true);
450 for (int i = 0; i < 16; i++)
451 {
452 m_clrData.SetCustomColour(
453 i,
454 wxColour(
455 (unsigned char)(i*16),
456 (unsigned char)(i*16),
457 (unsigned char)(i*16)
458 )
459 );
460 }
461 #endif // wxUSE_COLOURDLG
462
463 #if wxUSE_STATUSBAR
464 CreateStatusBar();
465 #endif // wxUSE_STATUSBAR
466 }
467
468 #if wxUSE_COLOURDLG
469 void MyFrame::ChooseColour(wxCommandEvent& WXUNUSED(event) )
470 {
471 m_clrData.SetColour(myCanvas->GetBackgroundColour());
472
473 wxColourDialog dialog(this, &m_clrData);
474 dialog.SetTitle(_T("Choose the background colour"));
475 if (dialog.ShowModal() == wxID_OK)
476 {
477 m_clrData = dialog.GetColourData();
478 myCanvas->SetBackgroundColour(m_clrData.GetColour());
479 myCanvas->ClearBackground();
480 myCanvas->Refresh();
481 }
482 }
483 #endif // wxUSE_COLOURDLG
484
485 #if USE_COLOURDLG_GENERIC
486 void MyFrame::ChooseColourGeneric(wxCommandEvent& WXUNUSED(event))
487 {
488 m_clrData.SetColour(myCanvas->GetBackgroundColour());
489
490 //FIXME:TODO:This has no effect...
491 m_clrData.SetChooseFull(true);
492
493 for (int i = 0; i < 16; i++)
494 {
495 wxColour colour(
496 (unsigned char)(i*16),
497 (unsigned char)(i*16),
498 (unsigned char)(i*16)
499 );
500 m_clrData.SetCustomColour(i, colour);
501 }
502
503 wxGenericColourDialog *dialog = new wxGenericColourDialog(this, &m_clrData);
504 if (dialog->ShowModal() == wxID_OK)
505 {
506 m_clrData = dialog->GetColourData();
507 myCanvas->SetBackgroundColour(m_clrData.GetColour());
508 myCanvas->ClearBackground();
509 myCanvas->Refresh();
510 }
511 dialog->Destroy();
512 }
513 #endif // USE_COLOURDLG_GENERIC
514
515 #if wxUSE_FONTDLG
516 void MyFrame::ChooseFont(wxCommandEvent& WXUNUSED(event) )
517 {
518 wxFontData data;
519 data.SetInitialFont(wxGetApp().m_canvasFont);
520 data.SetColour(wxGetApp().m_canvasTextColour);
521
522 // you might also do this:
523 //
524 // wxFontDialog dialog;
525 // if ( !dialog.Create(this, data) { ... error ... }
526 //
527 wxFontDialog dialog(this, data);
528
529 if (dialog.ShowModal() == wxID_OK)
530 {
531 wxFontData retData = dialog.GetFontData();
532 wxGetApp().m_canvasFont = retData.GetChosenFont();
533 wxGetApp().m_canvasTextColour = retData.GetColour();
534 myCanvas->Refresh();
535 }
536 //else: cancelled by the user, don't change the font
537 }
538 #endif // wxUSE_FONTDLG
539
540 #if USE_FONTDLG_GENERIC
541 void MyFrame::ChooseFontGeneric(wxCommandEvent& WXUNUSED(event) )
542 {
543 wxFontData data;
544 data.SetInitialFont(wxGetApp().m_canvasFont);
545 data.SetColour(wxGetApp().m_canvasTextColour);
546
547 wxGenericFontDialog *dialog = new wxGenericFontDialog(this, data);
548 if (dialog->ShowModal() == wxID_OK)
549 {
550 wxFontData retData = dialog->GetFontData();
551 wxGetApp().m_canvasFont = retData.GetChosenFont();
552 wxGetApp().m_canvasTextColour = retData.GetColour();
553 myCanvas->Refresh();
554 }
555 dialog->Destroy();
556 }
557 #endif // USE_FONTDLG_GENERIC
558
559 #if wxUSE_LOG_DIALOG
560 void MyFrame::LogDialog(wxCommandEvent& WXUNUSED(event))
561 {
562 // calling wxYield() (as ~wxBusyCursor does) shouldn't result in messages
563 // being flushed -- test it
564 {
565 wxBusyCursor bc;
566 wxLogMessage(wxT("This is some message - everything is ok so far."));
567 wxLogMessage(wxT("Another message...\n... this one is on multiple lines"));
568 wxLogWarning(wxT("And then something went wrong!"));
569
570 // and if ~wxBusyCursor doesn't do it, then call it manually
571 wxYield();
572 }
573
574 wxLogError(wxT("Intermediary error handler decided to abort."));
575 wxLogError(wxT("The top level caller detected an unrecoverable error."));
576
577 wxLog::FlushActive();
578
579 wxLogMessage(wxT("And this is the same dialog but with only one message."));
580 }
581 #endif // wxUSE_LOG_DIALOG
582
583 void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event) )
584 {
585 wxMessageDialog dialog( NULL, _T("This is a message box\nA long, long string to test out the message box properly"),
586 _T("Message box text"), wxNO_DEFAULT|wxYES_NO|wxCANCEL|wxICON_INFORMATION);
587
588 switch ( dialog.ShowModal() )
589 {
590 case wxID_YES:
591 wxLogStatus(wxT("You pressed \"Yes\""));
592 break;
593
594 case wxID_NO:
595 wxLogStatus(wxT("You pressed \"No\""));
596 break;
597
598 case wxID_CANCEL:
599 wxLogStatus(wxT("You pressed \"Cancel\""));
600 break;
601
602 default:
603 wxLogError(wxT("Unexpected wxMessageDialog return code!"));
604 }
605 }
606
607 #if wxUSE_NUMBERDLG
608 void MyFrame::NumericEntry(wxCommandEvent& WXUNUSED(event) )
609 {
610 long res = wxGetNumberFromUser( _T("This is some text, actually a lot of text.\n")
611 _T("Even two rows of text."),
612 _T("Enter a number:"), _T("Numeric input test"),
613 50, 0, 100, this );
614
615 wxString msg;
616 int icon;
617 if ( res == -1 )
618 {
619 msg = _T("Invalid number entered or dialog cancelled.");
620 icon = wxICON_HAND;
621 }
622 else
623 {
624 msg.Printf(_T("You've entered %lu"), res );
625 icon = wxICON_INFORMATION;
626 }
627
628 wxMessageBox(msg, _T("Numeric test result"), wxOK | icon, this);
629 }
630 #endif // wxUSE_NUMBERDLG
631
632 #if wxUSE_TEXTDLG
633 void MyFrame::PasswordEntry(wxCommandEvent& WXUNUSED(event))
634 {
635 wxString pwd = wxGetPasswordFromUser(_T("Enter password:"),
636 _T("Password entry dialog"),
637 wxEmptyString,
638 this);
639 if ( !pwd.empty() )
640 {
641 wxMessageBox(wxString::Format(wxT("Your password is '%s'"), pwd.c_str()),
642 _T("Got password"), wxOK | wxICON_INFORMATION, this);
643 }
644 }
645
646 void MyFrame::TextEntry(wxCommandEvent& WXUNUSED(event))
647 {
648 wxTextEntryDialog dialog(this,
649 _T("This is a small sample\n")
650 _T("A long, long string to test out the text entrybox"),
651 _T("Please enter a string"),
652 _T("Default value"),
653 wxOK | wxCANCEL);
654
655 if (dialog.ShowModal() == wxID_OK)
656 {
657 wxMessageBox(dialog.GetValue(), _T("Got string"), wxOK | wxICON_INFORMATION, this);
658 }
659 }
660 #endif // wxUSE_TEXTDLG
661
662 #if wxUSE_CHOICEDLG
663 void MyFrame::SingleChoice(wxCommandEvent& WXUNUSED(event) )
664 {
665 const wxString choices[] = { _T("One"), _T("Two"), _T("Three"), _T("Four"), _T("Five") } ;
666
667 wxSingleChoiceDialog dialog(this,
668 _T("This is a small sample\n")
669 _T("A single-choice convenience dialog"),
670 _T("Please select a value"),
671 WXSIZEOF(choices), choices);
672
673 dialog.SetSelection(2);
674
675 if (dialog.ShowModal() == wxID_OK)
676 {
677 wxMessageDialog dialog2(this, dialog.GetStringSelection(), _T("Got string"));
678 dialog2.ShowModal();
679 }
680 }
681
682 void MyFrame::MultiChoice(wxCommandEvent& WXUNUSED(event) )
683 {
684 const wxString choices[] =
685 {
686 _T("One"), _T("Two"), _T("Three"), _T("Four"), _T("Five"),
687 _T("Six"), _T("Seven"), _T("Eight"), _T("Nine"), _T("Ten"),
688 _T("Eleven"), _T("Twelve"), _T("Seventeen"),
689 };
690
691 wxArrayInt selections;
692 size_t count = wxGetMultipleChoices(selections,
693 _T("This is a small sample\n")
694 _T("A multi-choice convenience dialog"),
695 _T("Please select a value"),
696 WXSIZEOF(choices), choices,
697 this);
698 if ( count )
699 {
700 wxString msg;
701 msg.Printf(wxT("You selected %u items:\n"), (unsigned)count);
702 for ( size_t n = 0; n < count; n++ )
703 {
704 msg += wxString::Format(wxT("\t%u: %u (%s)\n"),
705 (unsigned)n, (unsigned)selections[n],
706 choices[selections[n]].c_str());
707 }
708 wxLogMessage(msg);
709 }
710 //else: cancelled or nothing selected
711 }
712 #endif // wxUSE_CHOICEDLG
713
714 #if wxUSE_FILEDLG
715 void MyFrame::FileOpen(wxCommandEvent& WXUNUSED(event) )
716 {
717 wxFileDialog dialog
718 (
719 this,
720 _T("Testing open file dialog"),
721 wxEmptyString,
722 wxEmptyString,
723 #ifdef __WXMOTIF__
724 _T("C++ files (*.cpp)|*.cpp")
725 #else
726 _T("C++ files (*.cpp;*.h)|*.cpp;*.h")
727 #endif
728 );
729
730 dialog.CentreOnParent();
731 dialog.SetDirectory(wxGetHomeDir());
732
733 if (dialog.ShowModal() == wxID_OK)
734 {
735 wxString info;
736 info.Printf(_T("Full file name: %s\n")
737 _T("Path: %s\n")
738 _T("Name: %s"),
739 dialog.GetPath().c_str(),
740 dialog.GetDirectory().c_str(),
741 dialog.GetFilename().c_str());
742 wxMessageDialog dialog2(this, info, _T("Selected file"));
743 dialog2.ShowModal();
744 }
745 }
746
747 // this shows how to take advantage of specifying a default extension in the
748 // call to wxFileSelector: it is remembered after each new call and the next
749 // one will use it by default
750 void MyFrame::FileOpen2(wxCommandEvent& WXUNUSED(event) )
751 {
752 static wxString s_extDef;
753 wxString path = wxFileSelector(
754 _T("Select the file to load"),
755 wxEmptyString, wxEmptyString,
756 s_extDef,
757 wxString::Format
758 (
759 _T("Waveform (*.wav)|*.wav|Plain text (*.txt)|*.txt|All files (%s)|%s"),
760 wxFileSelectorDefaultWildcardStr,
761 wxFileSelectorDefaultWildcardStr
762 ),
763 wxFD_OPEN|wxFD_CHANGE_DIR|wxFD_PREVIEW,
764 this
765 );
766
767 if ( !path )
768 return;
769
770 // it is just a sample, would use wxSplitPath in real program
771 s_extDef = path.AfterLast(_T('.'));
772
773 wxLogMessage(_T("You selected the file '%s', remembered extension '%s'"),
774 (const wxChar*) path, (const wxChar*) s_extDef);
775 }
776
777 void MyFrame::FilesOpen(wxCommandEvent& WXUNUSED(event) )
778 {
779 wxString wildcards =
780 #ifdef __WXMOTIF__
781 _T("C++ files (*.cpp)|*.cpp");
782 #else
783 wxString::Format
784 (
785 _T("All files (%s)|%s|C++ files (*.cpp;*.h)|*.cpp;*.h"),
786 wxFileSelectorDefaultWildcardStr,
787 wxFileSelectorDefaultWildcardStr
788 );
789 #endif
790 wxFileDialog dialog(this, _T("Testing open multiple file dialog"),
791 wxEmptyString, wxEmptyString, wildcards,
792 wxFD_OPEN|wxFD_MULTIPLE);
793
794 if (dialog.ShowModal() == wxID_OK)
795 {
796 wxArrayString paths, filenames;
797
798 dialog.GetPaths(paths);
799 dialog.GetFilenames(filenames);
800
801 wxString msg, s;
802 size_t count = paths.GetCount();
803 for ( size_t n = 0; n < count; n++ )
804 {
805 s.Printf(_T("File %d: %s (%s)\n"),
806 (int)n, paths[n].c_str(), filenames[n].c_str());
807
808 msg += s;
809 }
810 s.Printf(_T("Filter index: %d"), dialog.GetFilterIndex());
811 msg += s;
812
813 wxMessageDialog dialog2(this, msg, _T("Selected files"));
814 dialog2.ShowModal();
815 }
816 }
817
818 void MyFrame::FileSave(wxCommandEvent& WXUNUSED(event) )
819 {
820 wxFileDialog dialog(this,
821 _T("Testing save file dialog"),
822 wxEmptyString,
823 _T("myletter.doc"),
824 _T("Text files (*.txt)|*.txt|Document files (*.doc)|*.doc"),
825 wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
826
827 dialog.SetFilterIndex(1);
828
829 if (dialog.ShowModal() == wxID_OK)
830 {
831 wxLogMessage(_T("%s, filter %d"),
832 dialog.GetPath().c_str(), dialog.GetFilterIndex());
833 }
834 }
835 #endif // wxUSE_FILEDLG
836
837 #if USE_FILEDLG_GENERIC
838 void MyFrame::FileOpenGeneric(wxCommandEvent& WXUNUSED(event) )
839 {
840 wxGenericFileDialog dialog
841 (
842 this,
843 _T("Testing open file dialog"),
844 wxEmptyString,
845 wxEmptyString,
846 _T("C++ files (*.cpp;*.h)|*.cpp;*.h")
847 );
848
849 dialog.SetDirectory(wxGetHomeDir());
850
851 if (dialog.ShowModal() == wxID_OK)
852 {
853 wxString info;
854 info.Printf(_T("Full file name: %s\n")
855 _T("Path: %s\n")
856 _T("Name: %s"),
857 dialog.GetPath().c_str(),
858 dialog.GetDirectory().c_str(),
859 dialog.GetFilename().c_str());
860 wxMessageDialog dialog2(this, info, _T("Selected file"));
861 dialog2.ShowModal();
862 }
863 }
864
865 void MyFrame::FilesOpenGeneric(wxCommandEvent& WXUNUSED(event) )
866 {
867 // On PocketPC you can disable OK-only dialogs policy using system option
868 int buttons = wxSystemOptions::GetOptionInt(wxT("wince.dialog.real-ok-cancel"));
869 wxSystemOptions::SetOption(wxT("wince.dialog.real-ok-cancel"), 1);
870
871 wxString wildcards = _T("All files (*.*)|*.*|C++ files (*.cpp;*.h)|*.cpp;*.h");
872 wxGenericFileDialog dialog(this, _T("Testing open multiple file dialog"),
873 wxEmptyString, wxEmptyString, wildcards,
874 wxFD_MULTIPLE);
875
876 if (dialog.ShowModal() == wxID_OK)
877 {
878 wxArrayString paths, filenames;
879
880 dialog.GetPaths(paths);
881 dialog.GetFilenames(filenames);
882
883 wxString msg, s;
884 size_t count = paths.GetCount();
885 for ( size_t n = 0; n < count; n++ )
886 {
887 s.Printf(_T("File %d: %s (%s)\n"),
888 (int)n, paths[n].c_str(), filenames[n].c_str());
889
890 msg += s;
891 }
892 s.Printf(_T("Filter index: %d"), dialog.GetFilterIndex());
893 msg += s;
894
895 wxMessageDialog dialog2(this, msg, _T("Selected files"));
896 dialog2.ShowModal();
897 }
898
899 // restore system option
900 wxSystemOptions::SetOption(wxT("wince.dialog.real-ok-cancel"), buttons);
901 }
902
903 void MyFrame::FileSaveGeneric(wxCommandEvent& WXUNUSED(event) )
904 {
905 wxGenericFileDialog dialog(this,
906 _T("Testing save file dialog"),
907 wxEmptyString,
908 _T("myletter.doc"),
909 _T("Text files (*.txt)|*.txt|Document files (*.doc)|*.doc"),
910 wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
911
912 dialog.SetFilterIndex(1);
913
914 if (dialog.ShowModal() == wxID_OK)
915 {
916 wxLogMessage(_T("%s, filter %d"),
917 dialog.GetPath().c_str(), dialog.GetFilterIndex());
918 }
919 }
920 #endif // USE_FILEDLG_GENERIC
921
922 #if wxUSE_DIRDLG
923 void MyFrame::DoDirChoose(int style)
924 {
925 // pass some initial dir to wxDirDialog
926 wxString dirHome;
927 wxGetHomeDir(&dirHome);
928
929 wxDirDialog dialog(this, _T("Testing directory picker"), dirHome, style);
930
931 if (dialog.ShowModal() == wxID_OK)
932 {
933 wxLogMessage(_T("Selected path: %s"), dialog.GetPath().c_str());
934 }
935 }
936
937 void MyFrame::DirChoose(wxCommandEvent& WXUNUSED(event) )
938 {
939 DoDirChoose(wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST);
940 }
941
942 void MyFrame::DirChooseNew(wxCommandEvent& WXUNUSED(event) )
943 {
944 DoDirChoose(wxDD_DEFAULT_STYLE & ~wxDD_DIR_MUST_EXIST);
945 }
946 #endif // wxUSE_DIRDLG
947
948 #if USE_DIRDLG_GENERIC
949 void MyFrame::GenericDirChoose(wxCommandEvent& WXUNUSED(event) )
950 {
951 // pass some initial dir to wxDirDialog
952 wxString dirHome;
953 wxGetHomeDir(&dirHome);
954
955 wxGenericDirDialog dialog(this, _T("Testing generic directory picker"), dirHome);
956
957 if (dialog.ShowModal() == wxID_OK)
958 {
959 wxMessageDialog dialog2(this, dialog.GetPath(), _T("Selected path"));
960 dialog2.ShowModal();
961 }
962 }
963 #endif // USE_DIRDLG_GENERIC
964
965 #if USE_MODAL_PRESENTATION
966 void MyFrame::ModalDlg(wxCommandEvent& WXUNUSED(event))
967 {
968 MyModalDialog dlg(this);
969 dlg.ShowModal();
970 }
971
972 void MyFrame::ModelessDlg(wxCommandEvent& event)
973 {
974 bool show = GetMenuBar()->IsChecked(event.GetId());
975
976 if ( show )
977 {
978 if ( !m_dialog )
979 {
980 m_dialog = new MyModelessDialog(this);
981 }
982
983 m_dialog->Show(true);
984 }
985 else // hide
986 {
987 // If m_dialog is NULL, then possibly the system
988 // didn't report the checked menu item status correctly.
989 // It should be true just after the menu item was selected,
990 // if there was no modeless dialog yet.
991
992 wxASSERT( m_dialog != NULL );
993 if (m_dialog)
994 m_dialog->Hide();
995 }
996 }
997
998 void MyFrame::DlgCenteredScreen(wxCommandEvent& WXUNUSED(event))
999 {
1000 wxDialog dlg(this, wxID_ANY, _T("Dialog centered on screen"),
1001 wxDefaultPosition, wxSize(200, 100));
1002 (new wxButton(&dlg, wxID_OK, _T("Close")))->Centre();
1003 dlg.CentreOnScreen();
1004 dlg.ShowModal();
1005 }
1006
1007 void MyFrame::DlgCenteredParent(wxCommandEvent& WXUNUSED(event))
1008 {
1009 wxDialog dlg(this, wxID_ANY, _T("Dialog centered on parent"),
1010 wxDefaultPosition, wxSize(200, 100));
1011 (new wxButton(&dlg, wxID_OK, _T("Close")))->Centre();
1012 dlg.CentreOnParent();
1013 dlg.ShowModal();
1014 }
1015
1016 #endif // USE_MODAL_PRESENTATION
1017
1018 #if wxUSE_STARTUP_TIPS
1019 void MyFrame::ShowTip(wxCommandEvent& WXUNUSED(event))
1020 {
1021 static size_t s_index = (size_t)-1;
1022
1023 if ( s_index == (size_t)-1 )
1024 {
1025 srand(time(NULL));
1026
1027 // this is completely bogus, we don't know how many lines are there
1028 // in the file, but who cares, it's a demo only...
1029 s_index = rand() % 5;
1030 }
1031
1032 wxTipProvider *tipProvider = wxCreateFileTipProvider(_T("tips.txt"), s_index);
1033
1034 bool showAtStartup = wxShowTip(this, tipProvider);
1035
1036 if ( showAtStartup )
1037 {
1038 wxMessageBox(_T("Will show tips on startup"), _T("Tips dialog"),
1039 wxOK | wxICON_INFORMATION, this);
1040 }
1041
1042 s_index = tipProvider->GetCurrentTip();
1043 delete tipProvider;
1044 }
1045 #endif // wxUSE_STARTUP_TIPS
1046
1047 #if USE_SETTINGS_DIALOG
1048 void MyFrame::OnPropertySheet(wxCommandEvent& event)
1049 {
1050 SettingsDialog dialog(this, event.GetId());
1051 dialog.ShowModal();
1052 }
1053 #endif // USE_SETTINGS_DIALOG
1054
1055 void MyFrame::OnRequestUserAttention(wxCommandEvent& WXUNUSED(event))
1056 {
1057 wxLogStatus(_T("Sleeping for 3 seconds to allow you to switch to another window"));
1058
1059 wxSleep(3);
1060
1061 RequestUserAttention(wxUSER_ATTENTION_ERROR);
1062 }
1063
1064 void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event) )
1065 {
1066 Close(true);
1067 }
1068
1069 #if wxUSE_PROGRESSDLG
1070
1071 void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
1072 {
1073 #if wxUSE_STOPWATCH && wxUSE_LONGLONG
1074 // check the performance
1075 int countrandomnumbers = 0, count = 0;
1076 wxTimeSpan tsTest(0,0,0,250);
1077 wxDateTime DT2, DT1 = wxDateTime::UNow();
1078 srand(0);
1079 while(1)
1080 {
1081 rand();
1082 ++countrandomnumbers;
1083 if ( countrandomnumbers == 1000 )
1084 {
1085 srand(0);
1086 countrandomnumbers = 0;
1087 ++count;
1088 DT2 = wxDateTime::UNow();
1089 wxTimeSpan ts = DT2.Subtract( DT1 );
1090 if ( ts.IsLongerThan( tsTest ) )
1091 {
1092 break;
1093 }
1094 }
1095 }
1096 const int max = 40 * count;
1097 #else
1098 static const int max = 10;
1099 #endif // wxUSE_STOPWATCH && wxUSE_LONGLONG
1100
1101 wxProgressDialog dialog(_T("Progress dialog example"),
1102 _T("An informative message"),
1103 max, // range
1104 this, // parent
1105 wxPD_CAN_ABORT |
1106 wxPD_CAN_SKIP |
1107 wxPD_APP_MODAL |
1108 // wxPD_AUTO_HIDE | -- try this as well
1109 wxPD_ELAPSED_TIME |
1110 wxPD_ESTIMATED_TIME |
1111 wxPD_REMAINING_TIME |
1112 wxPD_SMOOTH);
1113
1114 bool cont = true;
1115 bool skip = false;
1116 // each skip will move progress about quarter forward
1117 for ( int i = 0; i <= max; i = wxMin(i+(skip?int(max/4):1), max+1), skip = false )
1118 {
1119 #if wxUSE_STOPWATCH && wxUSE_LONGLONG
1120 // do (almost) the same operations as we did for the performance test
1121 srand(0);
1122 for ( int j = 0; j < 1000; j++ )
1123 {
1124 rand();
1125 if ( j == 999 )
1126 {
1127 DT2 = wxDateTime::UNow();
1128 wxTimeSpan ts = DT2.Subtract( DT1 );
1129 if ( ts.IsLongerThan( tsTest ) )
1130 {
1131 // nothing to do
1132 }
1133 }
1134 }
1135 #else
1136 wxSleep(1);
1137 #endif
1138
1139 wxString msg;
1140
1141 if ( i == max )
1142 {
1143 msg = _T("That's all, folks!");
1144 }
1145 else if ( i > max / 2 )
1146 {
1147 msg = _T("Only a half left (very long message)!");
1148 }
1149
1150 #if wxUSE_STOPWATCH && wxUSE_LONGLONG
1151 if ( (i % (max/100)) == 0 ) // // only 100 updates, this makes it much faster
1152 {
1153 cont = dialog.Update(i, msg, &skip);
1154 }
1155 #else
1156 cont = dialog.Update(i, msg, &skip);
1157 #endif
1158
1159 if ( !cont )
1160 {
1161 if ( wxMessageBox(_T("Do you really want to cancel?"),
1162 _T("Progress dialog question"), // caption
1163 wxYES_NO | wxICON_QUESTION) == wxYES )
1164 break;
1165
1166 cont = true;
1167 dialog.Resume();
1168 }
1169 }
1170
1171 if ( !cont )
1172 {
1173 wxLogStatus(wxT("Progress dialog aborted!"));
1174 }
1175 else
1176 {
1177 wxLogStatus(wxT("Countdown from %d finished"), max);
1178 }
1179 }
1180
1181 #endif // wxUSE_PROGRESSDLG
1182
1183 #if wxUSE_ABOUTDLG
1184
1185 static void InitAboutInfoMinimal(wxAboutDialogInfo& info)
1186 {
1187 info.SetName(_T("Dialogs Sample"));
1188 info.SetVersion(wxVERSION_NUM_DOT_STRING_T);
1189 info.SetDescription(_T("This sample shows different wxWidgets dialogs"));
1190 info.SetCopyright(_T("(C) 1998-2006 wxWidgets dev team"));
1191 info.AddDeveloper(_T("Vadim Zeitlin"));
1192 }
1193
1194 static void InitAboutInfoWebsite(wxAboutDialogInfo& info)
1195 {
1196 InitAboutInfoMinimal(info);
1197
1198 info.SetWebSite(_T("http://www.wxwidgets.org/"), _T("wxWidgets web site"));
1199 }
1200
1201 static void InitAboutInfoAll(wxAboutDialogInfo& info)
1202 {
1203 InitAboutInfoMinimal(info);
1204
1205 // we can add a second developer
1206 info.AddDeveloper(_T("A.N. Other"));
1207
1208 // or we can add several persons at once like this
1209 static const wxChar *docwriters[] =
1210 {
1211 _T("First D. Writer"),
1212 _T("Second One"),
1213 };
1214
1215 info.SetDocWriters(wxArrayString(WXSIZEOF(docwriters), docwriters));
1216 info.SetLicence(wxString::FromAscii(
1217 " wxWindows Library Licence, Version 3.1\n"
1218 " ======================================\n"
1219 "\n"
1220 " Copyright (c) 1998-2005 Julian Smart, Robert Roebling et al\n"
1221 "\n"
1222 " Everyone is permitted to copy and distribute verbatim copies\n"
1223 " of this licence document, but changing it is not allowed.\n"
1224 "\n"
1225 " WXWINDOWS LIBRARY LICENCE\n"
1226 " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n"
1227 "\n"
1228 " ...and so on and so forth...\n"
1229 ));
1230
1231 info.AddTranslator(_T("Wun Ngo Wen (Martian)"));
1232 }
1233
1234 void MyFrame::ShowSimpleAboutDialog(wxCommandEvent& WXUNUSED(event))
1235 {
1236 wxAboutDialogInfo info;
1237 InitAboutInfoMinimal(info);
1238
1239 wxAboutBox(info);
1240 }
1241
1242 void MyFrame::ShowFancyAboutDialog(wxCommandEvent& WXUNUSED(event))
1243 {
1244 wxAboutDialogInfo info;
1245 InitAboutInfoWebsite(info);
1246
1247 wxAboutBox(info);
1248 }
1249
1250 void MyFrame::ShowFullAboutDialog(wxCommandEvent& WXUNUSED(event))
1251 {
1252 wxAboutDialogInfo info;
1253 InitAboutInfoAll(info);
1254
1255 wxAboutBox(info);
1256 }
1257
1258 void MyFrame::ShowCustomAboutDialog(wxCommandEvent& WXUNUSED(event))
1259 {
1260 class MyAboutDialog : public wxGenericAboutDialog
1261 {
1262 public:
1263 MyAboutDialog(const wxAboutDialogInfo& info)
1264 {
1265 Create(info);
1266 }
1267
1268 // add some custom controls
1269 virtual void DoAddCustomControls()
1270 {
1271 AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
1272 AddText(_T("Some custom text"));
1273 AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
1274 }
1275 };
1276
1277 wxAboutDialogInfo info;
1278 InitAboutInfoAll(info);
1279
1280 MyAboutDialog dlg(info);
1281 dlg.ShowModal();
1282 }
1283
1284 #endif // wxUSE_ABOUTDLG
1285
1286 #if wxUSE_BUSYINFO
1287
1288 void MyFrame::ShowBusyInfo(wxCommandEvent& WXUNUSED(event))
1289 {
1290 wxWindowDisabler disableAll;
1291
1292 wxBusyInfo info(_T("Working, please wait..."), this);
1293
1294 for ( int i = 0; i < 18; i++ )
1295 {
1296 //wxUsleep(100);
1297 wxTheApp->Yield();
1298 }
1299
1300 wxSleep(2);
1301 //wxWakeUpIdle();
1302 }
1303
1304 #endif // wxUSE_BUSYINFO
1305
1306 #if wxUSE_FINDREPLDLG
1307
1308 void MyFrame::ShowReplaceDialog( wxCommandEvent& WXUNUSED(event) )
1309 {
1310 if ( m_dlgReplace )
1311 {
1312 delete m_dlgReplace;
1313 m_dlgReplace = NULL;
1314 }
1315 else
1316 {
1317 m_dlgReplace = new wxFindReplaceDialog
1318 (
1319 this,
1320 &m_findData,
1321 _T("Find and replace dialog"),
1322 wxFR_REPLACEDIALOG
1323 );
1324
1325 m_dlgReplace->Show(true);
1326 }
1327 }
1328
1329 void MyFrame::ShowFindDialog( wxCommandEvent& WXUNUSED(event) )
1330 {
1331 if ( m_dlgFind )
1332 {
1333 delete m_dlgFind;
1334 m_dlgFind = NULL;
1335 }
1336 else
1337 {
1338 m_dlgFind = new wxFindReplaceDialog
1339 (
1340 this,
1341 &m_findData,
1342 _T("Find dialog"),
1343 // just for testing
1344 wxFR_NOWHOLEWORD
1345 );
1346
1347 m_dlgFind->Show(true);
1348 }
1349 }
1350
1351 static wxString DecodeFindDialogEventFlags(int flags)
1352 {
1353 wxString str;
1354 str << (flags & wxFR_DOWN ? _T("down") : _T("up")) << _T(", ")
1355 << (flags & wxFR_WHOLEWORD ? _T("whole words only, ") : _T(""))
1356 << (flags & wxFR_MATCHCASE ? _T("") : _T("not "))
1357 << _T("case sensitive");
1358
1359 return str;
1360 }
1361
1362 void MyFrame::OnFindDialog(wxFindDialogEvent& event)
1363 {
1364 wxEventType type = event.GetEventType();
1365
1366 if ( type == wxEVT_COMMAND_FIND || type == wxEVT_COMMAND_FIND_NEXT )
1367 {
1368 wxLogMessage(wxT("Find %s'%s' (flags: %s)"),
1369 type == wxEVT_COMMAND_FIND_NEXT ? wxT("next ") : wxT(""),
1370 event.GetFindString().c_str(),
1371 DecodeFindDialogEventFlags(event.GetFlags()).c_str());
1372 }
1373 else if ( type == wxEVT_COMMAND_FIND_REPLACE ||
1374 type == wxEVT_COMMAND_FIND_REPLACE_ALL )
1375 {
1376 wxLogMessage(wxT("Replace %s'%s' with '%s' (flags: %s)"),
1377 type == wxEVT_COMMAND_FIND_REPLACE_ALL ? _T("all ") : wxT(""),
1378 event.GetFindString().c_str(),
1379 event.GetReplaceString().c_str(),
1380 DecodeFindDialogEventFlags(event.GetFlags()).c_str());
1381 }
1382 else if ( type == wxEVT_COMMAND_FIND_CLOSE )
1383 {
1384 wxFindReplaceDialog *dlg = event.GetDialog();
1385
1386 int idMenu;
1387 const wxChar *txt;
1388 if ( dlg == m_dlgFind )
1389 {
1390 txt = _T("Find");
1391 idMenu = DIALOGS_FIND;
1392 m_dlgFind = NULL;
1393 }
1394 else if ( dlg == m_dlgReplace )
1395 {
1396 txt = _T("Replace");
1397 idMenu = DIALOGS_REPLACE;
1398 m_dlgReplace = NULL;
1399 }
1400 else
1401 {
1402 txt = _T("Unknown");
1403 idMenu = wxID_ANY;
1404
1405 wxFAIL_MSG( _T("unexpected event") );
1406 }
1407
1408 wxLogMessage(wxT("%s dialog is being closed."), txt);
1409
1410 if ( idMenu != wxID_ANY )
1411 {
1412 GetMenuBar()->Check(idMenu, false);
1413 }
1414
1415 dlg->Destroy();
1416 }
1417 else
1418 {
1419 wxLogError(wxT("Unknown find dialog event!"));
1420 }
1421 }
1422
1423 #endif // wxUSE_FINDREPLDLG
1424
1425 // ----------------------------------------------------------------------------
1426 // MyCanvas
1427 // ----------------------------------------------------------------------------
1428
1429 void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event) )
1430 {
1431 wxPaintDC dc(this);
1432 dc.SetFont(wxGetApp().m_canvasFont);
1433 dc.SetTextForeground(wxGetApp().m_canvasTextColour);
1434 dc.SetBackgroundMode(wxTRANSPARENT);
1435 dc.DrawText(
1436 _T("wxWidgets common dialogs")
1437 #if !defined(__SMARTPHONE__)
1438 _T(" test application")
1439 #endif
1440 , 10, 10);
1441 }
1442
1443 #if USE_MODAL_PRESENTATION
1444
1445 // ----------------------------------------------------------------------------
1446 // MyModelessDialog
1447 // ----------------------------------------------------------------------------
1448
1449 MyModelessDialog::MyModelessDialog(wxWindow *parent)
1450 : wxDialog(parent, wxID_ANY, wxString(_T("Modeless dialog")))
1451 {
1452 wxBoxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
1453
1454 wxButton *btn = new wxButton(this, DIALOGS_MODELESS_BTN, _T("Press me"));
1455 wxCheckBox *check = new wxCheckBox(this, wxID_ANY, _T("Should be disabled"));
1456 check->Disable();
1457
1458 sizerTop->Add(btn, 1, wxEXPAND | wxALL, 5);
1459 sizerTop->Add(check, 1, wxEXPAND | wxALL, 5);
1460
1461 SetSizer(sizerTop);
1462
1463 sizerTop->SetSizeHints(this);
1464 sizerTop->Fit(this);
1465 }
1466
1467 void MyModelessDialog::OnButton(wxCommandEvent& WXUNUSED(event))
1468 {
1469 wxMessageBox(_T("Button pressed in modeless dialog"), _T("Info"),
1470 wxOK | wxICON_INFORMATION, this);
1471 }
1472
1473 void MyModelessDialog::OnClose(wxCloseEvent& event)
1474 {
1475 if ( event.CanVeto() )
1476 {
1477 wxMessageBox(_T("Use the menu item to close this dialog"),
1478 _T("Modeless dialog"),
1479 wxOK | wxICON_INFORMATION, this);
1480
1481 event.Veto();
1482 }
1483 }
1484
1485 // ----------------------------------------------------------------------------
1486 // MyModalDialog
1487 // ----------------------------------------------------------------------------
1488
1489 MyModalDialog::MyModalDialog(wxWindow *parent)
1490 : wxDialog(parent, wxID_ANY, wxString(_T("Modal dialog")))
1491 {
1492 wxBoxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
1493
1494 m_btnModal = new wxButton(this, wxID_ANY, _T("&Modal dialog..."));
1495 m_btnModeless = new wxButton(this, wxID_ANY, _T("Mode&less dialog"));
1496 m_btnDelete = new wxButton(this, wxID_ANY, _T("&Delete button"));
1497
1498 wxButton *btnOk = new wxButton(this, wxID_CANCEL, _T("&Close"));
1499 sizerTop->Add(m_btnModal, 0, wxALIGN_CENTER | wxALL, 5);
1500 sizerTop->Add(m_btnModeless, 0, wxALIGN_CENTER | wxALL, 5);
1501 sizerTop->Add(m_btnDelete, 0, wxALIGN_CENTER | wxALL, 5);
1502 sizerTop->Add(btnOk, 0, wxALIGN_CENTER | wxALL, 5);
1503
1504 SetSizer(sizerTop);
1505
1506 sizerTop->SetSizeHints(this);
1507 sizerTop->Fit(this);
1508
1509 m_btnModal->SetFocus();
1510 m_btnModal->SetDefault();
1511 }
1512
1513 void MyModalDialog::OnButton(wxCommandEvent& event)
1514 {
1515 if ( event.GetEventObject() == m_btnDelete )
1516 {
1517 delete m_btnModal;
1518 m_btnModal = NULL;
1519
1520 m_btnDelete->Disable();
1521 }
1522 else if ( event.GetEventObject() == m_btnModal )
1523 {
1524 #if wxUSE_TEXTDLG
1525 wxGetTextFromUser(_T("Dummy prompt"),
1526 _T("Modal dialog called from dialog"),
1527 wxEmptyString, this);
1528 #else
1529 wxMessageBox(_T("Modal dialog called from dialog"));
1530 #endif // wxUSE_TEXTDLG
1531 }
1532 else if ( event.GetEventObject() == m_btnModeless )
1533 {
1534 (new MyModelessDialog(this))->Show();
1535 }
1536 else
1537 {
1538 event.Skip();
1539 }
1540 }
1541
1542 #endif // USE_MODAL_PRESENTATION
1543
1544 #if USE_SETTINGS_DIALOG
1545 // ----------------------------------------------------------------------------
1546 // SettingsDialog
1547 // ----------------------------------------------------------------------------
1548
1549 IMPLEMENT_CLASS(SettingsDialog, wxPropertySheetDialog)
1550
1551 BEGIN_EVENT_TABLE(SettingsDialog, wxPropertySheetDialog)
1552 END_EVENT_TABLE()
1553
1554 SettingsDialog::SettingsDialog(wxWindow* win, int dialogType)
1555 {
1556 SetExtraStyle(wxDIALOG_EX_CONTEXTHELP|wxWS_EX_VALIDATE_RECURSIVELY);
1557
1558 int tabImage1 = -1;
1559 int tabImage2 = -1;
1560
1561 bool useToolBook = (dialogType == DIALOGS_PROPERTY_SHEET_TOOLBOOK || dialogType == DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK);
1562 int resizeBorder = wxRESIZE_BORDER;
1563
1564 if (useToolBook)
1565 {
1566 resizeBorder = 0;
1567 tabImage1 = 0;
1568 tabImage2 = 1;
1569
1570 int sheetStyle = wxPROPSHEET_SHRINKTOFIT;
1571 if (dialogType == DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK)
1572 sheetStyle |= wxPROPSHEET_BUTTONTOOLBOOK;
1573 else
1574 sheetStyle |= wxPROPSHEET_TOOLBOOK;
1575
1576 SetSheetStyle(sheetStyle);
1577 SetSheetInnerBorder(0);
1578 SetSheetOuterBorder(0);
1579
1580 // create a dummy image list with a few icons
1581 const wxSize imageSize(32, 32);
1582
1583 m_imageList = new wxImageList(imageSize.GetWidth(), imageSize.GetHeight());
1584 m_imageList->
1585 Add(wxArtProvider::GetIcon(wxART_INFORMATION, wxART_OTHER, imageSize));
1586 m_imageList->
1587 Add(wxArtProvider::GetIcon(wxART_QUESTION, wxART_OTHER, imageSize));
1588 m_imageList->
1589 Add(wxArtProvider::GetIcon(wxART_WARNING, wxART_OTHER, imageSize));
1590 m_imageList->
1591 Add(wxArtProvider::GetIcon(wxART_ERROR, wxART_OTHER, imageSize));
1592 }
1593 else
1594 m_imageList = NULL;
1595
1596 Create(win, wxID_ANY, _("Preferences"), wxDefaultPosition, wxDefaultSize,
1597 wxDEFAULT_DIALOG_STYLE| (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, resizeBorder)
1598 );
1599
1600 // If using a toolbook, also follow Mac style and don't create buttons
1601 if (!useToolBook)
1602 CreateButtons(wxOK | wxCANCEL |
1603 (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, wxHELP)
1604 );
1605
1606 wxBookCtrlBase* notebook = GetBookCtrl();
1607 notebook->SetImageList(m_imageList);
1608
1609 wxPanel* generalSettings = CreateGeneralSettingsPage(notebook);
1610 wxPanel* aestheticSettings = CreateAestheticSettingsPage(notebook);
1611
1612 notebook->AddPage(generalSettings, _("General"), true, tabImage1);
1613 notebook->AddPage(aestheticSettings, _("Aesthetics"), false, tabImage2);
1614
1615 LayoutDialog();
1616 }
1617
1618 SettingsDialog::~SettingsDialog()
1619 {
1620 delete m_imageList;
1621 }
1622
1623 wxPanel* SettingsDialog::CreateGeneralSettingsPage(wxWindow* parent)
1624 {
1625 wxPanel* panel = new wxPanel(parent, wxID_ANY);
1626
1627 wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
1628 wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
1629
1630 //// LOAD LAST FILE
1631
1632 wxBoxSizer* itemSizer3 = new wxBoxSizer( wxHORIZONTAL );
1633 wxCheckBox* checkBox3 = new wxCheckBox(panel, ID_LOAD_LAST_PROJECT, _("&Load last project on startup"), wxDefaultPosition, wxDefaultSize);
1634 itemSizer3->Add(checkBox3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1635 item0->Add(itemSizer3, 0, wxGROW|wxALL, 0);
1636
1637 //// AUTOSAVE
1638
1639 wxString autoSaveLabel = _("&Auto-save every");
1640 wxString minsLabel = _("mins");
1641
1642 wxBoxSizer* itemSizer12 = new wxBoxSizer( wxHORIZONTAL );
1643 wxCheckBox* checkBox12 = new wxCheckBox(panel, ID_AUTO_SAVE, autoSaveLabel, wxDefaultPosition, wxDefaultSize);
1644
1645 #if wxUSE_SPINCTRL
1646 wxSpinCtrl* spinCtrl12 = new wxSpinCtrl(panel, ID_AUTO_SAVE_MINS, wxEmptyString,
1647 wxDefaultPosition, wxSize(40, wxDefaultCoord), wxSP_ARROW_KEYS, 1, 60, 1);
1648 #endif
1649
1650 itemSizer12->Add(checkBox12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1651 #if wxUSE_SPINCTRL
1652 itemSizer12->Add(spinCtrl12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1653 #endif
1654 itemSizer12->Add(new wxStaticText(panel, wxID_STATIC, minsLabel), 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1655 item0->Add(itemSizer12, 0, wxGROW|wxALL, 0);
1656
1657 //// TOOLTIPS
1658
1659 wxBoxSizer* itemSizer8 = new wxBoxSizer( wxHORIZONTAL );
1660 wxCheckBox* checkBox6 = new wxCheckBox(panel, ID_SHOW_TOOLTIPS, _("Show &tooltips"), wxDefaultPosition, wxDefaultSize);
1661 itemSizer8->Add(checkBox6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1662 item0->Add(itemSizer8, 0, wxGROW|wxALL, 0);
1663
1664 topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );
1665
1666 panel->SetSizer(topSizer);
1667 topSizer->Fit(panel);
1668
1669 return panel;
1670 }
1671
1672 wxPanel* SettingsDialog::CreateAestheticSettingsPage(wxWindow* parent)
1673 {
1674 wxPanel* panel = new wxPanel(parent, wxID_ANY);
1675
1676 wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
1677 wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
1678
1679 //// PROJECT OR GLOBAL
1680 wxString globalOrProjectChoices[2];
1681 globalOrProjectChoices[0] = _("&New projects");
1682 globalOrProjectChoices[1] = _("&This project");
1683
1684 wxRadioBox* projectOrGlobal = new wxRadioBox(panel, ID_APPLY_SETTINGS_TO, _("&Apply settings to:"),
1685 wxDefaultPosition, wxDefaultSize, 2, globalOrProjectChoices);
1686 item0->Add(projectOrGlobal, 0, wxGROW|wxALL, 5);
1687
1688 projectOrGlobal->SetSelection(0);
1689
1690 //// BACKGROUND STYLE
1691 wxArrayString backgroundStyleChoices;
1692 backgroundStyleChoices.Add(wxT("Colour"));
1693 backgroundStyleChoices.Add(wxT("Image"));
1694 wxStaticBox* staticBox3 = new wxStaticBox(panel, wxID_ANY, _("Background style:"));
1695
1696 wxBoxSizer* styleSizer = new wxStaticBoxSizer( staticBox3, wxVERTICAL );
1697 item0->Add(styleSizer, 0, wxGROW|wxALL, 5);
1698
1699 wxBoxSizer* itemSizer2 = new wxBoxSizer( wxHORIZONTAL );
1700
1701 wxChoice* choice2 = new wxChoice(panel, ID_BACKGROUND_STYLE, wxDefaultPosition, wxDefaultSize, backgroundStyleChoices);
1702
1703 itemSizer2->Add(new wxStaticText(panel, wxID_ANY, _("&Window:")), 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1704 itemSizer2->Add(5, 5, 1, wxALL, 0);
1705 itemSizer2->Add(choice2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1706
1707 styleSizer->Add(itemSizer2, 0, wxGROW|wxALL, 5);
1708
1709 #if wxUSE_SPINCTRL
1710 //// FONT SIZE SELECTION
1711
1712 wxStaticBox* staticBox1 = new wxStaticBox(panel, wxID_ANY, _("Tile font size:"));
1713 wxBoxSizer* itemSizer5 = new wxStaticBoxSizer( staticBox1, wxHORIZONTAL );
1714
1715 wxSpinCtrl* spinCtrl = new wxSpinCtrl(panel, ID_FONT_SIZE, wxEmptyString, wxDefaultPosition,
1716 wxSize(80, wxDefaultCoord));
1717 itemSizer5->Add(spinCtrl, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
1718
1719 item0->Add(itemSizer5, 0, wxGROW|wxLEFT|wxRIGHT, 5);
1720 #endif
1721
1722 topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );
1723 topSizer->AddSpacer(5);
1724
1725 panel->SetSizer(topSizer);
1726 topSizer->Fit(panel);
1727
1728 return panel;
1729 }
1730
1731 #endif // USE_SETTINGS_DIALOG