]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/dialogs/dialogs.cpp
removing old xcode files
[wxWidgets.git] / samples / dialogs / dialogs.cpp
index d81a728015e7bbbba7f22da0d251aa28270fb394..1c020573f544381590927e8bea5c7178b383e7ee 100644 (file)
@@ -1,12 +1,13 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        dialogs.cpp
 // Purpose:     Common dialogs demo
-// Author:      Julian Smart
-// Modified by: ABX (2004) - adjustements for conditional building + new menu
+// Author:      Julian Smart, Vadim Zeitlin, ABX
 // Created:     04/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
-// Licence:     wxWindows license
+//              (c) 2004 ABX
+//              (c) Vadim Zeitlin
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx/wx.h".
 #include "wx/sysopt.h"
 #include "wx/notifmsg.h"
 
+#if wxUSE_RICHMSGDLG
+    #include "wx/richmsgdlg.h"
+#endif // wxUSE_RICHMSGDLG
+
 #if wxUSE_COLOURDLG
     #include "wx/colordlg.h"
 #endif // wxUSE_COLOURDLG
     #include "wx/fdrepdlg.h"
 #endif // wxUSE_FINDREPLDLG
 
+#if wxUSE_INFOBAR
+    #include "wx/infobar.h"
+#endif // wxUSE_INFOBAR
+
 #include "wx/spinctrl.h"
 #include "wx/propdlg.h"
 
@@ -118,9 +127,13 @@ END_EVENT_TABLE()
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
 #if wxUSE_MSGDLG
     EVT_MENU(DIALOGS_MESSAGE_BOX,                   MyFrame::MessageBox)
+    EVT_MENU(DIALOGS_MESSAGE_BOX_WINDOW_MODAL,      MyFrame::MessageBoxWindowModal)
     EVT_MENU(DIALOGS_MESSAGE_DIALOG,                MyFrame::MessageBoxDialog)
     EVT_MENU(DIALOGS_MESSAGE_BOX_WXINFO,            MyFrame::MessageBoxInfo)
 #endif // wxUSE_MSGDLG
+#if wxUSE_RICHMSGDLG
+    EVT_MENU(DIALOGS_RICH_MESSAGE_DIALOG,           MyFrame::RichMessageDialog)
+#endif // wxUSE_RICHMSGDLG
 #if wxUSE_COLOURDLG
     EVT_MENU(DIALOGS_CHOOSE_COLOUR,                 MyFrame::ChooseColour)
     EVT_MENU(DIALOGS_GET_COLOUR,                    MyFrame::GetColour)
@@ -133,8 +146,13 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
 #if wxUSE_LOG_DIALOG
     EVT_MENU(DIALOGS_LOG_DIALOG,                    MyFrame::LogDialog)
 #endif // wxUSE_LOG_DIALOG
+#if wxUSE_INFOBAR
+    EVT_MENU(DIALOGS_INFOBAR_SIMPLE,                MyFrame::InfoBarSimple)
+    EVT_MENU(DIALOGS_INFOBAR_ADVANCED,              MyFrame::InfoBarAdvanced)
+#endif // wxUSE_INFOBAR
 
 #if wxUSE_TEXTDLG
+    EVT_MENU(DIALOGS_LINE_ENTRY,                    MyFrame::LineEntry)
     EVT_MENU(DIALOGS_TEXT_ENTRY,                    MyFrame::TextEntry)
     EVT_MENU(DIALOGS_PASSWORD_ENTRY,                MyFrame::PasswordEntry)
 #endif // wxUSE_TEXTDLG
@@ -260,7 +278,32 @@ BEGIN_EVENT_TABLE(StdButtonSizerDialog, wxDialog)
     EVT_RADIOBUTTON(wxID_ANY, StdButtonSizerDialog::OnEvent)
 END_EVENT_TABLE()
 
-MyCanvas *myCanvas = (MyCanvas *) NULL;
+#if wxUSE_CMDLINE_PARSER
+
+#include "wx/cmdline.h"
+
+static const char *PROGRESS_SWITCH = "progress";
+
+void MyApp::OnInitCmdLine(wxCmdLineParser& parser)
+{
+    wxApp::OnInitCmdLine(parser);
+
+    parser.AddOption("", PROGRESS_SWITCH,
+                     "Style for the startup progress dialog (wxPD_XXX)",
+                     wxCMD_LINE_VAL_NUMBER);
+}
+
+bool MyApp::OnCmdLineParsed(wxCmdLineParser& parser)
+{
+    if ( !wxApp::OnCmdLineParsed(parser) )
+        return false;
+
+    parser.Found(PROGRESS_SWITCH, &m_startupProgressStyle);
+
+    return true;
+}
+
+#endif // wxUSE_CMDLINE_PARSER
 
 // `Main program' equivalent, creating windows and returning main app frame
 bool MyApp::OnInit()
@@ -268,21 +311,46 @@ bool MyApp::OnInit()
     if ( !wxApp::OnInit() )
         return false;
 
+#if wxUSE_PROGRESSDLG
+    if ( m_startupProgressStyle != -1 )
+    {
+        // Show a test progress dialog before the main event loop is started:
+        // it should still work.
+        const int PROGRESS_COUNT = 100;
+        wxProgressDialog dlg
+                         (
+                            "Progress in progress",
+                            "Please wait, starting...",
+                            PROGRESS_COUNT,
+                            NULL,
+                            m_startupProgressStyle
+                         );
+        for ( int i = 0; i <= PROGRESS_COUNT; i++ )
+        {
+            if ( !dlg.Update(i) )
+                break;
+
+            wxMilliSleep(50);
+        }
+    }
+#endif // wxUSE_PROGRESSDLG
+
 #if wxUSE_IMAGE
     wxInitAllImageHandlers();
 #endif
 
-    m_canvasTextColour = *wxBLACK;
-    m_canvasFont = *wxNORMAL_FONT;
-
     // Create the main frame window
-    MyFrame *frame = new MyFrame((wxFrame *) NULL, wxT("wxWidgets dialogs example"));
+    MyFrame *frame = new MyFrame(wxT("wxWidgets dialogs example"));
 
     // Make a menubar
     wxMenu *menuDlg = new wxMenu;
 
     menuDlg->Append(DIALOGS_MESSAGE_BOX, wxT("&Message box\tCtrl-M"));
+    menuDlg->Append(DIALOGS_MESSAGE_BOX_WINDOW_MODAL, wxT("Window-Modal Message box "));
     menuDlg->Append(DIALOGS_MESSAGE_DIALOG, wxT("Message dialog\tShift-Ctrl-M"));
+#if wxUSE_RICHMSGDLG
+    menuDlg->Append(DIALOGS_RICH_MESSAGE_DIALOG, wxT("Rich message dialog"));
+#endif // wxUSE_RICHMSGDLG
 
 
 #if wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
@@ -328,7 +396,8 @@ bool MyApp::OnInit()
     wxMenu *entry_menu = new wxMenu;
 
     #if wxUSE_TEXTDLG
-        entry_menu->Append(DIALOGS_TEXT_ENTRY,  wxT("Text &entry\tCtrl-E"));
+        entry_menu->Append(DIALOGS_LINE_ENTRY,  wxT("Single line &entry\tCtrl-E"));
+        entry_menu->Append(DIALOGS_TEXT_ENTRY,  wxT("Multi line text &entry\tShift-Ctrl-E"));
         entry_menu->Append(DIALOGS_PASSWORD_ENTRY,  wxT("&Password entry\tCtrl-P"));
     #endif // wxUSE_TEXTDLG
 
@@ -399,9 +468,14 @@ bool MyApp::OnInit()
        info_menu->Append(DIALOGS_LOG_DIALOG, wxT("&Log dialog\tCtrl-L"));
     #endif // wxUSE_LOG_DIALOG
 
+    #if wxUSE_INFOBAR
+       info_menu->Append(DIALOGS_INFOBAR_SIMPLE, "Simple &info bar\tCtrl-I");
+       info_menu->Append(DIALOGS_INFOBAR_ADVANCED, "&Advanced info bar\tShift-Ctrl-I");
+    #endif // wxUSE_INFOBAR
+
     #if wxUSE_MSGDLG
         info_menu->Append(DIALOGS_MESSAGE_BOX_WXINFO,
-                             wxT("&wxWidgets information\tCtrl-I"));
+                             wxT("&wxWidgets information\tCtrl-W"));
     #endif // wxUSE_MSGDLG
 
     menuDlg->Append(wxID_ANY,wxT("&Informative dialogs"),info_menu);
@@ -418,9 +492,9 @@ bool MyApp::OnInit()
 
     wxMenu *dialogs_menu = new wxMenu;
 #if USE_MODAL_PRESENTATION
-    dialogs_menu->Append(DIALOGS_MODAL, wxT("&Modal dialog\tCtrl-W"));
+    dialogs_menu->Append(DIALOGS_MODAL, wxT("&Modal dialog\tShift-Ctrl-W"));
 #endif // USE_MODAL_PRESENTATION
-    dialogs_menu->AppendCheckItem(DIALOGS_MODELESS, wxT("Mode&less dialog\tCtrl-Z"));
+    dialogs_menu->AppendCheckItem(DIALOGS_MODELESS, wxT("Mode&less dialog\tShift-Ctrl-Z"));
     dialogs_menu->Append(DIALOGS_CENTRE_SCREEN, wxT("Centered on &screen\tShift-Ctrl-1"));
     dialogs_menu->Append(DIALOGS_CENTRE_PARENT, wxT("Centered on &parent\tShift-Ctrl-2"));
 #if wxUSE_MINIFRAME
@@ -467,33 +541,40 @@ bool MyApp::OnInit()
     menuHelp->Append(DIALOGS_ABOUTDLG_CUSTOM, wxT("About (&custom)...\tCtrl-Shift-F1"));
 #endif // wxUSE_ABOUTDLG
 
+    wxMenu* editMenu = new wxMenu;
+    editMenu->Append(wxID_UNDO, _("&Undo\tCtrl+Z"));
+    editMenu->Append(wxID_REDO, _("&Redo\tCtrl+Y"));
+    editMenu->AppendSeparator();
+    editMenu->Append(wxID_CUT, _("Cu&t\tCtrl+X"));
+    editMenu->Append(wxID_COPY, _("&Copy\tCtrl+C"));
+    editMenu->Append(wxID_PASTE, _("&Paste\tCtrl+V"));
+    editMenu->Append(wxID_CLEAR, _("&Delete"));
+    
+    editMenu->AppendSeparator();
+    editMenu->Append(wxID_SELECTALL, _("Select All\tCtrl+A"));
+
     wxMenuBar *menubar = new wxMenuBar;
     menubar->Append(menuDlg, wxT("&Dialogs"));
+    
+    menubar->Append(editMenu, wxT("&Edit"));
+    
 #if wxUSE_ABOUTDLG
     menubar->Append(menuHelp, wxT("&Help"));
 #endif // wxUSE_ABOUTDLG
 
     frame->SetMenuBar(menubar);
 
-    myCanvas = new MyCanvas(frame);
-    myCanvas->SetBackgroundColour(*wxWHITE);
-
     frame->Centre(wxBOTH);
-
-    // Show the frame
     frame->Show(true);
 
-    SetTopWindow(frame);
-
     return true;
 }
 
 // My frame constructor
-MyFrame::MyFrame(wxWindow *parent,
-                 const wxString& title)
-       : wxFrame(parent, wxID_ANY, title)
+MyFrame::MyFrame(const wxString& title)
+       : wxFrame(NULL, wxID_ANY, title)
 {
-    SetIcon(sample_xpm);
+    SetIcon(wxICON(sample));
 
 #if USE_MODAL_PRESENTATION
     m_dialog = (MyModelessDialog *)NULL;
@@ -520,6 +601,53 @@ MyFrame::MyFrame(wxWindow *parent,
 #if wxUSE_STATUSBAR
     CreateStatusBar();
 #endif // wxUSE_STATUSBAR
+
+    m_canvas = new MyCanvas(this);
+
+#if wxUSE_INFOBAR
+    // an info bar can be created very simply and used without any extra effort
+    m_infoBarSimple = new wxInfoBar(this);
+
+    // or it can also be customized by
+    m_infoBarAdvanced = new wxInfoBar(this);
+
+    // ... adding extra buttons (but more than two will usually be too many)
+    m_infoBarAdvanced->AddButton(wxID_UNDO);
+    m_infoBarAdvanced->AddButton(wxID_REDO);
+
+    m_infoBarAdvanced->Connect(wxID_REDO, wxEVT_COMMAND_BUTTON_CLICKED,
+                                wxCommandEventHandler(MyFrame::OnInfoBarRedo),
+                                NULL,
+                                this);
+
+    // adding and removing a button immediately doesn't make sense here, of
+    // course, it's done just to show that it is possible
+    m_infoBarAdvanced->AddButton(wxID_EXIT);
+    m_infoBarAdvanced->RemoveButton(wxID_EXIT);
+
+    // ... changing the colours and/or fonts
+    m_infoBarAdvanced->SetOwnBackgroundColour(0xc8ffff);
+    m_infoBarAdvanced->SetFont(GetFont().Bold().Larger());
+
+    // ... and changing the effect (only does anything under MSW currently)
+    m_infoBarAdvanced->SetShowHideEffects(wxSHOW_EFFECT_EXPAND,
+                                          wxSHOW_EFFECT_EXPAND);
+    m_infoBarAdvanced->SetEffectDuration(1500);
+
+
+    // to use the info bars we need to use sizer for the window layout
+    wxBoxSizer * const sizer = new wxBoxSizer(wxVERTICAL);
+    sizer->Add(m_infoBarSimple, wxSizerFlags().Expand());
+    sizer->Add(m_canvas, wxSizerFlags(1).Expand());
+    sizer->Add(m_infoBarAdvanced, wxSizerFlags().Expand());
+    SetSizer(sizer);
+
+    // final touch: under MSW the info bars are shown progressively and parts
+    // of the parent window can be seen during the process, so use the same
+    // background colour for our background as for the canvas window which
+    // covers our entire client area to avoid jarring colour jumps
+    SetOwnBackgroundColour(m_canvas->GetBackgroundColour());
+#endif // wxUSE_INFOBAR
 }
 
 MyFrame::~MyFrame()
@@ -533,16 +661,16 @@ MyFrame::~MyFrame()
 
 void MyFrame::ChooseColour(wxCommandEvent& WXUNUSED(event))
 {
-    m_clrData.SetColour(myCanvas->GetBackgroundColour());
+    m_clrData.SetColour(m_canvas->GetBackgroundColour());
 
     wxColourDialog dialog(this, &m_clrData);
     dialog.SetTitle(_("Please choose the background colour"));
     if ( dialog.ShowModal() == wxID_OK )
     {
         m_clrData = dialog.GetColourData();
-        myCanvas->SetBackgroundColour(m_clrData.GetColour());
-        myCanvas->ClearBackground();
-        myCanvas->Refresh();
+        m_canvas->SetBackgroundColour(m_clrData.GetColour());
+        m_canvas->ClearBackground();
+        m_canvas->Refresh();
     }
 }
 
@@ -551,13 +679,13 @@ void MyFrame::GetColour(wxCommandEvent& WXUNUSED(event))
     wxColour clr = wxGetColourFromUser
                    (
                     this,
-                    wxGetApp().m_canvasTextColour,
+                    m_canvas->GetForegroundColour(),
                     "Please choose the foreground colour"
                    );
     if ( clr.IsOk() )
     {
-        wxGetApp().m_canvasTextColour = clr;
-        myCanvas->Refresh();
+        m_canvas->SetForegroundColour(clr);
+        m_canvas->Refresh();
     }
     //else: dialog cancelled by user
 }
@@ -568,7 +696,7 @@ void MyFrame::GetColour(wxCommandEvent& WXUNUSED(event))
 #if USE_COLOURDLG_GENERIC
 void MyFrame::ChooseColourGeneric(wxCommandEvent& WXUNUSED(event))
 {
-    m_clrData.SetColour(myCanvas->GetBackgroundColour());
+    m_clrData.SetColour(m_canvas->GetBackgroundColour());
 
     //FIXME:TODO:This has no effect...
     m_clrData.SetChooseFull(true);
@@ -587,9 +715,9 @@ void MyFrame::ChooseColourGeneric(wxCommandEvent& WXUNUSED(event))
     if (dialog->ShowModal() == wxID_OK)
     {
         m_clrData = dialog->GetColourData();
-        myCanvas->SetBackgroundColour(m_clrData.GetColour());
-        myCanvas->ClearBackground();
-        myCanvas->Refresh();
+        m_canvas->SetBackgroundColour(m_clrData.GetColour());
+        m_canvas->ClearBackground();
+        m_canvas->Refresh();
     }
     dialog->Destroy();
 }
@@ -599,8 +727,8 @@ void MyFrame::ChooseColourGeneric(wxCommandEvent& WXUNUSED(event))
 void MyFrame::ChooseFont(wxCommandEvent& WXUNUSED(event) )
 {
     wxFontData data;
-    data.SetInitialFont(wxGetApp().m_canvasFont);
-    data.SetColour(wxGetApp().m_canvasTextColour);
+    data.SetInitialFont(m_canvas->GetFont());
+    data.SetColour(m_canvas->GetForegroundColour());
 
     // you might also do this:
     //
@@ -612,9 +740,9 @@ void MyFrame::ChooseFont(wxCommandEvent& WXUNUSED(event) )
     if (dialog.ShowModal() == wxID_OK)
     {
         wxFontData retData = dialog.GetFontData();
-        wxGetApp().m_canvasFont = retData.GetChosenFont();
-        wxGetApp().m_canvasTextColour = retData.GetColour();
-        myCanvas->Refresh();
+        m_canvas->SetFont(retData.GetChosenFont());
+        m_canvas->SetForegroundColour(retData.GetColour());
+        m_canvas->Refresh();
     }
     //else: cancelled by the user, don't change the font
 }
@@ -624,16 +752,16 @@ void MyFrame::ChooseFont(wxCommandEvent& WXUNUSED(event) )
 void MyFrame::ChooseFontGeneric(wxCommandEvent& WXUNUSED(event) )
 {
     wxFontData data;
-    data.SetInitialFont(wxGetApp().m_canvasFont);
-    data.SetColour(wxGetApp().m_canvasTextColour);
+    data.SetInitialFont(m_canvas->GetFont());
+    data.SetColour(m_canvas->GetForegroundColour());
 
     wxGenericFontDialog *dialog = new wxGenericFontDialog(this, data);
     if (dialog->ShowModal() == wxID_OK)
     {
         wxFontData retData = dialog->GetFontData();
-        wxGetApp().m_canvasFont = retData.GetChosenFont();
-        wxGetApp().m_canvasTextColour = retData.GetColour();
-        myCanvas->Refresh();
+        m_canvas->SetFont(retData.GetChosenFont());
+        m_canvas->SetForegroundColour(retData.GetColour());
+        m_canvas->Refresh();
     }
     dialog->Destroy();
 }
@@ -663,6 +791,30 @@ void MyFrame::LogDialog(wxCommandEvent& WXUNUSED(event))
 }
 #endif // wxUSE_LOG_DIALOG
 
+#if wxUSE_INFOBAR
+
+void MyFrame::InfoBarSimple(wxCommandEvent& WXUNUSED(event))
+{
+    static int s_count = 0;
+    m_infoBarSimple->ShowMessage
+                     (
+                      wxString::Format("Message #%d in the info bar.", ++s_count)
+                     );
+}
+
+void MyFrame::InfoBarAdvanced(wxCommandEvent& WXUNUSED(event))
+{
+    m_infoBarAdvanced->ShowMessage("Sorry, it didn't work out.", wxICON_WARNING);
+}
+
+void MyFrame::OnInfoBarRedo(wxCommandEvent& WXUNUSED(event))
+{
+    m_infoBarAdvanced->ShowMessage("Still no, sorry again.", wxICON_ERROR);
+}
+
+#endif // wxUSE_INFOBAR
+
+
 #if wxUSE_MSGDLG
 void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event))
 {
@@ -677,6 +829,54 @@ void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event))
 
     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() )
+    {
+        case wxID_YES:
+            wxLogStatus(wxT("You pressed \"Yes\""));
+            break;
+
+        case wxID_NO:
+            wxLogStatus(wxT("You pressed \"No\""));
+            break;
+
+        case wxID_CANCEL:
+            wxLogStatus(wxT("You pressed \"Cancel\""));
+            break;
+
+        default:
+            wxLogError(wxT("Unexpected wxMessageDialog return code!"));
+    }
+}
+
+void MyFrame::MessageBoxWindowModal(wxCommandEvent& WXUNUSED(event))
+{
+    wxMessageDialog* dialog = new wxMessageDialog(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",
@@ -691,9 +891,15 @@ void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event))
         extmsg = "Custom button labels are not supported on this platform,\n"
                  "so the default \"Yes\"/\"No\"/\"Cancel\" buttons are used.";
     }
-    dialog.SetExtendedMessage(extmsg);
+    dialog->SetExtendedMessage(extmsg);
+    dialog->Connect( wxEVT_WINDOW_MODAL_DIALOG_CLOSED, wxWindowModalDialogEventHandler(MyFrame::MessageBoxWindowModalClosed), NULL, this );
+    dialog->ShowWindowModal();
+}
 
-    switch ( dialog.ShowModal() )
+void MyFrame::MessageBoxWindowModalClosed(wxWindowModalDialogEvent& event)
+{
+    wxDialog* dialog = event.GetDialog();
+    switch ( dialog->GetReturnCode() )
     {
         case wxID_YES:
             wxLogStatus(wxT("You pressed \"Yes\""));
@@ -710,11 +916,13 @@ void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event))
         default:
             wxLogError(wxT("Unexpected wxMessageDialog return code!"));
     }
+    delete dialog;
 }
 
 void MyFrame::MessageBoxDialog(wxCommandEvent& WXUNUSED(event))
 {
     TestMessageBoxDialog dlg(this);
+    dlg.Create();
     dlg.ShowModal();
 }
 
@@ -724,6 +932,15 @@ void MyFrame::MessageBoxInfo(wxCommandEvent& WXUNUSED(event))
 }
 #endif // wxUSE_MSGDLG
 
+#if wxUSE_RICHMSGDLG
+void MyFrame::RichMessageDialog(wxCommandEvent& WXUNUSED(event))
+{
+    TestRichMessageDialog dlg(this);
+    dlg.Create();
+    dlg.ShowModal();
+}
+#endif // wxUSE_RICHMSGDLG
+
 #if wxUSE_NUMBERDLG
 void MyFrame::NumericEntry(wxCommandEvent& WXUNUSED(event))
 {
@@ -763,7 +980,7 @@ void MyFrame::PasswordEntry(wxCommandEvent& WXUNUSED(event))
     }
 }
 
-void MyFrame::TextEntry(wxCommandEvent& WXUNUSED(event))
+void MyFrame::LineEntry(wxCommandEvent& WXUNUSED(event))
 {
     wxTextEntryDialog dialog(this,
                              wxT("This is a small sample\n")
@@ -777,6 +994,19 @@ void MyFrame::TextEntry(wxCommandEvent& WXUNUSED(event))
         wxMessageBox(dialog.GetValue(), wxT("Got string"), wxOK | wxICON_INFORMATION, this);
     }
 }
+
+void MyFrame::TextEntry(wxCommandEvent& WXUNUSED(event))
+{
+    wxTextEntryDialog dialog(this, "You can enter a multiline string here.",
+                             "Please enter some text",
+                             "First line\nSecond one\nAnd another one too",
+                             wxOK | wxCANCEL | wxTE_MULTILINE);
+
+    if (dialog.ShowModal() == wxID_OK)
+    {
+        wxMessageBox(dialog.GetValue(), wxT("Got text"), wxOK | wxICON_INFORMATION, this);
+    }
+}
 #endif // wxUSE_TEXTDLG
 
 #if wxUSE_CHOICEDLG
@@ -1607,25 +1837,26 @@ void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
 {
     static const int max = 100;
 
-    wxProgressDialog dialog(wxT("Progress dialog example"),
-                            wxT("An informative message"),
+    wxProgressDialog dialog("Progress dialog example",
+                            // "Reserve" enough space for the multiline
+                            // messages below, we'll change it anyhow
+                            // immediately in the loop below
+                            wxString(' ', 100) + "\n\n\n\n",
                             max,    // range
                             this,   // parent
                             wxPD_CAN_ABORT |
                             wxPD_CAN_SKIP |
                             wxPD_APP_MODAL |
-                            // wxPD_AUTO_HIDE | -- try this as well
+                            //wxPD_AUTO_HIDE | // -- try this as well
                             wxPD_ELAPSED_TIME |
                             wxPD_ESTIMATED_TIME |
-                            wxPD_REMAINING_TIME
-                            wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small
+                            wxPD_REMAINING_TIME |
+                            wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small
                             );
 
     bool cont = true;
     for ( int i = 0; i <= max; i++ )
     {
-        wxMilliSleep(200);
-
         wxString msg;
 
         // test both modes of wxProgressDialog behaviour: start in
@@ -1634,15 +1865,25 @@ void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
 
         if ( i == max )
         {
-            msg = wxT("That's all, folks!");
+            msg = "That's all, folks!\n"
+                  "\n"
+                  "Nothing to see here any more.";
         }
         else if ( !determinate )
         {
-            msg = wxT("Testing indeterminate mode");
+            msg = "Testing indeterminate mode\n"
+                  "\n"
+                  "This mode allows you to show to the user\n"
+                  "that something is going on even if you don't know\n"
+                  "when exactly will you finish.";
         }
         else if ( determinate )
         {
-            msg = wxT("Now in standard determinate mode");
+            msg = "Now in standard determinate mode\n"
+                  "\n"
+                  "This is the standard usage mode in which you\n"
+                  "update the dialog after performing each new step of work.\n"
+                  "It requires knowing the total number of steps in advance.";
         }
 
         // will be set to true if "Skip" button was pressed
@@ -1658,8 +1899,13 @@ void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
 
         // each skip will move progress about quarter forward
         if ( skip )
+        {
             i += max/4;
 
+            if ( i >= 100 )
+                i = 99;
+        }
+
         if ( !cont )
         {
             if ( wxMessageBox(wxT("Do you really want to cancel?"),
@@ -1670,6 +1916,8 @@ void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
             cont = true;
             dialog.Resume();
         }
+
+        wxMilliSleep(200);
     }
 
     if ( !cont )
@@ -1689,7 +1937,13 @@ void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
 static void InitAboutInfoMinimal(wxAboutDialogInfo& info)
 {
     info.SetName(wxT("Dialogs Sample"));
-    info.SetVersion(wxVERSION_NUM_DOT_STRING_T);
+    info.SetVersion(wxVERSION_NUM_DOT_STRING,
+                    wxString::Format
+                    (
+                        "%s version %s",
+                        wxMINOR_VERSION % 2 ? "Development" : "Stable",
+                        wxVERSION_NUM_DOT_STRING
+                    ));
     info.SetDescription(wxT("This sample shows different wxWidgets dialogs"));
     info.SetCopyright(wxT("(C) 1998-2006 wxWidgets dev team"));
     info.AddDeveloper(wxT("Vadim Zeitlin"));
@@ -1814,8 +2068,7 @@ void MyFrame::ShowReplaceDialog( wxCommandEvent& WXUNUSED(event) )
 {
     if ( m_dlgReplace )
     {
-        delete m_dlgReplace;
-        m_dlgReplace = NULL;
+        wxDELETE(m_dlgReplace);
     }
     else
     {
@@ -1835,8 +2088,7 @@ void MyFrame::ShowFindDialog( wxCommandEvent& WXUNUSED(event) )
 {
     if ( m_dlgFind )
     {
-        delete m_dlgFind;
-        m_dlgFind = NULL;
+        wxDELETE(m_dlgFind);
     }
     else
     {
@@ -1934,8 +2186,6 @@ void MyFrame::OnFindDialog(wxFindDialogEvent& event)
 void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event) )
 {
     wxPaintDC dc(this);
-    dc.SetFont(wxGetApp().m_canvasFont);
-    dc.SetTextForeground(wxGetApp().m_canvasTextColour);
     dc.SetBackgroundMode(wxTRANSPARENT);
     dc.DrawText(
                 wxT("wxWidgets common dialogs")
@@ -2014,9 +2264,7 @@ void MyModalDialog::OnButton(wxCommandEvent& event)
 {
     if ( event.GetEventObject() == m_btnDelete )
     {
-        delete m_btnModal;
-        m_btnModal = NULL;
-
+        wxDELETE(m_btnModal);
         m_btnDelete->Disable();
     }
     else if ( event.GetEventObject() == m_btnModal )
@@ -2384,6 +2632,9 @@ wxPanel* SettingsDialog::CreateAestheticSettingsPage(wxWindow* parent)
     return panel;
 }
 
+#endif // USE_SETTINGS_DIALOG
+
+#if wxUSE_MSGDLG
 // ----------------------------------------------------------------------------
 // TestMessageBoxDialog
 // ----------------------------------------------------------------------------
@@ -2406,6 +2657,10 @@ TestMessageBoxDialog::TestMessageBoxDialog(wxWindow *parent)
                     : wxDialog(parent, wxID_ANY, "Message Box Test Dialog",
                                wxDefaultPosition, wxDefaultSize,
                                wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+{
+}
+
+bool TestMessageBoxDialog::Create()
 {
     wxSizer * const sizerTop = new wxBoxSizer(wxVERTICAL);
 
@@ -2426,8 +2681,13 @@ TestMessageBoxDialog::TestMessageBoxDialog(wxWindow *parent)
 
     sizerTop->Add(sizerMsgs, wxSizerFlags(1).Expand().Border());
 
+    // if a derived class provides more message configurations, add these.
+    AddAdditionalTextOptions(sizerTop);
 
     // this one is for configuring the buttons
+    wxSizer * const
+    sizerBtnsBox = new wxStaticBoxSizer(wxVERTICAL, this, "&Buttons");
+
     wxFlexGridSizer * const sizerBtns = new wxFlexGridSizer(2, 5, 5);
     sizerBtns->AddGrowableCol(1);
 
@@ -2449,22 +2709,29 @@ TestMessageBoxDialog::TestMessageBoxDialog(wxWindow *parent)
                              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"
+    const wxString icons[] =
+    {
+        "&Not specified",
+        "E&xplicitly none",
+        "&Information icon",
+        "&Question icon",
+        "&Warning icon",
+        "&Error icon"
     };
 
-    m_icons = new wxRadioBox(this, wxID_ANY, "&Icons",
+   wxCOMPILE_TIME_ASSERT( WXSIZEOF(icons) == MsgDlgIcon_Max, IconMismatch );
+
+    m_icons = new wxRadioBox(this, wxID_ANY, "&Icon style",
                              wxDefaultPosition, wxDefaultSize,
-                             WXSIZEOF(icons), icons);
+                             WXSIZEOF(icons), icons,
+                             2, wxRA_SPECIFY_ROWS);
     // Make the 'Information' icon the default one:
-    m_icons->SetSelection(1);
+    m_icons->SetSelection(MsgDlgIcon_Info);
     sizerTop->Add(m_icons, wxSizerFlags().Expand().Border());
 
 
@@ -2483,6 +2750,9 @@ TestMessageBoxDialog::TestMessageBoxDialog(wxWindow *parent)
     m_chkCentre = new wxCheckBox(this, wxID_ANY, "Centre on &parent");
     sizerFlags->Add(m_chkCentre, wxSizerFlags(1).Border());
 
+    // add any additional flag from subclasses
+    AddAdditionalFlags(sizerFlags);
+
     sizerTop->Add(sizerFlags, wxSizerFlags().Expand().Border());
 
     // finally buttons to show the resulting message box and close this dialog
@@ -2492,6 +2762,8 @@ TestMessageBoxDialog::TestMessageBoxDialog(wxWindow *parent)
     SetSizerAndFit(sizerTop);
 
     m_buttons[Btn_Ok]->SetValue(true);
+
+    return true;
 }
 
 void TestMessageBoxDialog::OnUpdateLabelUI(wxUpdateUIEvent& event)
@@ -2513,7 +2785,7 @@ void TestMessageBoxDialog::OnUpdateNoDefaultUI(wxUpdateUIEvent& event)
     event.Enable( m_buttons[Btn_No]->IsChecked() );
 }
 
-void TestMessageBoxDialog::OnApply(wxCommandEvent& WXUNUSED(event))
+long TestMessageBoxDialog::GetStyle()
 {
     long style = 0;
 
@@ -2525,11 +2797,31 @@ void TestMessageBoxDialog::OnApply(wxCommandEvent& WXUNUSED(event))
 
     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;
+        case MsgDlgIcon_Max:
+            wxFAIL_MSG( "unexpected selection" );
+
+        case MsgDlgIcon_No:
+            break;
+
+        case MsgDlgIcon_None:
+            style |= wxICON_NONE;
+            break;
+
+        case MsgDlgIcon_Info:
+            style |= wxICON_INFORMATION;
+            break;
+
+        case MsgDlgIcon_Question:
+            style |= wxICON_QUESTION;
+            break;
+
+        case MsgDlgIcon_Warning:
+            style |= wxICON_WARNING;
+            break;
+
+        case MsgDlgIcon_Error:
+            style |= wxICON_ERROR;
+            break;
     }
 
     if ( m_chkCentre->IsChecked() )
@@ -2538,9 +2830,13 @@ void TestMessageBoxDialog::OnApply(wxCommandEvent& WXUNUSED(event))
     if ( m_chkNoDefault->IsEnabled() && m_chkNoDefault->IsChecked() )
         style |= wxNO_DEFAULT;
 
+    return style;
+}
+
+void TestMessageBoxDialog::PrepareMessageDialog(wxMessageDialogBase &dlg)
+{
+    long style = dlg.GetMessageDialogStyle();
 
-    wxMessageDialog dlg(this, m_textMsg->GetValue(), "Test Message Box",
-                        style);
     if ( !m_textExtMsg->IsEmpty() )
         dlg.SetExtendedMessage(m_textExtMsg->GetValue());
 
@@ -2570,6 +2866,12 @@ void TestMessageBoxDialog::OnApply(wxCommandEvent& WXUNUSED(event))
             dlg.SetOKLabel(m_labels[Btn_Ok]->GetValue());
         }
     }
+}
+
+void TestMessageBoxDialog::OnApply(wxCommandEvent& WXUNUSED(event))
+{
+    wxMessageDialog dlg(this, GetMessage(), "Test Message Box", GetStyle());
+    PrepareMessageDialog(dlg);
 
     dlg.ShowModal();
 }
@@ -2578,8 +2880,69 @@ void TestMessageBoxDialog::OnClose(wxCommandEvent& WXUNUSED(event))
 {
     EndModal(wxID_CANCEL);
 }
+#endif // wxUSE_MSGDLG
 
-#endif // USE_SETTINGS_DIALOG
+#if wxUSE_RICHMSGDLG
+// ----------------------------------------------------------------------------
+// TestRichMessageDialog
+// ----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(TestRichMessageDialog, TestMessageBoxDialog)
+    EVT_BUTTON(wxID_APPLY, TestRichMessageDialog::OnApply)
+END_EVENT_TABLE()
+
+TestRichMessageDialog::TestRichMessageDialog(wxWindow *parent)
+                     : TestMessageBoxDialog(parent)
+{
+    SetTitle("Rich Message Dialog Test Dialog");
+}
+
+void TestRichMessageDialog::AddAdditionalTextOptions(wxSizer *sizer)
+{
+    wxSizer * const sizerMsgs = new wxStaticBoxSizer(wxVERTICAL, this,
+                                                     "&Additional Elements");
+
+    // add a option to show a check box.
+    wxFlexGridSizer * const sizerCheckBox = new wxFlexGridSizer(2, 5, 5);
+    sizerCheckBox->AddGrowableCol(1);
+    sizerCheckBox->Add(new wxStaticText(this, wxID_ANY, "&Check box:"));
+    m_textCheckBox = new wxTextCtrl(this, wxID_ANY);
+    sizerCheckBox->Add(m_textCheckBox, wxSizerFlags(1).Expand().Border(wxBOTTOM));
+    sizerMsgs->Add(sizerCheckBox, wxSizerFlags(1).Expand());
+
+    // add option to show a detailed text.
+    sizerMsgs->Add(new wxStaticText(this, wxID_ANY, "&Detailed message:"));
+    m_textDetailed = new wxTextCtrl(this, wxID_ANY, "",
+                                    wxDefaultPosition, wxDefaultSize,
+                                    wxTE_MULTILINE);
+    sizerMsgs->Add(m_textDetailed, wxSizerFlags(1).Expand());
+
+    sizer->Add(sizerMsgs, wxSizerFlags(1).Expand().Border());
+}
+
+void TestRichMessageDialog::AddAdditionalFlags(wxSizer *sizer)
+{
+    // add checkbox to set the initial state for the checkbox shown
+    // in the dialog.
+    m_initialValueCheckBox =
+        new wxCheckBox(this, wxID_ANY, "Checkbox initially checked");
+    sizer->Add(m_initialValueCheckBox, wxSizerFlags(1).Border());
+}
+
+void TestRichMessageDialog::OnApply(wxCommandEvent& WXUNUSED(event))
+{
+    wxRichMessageDialog dlg(this, GetMessage(), "Test Rich Message Dialog",
+                            GetStyle());
+    PrepareMessageDialog(dlg);
+
+    dlg.ShowCheckBox(m_textCheckBox->GetValue(),
+                     m_initialValueCheckBox->GetValue());
+    dlg.ShowDetailedText(m_textDetailed->GetValue());
+
+    dlg.ShowModal();
+}
+
+#endif // wxUSE_RICHMSGDLG
 
 #if wxUSE_LOG