]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/dialogs/dialogs.cpp
Reduce size of virtual list before sending out delete notification, fixes #10966...
[wxWidgets.git] / samples / dialogs / dialogs.cpp
index 55bc4b3f2844aefeb27b2486427a7e45f1f0c9ec..b33421162209fd8843881580ece6038bd6d4055f 100644 (file)
 
 #include "../sample.xpm"
 
+#include "wx/apptrait.h"
 #include "wx/datetime.h"
 #include "wx/image.h"
 #include "wx/bookctrl.h"
 #include "wx/artprov.h"
 #include "wx/imaglist.h"
+#include "wx/minifram.h"
 #include "wx/sysopt.h"
+#include "wx/notifmsg.h"
 
 #if wxUSE_COLOURDLG
     #include "wx/colordlg.h"
@@ -37,6 +40,8 @@
     #include "wx/choicdlg.h"
 #endif // wxUSE_CHOICEDLG
 
+#include "wx/rearrangectrl.h"
+
 #if wxUSE_STARTUP_TIPS
     #include "wx/tipdlg.h"
 #endif // wxUSE_STARTUP_TIPS
     #include "wx/progdlg.h"
 #endif // wxUSE_PROGRESSDLG
 
+#if wxUSE_ABOUTDLG
+    #include "wx/aboutdlg.h"
+
+    // these headers are only needed for custom about dialog
+    #include "wx/statline.h"
+    #include "wx/generic/aboutdlgg.h"
+#endif // wxUSE_ABOUTDLG
+
 #if wxUSE_BUSYINFO
     #include "wx/busyinfo.h"
 #endif // wxUSE_BUSYINFO
     #include "wx/fdrepdlg.h"
 #endif // wxUSE_FINDREPLDLG
 
-#if wxUSE_SPINCTRL
 #include "wx/spinctrl.h"
-#endif
-
 #include "wx/propdlg.h"
 
 #include "dialogs.h"
@@ -106,10 +116,14 @@ END_EVENT_TABLE()
 
 
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
+#if wxUSE_MSGDLG
     EVT_MENU(DIALOGS_MESSAGE_BOX,                   MyFrame::MessageBox)
-
+    EVT_MENU(DIALOGS_MESSAGE_DIALOG,                MyFrame::MessageBoxDialog)
+    EVT_MENU(DIALOGS_MESSAGE_BOX_WXINFO,            MyFrame::MessageBoxInfo)
+#endif // wxUSE_MSGDLG
 #if wxUSE_COLOURDLG
     EVT_MENU(DIALOGS_CHOOSE_COLOUR,                 MyFrame::ChooseColour)
+    EVT_MENU(DIALOGS_GET_COLOUR,                    MyFrame::GetColour)
 #endif // wxUSE_COLOURDLG
 
 #if wxUSE_FONTDLG
@@ -134,6 +148,10 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(DIALOGS_MULTI_CHOICE,                  MyFrame::MultiChoice)
 #endif // wxUSE_CHOICEDLG
 
+#if wxUSE_REARRANGECTRL
+    EVT_MENU(DIALOGS_REARRANGE,                     MyFrame::Rearrange)
+#endif // wxUSE_REARRANGECTRL
+
 #if wxUSE_FILEDLG
     EVT_MENU(DIALOGS_FILE_OPEN,                     MyFrame::FileOpen)
     EVT_MENU(DIALOGS_FILE_OPEN2,                    MyFrame::FileOpen2)
@@ -154,10 +172,14 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
 
 #if USE_MODAL_PRESENTATION
     EVT_MENU(DIALOGS_MODAL,                         MyFrame::ModalDlg)
+#endif // USE_MODAL_PRESENTATION
     EVT_MENU(DIALOGS_MODELESS,                      MyFrame::ModelessDlg)
     EVT_MENU(DIALOGS_CENTRE_SCREEN,                 MyFrame::DlgCenteredScreen)
     EVT_MENU(DIALOGS_CENTRE_PARENT,                 MyFrame::DlgCenteredParent)
-#endif // USE_MODAL
+#if wxUSE_MINIFRAME
+    EVT_MENU(DIALOGS_MINIFRAME,                     MyFrame::MiniFrame)
+#endif // wxUSE_MINIFRAME
+    EVT_MENU(DIALOGS_ONTOP,                         MyFrame::DlgOnTop)
 
 #if wxUSE_STARTUP_TIPS
     EVT_MENU(DIALOGS_TIP,                           MyFrame::ShowTip)
@@ -179,6 +201,13 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(DIALOGS_PROGRESS,                      MyFrame::ShowProgress)
 #endif // wxUSE_PROGRESSDLG
 
+#if wxUSE_ABOUTDLG
+    EVT_MENU(DIALOGS_ABOUTDLG_SIMPLE,               MyFrame::ShowSimpleAboutDialog)
+    EVT_MENU(DIALOGS_ABOUTDLG_FANCY,                MyFrame::ShowFancyAboutDialog)
+    EVT_MENU(DIALOGS_ABOUTDLG_FULL,                 MyFrame::ShowFullAboutDialog)
+    EVT_MENU(DIALOGS_ABOUTDLG_CUSTOM,               MyFrame::ShowCustomAboutDialog)
+#endif // wxUSE_ABOUTDLG
+
 #if wxUSE_BUSYINFO
     EVT_MENU(DIALOGS_BUSYINFO,                      MyFrame::ShowBusyInfo)
 #endif // wxUSE_BUSYINFO
@@ -196,10 +225,19 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
 
 #if USE_SETTINGS_DIALOG
     EVT_MENU(DIALOGS_PROPERTY_SHEET,                MyFrame::OnPropertySheet)
-    EVT_MENU(DIALOGS_PROPERTY_SHEET_TOOLBOOK,       MyFrame::OnPropertySheetToolBook)
-#endif
+    EVT_MENU(DIALOGS_PROPERTY_SHEET_TOOLBOOK,       MyFrame::OnPropertySheet)
+    EVT_MENU(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, MyFrame::OnPropertySheet)
+#endif // USE_SETTINGS_DIALOG
+
+    EVT_MENU(DIALOGS_STANDARD_BUTTON_SIZER_DIALOG,  MyFrame::OnStandardButtonsSizerDialog)
+    EVT_MENU(DIALOGS_TEST_DEFAULT_ACTION,           MyFrame::OnTestDefaultActionDialog)
 
     EVT_MENU(DIALOGS_REQUEST,                       MyFrame::OnRequestUserAttention)
+#if wxUSE_NOTIFICATION_MESSAGE
+    EVT_MENU(DIALOGS_NOTIFY_AUTO,                   MyFrame::OnNotifMsgAuto)
+    EVT_MENU(DIALOGS_NOTIFY_SHOW,                   MyFrame::OnNotifMsgShow)
+    EVT_MENU(DIALOGS_NOTIFY_HIDE,                   MyFrame::OnNotifMsgHide)
+#endif // wxUSE_NOTIFICATION_MESSAGE
 
     EVT_MENU(wxID_EXIT,                             MyFrame::OnExit)
 END_EVENT_TABLE()
@@ -217,25 +255,34 @@ END_EVENT_TABLE()
 
 #endif // USE_MODAL_PRESENTATION
 
+BEGIN_EVENT_TABLE(StdButtonSizerDialog, wxDialog)
+    EVT_CHECKBOX(wxID_ANY, StdButtonSizerDialog::OnEvent)
+    EVT_RADIOBUTTON(wxID_ANY, StdButtonSizerDialog::OnEvent)
+END_EVENT_TABLE()
+
 MyCanvas *myCanvas = (MyCanvas *) NULL;
 
 // `Main program' equivalent, creating windows and returning main app frame
 bool MyApp::OnInit()
 {
+    if ( !wxApp::OnInit() )
+        return false;
+
 #if wxUSE_IMAGE
     wxInitAllImageHandlers();
 #endif
 
-    m_canvasTextColour = wxColour(_T("BLACK"));
+    m_canvasTextColour = *wxBLACK;
     m_canvasFont = *wxNORMAL_FONT;
 
     // Create the main frame window
     MyFrame *frame = new MyFrame((wxFrame *) NULL, _T("wxWidgets dialogs example"));
 
     // Make a menubar
-    wxMenu *file_menu = new wxMenu;
+    wxMenu *menuDlg = new wxMenu;
 
-    file_menu->Append(DIALOGS_MESSAGE_BOX, _T("&Message box\tCtrl-M"));
+    menuDlg->Append(DIALOGS_MESSAGE_BOX, _T("&Message box\tCtrl-M"));
+    menuDlg->Append(DIALOGS_MESSAGE_DIALOG, _T("Message dialog\tShift-Ctrl-M"));
 
 
 #if wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
@@ -243,7 +290,8 @@ bool MyApp::OnInit()
     wxMenu *choices_menu = new wxMenu;
 
     #if wxUSE_COLOURDLG
-        choices_menu->Append(DIALOGS_CHOOSE_COLOUR, _T("&Choose colour"));
+        choices_menu->Append(DIALOGS_CHOOSE_COLOUR, _T("&Choose bg colour"));
+        choices_menu->Append(DIALOGS_GET_COLOUR, _T("&Choose fg colour"));
     #endif // wxUSE_COLOURDLG
 
     #if wxUSE_FONTDLG
@@ -255,6 +303,10 @@ bool MyApp::OnInit()
         choices_menu->Append(DIALOGS_MULTI_CHOICE,  _T("M&ultiple choice\tCtrl-U"));
     #endif // wxUSE_CHOICEDLG
 
+    #if wxUSE_REARRANGECTRL
+        choices_menu->Append(DIALOGS_REARRANGE,  _T("&Rearrange dialog\tCtrl-R"));
+    #endif // wxUSE_REARRANGECTRL
+
     #if USE_COLOURDLG_GENERIC || USE_FONTDLG_GENERIC
         choices_menu->AppendSeparator();
     #endif // USE_COLOURDLG_GENERIC || USE_FONTDLG_GENERIC
@@ -267,7 +319,7 @@ bool MyApp::OnInit()
         choices_menu->Append(DIALOGS_CHOOSE_FONT_GENERIC, _T("Choose &font (generic)"));
     #endif // USE_FONTDLG_GENERIC
 
-    file_menu->Append(wxID_ANY,_T("&Choices and selectors"),choices_menu);
+    menuDlg->Append(wxID_ANY,_T("&Choices and selectors"),choices_menu);
 #endif // wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
 
 
@@ -284,7 +336,7 @@ bool MyApp::OnInit()
         entry_menu->Append(DIALOGS_NUM_ENTRY, _T("&Numeric entry\tCtrl-N"));
     #endif // wxUSE_NUMBERDLG
 
-    file_menu->Append(wxID_ANY,_T("&Entry dialogs"),entry_menu);
+    menuDlg->Append(wxID_ANY,_T("&Entry dialogs"),entry_menu);
 
 #endif // wxUSE_TEXTDLG || wxUSE_NUMBERDLG
 
@@ -297,14 +349,14 @@ bool MyApp::OnInit()
     filedlg_menu->Append(DIALOGS_FILES_OPEN,  _T("Open &files\tCtrl-Q"));
     filedlg_menu->Append(DIALOGS_FILE_SAVE,  _T("Sa&ve file\tCtrl-S"));
 
-    #if USE_FILEDLG_GENERIC
-        filedlg_menu->AppendSeparator();
-        filedlg_menu->Append(DIALOGS_FILE_OPEN_GENERIC,  _T("&Open file (generic)"));
-        filedlg_menu->Append(DIALOGS_FILES_OPEN_GENERIC,  _T("Open &files (generic)"));
-        filedlg_menu->Append(DIALOGS_FILE_SAVE_GENERIC,  _T("Sa&ve file (generic)"));
-    #endif // USE_FILEDLG_GENERIC
+#if USE_FILEDLG_GENERIC
+    filedlg_menu->AppendSeparator();
+    filedlg_menu->Append(DIALOGS_FILE_OPEN_GENERIC, _T("&Open file (generic)"));
+    filedlg_menu->Append(DIALOGS_FILES_OPEN_GENERIC, _T("Open &files (generic)"));
+    filedlg_menu->Append(DIALOGS_FILE_SAVE_GENERIC, _T("Sa&ve file (generic)"));
+#endif // USE_FILEDLG_GENERIC
 
-    file_menu->Append(wxID_ANY,_T("&File operations"),filedlg_menu);
+    menuDlg->Append(wxID_ANY,_T("&File operations"),filedlg_menu);
 
 #endif // wxUSE_FILEDLG
 
@@ -313,7 +365,7 @@ bool MyApp::OnInit()
 
     dir_menu->Append(DIALOGS_DIR_CHOOSE,  _T("&Choose a directory\tCtrl-D"));
     dir_menu->Append(DIALOGS_DIRNEW_CHOOSE,  _T("Choose a directory (with \"Ne&w\" button)\tShift-Ctrl-D"));
-    file_menu->Append(wxID_ANY,_T("&Directory operations"),dir_menu);
+    menuDlg->Append(wxID_ANY,_T("&Directory operations"),dir_menu);
 
     #if USE_DIRDLG_GENERIC
         dir_menu->AppendSeparator();
@@ -323,7 +375,11 @@ bool MyApp::OnInit()
 #endif // wxUSE_DIRDLG
 
 
-#if wxUSE_STARTUP_TIPS || wxUSE_PROGRESSDLG || wxUSE_BUSYINFO || wxUSE_LOG_DIALOG
+#if wxUSE_STARTUP_TIPS || \
+    wxUSE_PROGRESSDLG || \
+    wxUSE_BUSYINFO || \
+    wxUSE_LOG_DIALOG || \
+    wxUSE_MSGDLG
 
     wxMenu *info_menu = new wxMenu;
 
@@ -343,7 +399,12 @@ bool MyApp::OnInit()
        info_menu->Append(DIALOGS_LOG_DIALOG, _T("&Log dialog\tCtrl-L"));
     #endif // wxUSE_LOG_DIALOG
 
-    file_menu->Append(wxID_ANY,_T("&Informative dialogs"),info_menu);
+    #if wxUSE_MSGDLG
+        info_menu->Append(DIALOGS_MESSAGE_BOX_WXINFO,
+                             _T("&wxWidgets information\tCtrl-I"));
+    #endif // wxUSE_MSGDLG
+
+    menuDlg->Append(wxID_ANY,_T("&Informative dialogs"),info_menu);
 
 #endif // wxUSE_STARTUP_TIPS || wxUSE_PROGRESSDLG || wxUSE_BUSYINFO || wxUSE_LOG_DIALOG
 
@@ -352,33 +413,67 @@ bool MyApp::OnInit()
     wxMenu *find_menu = new wxMenu;
     find_menu->AppendCheckItem(DIALOGS_FIND, _T("&Find dialog\tCtrl-F"));
     find_menu->AppendCheckItem(DIALOGS_REPLACE, _T("Find and &replace dialog\tShift-Ctrl-F"));
-    file_menu->Append(wxID_ANY,_T("&Searching"),find_menu);
+    menuDlg->Append(wxID_ANY,_T("&Searching"),find_menu);
 #endif // wxUSE_FINDREPLDLG
 
-#if USE_MODAL_PRESENTATION
     wxMenu *dialogs_menu = new wxMenu;
+#if USE_MODAL_PRESENTATION
     dialogs_menu->Append(DIALOGS_MODAL, _T("&Modal dialog\tCtrl-W"));
-    dialogs_menu->AppendCheckItem(DIALOGS_MODELESS, _T("Mode&less dialog\tCtrl-Z"));
-    dialogs_menu->AppendCheckItem(DIALOGS_CENTRE_SCREEN, _T("Centered on &screen\tShift-Ctrl-1"));
-    dialogs_menu->AppendCheckItem(DIALOGS_CENTRE_PARENT, _T("Centered on &parent\tShift-Ctrl-2"));
-    file_menu->Append(wxID_ANY, _T("&Generic dialogs"), dialogs_menu);
 #endif // USE_MODAL_PRESENTATION
+    dialogs_menu->AppendCheckItem(DIALOGS_MODELESS, _T("Mode&less dialog\tCtrl-Z"));
+    dialogs_menu->Append(DIALOGS_CENTRE_SCREEN, _T("Centered on &screen\tShift-Ctrl-1"));
+    dialogs_menu->Append(DIALOGS_CENTRE_PARENT, _T("Centered on &parent\tShift-Ctrl-2"));
+#if wxUSE_MINIFRAME
+    dialogs_menu->Append(DIALOGS_MINIFRAME, _T("&Mini frame"));
+#endif // wxUSE_MINIFRAME
+    dialogs_menu->Append(DIALOGS_ONTOP, _T("Dialog staying on &top"));
+    menuDlg->Append(wxID_ANY, _T("&Generic dialogs"), dialogs_menu);
 
 #if USE_SETTINGS_DIALOG
     wxMenu *sheet_menu = new wxMenu;
     sheet_menu->Append(DIALOGS_PROPERTY_SHEET, _T("&Standard property sheet\tShift-Ctrl-P"));
     sheet_menu->Append(DIALOGS_PROPERTY_SHEET_TOOLBOOK, _T("&Toolbook sheet\tShift-Ctrl-T"));
-    file_menu->Append(wxID_ANY, _T("&Property sheets"), sheet_menu);
-#endif // USE_SETTINGS_DIALOG
-
-    file_menu->Append(DIALOGS_REQUEST, _T("&Request user attention\tCtrl-R"));
 
-    file_menu->AppendSeparator();
-    file_menu->Append(wxID_EXIT, _T("E&xit\tAlt-X"));
+    if (wxPlatformIs(wxPORT_MAC))
+        sheet_menu->Append(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, _T("Button &Toolbook sheet\tShift-Ctrl-U"));
+/*
+#ifdef __WXMAC__
+    sheet_menu->Append(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, _T("Button &Toolbook sheet\tShift-Ctrl-U"));
+#endif
+*/
+    menuDlg->Append(wxID_ANY, _T("&Property sheets"), sheet_menu);
+#endif // USE_SETTINGS_DIALOG
 
-    wxMenuBar *menu_bar = new wxMenuBar;
-    menu_bar->Append(file_menu, _T("&File"));
-    frame->SetMenuBar(menu_bar);
+    wxMenu *menuNotif = new wxMenu;
+    menuNotif->Append(DIALOGS_REQUEST, _T("&Request user attention\tCtrl-Shift-R"));
+#if wxUSE_NOTIFICATION_MESSAGE
+    menuNotif->Append(DIALOGS_NOTIFY_AUTO, "&Automatically hidden notification");
+    menuNotif->Append(DIALOGS_NOTIFY_SHOW, "&Show manual notification");
+    menuNotif->Append(DIALOGS_NOTIFY_HIDE, "&Hide manual notification");
+#endif // wxUSE_NOTIFICATION_MESSAGE
+    menuDlg->AppendSubMenu(menuNotif, "&User notifications");
+
+    menuDlg->Append(DIALOGS_STANDARD_BUTTON_SIZER_DIALOG, _T("&Standard Buttons Sizer Dialog"));
+    menuDlg->Append(DIALOGS_TEST_DEFAULT_ACTION, _T("&Test dialog default action"));
+
+    menuDlg->AppendSeparator();
+    menuDlg->Append(wxID_EXIT, _T("E&xit\tAlt-X"));
+
+#if wxUSE_ABOUTDLG
+    wxMenu *menuHelp = new wxMenu;
+    menuHelp->Append(DIALOGS_ABOUTDLG_SIMPLE, _T("&About (simple)...\tF1"));
+    menuHelp->Append(DIALOGS_ABOUTDLG_FANCY, _T("About (&fancy)...\tShift-F1"));
+    menuHelp->Append(DIALOGS_ABOUTDLG_FULL, _T("About (f&ull)...\tCtrl-F1"));
+    menuHelp->Append(DIALOGS_ABOUTDLG_CUSTOM, _T("About (&custom)...\tCtrl-Shift-F1"));
+#endif // wxUSE_ABOUTDLG
+
+    wxMenuBar *menubar = new wxMenuBar;
+    menubar->Append(menuDlg, _T("&Dialogs"));
+#if wxUSE_ABOUTDLG
+    menubar->Append(menuHelp, _T("&Help"));
+#endif // wxUSE_ABOUTDLG
+
+    frame->SetMenuBar(menubar);
 
     myCanvas = new MyCanvas(frame);
     myCanvas->SetBackgroundColour(*wxWHITE);
@@ -411,28 +506,38 @@ MyFrame::MyFrame(wxWindow *parent,
 
 #if wxUSE_COLOURDLG
     m_clrData.SetChooseFull(true);
-    for (int i = 0; i < 16; i++)
+    for (int i = 0; i < wxColourData::NUM_CUSTOM; i++)
     {
-        m_clrData.SetCustomColour(
-          i,
-          wxColour(
-            (unsigned char)(i*16),
-            (unsigned char)(i*16),
-            (unsigned char)(i*16)
-          )
-        );
+        unsigned char n = i*16;
+        m_clrData.SetCustomColour(i, wxColour(n, n, n));
     }
 #endif // wxUSE_COLOURDLG
+
+#if wxUSE_NOTIFICATION_MESSAGE
+    m_notifMsg = NULL;
+#endif // wxUSE_NOTIFICATION_MESSAGE
+
+#if wxUSE_STATUSBAR
+    CreateStatusBar();
+#endif // wxUSE_STATUSBAR
+}
+
+MyFrame::~MyFrame()
+{
+#if wxUSE_NOTIFICATION_MESSAGE
+    delete m_notifMsg;
+#endif // wxUSE_NOTIFICATION_MESSAGE
 }
 
 #if wxUSE_COLOURDLG
-void MyFrame::ChooseColour(wxCommandEvent& WXUNUSED(event) )
+
+void MyFrame::ChooseColour(wxCommandEvent& WXUNUSED(event))
 {
     m_clrData.SetColour(myCanvas->GetBackgroundColour());
 
     wxColourDialog dialog(this, &m_clrData);
-    dialog.SetTitle(_T("Choose the background colour"));
-    if (dialog.ShowModal() == wxID_OK)
+    dialog.SetTitle(_("Please choose the background colour"));
+    if ( dialog.ShowModal() == wxID_OK )
     {
         m_clrData = dialog.GetColourData();
         myCanvas->SetBackgroundColour(m_clrData.GetColour());
@@ -440,8 +545,26 @@ void MyFrame::ChooseColour(wxCommandEvent& WXUNUSED(event) )
         myCanvas->Refresh();
     }
 }
+
+void MyFrame::GetColour(wxCommandEvent& WXUNUSED(event))
+{
+    wxColour clr = wxGetColourFromUser
+                   (
+                    this,
+                    wxGetApp().m_canvasTextColour,
+                    "Please choose the foreground colour"
+                   );
+    if ( clr.IsOk() )
+    {
+        wxGetApp().m_canvasTextColour = clr;
+        myCanvas->Refresh();
+    }
+    //else: dialog cancelled by user
+}
+
 #endif // wxUSE_COLOURDLG
 
+
 #if USE_COLOURDLG_GENERIC
 void MyFrame::ChooseColourGeneric(wxCommandEvent& WXUNUSED(event))
 {
@@ -504,7 +627,7 @@ void MyFrame::ChooseFontGeneric(wxCommandEvent& WXUNUSED(event) )
     data.SetInitialFont(wxGetApp().m_canvasFont);
     data.SetColour(wxGetApp().m_canvasTextColour);
 
-    wxGenericFontDialog *dialog = new wxGenericFontDialog(this, &data);
+    wxGenericFontDialog *dialog = new wxGenericFontDialog(this, data);
     if (dialog->ShowModal() == wxID_OK)
     {
         wxFontData retData = dialog->GetFontData();
@@ -540,10 +663,35 @@ void MyFrame::LogDialog(wxCommandEvent& WXUNUSED(event))
 }
 #endif // wxUSE_LOG_DIALOG
 
-void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event) )
+#if wxUSE_MSGDLG
+void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event))
 {
-    wxMessageDialog dialog( NULL, _T("This is a message box\nA long, long string to test out the message box properly"),
-        _T("Message box text"), wxNO_DEFAULT|wxYES_NO|wxCANCEL|wxICON_INFORMATION);
+    wxMessageDialog dialog(this,
+                           "This is a message box\n"
+                           "This is a long, long string to test out if the message box "
+                           "is laid out properly.",
+                           "Message box text",
+                           wxCENTER |
+                           wxNO_DEFAULT | wxYES_NO | wxCANCEL |
+                           wxICON_INFORMATION);
+
+    wxString extmsg;
+    if ( dialog.SetYesNoCancelLabels
+                (
+                    "Answer &Yes",
+                    "Answer &No",
+                    "Refuse to answer"
+                ) )
+    {
+        extmsg = "This platform supports custom button labels,\n"
+                 "so you should see the descriptive labels below.";
+    }
+    else
+    {
+        extmsg = "Custom button labels are not supported on this platform,\n"
+                 "so the default \"Yes\"/\"No\"/\"Cancel\" buttons are used.";
+    }
+    dialog.SetExtendedMessage(extmsg);
 
     switch ( dialog.ShowModal() )
     {
@@ -564,8 +712,20 @@ void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event) )
     }
 }
 
+void MyFrame::MessageBoxDialog(wxCommandEvent& WXUNUSED(event))
+{
+    TestMessageBoxDialog dlg(this);
+    dlg.ShowModal();
+}
+
+void MyFrame::MessageBoxInfo(wxCommandEvent& WXUNUSED(event))
+{
+    ::wxInfoMessageBox(this);
+}
+#endif // wxUSE_MSGDLG
+
 #if wxUSE_NUMBERDLG
-void MyFrame::NumericEntry(wxCommandEvent& WXUNUSED(event) )
+void MyFrame::NumericEntry(wxCommandEvent& WXUNUSED(event))
 {
     long res = wxGetNumberFromUser( _T("This is some text, actually a lot of text.\n")
                                     _T("Even two rows of text."),
@@ -649,29 +809,300 @@ void MyFrame::MultiChoice(wxCommandEvent& WXUNUSED(event) )
     };
 
     wxArrayInt selections;
-    size_t count = wxGetMultipleChoices(selections,
+    const int count = wxGetSelectedChoices(selections,
                                         _T("This is a small sample\n")
                                         _T("A multi-choice convenience dialog"),
                                         _T("Please select a value"),
                                         WXSIZEOF(choices), choices,
                                         this);
-    if ( count )
+    if ( count >= 0 )
     {
         wxString msg;
-        msg.Printf(wxT("You selected %u items:\n"), (unsigned)count);
-        for ( size_t n = 0; n < count; n++ )
+        if ( count == 0 )
         {
-            msg += wxString::Format(wxT("\t%u: %u (%s)\n"),
-                                    (unsigned)n, (unsigned)selections[n],
-                                    choices[selections[n]].c_str());
+            msg = wxT("You did not select any items");
+        }
+        else
+        {
+            msg.Printf(wxT("You selected %u items:\n"), (unsigned)count);
+            for ( int n = 0; n < count; n++ )
+            {
+                msg += wxString::Format(wxT("\t%u: %u (%s)\n"),
+                                        (unsigned)n, (unsigned)selections[n],
+                                        choices[selections[n]].c_str());
+            }
         }
         wxLogMessage(msg);
     }
-    //else: cancelled or nothing selected
+    //else: cancelled
 }
 #endif // wxUSE_CHOICEDLG
 
+#if wxUSE_REARRANGECTRL
+// custom rearrange dialog: it adds the possibility to rename an item to the
+// base class functionality
+class MyRearrangeDialog : public wxRearrangeDialog
+{
+public:
+    MyRearrangeDialog(wxWindow *parent,
+                      wxArrayInt& order,
+                      wxArrayString& labels,
+                      wxArrayString& labelsOrig)
+        : wxRearrangeDialog
+          (
+           parent,
+           "Configure the columns shown:",
+           "wxRearrangeDialog example",
+           order,
+           labels
+          ),
+          m_order(order),
+          m_labels(labels),
+          m_labelsOrig(labelsOrig)
+    {
+        m_sel = wxNOT_FOUND;
+
+        wxPanel * const panel = new wxPanel(this);
+        wxSizer * const sizer = new wxBoxSizer(wxHORIZONTAL);
+
+        m_labelOrig = new wxStaticText(panel, wxID_ANY, "");
+        sizer->Add(m_labelOrig, wxSizerFlags().Centre().Border(wxRIGHT));
+
+        m_text = new wxTextCtrl(panel, wxID_ANY, "",
+                                wxDefaultPosition, wxDefaultSize,
+                                wxTE_PROCESS_ENTER);
+        sizer->Add(m_text, wxSizerFlags().Centre().Border(wxRIGHT));
+
+        sizer->Add(new wxButton(panel, wxID_APPLY, "&Rename"),
+                   wxSizerFlags().Centre());
+
+        panel->SetSizer(sizer);
+
+        // call this first to ensure that the controls have a reasonable best
+        // size before they're added
+        DoUpdateExtraControls(GetList()->GetSelection());
+
+        AddExtraControls(panel);
+
+
+        // another customization not directly supported by the dialog: add a
+        // custom button
+        wxWindow * const btnOk = FindWindow(wxID_OK);
+        wxCHECK_RET( btnOk, "no Ok button?" );
+
+        wxSizer * const sizerBtns = btnOk->GetContainingSizer();
+        wxCHECK_RET( sizerBtns, "no buttons sizer?" );
+
+        sizerBtns->Add(new wxButton(this, wxID_RESET, "&Reset all"),
+                       wxSizerFlags().Border(wxLEFT));
+    }
+
+    // call this instead of ShowModal() to update order and labels array in
+    // case the dialog was not cancelled
+    bool Rearrange()
+    {
+        switch ( ShowModal() )
+        {
+            case wxID_CANCEL:
+                return false;
+
+            case wxID_OK:
+                m_order = GetOrder();
+                break;
+
+            case wxID_RESET:
+                // order already reset
+                break;
+        }
+
+        return true;
+    }
+
+private:
+    void OnSelChange(wxCommandEvent& event)
+    {
+        DoUpdateExtraControls(event.GetInt());
+    }
+
+    void OnUpdateUIRename(wxUpdateUIEvent& event)
+    {
+        event.Enable( CanRename() );
+    }
+
+    void OnRename(wxCommandEvent& WXUNUSED(event))
+    {
+        if ( !CanRename() )
+            return;
+
+        m_labels[m_sel] = m_text->GetValue();
+        GetList()->SetString(m_sel, m_labels[m_sel]);
+    }
+
+    void OnReset(wxCommandEvent& WXUNUSED(event))
+    {
+        // in a real program we should probably ask if the user really wants to
+        // do this but here we just go ahead and reset all columns labels and
+        // their order without confirmation
+        const unsigned count = m_order.size();
+        for ( unsigned n = 0; n < count; n++ )
+        {
+            m_order[n] = n;
+            m_labels[n] = m_labelsOrig[n];
+        }
+
+        EndModal(wxID_RESET);
+    }
+
+    bool CanRename() const
+    {
+        // only allow renaming if the user modified the currently selected item
+        // text (which presupposes that we do have a current item)
+        return m_sel != wxNOT_FOUND && m_text->GetValue() != m_labels[m_sel];
+    }
+
+    void DoUpdateExtraControls(int sel)
+    {
+        m_sel = sel;
+
+        if ( m_sel == wxNOT_FOUND )
+        {
+            m_labelOrig->SetLabel("<no selection>");
+            m_text->Clear();
+            m_text->Disable();
+        }
+        else // have valid item
+        {
+            m_labelOrig->SetLabelText(m_labelsOrig[m_sel]);
+            m_text->Enable();
+            m_text->SetValue(m_labels[m_sel]);
+        }
+    }
+
+    wxArrayInt& m_order;
+    wxArrayString& m_labels,
+                   m_labelsOrig;
+
+    int m_sel;
+    wxStaticText *m_labelOrig;
+    wxTextCtrl *m_text;
+
+    DECLARE_EVENT_TABLE()
+    wxDECLARE_NO_COPY_CLASS(MyRearrangeDialog);
+};
+
+BEGIN_EVENT_TABLE(MyRearrangeDialog, wxRearrangeDialog)
+    EVT_LISTBOX(wxID_ANY, MyRearrangeDialog::OnSelChange)
+
+    EVT_UPDATE_UI(wxID_APPLY, MyRearrangeDialog::OnUpdateUIRename)
+
+    EVT_TEXT_ENTER(wxID_ANY, MyRearrangeDialog::OnRename)
+    EVT_BUTTON(wxID_APPLY, MyRearrangeDialog::OnRename)
+    EVT_BUTTON(wxID_RESET, MyRearrangeDialog::OnReset)
+END_EVENT_TABLE()
+
+void MyFrame::Rearrange(wxCommandEvent& WXUNUSED(event))
+{
+    // the arrays are static so that we preserve the items order between calls
+    // to this function
+    static wxArrayInt s_order;
+    static wxArrayString s_labels,
+                         s_labelsOrig;
+
+    // initialize them on the first call
+    if ( s_labelsOrig.empty() )
+    {
+        static const struct ItemInfo
+        {
+            const char *label;
+            const char *labelOrig;
+            int order;
+        } items[] =
+        {
+            { "File name",      "Name",   0 },
+            { "File type",      "Ext",    1 },
+            { "Size",           "Size",   2 },
+            { "Creation time",  "Ctime", ~3 },  // negated so hidden
+            { "Last accessed",  "Atime", ~4 },
+            { "Last modified",  "Mtime",  5 },
+        };
+
+        s_order.reserve(WXSIZEOF(items));
+        s_labels.reserve(WXSIZEOF(items));
+        s_labelsOrig.reserve(WXSIZEOF(items));
+        for ( unsigned n = 0; n < WXSIZEOF(items); n++ )
+        {
+            const ItemInfo& item = items[n];
+            s_order.push_back(item.order);
+            s_labels.push_back(item.label);
+            s_labelsOrig.push_back(item.labelOrig);
+        }
+    }
+
+    MyRearrangeDialog dlg(this, s_order, s_labels, s_labelsOrig);
+    if ( !dlg.Rearrange() )
+        return;
+
+    wxString columns;
+    for ( unsigned n = 0; n < s_order.size(); n++ )
+    {
+        columns += wxString::Format("\n    %u: ", n);
+        int idx = s_order[n];
+        if ( idx < 0 )
+        {
+            columns += "[hidden] ";
+            idx = ~idx;
+        }
+
+        columns += s_labels[idx];
+        if ( s_labels[idx] != s_labelsOrig[idx] )
+        {
+            columns += wxString::Format(" (original label: \"%s\")",
+                                        s_labelsOrig[idx]);
+        }
+    }
+
+    wxLogMessage("The columns order now is:%s", columns);
+}
+#endif // wxUSE_REARRANGECTRL
+
 #if wxUSE_FILEDLG
+
+// panel with custom controls for file dialog
+class MyExtraPanel : public wxPanel
+{
+public:
+    MyExtraPanel(wxWindow *parent);
+    void OnCheckBox(wxCommandEvent& event) { m_btn->Enable(event.IsChecked()); }
+    wxString GetInfo() const
+    {
+        return wxString::Format("checkbox value = %d", (int) m_cb->GetValue());
+    }
+private:
+    wxButton *m_btn;
+    wxCheckBox *m_cb;
+};
+
+MyExtraPanel::MyExtraPanel(wxWindow *parent)
+            : wxPanel(parent)
+{
+    m_btn = new wxButton(this, -1, _T("Custom Button"));
+    m_btn->Enable(false);
+    m_cb = new wxCheckBox(this, -1, _T("Enable Custom Button"));
+    m_cb->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED,
+                  wxCommandEventHandler(MyExtraPanel::OnCheckBox), NULL, this);
+    wxBoxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
+    sizerTop->Add(m_cb, wxSizerFlags().Centre().Border());
+    sizerTop->AddStretchSpacer();
+    sizerTop->Add(m_btn, wxSizerFlags().Right().Border());
+    SetSizerAndFit(sizerTop);
+}
+
+// a static method can be used instead of a function with most of compilers
+static wxWindow* createMyExtraPanel(wxWindow *parent)
+{
+    return new MyExtraPanel(parent);
+}
+
 void MyFrame::FileOpen(wxCommandEvent& WXUNUSED(event) )
 {
     wxFileDialog dialog
@@ -687,18 +1118,23 @@ void MyFrame::FileOpen(wxCommandEvent& WXUNUSED(event) )
 #endif
                  );
 
-    dialog.SetDirectory(wxGetHomeDir());
+    dialog.SetExtraControlCreator(&createMyExtraPanel);
     dialog.CentreOnParent();
+    dialog.SetDirectory(wxGetHomeDir());
 
     if (dialog.ShowModal() == wxID_OK)
     {
         wxString info;
+        wxWindow * const extra = dialog.GetExtraControl();
         info.Printf(_T("Full file name: %s\n")
                     _T("Path: %s\n")
-                    _T("Name: %s"),
+                    _T("Name: %s\n")
+                    _T("Custom window: %s"),
                     dialog.GetPath().c_str(),
                     dialog.GetDirectory().c_str(),
-                    dialog.GetFilename().c_str());
+                    dialog.GetFilename().c_str(),
+                    extra ? static_cast<MyExtraPanel*>(extra)->GetInfo()
+                          : wxString("None"));
         wxMessageDialog dialog2(this, info, _T("Selected file"));
         dialog2.ShowModal();
     }
@@ -720,7 +1156,7 @@ void MyFrame::FileOpen2(wxCommandEvent& WXUNUSED(event) )
                                         wxFileSelectorDefaultWildcardStr,
                                         wxFileSelectorDefaultWildcardStr
                                     ),
-                                    wxCHANGE_DIR,
+                                    wxFD_OPEN|wxFD_CHANGE_DIR|wxFD_PREVIEW,
                                     this
                                    );
 
@@ -731,7 +1167,7 @@ void MyFrame::FileOpen2(wxCommandEvent& WXUNUSED(event) )
     s_extDef = path.AfterLast(_T('.'));
 
     wxLogMessage(_T("You selected the file '%s', remembered extension '%s'"),
-                 (const wxChar*) path, (const wxChar*) s_extDef);
+                 path, s_extDef);
 }
 
 void MyFrame::FilesOpen(wxCommandEvent& WXUNUSED(event) )
@@ -749,7 +1185,7 @@ void MyFrame::FilesOpen(wxCommandEvent& WXUNUSED(event) )
 #endif
     wxFileDialog dialog(this, _T("Testing open multiple file dialog"),
                         wxEmptyString, wxEmptyString, wildcards,
-                        wxMULTIPLE);
+                        wxFD_OPEN|wxFD_MULTIPLE);
 
     if (dialog.ShowModal() == wxID_OK)
     {
@@ -781,8 +1217,8 @@ void MyFrame::FileSave(wxCommandEvent& WXUNUSED(event) )
                         _T("Testing save file dialog"),
                         wxEmptyString,
                         _T("myletter.doc"),
-                        _T("Text files (*.txt)|*.txt|Document files (*.doc)|*.doc"),
-                        wxSAVE|wxOVERWRITE_PROMPT);
+                        _T("Text files (*.txt)|*.txt|Document files (*.doc;*.ods)|*.doc;*.ods"),
+                        wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
 
     dialog.SetFilterIndex(1);
 
@@ -806,6 +1242,7 @@ void MyFrame::FileOpenGeneric(wxCommandEvent& WXUNUSED(event) )
                     _T("C++ files (*.cpp;*.h)|*.cpp;*.h")
                  );
 
+    dialog.SetExtraControlCreator(&createMyExtraPanel);
     dialog.SetDirectory(wxGetHomeDir());
 
     if (dialog.ShowModal() == wxID_OK)
@@ -831,7 +1268,7 @@ void MyFrame::FilesOpenGeneric(wxCommandEvent& WXUNUSED(event) )
     wxString wildcards = _T("All files (*.*)|*.*|C++ files (*.cpp;*.h)|*.cpp;*.h");
     wxGenericFileDialog dialog(this, _T("Testing open multiple file dialog"),
                         wxEmptyString, wxEmptyString, wildcards,
-                        wxMULTIPLE);
+                        wxFD_MULTIPLE);
 
     if (dialog.ShowModal() == wxID_OK)
     {
@@ -866,8 +1303,8 @@ void MyFrame::FileSaveGeneric(wxCommandEvent& WXUNUSED(event) )
                         _T("Testing save file dialog"),
                         wxEmptyString,
                         _T("myletter.doc"),
-                        _T("Text files (*.txt)|*.txt|Document files (*.doc)|*.doc"),
-                        wxSAVE|wxOVERWRITE_PROMPT);
+                        _T("Text files (*.txt)|*.txt|Document files (*.doc;*.ods)|*.doc;*.ods"),
+                        wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
 
     dialog.SetFilterIndex(1);
 
@@ -896,12 +1333,12 @@ void MyFrame::DoDirChoose(int style)
 
 void MyFrame::DirChoose(wxCommandEvent& WXUNUSED(event) )
 {
-    DoDirChoose(wxDD_DEFAULT_STYLE & ~wxDD_NEW_DIR_BUTTON);
+    DoDirChoose(wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST);
 }
 
 void MyFrame::DirChooseNew(wxCommandEvent& WXUNUSED(event) )
 {
-    DoDirChoose(wxDD_DEFAULT_STYLE | wxDD_NEW_DIR_BUTTON);
+    DoDirChoose(wxDD_DEFAULT_STYLE & ~wxDD_DIR_MUST_EXIST);
 }
 #endif // wxUSE_DIRDLG
 
@@ -928,6 +1365,7 @@ void MyFrame::ModalDlg(wxCommandEvent& WXUNUSED(event))
     MyModalDialog dlg(this);
     dlg.ShowModal();
 }
+#endif // USE_MODAL_PRESENTATION
 
 void MyFrame::ModelessDlg(wxCommandEvent& event)
 {
@@ -959,7 +1397,7 @@ void MyFrame::DlgCenteredScreen(wxCommandEvent& WXUNUSED(event))
 {
     wxDialog dlg(this, wxID_ANY, _T("Dialog centered on screen"),
                  wxDefaultPosition, wxSize(200, 100));
-    new wxButton(&dlg, wxID_OK, _T("Close"), wxPoint(10, 10));
+    (new wxButton(&dlg, wxID_OK, _T("Close")))->Centre();
     dlg.CentreOnScreen();
     dlg.ShowModal();
 }
@@ -968,12 +1406,39 @@ void MyFrame::DlgCenteredParent(wxCommandEvent& WXUNUSED(event))
 {
     wxDialog dlg(this, wxID_ANY, _T("Dialog centered on parent"),
                  wxDefaultPosition, wxSize(200, 100));
-    new wxButton(&dlg, wxID_OK, _T("Close"), wxPoint(10, 10));
+    (new wxButton(&dlg, wxID_OK, _T("Close")))->Centre();
     dlg.CentreOnParent();
     dlg.ShowModal();
 }
 
-#endif // USE_MODAL_PRESENTATION
+#if wxUSE_MINIFRAME
+void MyFrame::MiniFrame(wxCommandEvent& WXUNUSED(event))
+{
+    wxFrame *frame = new wxMiniFrame(this, wxID_ANY, _T("Mini frame"),
+                                     wxDefaultPosition, wxSize(300, 100),
+                                     wxCAPTION | wxCLOSE_BOX);
+    new wxStaticText(frame,
+                     wxID_ANY,
+                     _T("Mini frames have slightly different appearance"),
+                     wxPoint(5, 5));
+    new wxStaticText(frame,
+                     wxID_ANY,
+                     _T("from the normal frames but that's the only difference."),
+                     wxPoint(5, 25));
+
+    frame->CentreOnParent();
+    frame->Show();
+}
+#endif // wxUSE_MINIFRAME
+
+void MyFrame::DlgOnTop(wxCommandEvent& WXUNUSED(event))
+{
+    wxDialog dlg(this, wxID_ANY, _T("Dialog staying on top of other windows"),
+                 wxDefaultPosition, wxSize(300, 100),
+                 wxDEFAULT_DIALOG_STYLE | wxSTAY_ON_TOP);
+    (new wxButton(&dlg, wxID_OK, _T("Close")))->Centre();
+    dlg.ShowModal();
+}
 
 #if wxUSE_STARTUP_TIPS
 void MyFrame::ShowTip(wxCommandEvent& WXUNUSED(event))
@@ -1005,15 +1470,9 @@ void MyFrame::ShowTip(wxCommandEvent& WXUNUSED(event))
 #endif // wxUSE_STARTUP_TIPS
 
 #if USE_SETTINGS_DIALOG
-void MyFrame::OnPropertySheet(wxCommandEvent& WXUNUSED(event))
+void MyFrame::OnPropertySheet(wxCommandEvent& event)
 {
-    SettingsDialog dialog(this);
-    dialog.ShowModal();
-}
-
-void MyFrame::OnPropertySheetToolBook(wxCommandEvent& WXUNUSED(event))
-{
-    SettingsDialog dialog(this, true);
+    SettingsDialog dialog(this, event.GetId());
     dialog.ShowModal();
 }
 #endif // USE_SETTINGS_DIALOG
@@ -1027,6 +1486,117 @@ void MyFrame::OnRequestUserAttention(wxCommandEvent& WXUNUSED(event))
     RequestUserAttention(wxUSER_ATTENTION_ERROR);
 }
 
+#if wxUSE_NOTIFICATION_MESSAGE
+
+void MyFrame::OnNotifMsgAuto(wxCommandEvent& WXUNUSED(event))
+{
+    if ( !wxNotificationMessage
+          (
+            "Automatic Notification",
+            "Nothing important has happened\n"
+            "this notification will disappear soon."
+          ).Show() )
+    {
+        wxLogStatus("Failed to show notification message");
+    }
+}
+
+void MyFrame::OnNotifMsgShow(wxCommandEvent& WXUNUSED(event))
+{
+    if ( !m_notifMsg )
+    {
+        m_notifMsg = new wxNotificationMessage
+                         (
+                            "wxWidgets Manual Notification",
+                            "You can hide this notification from the menu",
+                            this
+                         );
+    }
+
+    if ( !m_notifMsg->Show(wxNotificationMessage::Timeout_Never) )
+    {
+        wxLogStatus("Failed to show manual notification message");
+    }
+}
+
+void MyFrame::OnNotifMsgHide(wxCommandEvent& WXUNUSED(event))
+{
+    if ( m_notifMsg )
+    {
+        if ( !m_notifMsg->Close() )
+            wxLogStatus("Failed to hide manual notification message");
+    }
+}
+
+#endif // wxUSE_NOTIFICATION_MESSAGE
+
+void MyFrame::OnStandardButtonsSizerDialog(wxCommandEvent& WXUNUSED(event))
+{
+    StdButtonSizerDialog  dialog(this);
+    dialog.ShowModal();
+}
+
+// TestDefaultAction
+
+#define ID_CATCH_LISTBOX_DCLICK 100
+#define ID_LISTBOX              101
+
+BEGIN_EVENT_TABLE(TestDefaultActionDialog, wxDialog)
+    EVT_CHECKBOX(ID_CATCH_LISTBOX_DCLICK,    TestDefaultActionDialog::OnCatchListBoxDClick)
+    EVT_LISTBOX_DCLICK(ID_LISTBOX,           TestDefaultActionDialog::OnListBoxDClick)
+END_EVENT_TABLE()
+
+TestDefaultActionDialog::TestDefaultActionDialog( wxWindow *parent ) :
+  wxDialog( parent, -1, "Test default action" )
+{
+    m_catchListBoxDClick = false;
+
+    wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
+
+    wxFlexGridSizer *grid_sizer = new wxFlexGridSizer( 2, 5, 5 );
+
+#if wxUSE_LISTBOX
+    wxListBox *listbox = new wxListBox( this, ID_LISTBOX );
+    listbox->Append( "String 1" );
+    listbox->Append( "String 2" );
+    listbox->Append( "String 3" );
+    listbox->Append( "String 4" );
+    grid_sizer->Add( listbox );
+#endif // wxUSE_LISTBOX
+
+    grid_sizer->Add( new wxCheckBox( this, ID_CATCH_LISTBOX_DCLICK, "Catch DoubleClick from wxListBox" ), 0, wxALIGN_CENTRE_VERTICAL );
+
+    grid_sizer->Add( new wxTextCtrl( this, -1, "", wxDefaultPosition, wxSize(80,-1), 0 ), 0, wxALIGN_CENTRE_VERTICAL );
+    grid_sizer->Add( new wxStaticText( this, -1, "wxTextCtrl without wxTE_PROCESS_ENTER" ), 0, wxALIGN_CENTRE_VERTICAL );
+
+    grid_sizer->Add( new wxTextCtrl( this, -1, "", wxDefaultPosition, wxSize(80,-1), wxTE_PROCESS_ENTER ), 0, wxALIGN_CENTRE_VERTICAL );
+    grid_sizer->Add( new wxStaticText( this, -1, "wxTextCtrl with wxTE_PROCESS_ENTER" ), 0, wxALIGN_CENTRE_VERTICAL );
+
+    main_sizer->Add( grid_sizer, 0, wxALL, 10 );
+
+    wxSizer *button_sizer = CreateSeparatedButtonSizer( wxOK|wxCANCEL );
+    if (button_sizer)
+        main_sizer->Add( button_sizer, 0, wxALL|wxGROW, 5 );
+
+    SetSizerAndFit( main_sizer );
+}
+
+void TestDefaultActionDialog::OnListBoxDClick(wxCommandEvent& event)
+{
+    event.Skip( !m_catchListBoxDClick );
+}
+
+void TestDefaultActionDialog::OnCatchListBoxDClick(wxCommandEvent& WXUNUSED(event))
+{
+    m_catchListBoxDClick = !m_catchListBoxDClick;
+}
+
+void MyFrame::OnTestDefaultActionDialog(wxCommandEvent& WXUNUSED(event))
+{
+    TestDefaultActionDialog dialog( this );
+    dialog.ShowModal();
+}
+
 void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event) )
 {
     Close(true);
@@ -1036,33 +1606,7 @@ void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event) )
 
 void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
 {
-    #if wxUSE_STOPWATCH && wxUSE_LONGLONG
-    // check the performance
-    int countrandomnumbers = 0, count = 0;
-    wxTimeSpan tsTest(0,0,0,250);
-    wxDateTime DT2, DT1 = wxDateTime::UNow();
-    srand(0);
-    while(1)
-    {
-        rand();
-        ++countrandomnumbers;
-        if ( countrandomnumbers == 1000 )
-        {
-            srand(0);
-            countrandomnumbers = 0;
-            ++count;
-            DT2 = wxDateTime::UNow();
-            wxTimeSpan ts = DT2.Subtract( DT1 );
-            if ( ts.IsLongerThan( tsTest ) )
-            {
-                break;
-            }
-        }
-    }
-    const int max = 40 * count;
-    #else
-    static const int max = 10;
-    #endif // wxUSE_STOPWATCH && wxUSE_LONGLONG
+    static const int max = 100;
 
     wxProgressDialog dialog(_T("Progress dialog example"),
                             _T("An informative message"),
@@ -1074,53 +1618,48 @@ void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
                             // wxPD_AUTO_HIDE | -- try this as well
                             wxPD_ELAPSED_TIME |
                             wxPD_ESTIMATED_TIME |
-                            wxPD_REMAINING_TIME |
-                            wxPD_SMOOTH);
+                            wxPD_REMAINING_TIME
+                            | wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small
+                            );
 
     bool cont = true;
-    bool skip = false;
-    // each skip will move progress about quarter forward
-    for ( int i = 0; i <= max; i = wxMin(i+(skip?int(max/4):1), max+1), skip = false )
-    {
-        #if wxUSE_STOPWATCH && wxUSE_LONGLONG
-        // do (almost) the same operations as we did for the performance test
-        srand(0);
-        for ( int j = 0; j < 1000; j++ )
-        {
-            rand();
-            if ( j == 999 )
-            {
-                DT2 = wxDateTime::UNow();
-                wxTimeSpan ts = DT2.Subtract( DT1 );
-                if ( ts.IsLongerThan( tsTest ) )
-                {
-                    // nothing to do
-                }
-            }
-        }
-        #else
-        wxSleep(1);
-        #endif
+    for ( int i = 0; i <= max; i++ )
+    {
+        wxMilliSleep(200);
 
         wxString msg;
 
+        // test both modes of wxProgressDialog behaviour: start in
+        // indeterminate mode but switch to the determinate one later
+        const bool determinate = i > max/2;
+
         if ( i == max )
         {
             msg = _T("That's all, folks!");
         }
-        else if ( i > max / 2 )
+        else if ( !determinate )
+        {
+            msg = _T("Testing indeterminate mode");
+        }
+        else if ( determinate )
         {
-            msg = _T("Only a half left (very long message)!");
+            msg = _T("Now in standard determinate mode");
         }
 
-#if wxUSE_STOPWATCH && wxUSE_LONGLONG
-        if ( (i % (max/100)) == 0 ) // // only 100 updates, this makes it much faster
+        // will be set to true if "Skip" button was pressed
+        bool skip = false;
+        if ( determinate )
         {
             cont = dialog.Update(i, msg, &skip);
         }
-#else
-        cont = dialog.Update(i, msg, &skip);
-#endif
+        else
+        {
+            cont = dialog.Pulse(msg, &skip);
+        }
+
+        // each skip will move progress about quarter forward
+        if ( skip )
+            i += max/4;
 
         if ( !cont )
         {
@@ -1146,6 +1685,110 @@ void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
 
 #endif // wxUSE_PROGRESSDLG
 
+#if wxUSE_ABOUTDLG
+
+static void InitAboutInfoMinimal(wxAboutDialogInfo& info)
+{
+    info.SetName(_T("Dialogs Sample"));
+    info.SetVersion(wxVERSION_NUM_DOT_STRING_T);
+    info.SetDescription(_T("This sample shows different wxWidgets dialogs"));
+    info.SetCopyright(_T("(C) 1998-2006 wxWidgets dev team"));
+    info.AddDeveloper(_T("Vadim Zeitlin"));
+}
+
+static void InitAboutInfoWebsite(wxAboutDialogInfo& info)
+{
+    InitAboutInfoMinimal(info);
+
+    info.SetWebSite(_T("http://www.wxwidgets.org/"), _T("wxWidgets web site"));
+}
+
+static void InitAboutInfoAll(wxAboutDialogInfo& info)
+{
+    InitAboutInfoWebsite(info);
+
+    // we can add a second developer
+    info.AddDeveloper(_T("A.N. Other"));
+
+    // or we can add several persons at once like this
+    static const wxChar *docwriters[] =
+    {
+        _T("First D. Writer"),
+        _T("Second One"),
+    };
+
+    info.SetDocWriters(wxArrayString(WXSIZEOF(docwriters), docwriters));
+    info.SetLicence(wxString::FromAscii(
+"                wxWindows Library Licence, Version 3.1\n"
+"                ======================================\n"
+"\n"
+"  Copyright (c) 1998-2005 Julian Smart, Robert Roebling et al\n"
+"\n"
+"  Everyone is permitted to copy and distribute verbatim copies\n"
+"  of this licence document, but changing it is not allowed.\n"
+"\n"
+"                       WXWINDOWS LIBRARY LICENCE\n"
+"     TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n"
+"\n"
+"                    ...and so on and so forth...\n"
+    ));
+
+    info.AddTranslator(_T("Wun Ngo Wen (Martian)"));
+}
+
+void MyFrame::ShowSimpleAboutDialog(wxCommandEvent& WXUNUSED(event))
+{
+    wxAboutDialogInfo info;
+    InitAboutInfoMinimal(info);
+
+    wxAboutBox(info, this);
+}
+
+void MyFrame::ShowFancyAboutDialog(wxCommandEvent& WXUNUSED(event))
+{
+    wxAboutDialogInfo info;
+    InitAboutInfoWebsite(info);
+
+    wxAboutBox(info, this);
+}
+
+void MyFrame::ShowFullAboutDialog(wxCommandEvent& WXUNUSED(event))
+{
+    wxAboutDialogInfo info;
+    InitAboutInfoAll(info);
+
+    wxAboutBox(info, this);
+}
+
+// a trivial example of a custom dialog class
+class MyAboutDialog : public wxGenericAboutDialog
+{
+public:
+    MyAboutDialog(const wxAboutDialogInfo& info, wxWindow* parent)
+    {
+        Create(info, parent);
+    }
+
+    // add some custom controls
+    virtual void DoAddCustomControls()
+    {
+        AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
+        AddText(_T("Some custom text"));
+        AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
+    }
+};
+
+void MyFrame::ShowCustomAboutDialog(wxCommandEvent& WXUNUSED(event))
+{
+    wxAboutDialogInfo info;
+    InitAboutInfoAll(info);
+
+    MyAboutDialog dlg(info, this);
+    dlg.ShowModal();
+}
+
+#endif // wxUSE_ABOUTDLG
+
 #if wxUSE_BUSYINFO
 
 void MyFrame::ShowBusyInfo(wxCommandEvent& WXUNUSED(event))
@@ -1156,7 +1799,7 @@ void MyFrame::ShowBusyInfo(wxCommandEvent& WXUNUSED(event))
 
     for ( int i = 0; i < 18; i++ )
     {
-        //wxUsleep(100);
+        wxMilliSleep(100);
         wxTheApp->Yield();
     }
 
@@ -1321,10 +1964,7 @@ MyModelessDialog::MyModelessDialog(wxWindow *parent)
     sizerTop->Add(btn, 1, wxEXPAND | wxALL, 5);
     sizerTop->Add(check, 1, wxEXPAND | wxALL, 5);
 
-    SetSizer(sizerTop);
-
-    sizerTop->SetSizeHints(this);
-    sizerTop->Fit(this);
+    SetSizerAndFit(sizerTop);
 }
 
 void MyModelessDialog::OnButton(wxCommandEvent& WXUNUSED(event))
@@ -1358,16 +1998,14 @@ MyModalDialog::MyModalDialog(wxWindow *parent)
     m_btnModeless = new wxButton(this, wxID_ANY, _T("Mode&less dialog"));
     m_btnDelete = new wxButton(this, wxID_ANY, _T("&Delete button"));
 
-    wxButton *btnOk = new wxButton(this, wxID_CANCEL, _T("&Close"));
     sizerTop->Add(m_btnModal, 0, wxALIGN_CENTER | wxALL, 5);
     sizerTop->Add(m_btnModeless, 0, wxALIGN_CENTER | wxALL, 5);
     sizerTop->Add(m_btnDelete, 0, wxALIGN_CENTER | wxALL, 5);
-    sizerTop->Add(btnOk, 0, wxALIGN_CENTER | wxALL, 5);
+    sizerTop->Add(new wxButton(this, wxID_CLOSE), 0, wxALIGN_CENTER | wxALL, 5);
 
-    SetSizer(sizerTop);
+    SetSizerAndFit(sizerTop);
 
-    sizerTop->SetSizeHints(this);
-    sizerTop->Fit(this);
+    SetEscapeId(wxID_CLOSE);
 
     m_btnModal->SetFocus();
     m_btnModal->SetDefault();
@@ -1404,6 +2042,164 @@ void MyModalDialog::OnButton(wxCommandEvent& event)
 
 #endif // USE_MODAL_PRESENTATION
 
+// ----------------------------------------------------------------------------
+// StdButtonSizerDialog
+// ----------------------------------------------------------------------------
+
+StdButtonSizerDialog::StdButtonSizerDialog(wxWindow *parent)
+    : wxDialog(parent, wxID_ANY, wxString(_T("StdButtonSizer dialog")),
+      wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER),
+      m_buttonsSizer(NULL)
+{
+    wxBoxSizer *const sizerTop = new wxBoxSizer(wxVERTICAL);
+
+    wxBoxSizer *const sizer = new wxBoxSizer(wxHORIZONTAL);
+    wxBoxSizer *const sizerInside1 = new wxBoxSizer(wxVERTICAL);
+
+    m_chkboxAffirmativeButton = new wxCheckBox(this, wxID_ANY, _("Enable Affirmative Button"));
+
+    wxStaticBoxSizer *const sizer1 = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Affirmative Button"));
+
+    m_radiobtnOk = new wxRadioButton(this, wxID_ANY, _("Ok"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
+    m_radiobtnYes = new wxRadioButton(this, wxID_ANY, _("Yes"));
+
+    wxBoxSizer *const sizerInside2 = new wxBoxSizer(wxVERTICAL);
+
+    m_chkboxDismissButton = new wxCheckBox(this, wxID_ANY, _("Enable Dismiss Button"));
+
+    wxStaticBoxSizer *const sizer2 = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Dismiss Button"));
+
+    m_radiobtnCancel = new wxRadioButton(this, wxID_ANY, _("Cancel"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
+    m_radiobtnClose = new wxRadioButton(this, wxID_ANY, _("Close"));
+
+    wxBoxSizer *const sizer3 = new wxBoxSizer(wxHORIZONTAL);
+
+    m_chkboxNo = new wxCheckBox(this, wxID_ANY, _("No"));
+    m_chkboxHelp = new wxCheckBox(this, wxID_ANY, _("Help"));
+    m_chkboxApply = new wxCheckBox(this, wxID_ANY, _("Apply"));
+
+    m_chkboxNoDefault = new wxCheckBox(this, wxID_ANY, wxT("No Default"));
+
+    sizer1->Add(m_radiobtnOk, 0, wxALL, 5);
+    sizer1->Add(m_radiobtnYes, 0, wxALL, 5);
+
+    sizer->Add(sizerInside1, 0, 0, 0);
+    sizerInside1->Add(m_chkboxAffirmativeButton, 0, wxALL, 5);
+    sizerInside1->Add(sizer1, 0, wxALL, 5);
+    sizerInside1->SetItemMinSize(sizer1, sizer1->GetStaticBox()->GetBestSize());    // to prevent wrapping of static box label
+
+    sizer2->Add(m_radiobtnCancel, 0, wxALL, 5);
+    sizer2->Add(m_radiobtnClose, 0, wxALL, 5);
+
+    sizer->Add(sizerInside2, 0, 0, 0);
+    sizerInside2->Add(m_chkboxDismissButton, 0, wxALL, 5);
+    sizerInside2->Add(sizer2, 0, wxALL, 5);
+    sizerInside2->SetItemMinSize(sizer2, sizer2->GetStaticBox()->GetBestSize());    // to prevent wrapping of static box label
+
+    sizerTop->Add(sizer, 0, wxALL, 5);
+
+    sizer3->Add(m_chkboxNo, 0, wxALL, 5);
+    sizer3->Add(m_chkboxHelp, 0, wxALL, 5);
+    sizer3->Add(m_chkboxApply, 0, wxALL, 5);
+
+    sizerTop->Add(sizer3, 0, wxALL, 5);
+
+    sizerTop->Add(m_chkboxNoDefault, 0, wxLEFT|wxRIGHT, 10);
+
+    EnableDisableControls();
+
+    SetSizerAndFit(sizerTop);
+
+    wxCommandEvent ev;
+    OnEvent(ev);
+}
+
+void StdButtonSizerDialog::OnEvent(wxCommandEvent& WXUNUSED(event))
+{
+    if (m_buttonsSizer)
+    {
+        m_buttonsSizer->DeleteWindows();
+        GetSizer()->Remove(m_buttonsSizer);
+    }
+
+    EnableDisableControls();
+
+    long flags = 0;
+    unsigned long numButtons = 0;
+
+    if (m_chkboxAffirmativeButton->IsChecked())
+    {
+        if (m_radiobtnOk->GetValue())
+        {
+            flags |= wxOK;
+            numButtons ++;
+        }
+        else if (m_radiobtnYes->GetValue())
+        {
+            flags |= wxYES;
+            numButtons ++;
+        }
+    }
+
+    if (m_chkboxDismissButton->IsChecked())
+    {
+        if (m_radiobtnCancel->GetValue())
+        {
+            flags |= wxCANCEL;
+            numButtons ++;
+        }
+
+        else if (m_radiobtnClose->GetValue())
+        {
+            flags |= wxCLOSE;
+            numButtons ++;
+        }
+
+    }
+
+    if (m_chkboxApply->IsChecked())
+    {
+        flags |= wxAPPLY;
+        numButtons ++;
+    }
+
+    if (m_chkboxNo->IsChecked())
+    {
+        flags |= wxNO;
+        numButtons ++;
+    }
+
+    if (m_chkboxHelp->IsChecked())
+    {
+        flags |= wxHELP;
+        numButtons ++;
+    }
+
+    if (m_chkboxNoDefault->IsChecked())
+    {
+        flags |= wxNO_DEFAULT;
+    }
+
+    m_buttonsSizer = CreateStdDialogButtonSizer(flags);
+    GetSizer()->Add(m_buttonsSizer, 0, wxGROW|wxALL, 5);
+
+    Layout();
+    GetSizer()->SetSizeHints(this);
+}
+
+void StdButtonSizerDialog::EnableDisableControls()
+{
+    const bool affButtonEnabled = m_chkboxAffirmativeButton->IsChecked();
+
+    m_radiobtnOk->Enable(affButtonEnabled);
+    m_radiobtnYes->Enable(affButtonEnabled);
+
+    const bool dismissButtonEnabled = m_chkboxDismissButton->IsChecked();
+
+    m_radiobtnCancel->Enable(dismissButtonEnabled);
+    m_radiobtnClose->Enable(dismissButtonEnabled);
+}
+
 #if USE_SETTINGS_DIALOG
 // ----------------------------------------------------------------------------
 // SettingsDialog
@@ -1414,18 +2210,31 @@ IMPLEMENT_CLASS(SettingsDialog, wxPropertySheetDialog)
 BEGIN_EVENT_TABLE(SettingsDialog, wxPropertySheetDialog)
 END_EVENT_TABLE()
 
-SettingsDialog::SettingsDialog(wxWindow* win, bool useToolBook)
+SettingsDialog::SettingsDialog(wxWindow* win, int dialogType)
 {
     SetExtraStyle(wxDIALOG_EX_CONTEXTHELP|wxWS_EX_VALIDATE_RECURSIVELY);
 
     int tabImage1 = -1;
     int tabImage2 = -1;
 
+    bool useToolBook = (dialogType == DIALOGS_PROPERTY_SHEET_TOOLBOOK || dialogType == DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK);
+    int resizeBorder = wxRESIZE_BORDER;
+
     if (useToolBook)
     {
+        resizeBorder = 0;
         tabImage1 = 0;
         tabImage2 = 1;
-        SetSheetStyle(wxPROPSHEET_TOOLBOOK|wxPROPSHEET_SHRINKTOFIT);
+
+        int sheetStyle = wxPROPSHEET_SHRINKTOFIT;
+        if (dialogType == DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK)
+            sheetStyle |= wxPROPSHEET_BUTTONTOOLBOOK;
+        else
+            sheetStyle |= wxPROPSHEET_TOOLBOOK;
+
+        SetSheetStyle(sheetStyle);
+        SetSheetInnerBorder(0);
+        SetSheetOuterBorder(0);
 
         // create a dummy image list with a few icons
         const wxSize imageSize(32, 32);
@@ -1444,18 +2253,13 @@ SettingsDialog::SettingsDialog(wxWindow* win, bool useToolBook)
         m_imageList = NULL;
 
     Create(win, wxID_ANY, _("Preferences"), wxDefaultPosition, wxDefaultSize,
-        wxDEFAULT_DIALOG_STYLE
-#ifndef __WXWINCE__
-        |wxRESIZE_BORDER
-#endif
+        wxDEFAULT_DIALOG_STYLE| (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, resizeBorder)
     );
 
     // If using a toolbook, also follow Mac style and don't create buttons
     if (!useToolBook)
-        CreateButtons(wxOK|wxCANCEL
-#ifndef __POCKETPC__
-                      |wxHELP
-#endif
+        CreateButtons(wxOK | wxCANCEL |
+                        (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, wxHELP)
     );
 
     wxBookCtrlBase* notebook = GetBookCtrl();
@@ -1518,8 +2322,7 @@ wxPanel* SettingsDialog::CreateGeneralSettingsPage(wxWindow* parent)
 
     topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );
 
-    panel->SetSizer(topSizer);
-    topSizer->Fit(panel);
+    panel->SetSizerAndFit(topSizer);
 
     return panel;
 }
@@ -1577,10 +2380,232 @@ wxPanel* SettingsDialog::CreateAestheticSettingsPage(wxWindow* parent)
     topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );
     topSizer->AddSpacer(5);
 
-    panel->SetSizer(topSizer);
-    topSizer->Fit(panel);
+    panel->SetSizerAndFit(topSizer);
 
     return panel;
 }
 
+// ----------------------------------------------------------------------------
+// TestMessageBoxDialog
+// ----------------------------------------------------------------------------
+
+/* static */
+const TestMessageBoxDialog::BtnInfo TestMessageBoxDialog::ms_btnInfo[] =
+{
+    { wxYES,    "&Yes"    },
+    { wxNO,     "&No"     },
+    { wxOK,     "&Ok"     },
+    { wxCANCEL, "&Cancel" },
+};
+
+BEGIN_EVENT_TABLE(TestMessageBoxDialog, wxDialog)
+    EVT_BUTTON(wxID_APPLY, TestMessageBoxDialog::OnApply)
+    EVT_BUTTON(wxID_CLOSE, TestMessageBoxDialog::OnClose)
+END_EVENT_TABLE()
+
+TestMessageBoxDialog::TestMessageBoxDialog(wxWindow *parent)
+                    : wxDialog(parent, wxID_ANY, "Message Box Test Dialog",
+                               wxDefaultPosition, wxDefaultSize,
+                               wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+{
+    wxSizer * const sizerTop = new wxBoxSizer(wxVERTICAL);
+
+    // this sizer allows to configure the messages shown in the message box
+    wxSizer * const
+        sizerMsgs = new wxStaticBoxSizer(wxVERTICAL, this, "&Messages");
+    sizerMsgs->Add(new wxStaticText(this, wxID_ANY, "&Main message:"));
+    m_textMsg = new wxTextCtrl(this, wxID_ANY, "Hello from a box!",
+                               wxDefaultPosition, wxDefaultSize,
+                               wxTE_MULTILINE);
+    sizerMsgs->Add(m_textMsg, wxSizerFlags(1).Expand().Border(wxBOTTOM));
+
+    sizerMsgs->Add(new wxStaticText(this, wxID_ANY, "&Extended message:"));
+    m_textExtMsg = new wxTextCtrl(this, wxID_ANY, "",
+                                  wxDefaultPosition, wxDefaultSize,
+                                  wxTE_MULTILINE);
+    sizerMsgs->Add(m_textExtMsg, wxSizerFlags(1).Expand());
+
+    sizerTop->Add(sizerMsgs, wxSizerFlags(1).Expand().Border());
+
+
+    // this one is for configuring the buttons
+    wxFlexGridSizer * const sizerBtns = new wxFlexGridSizer(2, 5, 5);
+    sizerBtns->AddGrowableCol(1);
+
+    sizerBtns->Add(new wxStaticText(this, wxID_ANY, "Button(s)"));
+    sizerBtns->Add(new wxStaticText(this, wxID_ANY, "Custom label"));
+
+    for ( int n = 0; n < Btn_Max; n++ )
+    {
+        m_buttons[n] = new wxCheckBox(this, wxID_ANY, ms_btnInfo[n].name);
+        sizerBtns->Add(m_buttons[n], wxSizerFlags().Centre().Left());
+
+        m_labels[n] = new wxTextCtrl(this, wxID_ANY);
+        sizerBtns->Add(m_labels[n], wxSizerFlags(1).Centre().Expand());
+
+        m_labels[n]->Connect(wxEVT_UPDATE_UI,
+                             wxUpdateUIEventHandler(
+                                 TestMessageBoxDialog::OnUpdateLabelUI),
+                             NULL,
+                             this);
+    }
+
+    wxSizer * const
+        sizerBtnsBox = new wxStaticBoxSizer(wxVERTICAL, this, "&Buttons");
+    sizerBtnsBox->Add(sizerBtns, wxSizerFlags(1).Expand());
+    sizerTop->Add(sizerBtnsBox, wxSizerFlags().Expand().Border());
+
+
+    // icon choice
+    const wxString icons[] = {
+        "&None", "&Information", "&Question", "&Warning", "&Error"
+    };
+
+    m_icons = new wxRadioBox(this, wxID_ANY, "&Icons",
+                             wxDefaultPosition, wxDefaultSize,
+                             WXSIZEOF(icons), icons);
+    // Make the 'Information' icon the default one:
+    m_icons->SetSelection(1);
+    sizerTop->Add(m_icons, wxSizerFlags().Expand().Border());
+
+
+    // miscellaneous other stuff
+    wxSizer * const
+        sizerFlags = new wxStaticBoxSizer(wxHORIZONTAL, this, "&Other flags");
+
+    m_chkNoDefault = new wxCheckBox(this, wxID_ANY, "Make \"No\" &default");
+    m_chkNoDefault->Connect(wxEVT_UPDATE_UI,
+                            wxUpdateUIEventHandler(
+                                TestMessageBoxDialog::OnUpdateNoDefaultUI),
+                            NULL,
+                            this);
+    sizerFlags->Add(m_chkNoDefault, wxSizerFlags(1).Border());
+
+    m_chkCentre = new wxCheckBox(this, wxID_ANY, "Centre on &parent");
+    sizerFlags->Add(m_chkCentre, wxSizerFlags(1).Border());
+
+    sizerTop->Add(sizerFlags, wxSizerFlags().Expand().Border());
+
+    // finally buttons to show the resulting message box and close this dialog
+    sizerTop->Add(CreateStdDialogButtonSizer(wxAPPLY | wxCLOSE),
+                  wxSizerFlags().Right().Border());
+
+    SetSizerAndFit(sizerTop);
+
+    m_buttons[Btn_Ok]->SetValue(true);
+}
+
+void TestMessageBoxDialog::OnUpdateLabelUI(wxUpdateUIEvent& event)
+{
+    for ( int n = 0; n < Btn_Max; n++ )
+    {
+        if ( event.GetEventObject() == m_labels[n] )
+        {
+            event.Enable( m_buttons[n]->IsChecked() );
+            return;
+        }
+    }
+
+    wxFAIL_MSG( "called for unknown label" );
+}
+
+void TestMessageBoxDialog::OnUpdateNoDefaultUI(wxUpdateUIEvent& event)
+{
+    event.Enable( m_buttons[Btn_No]->IsChecked() );
+}
+
+void TestMessageBoxDialog::OnApply(wxCommandEvent& WXUNUSED(event))
+{
+    long style = 0;
+
+    for ( int n = 0; n < Btn_Max; n++ )
+    {
+        if ( m_buttons[n]->IsChecked() )
+            style |= ms_btnInfo[n].flag;
+    }
+
+    switch ( m_icons->GetSelection() )
+    {
+        case 0: style |= wxICON_NONE; break;
+        case 1: style |= wxICON_INFORMATION; break;
+        case 2: style |= wxICON_QUESTION; break;
+        case 3: style |= wxICON_WARNING; break;
+        case 4: style |= wxICON_ERROR; break;
+    }
+
+    if ( m_chkCentre->IsChecked() )
+        style |= wxCENTRE;
+
+    if ( m_chkNoDefault->IsEnabled() && m_chkNoDefault->IsChecked() )
+        style |= wxNO_DEFAULT;
+
+
+    wxMessageDialog dlg(this, m_textMsg->GetValue(), "Test Message Box",
+                        style);
+    if ( !m_textExtMsg->IsEmpty() )
+        dlg.SetExtendedMessage(m_textExtMsg->GetValue());
+
+    if ( style & wxYES_NO )
+    {
+        if ( style & wxCANCEL )
+        {
+            dlg.SetYesNoCancelLabels(m_labels[Btn_Yes]->GetValue(),
+                                     m_labels[Btn_No]->GetValue(),
+                                     m_labels[Btn_Cancel]->GetValue());
+        }
+        else
+        {
+            dlg.SetYesNoLabels(m_labels[Btn_Yes]->GetValue(),
+                               m_labels[Btn_No]->GetValue());
+        }
+    }
+    else
+    {
+        if ( style & wxCANCEL )
+        {
+            dlg.SetOKCancelLabels(m_labels[Btn_Ok]->GetValue(),
+                                  m_labels[Btn_Cancel]->GetValue());
+        }
+        else
+        {
+            dlg.SetOKLabel(m_labels[Btn_Ok]->GetValue());
+        }
+    }
+
+    dlg.ShowModal();
+}
+
+void TestMessageBoxDialog::OnClose(wxCommandEvent& WXUNUSED(event))
+{
+    EndModal(wxID_CANCEL);
+}
+
 #endif // USE_SETTINGS_DIALOG
+
+#if wxUSE_LOG
+
+// ----------------------------------------------------------------------------
+// custom log target
+// ----------------------------------------------------------------------------
+
+class MyLogGui : public wxLogGui
+{
+private:
+    virtual void DoShowSingleLogMessage(const wxString& message,
+                                        const wxString& title,
+                                        int style)
+    {
+        wxMessageDialog dlg(NULL, message, title,
+                            wxOK | wxCANCEL | wxCANCEL_DEFAULT | style);
+        dlg.SetOKCancelLabels(wxID_COPY, wxID_OK);
+        dlg.SetExtendedMessage("Note that this is a custom log dialog.");
+        dlg.ShowModal();
+    }
+};
+
+wxLog *MyAppTraits::CreateLogTarget()
+{
+    return new MyLogGui;
+}
+
+#endif // wxUSE_LOG