]> git.saurik.com Git - wxWidgets.git/blob - samples/dialogs/dialogs.h
Support using GetTextExtent() with empty string to get descent in wxOSX.
[wxWidgets.git] / samples / dialogs / dialogs.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: dialogs.h
3 // Purpose: Common dialogs demo
4 // Author: Julian Smart, Vadim Zeitlin, ABX
5 // Created: 04/01/98
6 // RCS-ID: $Id$
7 // Copyright: (c) Julian Smart
8 // (c) 2004 ABX
9 // (c) Vadim Zeitlin
10 // Licence: wxWindows licence
11 /////////////////////////////////////////////////////////////////////////////
12
13 /*
14 This sample shows how to use the common dialogs available from wxWidgets.
15 It also shows that generic implementations of common dialogs can be exchanged
16 with native dialogs and can coexist in one application. The need for generic
17 dialogs addition is recognized thanks to setup of below USE_*** setting. Their
18 combinations reflects conditions of makefiles and project files to avoid unresolved
19 references during linking. For now some generic dialogs are added in static builds
20 of MSW, MAC and OS2
21 */
22
23 #ifndef __DIALOGSH__
24 #define __DIALOGSH__
25
26 #ifdef __WXUNIVERSAL__
27 #define USE_WXUNIVERSAL 1
28 #else
29 #define USE_WXUNIVERSAL 0
30 #endif
31
32 #ifdef WXUSINGDLL
33 #define USE_DLL 1
34 #else
35 #define USE_DLL 0
36 #endif
37
38 #if defined(__WXWINCE__)
39 #define USE_WXWINCE 1
40 #else
41 #define USE_WXWINCE 0
42 #endif
43
44 #if defined(__WXMSW__) && !USE_WXWINCE
45 #define USE_WXMSW 1
46 #else
47 #define USE_WXMSW 0
48 #endif
49
50 #ifdef __WXMAC__
51 #define USE_WXMAC 1
52 #else
53 #define USE_WXMAC 0
54 #endif
55
56 #if defined(__WXMAC_OSX__) && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2) && USE_NATIVE_FONT_DIALOG_FOR_MACOSX
57 #define USE_WXMACFONTDLG 1
58 #else
59 #define USE_WXMACFONTDLG 0
60 #endif
61
62 #ifdef __WXGTK__
63 #define USE_WXGTK 1
64 #else
65 #define USE_WXGTK 0
66 #endif
67
68 #ifdef __WXPM__
69 #define USE_WXPM 1
70 #else
71 #define USE_WXPM 0
72 #endif
73
74 #define USE_GENERIC_DIALOGS (!USE_WXUNIVERSAL && !USE_DLL)
75
76 #define USE_COLOURDLG_GENERIC \
77 ((USE_WXMSW || USE_WXMAC) && USE_GENERIC_DIALOGS && wxUSE_COLOURDLG)
78 #define USE_DIRDLG_GENERIC \
79 ((USE_WXMSW || USE_WXMAC) && USE_GENERIC_DIALOGS && wxUSE_DIRDLG)
80 #define USE_FILEDLG_GENERIC \
81 ((((USE_WXMSW || USE_WXMAC || USE_WXPM || USE_WXGTK) \
82 && USE_GENERIC_DIALOGS) || USE_WXWINCE) && wxUSE_FILEDLG)
83 #define USE_FONTDLG_GENERIC \
84 ((USE_WXMSW || USE_WXMACFONTDLG || USE_WXPM) && USE_GENERIC_DIALOGS && wxUSE_FONTDLG)
85
86 // Turn USE_MODAL_PRESENTATION to 0 if there is any reason for not presenting difference
87 // between modal and modeless dialogs (ie. not implemented it in your port yet)
88 #if defined(__SMARTPHONE__) || !wxUSE_BOOKCTRL
89 #define USE_MODAL_PRESENTATION 0
90 #else
91 #define USE_MODAL_PRESENTATION 1
92 #endif
93
94
95 // Turn USE_SETTINGS_DIALOG to 0 if supported
96 #if wxUSE_BOOKCTRL
97 #define USE_SETTINGS_DIALOG 1
98 #else
99 #define USE_SETTINGS_DIALOG 0
100 #endif
101
102 #if wxUSE_LOG
103
104 // Custom application traits class which we use to override the default log
105 // target creation
106 class MyAppTraits : public wxGUIAppTraits
107 {
108 public:
109 virtual wxLog *CreateLogTarget();
110 };
111
112 #endif // wxUSE_LOG
113
114 // Define a new application type
115 class MyApp: public wxApp
116 {
117 public:
118 MyApp() { m_startupProgressStyle = -1; }
119
120 virtual bool OnInit();
121
122 #if wxUSE_CMDLINE_PARSER
123 virtual void OnInitCmdLine(wxCmdLineParser& parser);
124 virtual bool OnCmdLineParsed(wxCmdLineParser& parser);
125 #endif // wxUSE_CMDLINE_PARSER
126
127 protected:
128 #if wxUSE_LOG
129 virtual wxAppTraits *CreateTraits() { return new MyAppTraits; }
130 #endif // wxUSE_LOG
131
132 private:
133 // Flag set to a valid value if command line option "progress" is used,
134 // this allows testing of wxProgressDialog before the main event loop is
135 // started. If this option is not specified it is set to -1 by default
136 // meaning that progress dialog shouldn't be shown at all.
137 long m_startupProgressStyle;
138 };
139
140 #if USE_MODAL_PRESENTATION
141
142 // A custom modeless dialog
143 class MyModelessDialog : public wxDialog
144 {
145 public:
146 MyModelessDialog(wxWindow *parent);
147
148 void OnButton(wxCommandEvent& event);
149 void OnClose(wxCloseEvent& event);
150
151 private:
152 DECLARE_EVENT_TABLE()
153 };
154
155 // A custom modal dialog
156 class MyModalDialog : public wxDialog
157 {
158 public:
159 MyModalDialog(wxWindow *parent);
160
161 void OnButton(wxCommandEvent& event);
162
163 private:
164 wxButton *m_btnModal,
165 *m_btnModeless,
166 *m_btnDelete;
167
168 DECLARE_EVENT_TABLE()
169 };
170
171 #endif // USE_MODAL_PRESENTATION
172
173 // A class demonstrating CreateStdDialogButtonSizer()
174 class StdButtonSizerDialog : public wxDialog
175 {
176 public:
177 StdButtonSizerDialog(wxWindow *parent);
178
179 void OnEvent(wxCommandEvent& event);
180
181 private:
182 void EnableDisableControls();
183
184 wxCheckBox *m_chkboxAffirmativeButton;
185 wxRadioButton *m_radiobtnOk,
186 *m_radiobtnYes;
187
188 wxCheckBox *m_chkboxDismissButton;
189 wxRadioButton *m_radiobtnClose,
190 *m_radiobtnCancel;
191
192 wxCheckBox *m_chkboxApply,
193 *m_chkboxNo,
194 *m_chkboxHelp,
195 *m_chkboxNoDefault;
196
197 wxSizer *m_buttonsSizer;
198
199 DECLARE_EVENT_TABLE()
200 };
201
202 // Test harness for wxMessageDialog.
203 class TestMessageBoxDialog : public wxDialog
204 {
205 public:
206 TestMessageBoxDialog(wxWindow *parent);
207
208 bool Create();
209
210 protected:
211 wxString GetBoxTitle() { return m_textTitle->GetValue(); }
212 wxString GetMessage() { return m_textMsg->GetValue(); }
213 long GetStyle();
214
215 void PrepareMessageDialog(wxMessageDialogBase &dlg);
216
217 virtual void AddAdditionalTextOptions(wxSizer *WXUNUSED(sizer)) { }
218 virtual void AddAdditionalFlags(wxSizer *WXUNUSED(sizer)) { }
219
220 void OnApply(wxCommandEvent& event);
221 void OnClose(wxCommandEvent& event);
222 void OnUpdateLabelUI(wxUpdateUIEvent& event);
223 void OnUpdateNoDefaultUI(wxUpdateUIEvent& event);
224
225 private:
226 enum
227 {
228 Btn_Yes,
229 Btn_No,
230 Btn_Ok,
231 Btn_Cancel,
232 Btn_Help,
233 Btn_Max
234 };
235
236 struct BtnInfo
237 {
238 int flag;
239 const char *name;
240 };
241
242 static const BtnInfo ms_btnInfo[Btn_Max];
243
244 enum
245 {
246 MsgDlgIcon_No,
247 MsgDlgIcon_None,
248 MsgDlgIcon_Info,
249 MsgDlgIcon_Question,
250 MsgDlgIcon_Warning,
251 MsgDlgIcon_Error,
252 MsgDlgIcon_AuthNeeded,
253 MsgDlgIcon_Max
254 };
255
256 wxTextCtrl *m_textTitle,
257 *m_textMsg,
258 *m_textExtMsg;
259
260 wxCheckBox *m_buttons[Btn_Max];
261 wxTextCtrl *m_labels[Btn_Max];
262
263 wxRadioBox *m_icons;
264
265 wxCheckBox *m_chkNoDefault,
266 *m_chkCentre;
267
268 DECLARE_EVENT_TABLE()
269 wxDECLARE_NO_COPY_CLASS(TestMessageBoxDialog);
270 };
271
272 #if wxUSE_RICHMSGDLG
273 class TestRichMessageDialog : public TestMessageBoxDialog
274 {
275 public:
276 TestRichMessageDialog(wxWindow *parent);
277
278 protected:
279 // overrides method in base class
280 virtual void AddAdditionalTextOptions(wxSizer *sizer);
281 virtual void AddAdditionalFlags(wxSizer *sizer);
282
283 void OnApply(wxCommandEvent& event);
284
285 private:
286 wxTextCtrl *m_textCheckBox;
287 wxCheckBox *m_initialValueCheckBox;
288 wxTextCtrl *m_textDetailed;
289
290 DECLARE_EVENT_TABLE()
291 };
292 #endif // wxUSE_RICHMSGDLG
293
294 class TestDefaultActionDialog: public wxDialog
295 {
296 public:
297 TestDefaultActionDialog( wxWindow *parent );
298
299 void OnListBoxDClick(wxCommandEvent& event);
300 void OnDisableOK(wxCommandEvent& event);
301 void OnDisableCancel(wxCommandEvent& event);
302 void OnCatchListBoxDClick(wxCommandEvent& event);
303 void OnTextEnter(wxCommandEvent& event);
304
305 private:
306 bool m_catchListBoxDClick;
307
308 private:
309 DECLARE_EVENT_TABLE()
310 };
311
312
313 #if USE_SETTINGS_DIALOG
314 // Property sheet dialog
315 class SettingsDialog: public wxPropertySheetDialog
316 {
317 DECLARE_CLASS(SettingsDialog)
318 public:
319 SettingsDialog(wxWindow* parent, int dialogType);
320 ~SettingsDialog();
321
322 wxPanel* CreateGeneralSettingsPage(wxWindow* parent);
323 wxPanel* CreateAestheticSettingsPage(wxWindow* parent);
324
325 protected:
326
327 enum {
328 ID_SHOW_TOOLTIPS = 100,
329 ID_AUTO_SAVE,
330 ID_AUTO_SAVE_MINS,
331 ID_LOAD_LAST_PROJECT,
332
333 ID_APPLY_SETTINGS_TO,
334 ID_BACKGROUND_STYLE,
335 ID_FONT_SIZE
336 };
337
338 wxImageList* m_imageList;
339
340 DECLARE_EVENT_TABLE()
341 };
342
343 #endif // USE_SETTINGS_DIALOG
344
345 // Define a new frame type
346 class MyFrame: public wxFrame
347 {
348 public:
349 MyFrame(const wxString& title);
350 virtual ~MyFrame();
351
352 #if wxUSE_MSGDLG
353 void MessageBox(wxCommandEvent& event);
354 void MessageBoxDialog(wxCommandEvent& event);
355 void MessageBoxInfo(wxCommandEvent& event);
356 void MessageBoxWindowModal(wxCommandEvent& event);
357 void MessageBoxWindowModalClosed(wxWindowModalDialogEvent& event);
358 #endif // wxUSE_MSGDLG
359 #if wxUSE_RICHMSGDLG
360 void RichMessageDialog(wxCommandEvent& event);
361 #endif // wxUSE_RICHMSGDLG
362
363 #if wxUSE_COLOURDLG
364 void ChooseColour(wxCommandEvent& event);
365 void GetColour(wxCommandEvent& event);
366 #endif // wxUSE_COLOURDLG
367
368 #if wxUSE_FONTDLG
369 void ChooseFont(wxCommandEvent& event);
370 #endif // wxUSE_FONTDLG
371
372 #if wxUSE_LOG_DIALOG
373 void LogDialog(wxCommandEvent& event);
374 #endif // wxUSE_LOG_DIALOG
375
376 #if wxUSE_INFOBAR
377 void InfoBarSimple(wxCommandEvent& event);
378 void InfoBarAdvanced(wxCommandEvent& event);
379 #endif // wxUSE_INFOBAR
380
381 #if wxUSE_CHOICEDLG
382 void SingleChoice(wxCommandEvent& event);
383 void MultiChoice(wxCommandEvent& event);
384 #endif // wxUSE_CHOICEDLG
385
386 void Rearrange(wxCommandEvent& event);
387
388 #if wxUSE_TEXTDLG
389 void LineEntry(wxCommandEvent& event);
390 void TextEntry(wxCommandEvent& event);
391 void PasswordEntry(wxCommandEvent& event);
392 #endif // wxUSE_TEXTDLG
393
394 #if wxUSE_NUMBERDLG
395 void NumericEntry(wxCommandEvent& event);
396 #endif // wxUSE_NUMBERDLG
397
398 #if wxUSE_FILEDLG
399 void FileOpen(wxCommandEvent& event);
400 void FileOpen2(wxCommandEvent& event);
401 void FilesOpen(wxCommandEvent& event);
402 void FileSave(wxCommandEvent& event);
403 #endif // wxUSE_FILEDLG
404
405 #if USE_FILEDLG_GENERIC
406 void FileOpenGeneric(wxCommandEvent& event);
407 void FilesOpenGeneric(wxCommandEvent& event);
408 void FileSaveGeneric(wxCommandEvent& event);
409 #endif // USE_FILEDLG_GENERIC
410
411 #if wxUSE_DIRDLG
412 void DirChoose(wxCommandEvent& event);
413 void DirChooseNew(wxCommandEvent& event);
414 #endif // wxUSE_DIRDLG
415
416 #if USE_DIRDLG_GENERIC
417 void GenericDirChoose(wxCommandEvent& event);
418 #endif // USE_DIRDLG_GENERIC
419
420 #if wxUSE_STARTUP_TIPS
421 void ShowTip(wxCommandEvent& event);
422 #endif // wxUSE_STARTUP_TIPS
423
424 #if USE_MODAL_PRESENTATION
425 void ModalDlg(wxCommandEvent& event);
426 #endif // USE_MODAL_PRESENTATION
427 void ModelessDlg(wxCommandEvent& event);
428 void DlgCenteredScreen(wxCommandEvent& event);
429 void DlgCenteredParent(wxCommandEvent& event);
430 void MiniFrame(wxCommandEvent& event);
431 void DlgOnTop(wxCommandEvent& event);
432
433 #if wxUSE_PROGRESSDLG
434 void ShowProgress(wxCommandEvent& event);
435 #endif // wxUSE_PROGRESSDLG
436
437 #if wxUSE_ABOUTDLG
438 void ShowSimpleAboutDialog(wxCommandEvent& event);
439 void ShowFancyAboutDialog(wxCommandEvent& event);
440 void ShowFullAboutDialog(wxCommandEvent& event);
441 void ShowCustomAboutDialog(wxCommandEvent& event);
442 #endif // wxUSE_ABOUTDLG
443
444 #if wxUSE_BUSYINFO
445 void ShowBusyInfo(wxCommandEvent& event);
446 #endif // wxUSE_BUSYINFO
447
448 #if wxUSE_FINDREPLDLG
449 void ShowFindDialog(wxCommandEvent& event);
450 void ShowReplaceDialog(wxCommandEvent& event);
451 void OnFindDialog(wxFindDialogEvent& event);
452 #endif // wxUSE_FINDREPLDLG
453
454 #if USE_COLOURDLG_GENERIC
455 void ChooseColourGeneric(wxCommandEvent& event);
456 #endif // USE_COLOURDLG_GENERIC
457
458 #if USE_FONTDLG_GENERIC
459 void ChooseFontGeneric(wxCommandEvent& event);
460 #endif // USE_FONTDLG_GENERIC
461
462 void OnPropertySheet(wxCommandEvent& event);
463
464 void OnRequestUserAttention(wxCommandEvent& event);
465 #if wxUSE_NOTIFICATION_MESSAGE
466 void OnNotifMsgAuto(wxCommandEvent& event);
467 void OnNotifMsgShow(wxCommandEvent& event);
468 void OnNotifMsgHide(wxCommandEvent& event);
469 #endif // wxUSE_NOTIFICATION_MESSAGE
470
471 #if wxUSE_RICHTOOLTIP
472 void OnRichTipDialog(wxCommandEvent& event);
473 #endif // wxUSE_RICHTOOLTIP
474
475 void OnStandardButtonsSizerDialog(wxCommandEvent& event);
476
477 void OnTestDefaultActionDialog(wxCommandEvent& event);
478 void OnModalHook(wxCommandEvent& event);
479
480 void OnExit(wxCommandEvent& event);
481
482 private:
483 #if wxUSE_DIRDLG
484 void DoDirChoose(int style);
485 #endif // wxUSE_DIRDLG
486
487 #if USE_MODAL_PRESENTATION
488 MyModelessDialog *m_dialog;
489 #endif // USE_MODAL_PRESENTATION
490
491 #if wxUSE_FINDREPLDLG
492 wxFindReplaceData m_findData;
493
494 wxFindReplaceDialog *m_dlgFind,
495 *m_dlgReplace;
496 #endif // wxUSE_FINDREPLDLG
497
498 #if wxUSE_NOTIFICATION_MESSAGE
499 wxNotificationMessage *m_notifMsg;
500 #endif // wxUSE_NOTIFICATION_MESSAGE
501
502 wxColourData m_clrData;
503
504 // just a window which we use to show the effect of font/colours selection
505 wxWindow *m_canvas;
506
507 #if wxUSE_INFOBAR
508 void OnInfoBarRedo(wxCommandEvent& event);
509
510 wxInfoBar *m_infoBarSimple,
511 *m_infoBarAdvanced;
512 #endif // wxUSE_INFOBAR
513
514 DECLARE_EVENT_TABLE()
515 };
516
517 class MyCanvas: public wxScrolledWindow
518 {
519 public:
520 MyCanvas(wxWindow *parent) : wxScrolledWindow(parent, wxID_ANY)
521 {
522 SetForegroundColour(*wxBLACK);
523 SetBackgroundColour(*wxWHITE);
524 SetFont(*wxNORMAL_FONT);
525 }
526
527 private:
528 void OnPaint(wxPaintEvent& event);
529
530 DECLARE_EVENT_TABLE()
531 };
532
533
534 // Menu IDs
535 enum
536 {
537 DIALOGS_CHOOSE_COLOUR = wxID_HIGHEST,
538 DIALOGS_GET_COLOUR,
539 DIALOGS_CHOOSE_COLOUR_GENERIC,
540 DIALOGS_CHOOSE_FONT,
541 DIALOGS_CHOOSE_FONT_GENERIC,
542 DIALOGS_MESSAGE_BOX,
543 DIALOGS_MESSAGE_BOX_WINDOW_MODAL,
544 DIALOGS_MESSAGE_DIALOG,
545 DIALOGS_MESSAGE_BOX_WXINFO,
546 DIALOGS_RICH_MESSAGE_DIALOG,
547 DIALOGS_SINGLE_CHOICE,
548 DIALOGS_MULTI_CHOICE,
549 DIALOGS_REARRANGE,
550 DIALOGS_LINE_ENTRY,
551 DIALOGS_TEXT_ENTRY,
552 DIALOGS_PASSWORD_ENTRY,
553 DIALOGS_FILE_OPEN,
554 DIALOGS_FILE_OPEN2,
555 DIALOGS_FILES_OPEN,
556 DIALOGS_FILE_SAVE,
557 DIALOGS_FILE_OPEN_GENERIC,
558 DIALOGS_FILES_OPEN_GENERIC,
559 DIALOGS_FILE_SAVE_GENERIC,
560 DIALOGS_DIR_CHOOSE,
561 DIALOGS_DIRNEW_CHOOSE,
562 DIALOGS_GENERIC_DIR_CHOOSE,
563 DIALOGS_TIP,
564 DIALOGS_NUM_ENTRY,
565 DIALOGS_LOG_DIALOG,
566 DIALOGS_INFOBAR_SIMPLE,
567 DIALOGS_INFOBAR_ADVANCED,
568 DIALOGS_MODAL,
569 DIALOGS_MODELESS,
570 DIALOGS_CENTRE_SCREEN,
571 DIALOGS_CENTRE_PARENT,
572 DIALOGS_MINIFRAME,
573 DIALOGS_ONTOP,
574 DIALOGS_MODELESS_BTN,
575 DIALOGS_PROGRESS,
576 DIALOGS_ABOUTDLG_SIMPLE,
577 DIALOGS_ABOUTDLG_FANCY,
578 DIALOGS_ABOUTDLG_FULL,
579 DIALOGS_ABOUTDLG_CUSTOM,
580 DIALOGS_BUSYINFO,
581 DIALOGS_FIND,
582 DIALOGS_REPLACE,
583 DIALOGS_REQUEST,
584 DIALOGS_NOTIFY_AUTO,
585 DIALOGS_NOTIFY_SHOW,
586 DIALOGS_NOTIFY_HIDE,
587 DIALOGS_RICHTIP_DIALOG,
588 DIALOGS_PROPERTY_SHEET,
589 DIALOGS_PROPERTY_SHEET_TOOLBOOK,
590 DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK,
591 DIALOGS_STANDARD_BUTTON_SIZER_DIALOG,
592 DIALOGS_TEST_DEFAULT_ACTION,
593 DIALOGS_MODAL_HOOK
594 };
595
596 #endif
597