X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/948f4c37355b0055282f9ad4180c31e0517f3742..147e8ebc058cf2986d977388fa3861d8b3ceca93:/src/generic/collpaneg.cpp diff --git a/src/generic/collpaneg.cpp b/src/generic/collpaneg.cpp index 1e2a14880f..db24dbd952 100644 --- a/src/generic/collpaneg.cpp +++ b/src/generic/collpaneg.cpp @@ -26,6 +26,7 @@ #include "wx/toplevel.h" #include "wx/button.h" #include "wx/sizer.h" + #include "wx/panel.h" #endif // !WX_PRECOMP #include "wx/statline.h" @@ -38,7 +39,7 @@ // implementation // ============================================================================ -const wxChar wxGenericCollapsiblePaneNameStr[] = wxT("genericCollapsiblePane"); +const wxChar wxCollapsiblePaneNameStr[] = wxT("collapsiblePane"); //----------------------------------------------------------------------------- // wxGenericCollapsiblePane @@ -68,30 +69,37 @@ bool wxGenericCollapsiblePane::Create(wxWindow *parent, m_strLabel = label; +#ifdef __WXMAC__ + // on Mac we use the disclosure triangle + // we need a light gray line above and below, lets approximate with the frame + m_pStaticLine = NULL; + m_pButton = new wxDisclosureTriangle( this, wxID_ANY, GetBtnLabel(), + wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER ); + m_pButton->SetBackgroundColour( wxColour( 221, 226, 239 ) ); + m_sz = new wxBoxSizer(wxHORIZONTAL); + // m_sz->Add(4,4); where shall we put it? + m_sz->Add( m_pButton, 1); +#else // create children and lay them out using a wxBoxSizer // (so that we automatically get RTL features) m_pButton = new wxButton(this, wxID_ANY, GetBtnLabel(), wxPoint(0, 0), wxDefaultSize, wxBU_EXACTFIT); m_pStaticLine = new wxStaticLine(this, wxID_ANY); -#ifdef __WXMAC__ - // on Mac we put the static libe above the button - m_sz = new wxBoxSizer(wxVERTICAL); - m_sz->Add(m_pStaticLine, 0, wxALL|wxGROW, GetBorder()); - m_sz->Add(m_pButton, 0, wxLEFT|wxRIGHT|wxBOTTOM, GetBorder()); -#else // on other platforms we put the static line and the button horizontally m_sz = new wxBoxSizer(wxHORIZONTAL); m_sz->Add(m_pButton, 0, wxLEFT|wxTOP|wxBOTTOM, GetBorder()); m_sz->Add(m_pStaticLine, 1, wxALIGN_CENTER|wxLEFT|wxRIGHT, GetBorder()); #endif -#ifdef __WXWINCE__ + // FIXME: at least under wxCE and wxGTK1 the background is black if we don't do + // this, no idea why... +#if defined(__WXWINCE__) || defined(__WXGTK__) SetBackgroundColour(parent->GetBackgroundColour()); #endif // do not set sz as our sizers since we handle the pane window without using sizers - m_pPane = new wxWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, - wxNO_BORDER); + m_pPane = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, + wxTAB_TRAVERSAL|wxNO_BORDER); // start as collapsed: m_pPane->Hide(); @@ -101,14 +109,14 @@ bool wxGenericCollapsiblePane::Create(wxWindow *parent, wxGenericCollapsiblePane::~wxGenericCollapsiblePane() { - if (m_pButton && m_pStaticLine && m_sz) - { + if (m_pButton) m_pButton->SetContainingSizer(NULL); + + if (m_pStaticLine) m_pStaticLine->SetContainingSizer(NULL); - - // our sizer is not deleted automatically since we didn't use SetSizer()! - wxDELETE(m_sz); - } + + // our sizer is not deleted automatically since we didn't use SetSizer()! + wxDELETE(m_sz); } wxSize wxGenericCollapsiblePane::DoGetBestSize() const @@ -128,7 +136,12 @@ wxSize wxGenericCollapsiblePane::DoGetBestSize() const wxString wxGenericCollapsiblePane::GetBtnLabel() const { + // on mac the triangle indicates the state, no string change +#ifdef __WXMAC__ + return m_strLabel; +#else return m_strLabel + (IsCollapsed() ? wxT(" >>") : wxT(" <<")); +#endif } void wxGenericCollapsiblePane::OnStateChange(const wxSize& sz) @@ -181,11 +194,11 @@ void wxGenericCollapsiblePane::OnStateChange(const wxSize& sz) if (top->GetSizer()) { // we have just set the size hints... - wxSize sz = top->GetSizer()->CalcMin(); + wxSize szClient = top->GetSizer()->CalcMin(); // use SetClientSize() and not SetSize() otherwise the size for // e.g. a wxFrame with a menubar wouldn't be correctly set - top->SetClientSize(sz); + top->SetClientSize(szClient); } else top->Layout(); @@ -212,8 +225,13 @@ void wxGenericCollapsiblePane::Collapse(bool collapse) m_pPane->Show(!collapse); // update button label +#ifdef __WXMAC__ + m_pButton->SetOpen( !collapse ); +#else // NB: this must be done after updating our "state" m_pButton->SetLabel(GetBtnLabel()); +#endif + OnStateChange(GetBestSize()); } @@ -221,16 +239,25 @@ void wxGenericCollapsiblePane::Collapse(bool collapse) void wxGenericCollapsiblePane::SetLabel(const wxString &label) { m_strLabel = label; +#ifdef __WXMAC__ + m_pButton->SetLabel(GetBtnLabel()); +#else m_pButton->SetLabel(GetBtnLabel()); m_pButton->SetInitialSize(); +#endif Layout(); } bool wxGenericCollapsiblePane::Layout() { +#ifdef __WXMAC__ + if (!m_pButton || !m_pPane || !m_sz) + return false; // we need to complete the creation first! +#else if (!m_pButton || !m_pStaticLine || !m_pPane || !m_sz) return false; // we need to complete the creation first! +#endif wxSize oursz(GetSize()); @@ -256,8 +283,6 @@ int wxGenericCollapsiblePane::GetBorder() const { #if defined( __WXMAC__ ) return 6; -#elif defined(__WXGTK20__) - return 3; #elif defined(__WXMSW__) wxASSERT(m_pButton); return m_pButton->ConvertDialogToPixels(wxSize(2, 0)).x;