From: Włodzimierz Skiba Date: Fri, 15 Jul 2005 16:26:11 +0000 (+0000) Subject: Possibility of modeless wxWizard dialog (with presentation in sample). X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/b3eb133b51450e55a918b465a28bf2e11500fa24 Possibility of modeless wxWizard dialog (with presentation in sample). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34858 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index 17ffe9a691..396845dd50 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -13,6 +13,7 @@ All: All (GUI): - Added wxXmlResource::Unload() +- Possibility of modeless wxWizard dialog (with presentation in sample). wxMSW: diff --git a/include/wx/generic/wizard.h b/include/wx/generic/wizard.h index e5db3aa0e0..ee6185750a 100644 --- a/include/wx/generic/wizard.h +++ b/include/wx/generic/wizard.h @@ -86,8 +86,10 @@ private: void AddBackNextPair(wxBoxSizer *buttonRow); void AddButtonRow(wxBoxSizer *mainColumn); +protected: void FinishLayout(); +private: wxSize GetManualPageSize() const; // the page size requested by user diff --git a/samples/wizard/wizard.cpp b/samples/wizard/wizard.cpp index bba0ef2b18..54f826c2ab 100644 --- a/samples/wizard/wizard.cpp +++ b/samples/wizard/wizard.cpp @@ -49,9 +49,10 @@ // ids for menu items enum { - Wizard_Quit = 100, - Wizard_Run, - Wizard_About = 1000 + Wizard_Quit = wxID_EXIT, + Wizard_RunModal = wxID_HIGHEST, + Wizard_RunModeless, + Wizard_About = wxID_ABOUT }; // ---------------------------------------------------------------------------- @@ -84,6 +85,20 @@ private: DECLARE_EVENT_TABLE() }; +// ---------------------------------------------------------------------------- +// our wizard +// ---------------------------------------------------------------------------- + +class MyWizard : public wxWizard +{ +public: + MyWizard(wxFrame *frame); + void RunIt(bool modal); + +private: + wxWizardPageSimple *m_page1; +}; + // ---------------------------------------------------------------------------- // some pages for our wizard // ---------------------------------------------------------------------------- @@ -296,11 +311,12 @@ 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_MENU(Wizard_Quit, MyFrame::OnQuit) + EVT_MENU(Wizard_About, MyFrame::OnAbout) + EVT_MENU(Wizard_RunModal, MyFrame::OnRunWizard) + EVT_MENU(Wizard_RunModeless, MyFrame::OnRunWizard) - EVT_WIZARD_CANCEL(wxID_ANY, MyFrame::OnWizardCancel) + EVT_WIZARD_CANCEL(wxID_ANY, MyFrame::OnWizardCancel) EVT_WIZARD_FINISHED(wxID_ANY, MyFrame::OnWizardFinished) END_EVENT_TABLE() @@ -328,16 +344,74 @@ bool MyApp::OnInit() return true; } +// ---------------------------------------------------------------------------- +// MyWizard +// ---------------------------------------------------------------------------- + +MyWizard::MyWizard(wxFrame *frame) + :wxWizard(frame,wxID_ANY,_T("Absolutely Useless Wizard"), + wxBitmap(wiztest_xpm),wxDefaultPosition, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) +{ + // a wizard page may be either an object of predefined class + m_page1 = new wxWizardPageSimple(this); + + /* wxStaticText *text = */ new wxStaticText(m_page1, wxID_ANY, + _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) + ); + + // ... 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); + + // allow the wizard to size itself around the pages + GetPageAreaSizer()->Add(m_page1); +} + +void MyWizard::RunIt(bool modal) +{ + if ( modal ) + { + if ( RunWizard(m_page1) ) + { + wxMessageBox(_T("The wizard successfully completed"), _T("That's all"), + wxICON_INFORMATION | wxOK); + } + + Destroy(); + } + else + { + FinishLayout(); + ShowPage(m_page1); + Show(true); + } +} + // ---------------------------------------------------------------------------- // MyFrame // ---------------------------------------------------------------------------- MyFrame::MyFrame(const wxString& title) - : wxFrame((wxFrame *)NULL, wxID_ANY, 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, _T("&Run wizard modal...\tCtrl-R")); + menuFile->Append(Wizard_RunModeless, _T("&Run wizard modeless...")); menuFile->AppendSeparator(); menuFile->Append(Wizard_Quit, _T("E&xit\tAlt-X"), _T("Quit this program")); @@ -371,56 +445,19 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) _T("About wxWizard sample"), wxOK | wxICON_INFORMATION, this); } -void MyFrame::OnRunWizard(wxCommandEvent& WXUNUSED(event)) +void MyFrame::OnRunWizard(wxCommandEvent& event) { - wxWizard *wizard = new wxWizard(this, wxID_ANY, - _T("Absolutely Useless Wizard"), - wxBitmap(wiztest_xpm), - 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, wxID_ANY, - _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) - ); - - // ... 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); - - // 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); - - // allow the wizard to size itself around the pages - wizard->GetPageAreaSizer()->Add(page1); - - if ( wizard->RunWizard(page1) ) - { - wxMessageBox(_T("The wizard successfully completed"), _T("That's all"), - wxICON_INFORMATION | wxOK); - } + MyWizard *wizard = new MyWizard(this); - wizard->Destroy(); + wizard->RunIt( event.GetId() == Wizard_RunModal ); } 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")); } diff --git a/src/generic/wizard.cpp b/src/generic/wizard.cpp index 118c11e2c6..84f1f90ed5 100644 --- a/src/generic/wizard.cpp +++ b/src/generic/wizard.cpp @@ -480,6 +480,9 @@ void wxWizard::SetPageSize(const wxSize& size) void wxWizard::FinishLayout() { + // Set to enable wxWizardSizer::GetMaxChildSize + m_started = true; + m_sizerBmpAndPage->Add( m_sizerPage, 1, // Horizontal stretching @@ -555,7 +558,15 @@ bool wxWizard::ShowPage(wxWizardPage *page, bool goingForward) if ( !m_page ) { // terminate successfully - EndModal(wxID_OK); + if(IsModal()) + { + EndModal(wxID_OK); + } + else + { + SetReturnCode(wxID_OK); + Hide(); + } // and notify the user code (this is especially useful for modeless // wizards) @@ -625,9 +636,6 @@ bool wxWizard::RunWizard(wxWizardPage *firstPage) { wxCHECK_MSG( firstPage, false, wxT("can't run empty wizard") ); - // Set before FinishLayout to enable wxWizardSizer::GetMaxChildSize - m_started = true; - // This cannot be done sooner, because user can change layout options // up to this moment FinishLayout(); @@ -695,7 +703,15 @@ void wxWizard::OnCancel(wxCommandEvent& WXUNUSED(eventUnused)) if ( !win->GetEventHandler()->ProcessEvent(event) || event.IsAllowed() ) { // no objections - close the dialog - EndModal(wxID_CANCEL); + if(IsModal()) + { + EndModal(wxID_CANCEL); + } + else + { + SetReturnCode(wxID_CANCEL); + Hide(); + } } //else: request to Cancel ignored } @@ -755,14 +771,25 @@ void wxWizard::OnWizEvent(wxWizardEvent& event) { // the event will be propagated anyhow event.Skip(); - return; } + else + { + wxWindow *parent = GetParent(); - wxWindow *parent = GetParent(); + if ( !parent || !parent->GetEventHandler()->ProcessEvent(event) ) + { + event.Skip(); + } + } - if ( !parent || !parent->GetEventHandler()->ProcessEvent(event) ) + if ( !IsModal() && + event.IsAllowed() && + ( event.GetEventType() == wxEVT_WIZARD_FINISHED || + event.GetEventType() == wxEVT_WIZARD_CANCEL + ) + ) { - event.Skip(); + Destroy(); } } diff --git a/version-script.in b/version-script.in index 8c7ccdef4d..fa82a92ec3 100644 --- a/version-script.in +++ b/version-script.in @@ -1,6 +1,6 @@ # # $Id$ -# +# # Note: Remove all of the tags below except for the last one when creating # new development branch. @@ -17,6 +17,7 @@ wxEVT_SCROLL_CHANGED; *wxFileDialog*DoSetSize*; *wxDialog*GetEscapeId*; + *wxWizard*FinishLayout*; };