X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ca65c0440a7163e4e37e48b1c4329709d722db47..04bf2fb51514e3ec8631a1d8ea1f610fca851005:/src/generic/wizard.cpp diff --git a/src/generic/wizard.cpp b/src/generic/wizard.cpp index 9beedbfa47..bc07fcce14 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" @@ -43,6 +39,7 @@ #include "wx/statline.h" #include "wx/sizer.h" +#include "wx/settings.h" #include "wx/wizard.h" @@ -277,6 +274,7 @@ void wxWizard::Init() m_calledSetBorder = false; m_border = 0; m_started = false; + m_wasModal = false; } bool wxWizard::Create(wxWindow *parent, @@ -390,7 +388,19 @@ void wxWizard::AddButtonRow(wxBoxSizer *mainColumn) // key to TAB to the next entry field and page. This would not be possible, if the 'back' button // was created before the 'next' button. + bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + int buttonStyle = isPda ? wxBU_EXACTFIT : 0; + wxBoxSizer *buttonRow = new wxBoxSizer(wxHORIZONTAL); +#ifdef __WXMAC__ + if (GetExtraStyle() & wxWIZARD_EX_HELPBUTTON) + mainColumn->Add( + buttonRow, + 0, // Vertically unstretchable + wxGROW|wxALIGN_CENTRE + ); + else +#endif mainColumn->Add( buttonRow, 0, // Vertically unstretchable @@ -399,20 +409,33 @@ void wxWizard::AddButtonRow(wxBoxSizer *mainColumn) // Desired TAB order is 'next', 'cancel', 'help', 'back'. This makes the 'back' button the last control on the page. // Create the buttons in the right order... - m_btnNext = new wxButton(this, wxID_FORWARD, _("&Next >")); - wxButton *btnCancel=new wxButton(this, wxID_CANCEL, _("&Cancel")); wxButton *btnHelp=0; +#ifdef __WXMAC__ if (GetExtraStyle() & wxWIZARD_EX_HELPBUTTON) - btnHelp=new wxButton(this, wxID_HELP, _("&Help")); - m_btnPrev = new wxButton(this, wxID_BACKWARD, _("< &Back")); + btnHelp=new wxButton(this, wxID_HELP, _("&Help"), wxDefaultPosition, wxDefaultSize, buttonStyle); +#endif + + m_btnNext = new wxButton(this, wxID_FORWARD, _("&Next >")); + wxButton *btnCancel=new wxButton(this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxDefaultSize, buttonStyle); +#ifndef __WXMAC__ + if (GetExtraStyle() & wxWIZARD_EX_HELPBUTTON) + btnHelp=new wxButton(this, wxID_HELP, _("&Help"), wxDefaultPosition, wxDefaultSize, buttonStyle); +#endif + m_btnPrev = new wxButton(this, wxID_BACKWARD, _("< &Back"), wxDefaultPosition, wxDefaultSize, buttonStyle); if (btnHelp) + { buttonRow->Add( btnHelp, 0, // Horizontally unstretchable wxALL, // Border all around, top aligned 5 // Border width - ); + ); +#ifdef __WXMAC__ + // Put stretchable space between help button and others + buttonRow->Add(0, 0, 1, wxALIGN_CENTRE, 0); +#endif + } AddBackNextPair(buttonRow); @@ -430,6 +453,11 @@ void wxWizard::DoCreateControls() if ( WasCreated() ) 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); @@ -437,12 +465,15 @@ void wxWizard::DoCreateControls() windowSizer->Add( mainColumn, 1, // Vertical stretching - wxALL | wxEXPAND, // Border all around, horizontal stretching + mainColumnSizerFlags, 5 // Border width ); AddBitmapRow(mainColumn); - AddStaticLine(mainColumn); + + if (!isPda) + AddStaticLine(mainColumn); + AddButtonRow(mainColumn); // wxWindow::SetSizer should be followed by wxWindow::Fit, but @@ -458,6 +489,11 @@ void wxWizard::SetPageSize(const wxSize& size) void wxWizard::FinishLayout() { + bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + + // Set to enable wxWizardSizer::GetMaxChildSize + m_started = true; + m_sizerBmpAndPage->Add( m_sizerPage, 1, // Horizontal stretching @@ -465,9 +501,12 @@ void wxWizard::FinishLayout() m_sizerPage->Border() ); - GetSizer()->SetSizeHints(this); - if ( m_posWizard == wxDefaultPosition ) - CentreOnScreen(); + if (!isPda) + { + GetSizer()->SetSizeHints(this); + if ( m_posWizard == wxDefaultPosition ) + CentreOnScreen(); + } } void wxWizard::FitToPage(const wxWizardPage *page) @@ -533,7 +572,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) @@ -603,9 +650,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(); @@ -613,6 +657,8 @@ bool wxWizard::RunWizard(wxWizardPage *firstPage) // can't return false here because there is no old page (void)ShowPage(firstPage, true /* forward */); + m_wasModal = true; + return ShowModal() == wxID_OK; } @@ -644,8 +690,15 @@ void wxWizard::SetBorder(int border) wxSize wxWizard::GetManualPageSize() const { // default width and height of the page - static const int DEFAULT_PAGE_WIDTH = 270; - static const int DEFAULT_PAGE_HEIGHT = 290; + int DEFAULT_PAGE_WIDTH = 270; + int DEFAULT_PAGE_HEIGHT = 270; + bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + if (isPda) + { + // Make the default page size small enough to fit on screen + 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); @@ -669,7 +722,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 } @@ -729,36 +790,28 @@ 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 ( ( !m_wasModal ) && + event.IsAllowed() && + ( event.GetEventType() == wxEVT_WIZARD_FINISHED || + event.GetEventType() == wxEVT_WIZARD_CANCEL + ) + ) { - event.Skip(); + 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 // ----------------------------------------------------------------------------