]> git.saurik.com Git - wxWidgets.git/commitdiff
Corrected behaviour for modeless wizards -- can't detect modal/modeless
authorJulian Smart <julian@anthemion.co.uk>
Sun, 18 Sep 2005 13:31:50 +0000 (13:31 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Sun, 18 Sep 2005 13:31:50 +0000 (13:31 +0000)
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
src/generic/wizard.cpp

index 54f826c2abc6dd4c4c6ddf7f78abd72d4ef4528d..6446873f84e802605a554a74559b5e3f0aa854a5 100644 (file)
@@ -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;
+}
index 56563552359cf576c3790ed250a406ad63e47bb4..71305e8ffaa40cbb183069abbfe6de0e92a3c9a7 100644 (file)
@@ -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();
-    }
 }
 
 // ----------------------------------------------------------------------------