X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8a7dfb14a28a1a3f56d287bec54f94ca6590a4dc..fd78ef4715d4afe60a2ddb4bc4080af24ce7946d:/samples/wizard/wizard.cpp diff --git a/samples/wizard/wizard.cpp b/samples/wizard/wizard.cpp index 8e10fe0921..fcbcdb6b8f 100644 --- a/samples/wizard/wizard.cpp +++ b/samples/wizard/wizard.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: wizard.cpp -// Purpose: wxWindows sample demonstrating wxWizard control +// Purpose: wxWidgets sample demonstrating wxWizard control // Author: Vadim Zeitlin // Modified by: Robert Vazan (sizers) // Created: 15.08.99 @@ -26,22 +26,25 @@ // for all others, include the necessary headers #ifndef WX_PRECOMP + #include "wx/frame.h" #include "wx/stattext.h" #include "wx/log.h" #include "wx/app.h" #include "wx/checkbox.h" + #include "wx/checklst.h" #include "wx/msgdlg.h" #include "wx/radiobox.h" #include "wx/menu.h" #include "wx/sizer.h" #endif +#include "wx/textctrl.h" #include "wx/wizard.h" -#ifndef __WXMSW__ - #include "wiztest.xpm" - #include "wiztest2.xpm" -#endif +#include "wiztest.xpm" +#include "wiztest2.xpm" + +#include "../sample.xpm" // ---------------------------------------------------------------------------- // constants @@ -50,9 +53,15 @@ // ids for menu items enum { - Wizard_Quit = 100, - Wizard_Run, - Wizard_About = 1000 + Wizard_About = wxID_ABOUT, + Wizard_Quit = wxID_EXIT, + Wizard_RunModal = wxID_HIGHEST, + + Wizard_RunNoSizer, + Wizard_RunModeless, + + Wizard_LargeWizard, + Wizard_ExpandBitmap }; // ---------------------------------------------------------------------------- @@ -77,38 +86,55 @@ public: void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); void OnRunWizard(wxCommandEvent& event); + void OnRunWizardNoSizer(wxCommandEvent& event); + void OnRunWizardModeless(wxCommandEvent& event); void OnWizardCancel(wxWizardEvent& event); void OnWizardFinished(wxWizardEvent& event); private: - // any class wishing to process wxWindows events must use this macro + // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; +// ---------------------------------------------------------------------------- +// our wizard +// ---------------------------------------------------------------------------- + +class MyWizard : public wxWizard +{ +public: + MyWizard(wxFrame *frame, bool useSizer = true); + + wxWizardPage *GetFirstPage() const { return m_page1; } + +private: + wxWizardPageSimple *m_page1; +}; + // ---------------------------------------------------------------------------- // some pages for our wizard // ---------------------------------------------------------------------------- -// this shows how to simply control the validity of the user input by just +// This shows how to simply control the validity of the user input by just // overriding TransferDataFromWindow() - of course, in a real program, the // check wouldn't be so trivial and the data will be probably saved somewhere -// too +// too. // -// it also shows how to use a different bitmap for one of the pages +// It also shows how to use a different bitmap for one of the pages. class wxValidationPage : public wxWizardPageSimple { public: wxValidationPage(wxWizard *parent) : wxWizardPageSimple(parent) { - m_bitmap = wxBITMAP(wiztest2); + m_bitmap = wxBitmap(wiztest2_xpm); + + m_checkbox = new wxCheckBox(this, wxID_ANY, wxT("&Check me")); - m_checkbox = new wxCheckBox(this, -1, _T("&Check me")); - wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL); mainSizer->Add( - new wxStaticText(this, -1, - _T("You need to check the checkbox\n") - _T("below before going to the next page\n")), + new wxStaticText(this, wxID_ANY, + wxT("You need to check the checkbox\n") + wxT("below before going to the next page\n")), 0, wxALL, 5 @@ -120,21 +146,20 @@ public: wxALL, 5 // Border ); - SetSizer(mainSizer); - mainSizer->Fit(this); + SetSizerAndFit(mainSizer); } virtual bool TransferDataFromWindow() { if ( !m_checkbox->GetValue() ) { - wxMessageBox(_T("Check the checkbox first!"), _T("No way"), + wxMessageBox(wxT("Check the checkbox first!"), wxT("No way"), wxICON_WARNING | wxOK, this); - return FALSE; + return false; } - return TRUE; + return true; } private: @@ -159,17 +184,17 @@ public: // static wxString choices[] = { "forward", "backward", "both", "neither" }; // The above syntax can cause an internal compiler error with gcc. wxString choices[4]; - choices[0] = _T("forward"); - choices[1] = _T("backward"); - choices[2] = _T("both"); - choices[3] = _T("neither"); + choices[0] = wxT("forward"); + choices[1] = wxT("backward"); + choices[2] = wxT("both"); + choices[3] = wxT("neither"); - m_radio = new wxRadioBox(this, -1, _T("Allow to proceed:"), + m_radio = new wxRadioBox(this, wxID_ANY, wxT("Allow to proceed:"), wxDefaultPosition, wxDefaultSize, WXSIZEOF(choices), choices, 1, wxRA_SPECIFY_COLS); m_radio->SetSelection(Both); - + wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL); mainSizer->Add( m_radio, @@ -177,14 +202,14 @@ public: wxALL, 5 // Border ); - SetSizer(mainSizer); - mainSizer->Fit(this); + + SetSizerAndFit(mainSizer); } // wizard event handlers void OnWizardCancel(wxWizardEvent& event) { - if ( wxMessageBox(_T("Do you really want to cancel?"), _T("Question"), + if ( wxMessageBox(wxT("Do you really want to cancel?"), wxT("Question"), wxICON_QUESTION | wxYES_NO, this) != wxYES ) { // not confirmed @@ -205,7 +230,7 @@ public: if ( !event.GetDirection() && sel == Backward ) return; - wxMessageBox(_T("You can't go there"), _T("Not allowed"), + wxMessageBox(wxT("You can't go there"), wxT("Not allowed"), wxICON_WARNING | wxOK, this); event.Veto(); @@ -217,7 +242,7 @@ private: DECLARE_EVENT_TABLE() }; -// this shows how to dynamically (i.e. during run-time) arrange the page order +// This shows how to dynamically (i.e. during run-time) arrange the page order. class wxCheckboxPage : public wxWizardPage { public: @@ -228,27 +253,66 @@ public: { m_prev = prev; m_next = next; - + wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL); mainSizer->Add( - new wxStaticText(this, -1, _T("Try checking the box below and\n") - _T("then going back and clearing it")), + new wxStaticText(this, wxID_ANY, wxT("Try checking the box below and\n") + wxT("then going back and clearing it")), 0, // No vertical stretching wxALL, 5 // Border width ); - m_checkbox = new wxCheckBox(this, -1, _T("&Skip the next page")); + m_checkbox = new wxCheckBox(this, wxID_ANY, wxT("&Skip the next page")); mainSizer->Add( m_checkbox, 0, // No vertical stretching wxALL, 5 // Border width ); - - SetSizer(mainSizer); - mainSizer->Fit(this); + +#if wxUSE_CHECKLISTBOX + static const wxChar *aszChoices[] = + { + wxT("Zeroth"), + wxT("First"), + wxT("Second"), + wxT("Third"), + wxT("Fourth"), + wxT("Fifth"), + wxT("Sixth"), + wxT("Seventh"), + wxT("Eighth"), + wxT("Nineth") + }; + + m_checklistbox = new wxCheckListBox + ( + this, + wxID_ANY, + wxDefaultPosition, + wxSize(100,100), + wxArrayString(WXSIZEOF(aszChoices), aszChoices) + ); + + mainSizer->Add( + m_checklistbox, + 0, // No vertical stretching + wxALL, + 5 // Border width + ); +#endif // wxUSE_CHECKLISTBOX + + wxSize textSize = wxSize(150, 200); + if (((wxFrame*) wxTheApp->GetTopWindow())->GetMenuBar()->IsChecked(Wizard_LargeWizard)) + textSize = wxSize(150, wxGetClientDisplayRect().GetHeight() - 200); + + + wxTextCtrl* textCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, textSize, wxTE_MULTILINE); + mainSizer->Add(textCtrl, 0, wxALL|wxEXPAND, 5); + + SetSizerAndFit(mainSizer); } // implement wxWizardPage functions @@ -263,6 +327,9 @@ private: *m_next; wxCheckBox *m_checkbox; +#if wxUSE_CHECKLISTBOX + wxCheckListBox *m_checklistbox; +#endif }; // ============================================================================ @@ -274,17 +341,19 @@ private: // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(MyFrame, wxFrame) - EVT_MENU(Wizard_Quit, MyFrame::OnQuit) - EVT_MENU(Wizard_About, MyFrame::OnAbout) - EVT_MENU(Wizard_Run, MyFrame::OnRunWizard) - - EVT_WIZARD_CANCEL(-1, MyFrame::OnWizardCancel) - EVT_WIZARD_FINISHED(-1, MyFrame::OnWizardFinished) + EVT_MENU(Wizard_Quit, MyFrame::OnQuit) + EVT_MENU(Wizard_About, MyFrame::OnAbout) + EVT_MENU(Wizard_RunModal, MyFrame::OnRunWizard) + EVT_MENU(Wizard_RunNoSizer, MyFrame::OnRunWizardNoSizer) + EVT_MENU(Wizard_RunModeless, MyFrame::OnRunWizardModeless) + + EVT_WIZARD_CANCEL(wxID_ANY, MyFrame::OnWizardCancel) + EVT_WIZARD_FINISHED(wxID_ANY, MyFrame::OnWizardFinished) END_EVENT_TABLE() BEGIN_EVENT_TABLE(wxRadioboxPage, wxWizardPageSimple) - EVT_WIZARD_PAGE_CHANGING(-1, wxRadioboxPage::OnWizardPageChanging) - EVT_WIZARD_CANCEL(-1, wxRadioboxPage::OnWizardCancel) + EVT_WIZARD_PAGE_CHANGING(wxID_ANY, wxRadioboxPage::OnWizardPageChanging) + EVT_WIZARD_CANCEL(wxID_ANY, wxRadioboxPage::OnWizardCancel) END_EVENT_TABLE() IMPLEMENT_APP(MyApp) @@ -296,14 +365,69 @@ IMPLEMENT_APP(MyApp) // `Main program' equivalent: the program execution "starts" here bool MyApp::OnInit() { - MyFrame *frame = new MyFrame(_T("wxWizard Sample")); + if ( !wxApp::OnInit() ) + return false; + + MyFrame *frame = new MyFrame(wxT("wxWizard Sample")); // and show it (the frames, unlike simple controls, are not shown when // created initially) - frame->Show(TRUE); + frame->Show(true); // we're done - return TRUE; + return true; +} + +// ---------------------------------------------------------------------------- +// MyWizard +// ---------------------------------------------------------------------------- + +MyWizard::MyWizard(wxFrame *frame, bool useSizer) +{ + SetExtraStyle(wxWIZARD_EX_HELPBUTTON); + + Create(frame,wxID_ANY,wxT("Absolutely Useless Wizard"), + wxBitmap(wiztest_xpm),wxDefaultPosition, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER); + SetIcon(wxICON(sample)); + + // Allow the bitmap to be expanded to fit the page height + if (frame->GetMenuBar()->IsChecked(Wizard_ExpandBitmap)) + SetBitmapPlacement(wxWIZARD_VALIGN_CENTRE); + + // Enable scrolling adaptation + if (frame->GetMenuBar()->IsChecked(Wizard_LargeWizard)) + SetLayoutAdaptationMode(wxDIALOG_ADAPTATION_MODE_ENABLED); + + // a wizard page may be either an object of predefined class + m_page1 = new wxWizardPageSimple(this); + + /* wxStaticText *text = */ new wxStaticText(m_page1, wxID_ANY, + wxT("This wizard doesn't help you\nto do anything at all.\n") + wxT("\n") + wxT("The next pages will present you\nwith more useless controls."), + wxPoint(5,5) + ); + + // ... or a derived class + wxRadioboxPage *page3 = new wxRadioboxPage(this); + wxValidationPage *page4 = new wxValidationPage(this); + + // set the page order using a convenience function - could also use + // SetNext/Prev directly as below + wxWizardPageSimple::Chain(page3, page4); + + // this page is not a wxWizardPageSimple, so we use SetNext/Prev to insert + // it into the chain of pages + wxCheckboxPage *page2 = new wxCheckboxPage(this, m_page1, page3); + m_page1->SetNext(page2); + page3->SetPrev(page2); + + if ( useSizer ) + { + // allow the wizard to size itself around the pages + GetPageAreaSizer()->Add(m_page1); + } } // ---------------------------------------------------------------------------- @@ -311,92 +435,78 @@ bool MyApp::OnInit() // ---------------------------------------------------------------------------- MyFrame::MyFrame(const wxString& title) - : wxFrame((wxFrame *)NULL, -1, title, + :wxFrame((wxFrame *)NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150)) // small frame { wxMenu *menuFile = new wxMenu; - menuFile->Append(Wizard_Run, _T("&Run wizard...\tCtrl-R")); + menuFile->Append(Wizard_RunModal, wxT("&Run wizard modal...\tCtrl-R")); + menuFile->Append(Wizard_RunNoSizer, wxT("Run wizard &without sizer...")); + menuFile->Append(Wizard_RunModeless, wxT("Run wizard &modeless...")); menuFile->AppendSeparator(); - menuFile->Append(Wizard_Quit, _T("E&xit\tAlt-X"), _T("Quit this program")); + menuFile->Append(Wizard_Quit, wxT("E&xit\tAlt-X"), wxT("Quit this program")); + + wxMenu *menuOptions = new wxMenu; + menuOptions->AppendCheckItem(Wizard_LargeWizard, wxT("&Scroll Wizard Pages")); + menuOptions->AppendCheckItem(Wizard_ExpandBitmap, wxT("Si&ze Bitmap To Page")); wxMenu *helpMenu = new wxMenu; - helpMenu->Append(Wizard_About, _T("&About...\tF1"), _T("Show about dialog")); + helpMenu->Append(Wizard_About, wxT("&About\tF1"), wxT("Show about dialog")); // now append the freshly created menu to the menu bar... wxMenuBar *menuBar = new wxMenuBar(); - menuBar->Append(menuFile, _T("&File")); - menuBar->Append(helpMenu, _T("&Help")); + menuBar->Append(menuFile, wxT("&File")); + menuBar->Append(menuOptions, wxT("&Options")); + menuBar->Append(helpMenu, wxT("&Help")); // ... and attach this menu bar to the frame SetMenuBar(menuBar); // also create status bar which we use in OnWizardCancel +#if wxUSE_STATUSBAR CreateStatusBar(); +#endif // wxUSE_STATUSBAR } void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { - // TRUE is to force the frame to close - Close(TRUE); + // true is to force the frame to close + Close(true); } void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { - wxMessageBox(_T("Demo of wxWizard class\n") - _T("© 1999, 2000 Vadim Zeitlin"), - _T("About wxWizard sample"), wxOK | wxICON_INFORMATION, this); + wxMessageBox(wxT("Demo of wxWizard class\n") + wxT("(c) 1999, 2000 Vadim Zeitlin"), + wxT("About wxWizard sample"), wxOK | wxICON_INFORMATION, this); } void MyFrame::OnRunWizard(wxCommandEvent& WXUNUSED(event)) { - wxWizard *wizard = new wxWizard(this, -1, - _T("Absolutely Useless Wizard"), - wxBITMAP(wiztest), - wxDefaultPosition, - wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER); - - // a wizard page may be either an object of predefined class - wxWizardPageSimple *page1 = new wxWizardPageSimple(wizard); - wxStaticText *text = new wxStaticText(page1, -1, - _T("This wizard doesn't help you\nto do anything at all.\n") - _T("\n") - _T("The next pages will present you\nwith more useless controls."), - wxPoint(5,5) - ); - wxSize size = text->GetBestSize(); + MyWizard wizard(this); - // ... 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); + wizard.RunWizard(wizard.GetFirstPage()); +} - // 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); +void MyFrame::OnRunWizardNoSizer(wxCommandEvent& WXUNUSED(event)) +{ + MyWizard wizard(this, false); - wizard->SetPageSize(size); - wizard->GetPageAreaSizer()->Add(page1); - - if ( wizard->RunWizard(page1) ) - { - wxMessageBox(_T("The wizard successfully completed"), _T("That's all"), - wxICON_INFORMATION | wxOK); - } + wizard.RunWizard(wizard.GetFirstPage()); +} - wizard->Destroy(); +void MyFrame::OnRunWizardModeless(wxCommandEvent& WXUNUSED(event)) +{ + MyWizard *wizard = new MyWizard(this); + wizard->ShowPage(wizard->GetFirstPage()); + wizard->Show(true); } void MyFrame::OnWizardFinished(wxWizardEvent& WXUNUSED(event)) { - wxLogStatus(this, wxT("The wizard finished successfully.")); + wxMessageBox(wxT("The wizard finished successfully."), wxT("Wizard notification")); } void MyFrame::OnWizardCancel(wxWizardEvent& WXUNUSED(event)) { - wxLogStatus(this, wxT("The wizard was cancelled.")); + wxMessageBox(wxT("The wizard was cancelled."), wxT("Wizard notification")); }