virtual bool OnInit();
};
-class MyWizard;
class MyFrame : public wxFrame
{
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;
};
// ----------------------------------------------------------------------------
{
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;
};
// ----------------------------------------------------------------------------
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)
// ----------------------------------------------------------------------------
// 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);
void MyWizard::RunIt(bool modal)
{
- m_isModal = modal;
if ( modal )
{
if ( RunWizard(m_page1) )
: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..."));
void MyFrame::OnRunWizard(wxCommandEvent& event)
{
- m_wizard = new MyWizard(this);
+ MyWizard *wizard = new MyWizard(this);
- m_wizard->RunIt( event.GetId() == Wizard_RunModal );
+ 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"));
}
{
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;
-}
// generic wxWizard implementation
// ----------------------------------------------------------------------------
+#if wxCHECK_VERSION(2, 7, 0)
+ #error "Fix wxGTK vs. wxMSW difference other way"
+#else
+ WX_DEFINE_ARRAY_PTR(wxWizard *, wxModelessWizards);
+ wxModelessWizards modelessWizards;
+#endif
+
void wxWizard::Init()
{
m_posWizard = wxDefaultPosition;
m_calledSetBorder = false;
m_border = 0;
m_started = false;
+ modelessWizards.Add(this);
}
bool wxWizard::Create(wxWindow *parent,
// can't return false here because there is no old page
(void)ShowPage(firstPage, true /* forward */);
+ modelessWizards.Remove(this);
+
return ShowModal() == wxID_OK;
}
event.Skip();
}
}
+
+ if ( !IsModal() &&
+ ( modelessWizards.Index(this) != wxNOT_FOUND ) &&
+ event.IsAllowed() &&
+ ( event.GetEventType() == wxEVT_WIZARD_FINISHED ||
+ event.GetEventType() == wxEVT_WIZARD_CANCEL
+ )
+ )
+ {
+ modelessWizards.Remove(this);
+ Destroy();
+ }
}
// ----------------------------------------------------------------------------