]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/wizard/wiztest.cpp
Corrected miniframe.
[wxWidgets.git] / samples / wizard / wiztest.cpp
index 4172763ded8cc31b2cccdaaf4a0eb14b3914b4d7..69f137a4f516582fbe9f7fef7ec58ba0242cd01c 100644 (file)
 
 #include "wx/wizard.h"
 
+#ifndef __WXMSW__
+    #include "wiztest.xpm"
+#endif
+
 // ----------------------------------------------------------------------------
 // private classes
 // ----------------------------------------------------------------------------
@@ -59,20 +63,20 @@ IMPLEMENT_APP(MyApp)
 // overriding TransferDataFromWindow() - of course, in a real program, the
 // check wouldn't be so trivial and the data will be probably saved somewhere
 // too
-class wxCheckboxPage : public wxPanel
+class wxValidationPage : public wxWizardPageSimple
 {
 public:
-    wxCheckboxPage(wxWizard *parent) : wxPanel(parent)
+    wxValidationPage(wxWizard *parent) : wxWizardPageSimple(parent)
     {
-        m_checkbox = new wxCheckBox(this, -1, "Check me", wxPoint(20, 20));
+        m_checkbox = new wxCheckBox(this, -1, "&Check me");
     }
 
     virtual bool TransferDataFromWindow()
     {
-        if ( m_checkbox->GetValue() )
+        if ( !m_checkbox->GetValue() )
         {
-            wxMessageBox("Clear the checkbox first", "No way",
-                         wxICON_WARNING, this);
+            wxMessageBox("Check the checkbox first!", "No way",
+                         wxICON_WARNING | wxOK, this);
 
             return FALSE;
         }
@@ -84,10 +88,108 @@ private:
     wxCheckBox *m_checkbox;
 };
 
+// This is a more complicated example of validity checking: using events we may
+// allow to return to the previous page, but not to proceed. It also
+// demonstrates how to intercept [Cancel] button press.
+class wxRadioboxPage : public wxWizardPageSimple
+{
+public:
+    // directions in which we allow the user to proceed from this page
+    enum
+    {
+        Forward, Backward, Both, Neither
+    };
+
+    wxRadioboxPage(wxWizard *parent) : wxWizardPageSimple(parent)
+    {
+        // should correspond to the enum above
+        static wxString choices[] = { "forward", "backward", "both", "neither" };
+
+        m_radio = new wxRadioBox(this, -1, "Allow to proceed:",
+                                 wxPoint(5, 5), wxDefaultSize,
+                                 WXSIZEOF(choices), choices,
+                                 1, wxRA_SPECIFY_COLS);
+        m_radio->SetSelection(Both);
+    }
+
+    // wizard event handlers
+    void OnWizardCancel(wxWizardEvent& event)
+    {
+        if ( wxMessageBox("Do you really want to cancel?", "Question",
+                          wxICON_QUESTION | wxYES_NO, this) != wxYES )
+        {
+            // not confirmed
+            event.Veto();
+        }
+    }
+
+    void OnWizardPageChanging(wxWizardEvent& event)
+    {
+        int sel = m_radio->GetSelection();
+
+        if ( sel == Both )
+            return;
+
+        if ( event.GetDirection() && sel == Forward )
+            return;
+
+        if ( !event.GetDirection() && sel == Backward )
+            return;
+
+        wxMessageBox("You can't go there", "Not allowed",
+                     wxICON_WARNING | wxOK, this);
+
+        event.Veto();
+    }
+
+private:
+    wxRadioBox *m_radio;
+
+    DECLARE_EVENT_TABLE()
+};
+
+// this shows how to dynamically (i.e. during run-time) arrange the page order
+class wxCheckboxPage : public wxWizardPage
+{
+public:
+    wxCheckboxPage(wxWizard *parent,
+                   wxWizardPage *prev,
+                   wxWizardPage *next)
+        : wxWizardPage(parent)
+    {
+        m_prev = prev;
+        m_next = next;
+
+        (void)new wxStaticText(this, -1, "Try checking the box below and\n"
+                                         "then going back and clearing it");
+
+        m_checkbox = new wxCheckBox(this, -1, "&Skip the next page",
+                                    wxPoint(5, 30));
+    }
+
+    // implement wxWizardPage functions
+    virtual wxWizardPage *GetPrev() const { return m_prev; }
+    virtual wxWizardPage *GetNext() const
+    {
+        return m_checkbox->GetValue() ? m_next->GetNext() : m_next;
+    }
+
+private:
+    wxWizardPage *m_prev,
+                 *m_next;
+
+    wxCheckBox *m_checkbox;
+};
+
 // ============================================================================
 // implementation
 // ============================================================================
 
+BEGIN_EVENT_TABLE(wxRadioboxPage, wxWizardPageSimple)
+    EVT_WIZARD_PAGE_CHANGING(-1, wxRadioboxPage::OnWizardPageChanging)
+    EVT_WIZARD_CANCEL(-1, wxRadioboxPage::OnWizardCancel)
+END_EVENT_TABLE()
+
 // ----------------------------------------------------------------------------
 // the application class
 // ----------------------------------------------------------------------------
@@ -95,27 +197,43 @@ private:
 // `Main program' equivalent: the program execution "starts" here
 bool MyApp::OnInit()
 {
+#ifdef __WXMSW__
     wxBitmap bmpWizard("wiztest.bmp", wxBITMAP_TYPE_BMP);
+#else
+    wxBitmap bmpWizard(wizimage);
+#endif
 
     wxWizard *wizard = wxWizard::Create(NULL, -1,
                                         "Absolutely Useless Wizard",
                                         bmpWizard);
 
-    wxPanel *panel = new wxPanel(wizard);
-    (void)new wxStaticText(panel, -1,
+    // a wizard page may be either an object of predefined class
+    wxWizardPageSimple *page1 = new wxWizardPageSimple(wizard);
+    (void)new wxStaticText(page1, -1,
                            "This wizard doesn't help you to do anything at "
                            "all.\n"
                            "\n"
                            "The next pages will present you with more useless "
                            "controls.");
-    wizard->AddPage(panel);
 
-    wizard->AddPage(new wxCheckboxPage(wizard));
+    // ... or a derived class
+    wxRadioboxPage *page3 = new wxRadioboxPage(wizard);
+    wxValidationPage *page4 = new wxValidationPage(wizard);
+
+    // set the page order using a convenience function - could also use
+    // SetNext/Prev directly as below
+    wxWizardPageSimple::Chain(page3, page4);
 
-    if ( wizard->RunWizard() )
+    // this page is not a wxWizardPageSimple, so we use SetNext/Prev to insert
+    // it into the chain of pages
+    wxCheckboxPage *page2 = new wxCheckboxPage(wizard, page1, page3);
+    page1->SetNext(page2);
+    page3->SetPrev(page2);
+
+    if ( wizard->RunWizard(page1) )
     {
         wxMessageBox("The wizard successfully completed", "That's all",
-                     wxICON_INFORMATION);
+                     wxICON_INFORMATION | wxOK);
     }
 
     wizard->Destroy();
@@ -123,3 +241,4 @@ bool MyApp::OnInit()
     // we're done
     return FALSE;
 }
+