X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b87654f3fd52a9b6c1ebf5a3ff57c85b6c5631d6..7140577b50f951b356cd07393fe970e76eeee88d:/samples/wizard/wiztest.cpp diff --git a/samples/wizard/wiztest.cpp b/samples/wizard/wiztest.cpp index df1c8f3aff..69f137a4f5 100644 --- a/samples/wizard/wiztest.cpp +++ b/samples/wizard/wiztest.cpp @@ -63,19 +63,19 @@ 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", + wxMessageBox("Check the checkbox first!", "No way", wxICON_WARNING | wxOK, this); return FALSE; @@ -88,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 // ---------------------------------------------------------------------------- @@ -109,18 +207,30 @@ bool MyApp::OnInit() "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 | wxOK); @@ -131,3 +241,4 @@ bool MyApp::OnInit() // we're done return FALSE; } +