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: dialogs.cpp 43016 2006-11-04 10:57:24Z VZ $
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
108IMPLEMENT_APP(MyApp)
109
110BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
111    EVT_PAINT(MyCanvas::OnPaint)
112END_EVENT_TABLE()
113
114
115
116BEGIN_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)
221END_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
236MyCanvas *myCanvas = (MyCanvas *) NULL;
237
238// `Main program' equivalent, creating windows and returning main app frame
239bool 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
433MyFrame::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
469void 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
486void 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
516void 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
541void 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
560void 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
583void 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
608void 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
633void 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
646void 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
663void 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
682void 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
715void 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
750void 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
777void 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
818void 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
838void 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
865void 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
903void 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
923void 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
937void MyFrame::DirChoose(wxCommandEvent& WXUNUSED(event) )
938{
939    DoDirChoose(wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST);
940}
941
942void 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
949void 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
966void MyFrame::ModalDlg(wxCommandEvent& WXUNUSED(event))
967{
968    MyModalDialog dlg(this);
969    dlg.ShowModal();
970}
971
972void 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
998void 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
1007void 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
1019void 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
1048void MyFrame::OnPropertySheet(wxCommandEvent& event)
1049{
1050    SettingsDialog dialog(this, event.GetId());
1051    dialog.ShowModal();
1052}
1053#endif // USE_SETTINGS_DIALOG
1054
1055void 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
1064void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event) )
1065{
1066    Close(true);
1067}
1068
1069#if wxUSE_PROGRESSDLG
1070
1071void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
1072{
1073    static const int max = 100;
1074
1075    wxProgressDialog dialog(_T("Progress dialog example"),
1076                            _T("An informative message"),
1077                            max,    // range
1078                            this,   // parent
1079                            wxPD_CAN_ABORT |
1080                            wxPD_CAN_SKIP |
1081                            wxPD_APP_MODAL |
1082                            // wxPD_AUTO_HIDE | -- try this as well
1083                            wxPD_ELAPSED_TIME |
1084                            wxPD_ESTIMATED_TIME |
1085                            wxPD_REMAINING_TIME
1086                            | wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small
1087                            );
1088
1089    bool cont = true;
1090    for ( int i = 0; i <= max; i++ )
1091    {
1092        wxMilliSleep(200);
1093
1094        wxString msg;
1095
1096        // test both modes of wxProgressDialog behaviour: start in
1097        // indeterminate mode but switch to the determinate one later
1098        const bool determinate = i > max/2;
1099
1100        if ( i == max )
1101        {
1102            msg = _T("That's all, folks!");
1103        }
1104        else if ( !determinate )
1105        {
1106            msg = _T("Testing indeterminate mode");
1107        }
1108        else if ( determinate )
1109        {
1110            msg = _T("Now in standard determinate mode");
1111        }
1112
1113        // will be set to true if "Skip" button was pressed
1114        bool skip = false;
1115        if ( determinate )
1116        {
1117            cont = dialog.Update(i, msg, &skip);
1118        }
1119        else
1120        {
1121            cont = dialog.Pulse(msg, &skip);
1122        }
1123
1124        // each skip will move progress about quarter forward
1125        if ( skip )
1126            i += max/4;
1127
1128        if ( !cont )
1129        {
1130            if ( wxMessageBox(_T("Do you really want to cancel?"),
1131                              _T("Progress dialog question"),  // caption
1132                              wxYES_NO | wxICON_QUESTION) == wxYES )
1133                break;
1134
1135            cont = true;
1136            dialog.Resume();
1137        }
1138    }
1139
1140    if ( !cont )
1141    {
1142        wxLogStatus(wxT("Progress dialog aborted!"));
1143    }
1144    else
1145    {
1146        wxLogStatus(wxT("Countdown from %d finished"), max);
1147    }
1148}
1149
1150#endif // wxUSE_PROGRESSDLG
1151
1152#if wxUSE_ABOUTDLG
1153
1154static void InitAboutInfoMinimal(wxAboutDialogInfo& info)
1155{
1156    info.SetName(_T("Dialogs Sample"));
1157    info.SetVersion(wxVERSION_NUM_DOT_STRING_T);
1158    info.SetDescription(_T("This sample shows different wxWidgets dialogs"));
1159    info.SetCopyright(_T("(C) 1998-2006 wxWidgets dev team"));
1160    info.AddDeveloper(_T("Vadim Zeitlin"));
1161}
1162
1163static void InitAboutInfoWebsite(wxAboutDialogInfo& info)
1164{
1165    InitAboutInfoMinimal(info);
1166
1167    info.SetWebSite(_T("http://www.wxwidgets.org/"), _T("wxWidgets web site"));
1168}
1169
1170static void InitAboutInfoAll(wxAboutDialogInfo& info)
1171{
1172    InitAboutInfoMinimal(info);
1173
1174    // we can add a second developer
1175    info.AddDeveloper(_T("A.N. Other"));
1176
1177    // or we can add several persons at once like this
1178    static const wxChar *docwriters[] =
1179    {
1180        _T("First D. Writer"),
1181        _T("Second One"),
1182    };
1183
1184    info.SetDocWriters(wxArrayString(WXSIZEOF(docwriters), docwriters));
1185    info.SetLicence(wxString::FromAscii(
1186"                wxWindows Library Licence, Version 3.1\n"
1187"                ======================================\n"
1188"\n"
1189"  Copyright (c) 1998-2005 Julian Smart, Robert Roebling et al\n"
1190"\n"
1191"  Everyone is permitted to copy and distribute verbatim copies\n"
1192"  of this licence document, but changing it is not allowed.\n"
1193"\n"
1194"                       WXWINDOWS LIBRARY LICENCE\n"
1195"     TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n"
1196"\n"
1197"                    ...and so on and so forth...\n"
1198    ));
1199
1200    info.AddTranslator(_T("Wun Ngo Wen (Martian)"));
1201}
1202
1203void MyFrame::ShowSimpleAboutDialog(wxCommandEvent& WXUNUSED(event))
1204{
1205    wxAboutDialogInfo info;
1206    InitAboutInfoMinimal(info);
1207
1208    wxAboutBox(info);
1209}
1210
1211void MyFrame::ShowFancyAboutDialog(wxCommandEvent& WXUNUSED(event))
1212{
1213    wxAboutDialogInfo info;
1214    InitAboutInfoWebsite(info);
1215
1216    wxAboutBox(info);
1217}
1218
1219void MyFrame::ShowFullAboutDialog(wxCommandEvent& WXUNUSED(event))
1220{
1221    wxAboutDialogInfo info;
1222    InitAboutInfoAll(info);
1223
1224    wxAboutBox(info);
1225}
1226
1227// a trivial example of a custom dialog class
1228class MyAboutDialog : public wxGenericAboutDialog
1229{
1230public:
1231    MyAboutDialog(const wxAboutDialogInfo& info)
1232    {
1233        Create(info);
1234    }
1235
1236    // add some custom controls
1237    virtual void DoAddCustomControls()
1238    {
1239        AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
1240        AddText(_T("Some custom text"));
1241        AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
1242    }
1243};
1244
1245void MyFrame::ShowCustomAboutDialog(wxCommandEvent& WXUNUSED(event))
1246{
1247    wxAboutDialogInfo info;
1248    InitAboutInfoAll(info);
1249
1250    MyAboutDialog dlg(info);
1251    dlg.ShowModal();
1252}
1253
1254#endif // wxUSE_ABOUTDLG
1255
1256#if wxUSE_BUSYINFO
1257
1258void MyFrame::ShowBusyInfo(wxCommandEvent& WXUNUSED(event))
1259{
1260    wxWindowDisabler disableAll;
1261
1262    wxBusyInfo info(_T("Working, please wait..."), this);
1263
1264    for ( int i = 0; i < 18; i++ )
1265    {
1266        //wxUsleep(100);
1267        wxTheApp->Yield();
1268    }
1269
1270    wxSleep(2);
1271    //wxWakeUpIdle();
1272}
1273
1274#endif // wxUSE_BUSYINFO
1275
1276#if wxUSE_FINDREPLDLG
1277
1278void MyFrame::ShowReplaceDialog( wxCommandEvent& WXUNUSED(event) )
1279{
1280    if ( m_dlgReplace )
1281    {
1282        delete m_dlgReplace;
1283        m_dlgReplace = NULL;
1284    }
1285    else
1286    {
1287        m_dlgReplace = new wxFindReplaceDialog
1288                           (
1289                            this,
1290                            &m_findData,
1291                            _T("Find and replace dialog"),
1292                            wxFR_REPLACEDIALOG
1293                           );
1294
1295        m_dlgReplace->Show(true);
1296    }
1297}
1298
1299void MyFrame::ShowFindDialog( wxCommandEvent& WXUNUSED(event) )
1300{
1301    if ( m_dlgFind )
1302    {
1303        delete m_dlgFind;
1304        m_dlgFind = NULL;
1305    }
1306    else
1307    {
1308        m_dlgFind = new wxFindReplaceDialog
1309                        (
1310                            this,
1311                            &m_findData,
1312                            _T("Find dialog"),
1313                            // just for testing
1314                            wxFR_NOWHOLEWORD
1315                        );
1316
1317        m_dlgFind->Show(true);
1318    }
1319}
1320
1321static wxString DecodeFindDialogEventFlags(int flags)
1322{
1323    wxString str;
1324    str << (flags & wxFR_DOWN ? _T("down") : _T("up")) << _T(", ")
1325        << (flags & wxFR_WHOLEWORD ? _T("whole words only, ") : _T(""))
1326        << (flags & wxFR_MATCHCASE ? _T("") : _T("not "))
1327        << _T("case sensitive");
1328
1329    return str;
1330}
1331
1332void MyFrame::OnFindDialog(wxFindDialogEvent& event)
1333{
1334    wxEventType type = event.GetEventType();
1335
1336    if ( type == wxEVT_COMMAND_FIND || type == wxEVT_COMMAND_FIND_NEXT )
1337    {
1338        wxLogMessage(wxT("Find %s'%s' (flags: %s)"),
1339                     type == wxEVT_COMMAND_FIND_NEXT ? wxT("next ") : wxT(""),
1340                     event.GetFindString().c_str(),
1341                     DecodeFindDialogEventFlags(event.GetFlags()).c_str());
1342    }
1343    else if ( type == wxEVT_COMMAND_FIND_REPLACE ||
1344                type == wxEVT_COMMAND_FIND_REPLACE_ALL )
1345    {
1346        wxLogMessage(wxT("Replace %s'%s' with '%s' (flags: %s)"),
1347                     type == wxEVT_COMMAND_FIND_REPLACE_ALL ? _T("all ") : wxT(""),
1348                     event.GetFindString().c_str(),
1349                     event.GetReplaceString().c_str(),
1350                     DecodeFindDialogEventFlags(event.GetFlags()).c_str());
1351    }
1352    else if ( type == wxEVT_COMMAND_FIND_CLOSE )
1353    {
1354        wxFindReplaceDialog *dlg = event.GetDialog();
1355
1356        int idMenu;
1357        const wxChar *txt;
1358        if ( dlg == m_dlgFind )
1359        {
1360            txt = _T("Find");
1361            idMenu = DIALOGS_FIND;
1362            m_dlgFind = NULL;
1363        }
1364        else if ( dlg == m_dlgReplace )
1365        {
1366            txt = _T("Replace");
1367            idMenu = DIALOGS_REPLACE;
1368            m_dlgReplace = NULL;
1369        }
1370        else
1371        {
1372            txt = _T("Unknown");
1373            idMenu = wxID_ANY;
1374
1375            wxFAIL_MSG( _T("unexpected event") );
1376        }
1377
1378        wxLogMessage(wxT("%s dialog is being closed."), txt);
1379
1380        if ( idMenu != wxID_ANY )
1381        {
1382            GetMenuBar()->Check(idMenu, false);
1383        }
1384
1385        dlg->Destroy();
1386    }
1387    else
1388    {
1389        wxLogError(wxT("Unknown find dialog event!"));
1390    }
1391}
1392
1393#endif // wxUSE_FINDREPLDLG
1394
1395// ----------------------------------------------------------------------------
1396// MyCanvas
1397// ----------------------------------------------------------------------------
1398
1399void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event) )
1400{
1401    wxPaintDC dc(this);
1402    dc.SetFont(wxGetApp().m_canvasFont);
1403    dc.SetTextForeground(wxGetApp().m_canvasTextColour);
1404    dc.SetBackgroundMode(wxTRANSPARENT);
1405    dc.DrawText(
1406                _T("wxWidgets common dialogs")
1407#if !defined(__SMARTPHONE__)
1408                _T(" test application")
1409#endif
1410                , 10, 10);
1411}
1412
1413#if USE_MODAL_PRESENTATION
1414
1415// ----------------------------------------------------------------------------
1416// MyModelessDialog
1417// ----------------------------------------------------------------------------
1418
1419MyModelessDialog::MyModelessDialog(wxWindow *parent)
1420                : wxDialog(parent, wxID_ANY, wxString(_T("Modeless dialog")))
1421{
1422    wxBoxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
1423
1424    wxButton *btn = new wxButton(this, DIALOGS_MODELESS_BTN, _T("Press me"));
1425    wxCheckBox *check = new wxCheckBox(this, wxID_ANY, _T("Should be disabled"));
1426    check->Disable();
1427
1428    sizerTop->Add(btn, 1, wxEXPAND | wxALL, 5);
1429    sizerTop->Add(check, 1, wxEXPAND | wxALL, 5);
1430
1431    SetSizer(sizerTop);
1432
1433    sizerTop->SetSizeHints(this);
1434    sizerTop->Fit(this);
1435}
1436
1437void MyModelessDialog::OnButton(wxCommandEvent& WXUNUSED(event))
1438{
1439    wxMessageBox(_T("Button pressed in modeless dialog"), _T("Info"),
1440                 wxOK | wxICON_INFORMATION, this);
1441}
1442
1443void MyModelessDialog::OnClose(wxCloseEvent& event)
1444{
1445    if ( event.CanVeto() )
1446    {
1447        wxMessageBox(_T("Use the menu item to close this dialog"),
1448                     _T("Modeless dialog"),
1449                     wxOK | wxICON_INFORMATION, this);
1450
1451        event.Veto();
1452    }
1453}
1454
1455// ----------------------------------------------------------------------------
1456// MyModalDialog
1457// ----------------------------------------------------------------------------
1458
1459MyModalDialog::MyModalDialog(wxWindow *parent)
1460             : wxDialog(parent, wxID_ANY, wxString(_T("Modal dialog")))
1461{
1462    wxBoxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
1463
1464    m_btnModal = new wxButton(this, wxID_ANY, _T("&Modal dialog..."));
1465    m_btnModeless = new wxButton(this, wxID_ANY, _T("Mode&less dialog"));
1466    m_btnDelete = new wxButton(this, wxID_ANY, _T("&Delete button"));
1467
1468    wxButton *btnOk = new wxButton(this, wxID_CANCEL, _T("&Close"));
1469    sizerTop->Add(m_btnModal, 0, wxALIGN_CENTER | wxALL, 5);
1470    sizerTop->Add(m_btnModeless, 0, wxALIGN_CENTER | wxALL, 5);
1471    sizerTop->Add(m_btnDelete, 0, wxALIGN_CENTER | wxALL, 5);
1472    sizerTop->Add(btnOk, 0, wxALIGN_CENTER | wxALL, 5);
1473
1474    SetSizer(sizerTop);
1475
1476    sizerTop->SetSizeHints(this);
1477    sizerTop->Fit(this);
1478
1479    m_btnModal->SetFocus();
1480    m_btnModal->SetDefault();
1481}
1482
1483void MyModalDialog::OnButton(wxCommandEvent& event)
1484{
1485    if ( event.GetEventObject() == m_btnDelete )
1486    {
1487        delete m_btnModal;
1488        m_btnModal = NULL;
1489
1490        m_btnDelete->Disable();
1491    }
1492    else if ( event.GetEventObject() == m_btnModal )
1493    {
1494#if wxUSE_TEXTDLG
1495        wxGetTextFromUser(_T("Dummy prompt"),
1496                          _T("Modal dialog called from dialog"),
1497                          wxEmptyString, this);
1498#else
1499        wxMessageBox(_T("Modal dialog called from dialog"));
1500#endif // wxUSE_TEXTDLG
1501    }
1502    else if ( event.GetEventObject() == m_btnModeless )
1503    {
1504        (new MyModelessDialog(this))->Show();
1505    }
1506    else
1507    {
1508        event.Skip();
1509    }
1510}
1511
1512#endif // USE_MODAL_PRESENTATION
1513
1514#if USE_SETTINGS_DIALOG
1515// ----------------------------------------------------------------------------
1516// SettingsDialog
1517// ----------------------------------------------------------------------------
1518
1519IMPLEMENT_CLASS(SettingsDialog, wxPropertySheetDialog)
1520
1521BEGIN_EVENT_TABLE(SettingsDialog, wxPropertySheetDialog)
1522END_EVENT_TABLE()
1523
1524SettingsDialog::SettingsDialog(wxWindow* win, int dialogType)
1525{
1526    SetExtraStyle(wxDIALOG_EX_CONTEXTHELP|wxWS_EX_VALIDATE_RECURSIVELY);
1527
1528    int tabImage1 = -1;
1529    int tabImage2 = -1;
1530
1531    bool useToolBook = (dialogType == DIALOGS_PROPERTY_SHEET_TOOLBOOK || dialogType == DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK);
1532    int resizeBorder = wxRESIZE_BORDER;
1533
1534    if (useToolBook)
1535    {
1536        resizeBorder = 0;
1537        tabImage1 = 0;
1538        tabImage2 = 1;
1539
1540        int sheetStyle = wxPROPSHEET_SHRINKTOFIT;
1541        if (dialogType == DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK)
1542            sheetStyle |= wxPROPSHEET_BUTTONTOOLBOOK;
1543        else
1544            sheetStyle |= wxPROPSHEET_TOOLBOOK;
1545
1546        SetSheetStyle(sheetStyle);
1547        SetSheetInnerBorder(0);
1548        SetSheetOuterBorder(0);
1549
1550        // create a dummy image list with a few icons
1551        const wxSize imageSize(32, 32);
1552
1553        m_imageList = new wxImageList(imageSize.GetWidth(), imageSize.GetHeight());
1554        m_imageList->
1555            Add(wxArtProvider::GetIcon(wxART_INFORMATION, wxART_OTHER, imageSize));
1556        m_imageList->
1557            Add(wxArtProvider::GetIcon(wxART_QUESTION, wxART_OTHER, imageSize));
1558        m_imageList->
1559            Add(wxArtProvider::GetIcon(wxART_WARNING, wxART_OTHER, imageSize));
1560        m_imageList->
1561            Add(wxArtProvider::GetIcon(wxART_ERROR, wxART_OTHER, imageSize));
1562    }
1563    else
1564        m_imageList = NULL;
1565
1566    Create(win, wxID_ANY, _("Preferences"), wxDefaultPosition, wxDefaultSize,
1567        wxDEFAULT_DIALOG_STYLE| (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, resizeBorder)
1568    );
1569
1570    // If using a toolbook, also follow Mac style and don't create buttons
1571    if (!useToolBook)
1572        CreateButtons(wxOK | wxCANCEL |
1573                        (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, wxHELP)
1574    );
1575
1576    wxBookCtrlBase* notebook = GetBookCtrl();
1577    notebook->SetImageList(m_imageList);
1578
1579    wxPanel* generalSettings = CreateGeneralSettingsPage(notebook);
1580    wxPanel* aestheticSettings = CreateAestheticSettingsPage(notebook);
1581
1582    notebook->AddPage(generalSettings, _("General"), true, tabImage1);
1583    notebook->AddPage(aestheticSettings, _("Aesthetics"), false, tabImage2);
1584
1585    LayoutDialog();
1586}
1587
1588SettingsDialog::~SettingsDialog()
1589{
1590    delete m_imageList;
1591}
1592
1593wxPanel* SettingsDialog::CreateGeneralSettingsPage(wxWindow* parent)
1594{
1595    wxPanel* panel = new wxPanel(parent, wxID_ANY);
1596
1597    wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
1598    wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
1599
1600    //// LOAD LAST FILE
1601
1602    wxBoxSizer* itemSizer3 = new wxBoxSizer( wxHORIZONTAL );
1603    wxCheckBox* checkBox3 = new wxCheckBox(panel, ID_LOAD_LAST_PROJECT, _("&Load last project on startup"), wxDefaultPosition, wxDefaultSize);
1604    itemSizer3->Add(checkBox3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1605    item0->Add(itemSizer3, 0, wxGROW|wxALL, 0);
1606
1607    //// AUTOSAVE
1608
1609    wxString autoSaveLabel = _("&Auto-save every");
1610    wxString minsLabel = _("mins");
1611
1612    wxBoxSizer* itemSizer12 = new wxBoxSizer( wxHORIZONTAL );
1613    wxCheckBox* checkBox12 = new wxCheckBox(panel, ID_AUTO_SAVE, autoSaveLabel, wxDefaultPosition, wxDefaultSize);
1614
1615#if wxUSE_SPINCTRL
1616    wxSpinCtrl* spinCtrl12 = new wxSpinCtrl(panel, ID_AUTO_SAVE_MINS, wxEmptyString,
1617        wxDefaultPosition, wxSize(40, wxDefaultCoord), wxSP_ARROW_KEYS, 1, 60, 1);
1618#endif
1619
1620    itemSizer12->Add(checkBox12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1621#if wxUSE_SPINCTRL
1622    itemSizer12->Add(spinCtrl12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1623#endif
1624    itemSizer12->Add(new wxStaticText(panel, wxID_STATIC, minsLabel), 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1625    item0->Add(itemSizer12, 0, wxGROW|wxALL, 0);
1626
1627    //// TOOLTIPS
1628
1629    wxBoxSizer* itemSizer8 = new wxBoxSizer( wxHORIZONTAL );
1630    wxCheckBox* checkBox6 = new wxCheckBox(panel, ID_SHOW_TOOLTIPS, _("Show &tooltips"), wxDefaultPosition, wxDefaultSize);
1631    itemSizer8->Add(checkBox6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1632    item0->Add(itemSizer8, 0, wxGROW|wxALL, 0);
1633
1634    topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );
1635
1636    panel->SetSizer(topSizer);
1637    topSizer->Fit(panel);
1638
1639    return panel;
1640}
1641
1642wxPanel* SettingsDialog::CreateAestheticSettingsPage(wxWindow* parent)
1643{
1644    wxPanel* panel = new wxPanel(parent, wxID_ANY);
1645
1646    wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
1647    wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
1648
1649    //// PROJECT OR GLOBAL
1650    wxString globalOrProjectChoices[2];
1651    globalOrProjectChoices[0] = _("&New projects");
1652    globalOrProjectChoices[1] = _("&This project");
1653
1654    wxRadioBox* projectOrGlobal = new wxRadioBox(panel, ID_APPLY_SETTINGS_TO, _("&Apply settings to:"),
1655        wxDefaultPosition, wxDefaultSize, 2, globalOrProjectChoices);
1656    item0->Add(projectOrGlobal, 0, wxGROW|wxALL, 5);
1657
1658    projectOrGlobal->SetSelection(0);
1659
1660    //// BACKGROUND STYLE
1661    wxArrayString backgroundStyleChoices;
1662    backgroundStyleChoices.Add(wxT("Colour"));
1663    backgroundStyleChoices.Add(wxT("Image"));
1664    wxStaticBox* staticBox3 = new wxStaticBox(panel, wxID_ANY, _("Background style:"));
1665
1666    wxBoxSizer* styleSizer = new wxStaticBoxSizer( staticBox3, wxVERTICAL );
1667    item0->Add(styleSizer, 0, wxGROW|wxALL, 5);
1668
1669    wxBoxSizer* itemSizer2 = new wxBoxSizer( wxHORIZONTAL );
1670
1671    wxChoice* choice2 = new wxChoice(panel, ID_BACKGROUND_STYLE, wxDefaultPosition, wxDefaultSize, backgroundStyleChoices);
1672
1673    itemSizer2->Add(new wxStaticText(panel, wxID_ANY, _("&Window:")), 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1674    itemSizer2->Add(5, 5, 1, wxALL, 0);
1675    itemSizer2->Add(choice2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
1676
1677    styleSizer->Add(itemSizer2, 0, wxGROW|wxALL, 5);
1678
1679#if wxUSE_SPINCTRL
1680    //// FONT SIZE SELECTION
1681
1682    wxStaticBox* staticBox1 = new wxStaticBox(panel, wxID_ANY, _("Tile font size:"));
1683    wxBoxSizer* itemSizer5 = new wxStaticBoxSizer( staticBox1, wxHORIZONTAL );
1684
1685    wxSpinCtrl* spinCtrl = new wxSpinCtrl(panel, ID_FONT_SIZE, wxEmptyString, wxDefaultPosition,
1686        wxSize(80, wxDefaultCoord));
1687    itemSizer5->Add(spinCtrl, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
1688
1689    item0->Add(itemSizer5, 0, wxGROW|wxLEFT|wxRIGHT, 5);
1690#endif
1691
1692    topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );
1693    topSizer->AddSpacer(5);
1694
1695    panel->SetSizer(topSizer);
1696    topSizer->Fit(panel);
1697
1698    return panel;
1699}
1700
1701#endif // USE_SETTINGS_DIALOG
1702