X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b7e22e3d27626ad19815517d5385aafa0be9d06b..7ea1c917764fb2588fe1aadc75c49ba300f8cb2f:/src/generic/wizard.cpp diff --git a/src/generic/wizard.cpp b/src/generic/wizard.cpp index c3884c0771..4690af5eae 100644 --- a/src/generic/wizard.cpp +++ b/src/generic/wizard.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: generic/wizard.cpp +// Name: src/generic/wizard.cpp // Purpose: generic implementation of wxWizard class // Author: Vadim Zeitlin // Modified by: Robert Cavanaugh @@ -21,10 +21,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "wizardg.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -56,11 +52,21 @@ class wxWizardSizer : public wxSizer public: wxWizardSizer(wxWizard *owner); - void RecalcSizes(); - wxSize CalcMin(); + virtual wxSizerItem *Insert(size_t index, wxSizerItem *item); + + virtual void RecalcSizes(); + virtual wxSize CalcMin(); + // get the max size of all wizard pages wxSize GetMaxChildSize(); - int Border() const; + + // return the border which can be either set using wxWizard::SetBorder() or + // have default value + int GetBorder() const; + + // hide the pages which we temporarily "show" when they're added to this + // sizer (see Insert()) + void HidePages(); private: wxSize SiblingSize(wxSizerItem *child); @@ -172,18 +178,43 @@ wxWizardPage *wxWizardPageSimple::GetNext() const // ---------------------------------------------------------------------------- wxWizardSizer::wxWizardSizer(wxWizard *owner) - : m_owner(owner) + : m_owner(owner) { m_childSizeValid = false; } +wxSizerItem *wxWizardSizer::Insert(size_t index, wxSizerItem *item) +{ + if ( item->IsWindow() ) + { + // we must pretend that the window is shown as otherwise it wouldn't be + // taken into account for the layout -- but avoid really showing it, so + // just set the internal flag instead of calling wxWindow::Show() + item->GetWindow()->wxWindowBase::Show(); + } + + return wxSizer::Insert(index, item); +} + +void wxWizardSizer::HidePages() +{ + for ( wxSizerItemList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxSizerItem * const item = node->GetData(); + if ( item->IsWindow() ) + item->GetWindow()->wxWindowBase::Show(false); + } +} + void wxWizardSizer::RecalcSizes() { // Effect of this function depends on m_owner->m_page and // it should be called whenever it changes (wxWizard::ShowPage) if ( m_owner->m_page ) { - m_owner->m_page->SetSize(m_position.x,m_position.y, m_size.x,m_size.y); + m_owner->m_page->SetSize(m_position.x, m_position.y, m_size.x, m_size.y); } } @@ -231,7 +262,7 @@ wxSize wxWizardSizer::GetMaxChildSize() return maxOfMin; } -int wxWizardSizer::Border() const +int wxWizardSizer::GetBorder() const { if ( m_owner->m_calledSetBorder ) return m_owner->m_border; @@ -267,13 +298,6 @@ wxSize wxWizardSizer::SiblingSize(wxSizerItem *child) // 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; @@ -285,7 +309,7 @@ void wxWizard::Init() m_calledSetBorder = false; m_border = 0; m_started = false; - modelessWizards.Add(this); + m_wasModal = false; } bool wxWizard::Create(wxWindow *parent, @@ -400,7 +424,7 @@ void wxWizard::AddButtonRow(wxBoxSizer *mainColumn) // was created before the 'next' button. bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); - int buttonStyle = isPda ? wxBU_EXACTFIT : 0; + int buttonStyle = isPda ? wxBU_EXACTFIT : 0; wxBoxSizer *buttonRow = new wxBoxSizer(wxHORIZONTAL); #ifdef __WXMAC__ @@ -465,10 +489,10 @@ void wxWizard::DoCreateControls() return; bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); - + // Horizontal stretching, and if not PDA, border all around int mainColumnSizerFlags = isPda ? wxEXPAND : wxALL|wxEXPAND ; - + // wxWindow::SetSizer will be called at end wxBoxSizer *windowSizer = new wxBoxSizer(wxVERTICAL); @@ -481,10 +505,10 @@ void wxWizard::DoCreateControls() ); AddBitmapRow(mainColumn); - + if (!isPda) AddStaticLine(mainColumn); - + AddButtonRow(mainColumn); // wxWindow::SetSizer should be followed by wxWindow::Fit, but @@ -501,7 +525,7 @@ void wxWizard::SetPageSize(const wxSize& size) void wxWizard::FinishLayout() { bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); - + // Set to enable wxWizardSizer::GetMaxChildSize m_started = true; @@ -509,7 +533,7 @@ void wxWizard::FinishLayout() m_sizerPage, 1, // Horizontal stretching wxEXPAND | wxALL, // Vertically stretchable - m_sizerPage->Border() + m_sizerPage->GetBorder() ); if (!isPda) @@ -518,6 +542,10 @@ void wxWizard::FinishLayout() if ( m_posWizard == wxDefaultPosition ) CentreOnScreen(); } + + // now that our layout is computed correctly, hide the pages artificially + // shown in wxWizardSizer::Insert() back again + m_sizerPage->HidePages(); } void wxWizard::FitToPage(const wxWizardPage *page) @@ -668,7 +696,7 @@ bool wxWizard::RunWizard(wxWizardPage *firstPage) // can't return false here because there is no old page (void)ShowPage(firstPage, true /* forward */); - modelessWizards.Remove(this); + m_wasModal = true; return ShowModal() == wxID_OK; } @@ -710,7 +738,7 @@ wxSize wxWizard::GetManualPageSize() const DEFAULT_PAGE_WIDTH = wxSystemSettings::GetMetric(wxSYS_SCREEN_X) / 2; DEFAULT_PAGE_HEIGHT = wxSystemSettings::GetMetric(wxSYS_SCREEN_Y) / 2; } - + wxSize totalPageSize(DEFAULT_PAGE_WIDTH,DEFAULT_PAGE_HEIGHT); totalPageSize.IncTo(m_sizePage); @@ -752,10 +780,12 @@ void wxWizard::OnBackOrNext(wxCommandEvent& event) (event.GetEventObject() == m_btnPrev), wxT("unknown button") ); + wxCHECK_RET( m_page, _T("should have a valid current page") ); + // ask the current page first: notice that we do it before calling // GetNext/Prev() because the data transfered from the controls of the page // may change the value returned by these methods - if ( m_page && (!m_page->Validate() || !m_page->TransferDataFromWindow()) ) + if ( !m_page->Validate() || !m_page->TransferDataFromWindow() ) { // the page data is incorrect, don't do anything return; @@ -812,37 +842,17 @@ void wxWizard::OnWizEvent(wxWizardEvent& event) } } - if ( ( modelessWizards.Index(this) != wxNOT_FOUND ) && + if ( ( !m_wasModal ) && event.IsAllowed() && ( event.GetEventType() == wxEVT_WIZARD_FINISHED || event.GetEventType() == wxEVT_WIZARD_CANCEL ) ) { - modelessWizards.Remove(this); Destroy(); } } -// ---------------------------------------------------------------------------- -// our public interface -// ---------------------------------------------------------------------------- - -#if WXWIN_COMPATIBILITY_2_2 - -/* static */ -wxWizard *wxWizardBase::Create(wxWindow *parent, - int id, - const wxString& title, - const wxBitmap& bitmap, - const wxPoint& pos, - const wxSize& WXUNUSED(size)) -{ - return new wxWizard(parent, id, title, bitmap, pos); -} - -#endif // WXWIN_COMPATIBILITY_2_2 - // ---------------------------------------------------------------------------- // wxWizardEvent // ----------------------------------------------------------------------------