X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/550d433e523dc462c62a2346c0fd713a1d5705e8..497cb543c0f96c4b18732729bf14c65fa97afa68:/src/generic/collpaneg.cpp diff --git a/src/generic/collpaneg.cpp b/src/generic/collpaneg.cpp index b7e0dd6e9e..2f1ea156b4 100644 --- a/src/generic/collpaneg.cpp +++ b/src/generic/collpaneg.cpp @@ -16,9 +16,27 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" + #include "wx/collpane.h" + +#if wxUSE_BUTTON && wxUSE_STATLINE + +#ifndef WX_PRECOMP + #include "wx/toplevel.h" + #include "wx/button.h" + #include "wx/sizer.h" +#endif // !WX_PRECOMP + #include "wx/statline.h" +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// the number of pixels to leave between the button and the static line and +// between the button and the pane +#define wxCP_MARGIN 10 + // ============================================================================ // implementation // ============================================================================ @@ -34,18 +52,19 @@ IMPLEMENT_DYNAMIC_CLASS(wxGenericCollapsiblePane, wxControl) IMPLEMENT_DYNAMIC_CLASS(wxCollapsiblePaneEvent, wxCommandEvent) BEGIN_EVENT_TABLE(wxGenericCollapsiblePane, wxControl) - EVT_BUTTON(wxCP_BUTTON_ID, wxGenericCollapsiblePane::OnButton) + EVT_BUTTON(wxID_ANY, wxGenericCollapsiblePane::OnButton) EVT_SIZE(wxGenericCollapsiblePane::OnSize) END_EVENT_TABLE() -bool wxGenericCollapsiblePane::Create( wxWindow *parent, wxWindowID id, - const wxString& label, - const wxPoint& pos, - const wxSize& size, - long style, - const wxValidator& val, - const wxString& name) +bool wxGenericCollapsiblePane::Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& val, + const wxString& name) { if ( !wxControl::Create(parent, id, pos, size, style, val, name) ) return false; @@ -53,7 +72,7 @@ bool wxGenericCollapsiblePane::Create( wxWindow *parent, wxWindowID id, m_strLabel = label; // create children; their size & position is set in OnSize() - m_pButton = new wxButton(this, wxCP_BUTTON_ID, GetBtnLabel(), wxPoint(0, 0), + m_pButton = new wxButton(this, wxID_ANY, GetBtnLabel(), wxPoint(0, 0), wxDefaultSize, wxBU_EXACTFIT); m_pStatLine = new wxStaticLine(this, wxID_ANY); m_pPane = new wxWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, @@ -88,26 +107,15 @@ wxString wxGenericCollapsiblePane::GetBtnLabel() const return m_strLabel + (IsCollapsed() ? wxT(" >>") : wxT(" <<")); } -void wxGenericCollapsiblePane::Collapse(bool collapse) +void wxGenericCollapsiblePane::OnStateChange(const wxSize& sz) { - // optimization - if ( IsCollapsed() == collapse ) - return; - - // update our state - m_pPane->Show(!collapse); - - // update button label - // NB: this must be done after updating our "state" - m_pButton->SetLabel(GetBtnLabel()); - // minimal size has priority over the best size so set here our min size - wxSize sz = GetBestSize(); SetMinSize(sz); SetSize(sz); - wxWindow *top = GetTopLevelParent(); - if (top) + wxTopLevelWindow * + top = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow); + if ( top ) { // we've changed our size, thus our top level parent needs to relayout // itself @@ -128,28 +136,40 @@ void wxGenericCollapsiblePane::Collapse(bool collapse) #endif top->GetSizer()->SetSizeHints(top); - if (IsCollapsed()) - { - // use SetClientSize() and not SetSize() otherwise the size for - // e.g. a wxFrame with a menubar wouldn't be correctly set - top->SetClientSize(sz); - } - else + + // we shouldn't attempt to resize a maximized window, whatever happens + if ( !top->IsMaximized() ) { - // force our parent to "fit", i.e. expand so that it can honour - // our minimal size - top->Fit(); + if ( IsCollapsed() ) + { + // use SetClientSize() and not SetSize() otherwise the size for + // e.g. a wxFrame with a menubar wouldn't be correctly set + top->SetClientSize(sz); + } + else + { + // force our parent to "fit", i.e. expand so that it can honour + // our minimal size + top->Fit(); + } } } } -wxWindow *wxGenericCollapsiblePane::GetTopLevelParent() +void wxGenericCollapsiblePane::Collapse(bool collapse) { - wxWindow *parent = GetParent(); - while (parent && !parent->IsTopLevel()) - parent = parent->GetParent(); + // optimization + if ( IsCollapsed() == collapse ) + return; - return parent; + // update our state + m_pPane->Show(!collapse); + + // update button label + // NB: this must be done after updating our "state" + m_pButton->SetLabel(GetBtnLabel()); + + OnStateChange(GetBestSize()); } void wxGenericCollapsiblePane::SetLabel(const wxString &label) @@ -183,8 +203,14 @@ void wxGenericCollapsiblePane::LayoutChildren() // wxGenericCollapsiblePane - event handlers //----------------------------------------------------------------------------- -void wxGenericCollapsiblePane::OnButton(wxCommandEvent &WXUNUSED(event)) +void wxGenericCollapsiblePane::OnButton(wxCommandEvent& event) { + if ( event.GetEventObject() != m_pButton ) + { + event.Skip(); + return; + } + Collapse(!IsCollapsed()); // this change was generated by the user - send the event @@ -213,3 +239,4 @@ void wxGenericCollapsiblePane::OnSize(wxSizeEvent& WXUNUSED(event)) m_pPane->Layout(); } +#endif // wxUSE_BUTTON && wxUSE_STATLINE