From 36afbc42f89854985c77caed2922be038c4d0d01 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Sun, 18 Sep 2005 13:31:50 +0000 Subject: [PATCH] Corrected behaviour for modeless wizards -- can't detect modal/modeless state after EndModal is called. Future API might incorporate modal flag so wxWizard can do the right thing. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35564 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/wizard/wizard.cpp | 44 ++++++++++++++++++++++++++++++++++----- src/generic/wizard.cpp | 10 --------- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/samples/wizard/wizard.cpp b/samples/wizard/wizard.cpp index 54f826c2ab..6446873f84 100644 --- a/samples/wizard/wizard.cpp +++ b/samples/wizard/wizard.cpp @@ -67,6 +67,7 @@ public: virtual bool OnInit(); }; +class MyWizard; class MyFrame : public wxFrame { public: @@ -80,9 +81,14 @@ public: void OnWizardCancel(wxWizardEvent& event); void OnWizardFinished(wxWizardEvent& event); + // Only required for modeless wizards, to implement destruction; + // if using modal wizards, you can rely on the default behaviour. + void OnCancel(wxCommandEvent& event); private: // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() + + MyWizard* m_wizard; }; // ---------------------------------------------------------------------------- @@ -93,10 +99,15 @@ class MyWizard : public wxWizard { public: MyWizard(wxFrame *frame); + void RunIt(bool modal); + // Is the wizard being invoked modally? + bool GetModalWizard() const { return m_isModal; } + private: wxWizardPageSimple *m_page1; + bool m_isModal; }; // ---------------------------------------------------------------------------- @@ -318,6 +329,8 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_WIZARD_CANCEL(wxID_ANY, MyFrame::OnWizardCancel) EVT_WIZARD_FINISHED(wxID_ANY, MyFrame::OnWizardFinished) + + EVT_BUTTON(wxID_CANCEL, MyFrame::OnCancel) END_EVENT_TABLE() BEGIN_EVENT_TABLE(wxRadioboxPage, wxWizardPageSimple) @@ -347,12 +360,14 @@ bool MyApp::OnInit() // ---------------------------------------------------------------------------- // MyWizard // ---------------------------------------------------------------------------- - + MyWizard::MyWizard(wxFrame *frame) :wxWizard(frame,wxID_ANY,_T("Absolutely Useless Wizard"), wxBitmap(wiztest_xpm),wxDefaultPosition, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) { + m_isModal = false; + // a wizard page may be either an object of predefined class m_page1 = new wxWizardPageSimple(this); @@ -383,12 +398,12 @@ MyWizard::MyWizard(wxFrame *frame) void MyWizard::RunIt(bool modal) { + m_isModal = modal; if ( modal ) { if ( RunWizard(m_page1) ) { - wxMessageBox(_T("The wizard successfully completed"), _T("That's all"), - wxICON_INFORMATION | wxOK); + // Success } Destroy(); @@ -409,6 +424,8 @@ MyFrame::MyFrame(const wxString& title) :wxFrame((wxFrame *)NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150)) // small frame { + m_wizard = NULL; + wxMenu *menuFile = new wxMenu; menuFile->Append(Wizard_RunModal, _T("&Run wizard modal...\tCtrl-R")); menuFile->Append(Wizard_RunModeless, _T("&Run wizard modeless...")); @@ -447,13 +464,17 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnRunWizard(wxCommandEvent& event) { - MyWizard *wizard = new MyWizard(this); + m_wizard = new MyWizard(this); - wizard->RunIt( event.GetId() == Wizard_RunModal ); + m_wizard->RunIt( event.GetId() == Wizard_RunModal ); } void MyFrame::OnWizardFinished(wxWizardEvent& WXUNUSED(event)) { + if (!m_wizard->GetModalWizard()) + m_wizard->Destroy(); + m_wizard = NULL; + wxMessageBox(wxT("The wizard finished successfully."), wxT("Wizard notification")); } @@ -461,3 +482,16 @@ void MyFrame::OnWizardCancel(wxWizardEvent& WXUNUSED(event)) { wxMessageBox(wxT("The wizard was cancelled."), wxT("Wizard notification")); } + +void MyFrame::OnCancel(wxCommandEvent& WXUNUSED(event)) +{ + // Destroy a modeless wizard here - we can't destroy it in OnWizardCancel + // since the wxWizard object is still in use when that event is sent. + + if (!m_wizard->GetModalWizard()) + m_wizard->Destroy(); + else + m_wizard->EndModal(wxID_CANCEL); + + m_wizard = NULL; +} diff --git a/src/generic/wizard.cpp b/src/generic/wizard.cpp index 5656355235..71305e8ffa 100644 --- a/src/generic/wizard.cpp +++ b/src/generic/wizard.cpp @@ -801,16 +801,6 @@ void wxWizard::OnWizEvent(wxWizardEvent& event) event.Skip(); } } - - if ( !IsModal() && - event.IsAllowed() && - ( event.GetEventType() == wxEVT_WIZARD_FINISHED || - event.GetEventType() == wxEVT_WIZARD_CANCEL - ) - ) - { - Destroy(); - } } // ----------------------------------------------------------------------------