]> git.saurik.com Git - wxWidgets.git/commitdiff
Use native DisclosureTriangle control for wxCollapsiblePane, II
authorRobert Roebling <robert@roebling.de>
Sat, 8 Dec 2007 18:49:08 +0000 (18:49 +0000)
committerRobert Roebling <robert@roebling.de>
Sat, 8 Dec 2007 18:49:08 +0000 (18:49 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50581 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/generic/collpaneg.h
include/wx/mac/carbon/button.h
src/generic/collpaneg.cpp
src/mac/carbon/button.cpp

index a12b6f1fc4bccbdf888a46305fd4d6aa6d95d2f0..dd31df6dab6cf9e0e17d78630e37b94286aced4f 100644 (file)
@@ -82,7 +82,11 @@ protected:
     int GetBorder() const;
 
     // child controls
+#ifdef __WXMAC__
+    wxDisclosureTriangle *m_pButton;
+#else
     wxButton *m_pButton;
+#endif
     wxStaticLine *m_pStaticLine;
     wxWindow *m_pPane;
     wxSizer *m_sz;
index 9fad666a4e0e8f1cf0d3f80230989ffc78f889d5..cc40a1bb3f55dfc7f5583e0a2ce79a781f4028cf 100644 (file)
@@ -55,5 +55,41 @@ protected:
     DECLARE_DYNAMIC_CLASS(wxButton)
 };
 
+class WXDLLEXPORT wxDisclosureTriangle: public wxControl
+{
+public:
+    wxDisclosureTriangle(wxWindow *parent,
+             wxWindowID id,
+             const wxString& label = wxEmptyString,
+             const wxPoint& pos = wxDefaultPosition,
+             const wxSize& size = wxDefaultSize,
+             long style = 0,
+             const wxValidator& validator = wxDefaultValidator,
+             const wxString& name = wxButtonNameStr)
+    {
+        Create(parent, id, label, pos, size, style, validator, name);
+    }
+
+    bool Create(wxWindow *parent,
+                wxWindowID id,
+                const wxString& label = wxEmptyString,
+                const wxPoint& pos = wxDefaultPosition,
+                const wxSize& size = wxDefaultSize,
+                long style = 0,
+                const wxValidator& validator = wxDefaultValidator,
+                const wxString& name = wxButtonNameStr);
+
+    void SetOpen( bool open );
+    bool IsOpen() const;
+    void SetLabel( const wxString &label );
+    wxString GetLabel() const;
+
+    virtual wxInt32 MacControlHit( WXEVENTHANDLERREF handler , WXEVENTREF event ) ;
+
+protected:
+    virtual wxSize DoGetBestSize() const ;
+    
+};
+
 #endif
     // _WX_BUTTON_H_
index 40dd98609afb32cf3f04431758c147647ce1650c..8eb359e81b4f43caf74a66d7fd1433e2df53c285 100644 (file)
@@ -69,17 +69,19 @@ bool wxGenericCollapsiblePane::Create(wxWindow *parent,
 
     m_strLabel = label;
 
+#ifdef __WXMAC__
+    // on Mac we use the disclosure triangle
+    m_pStaticLine = NULL;
+    m_pButton = new wxDisclosureTriangle( this, wxID_ANY, GetBtnLabel() );
+    m_sz = new wxBoxSizer(wxHORIZONTAL);
+    // m_sz->Add(4,4); where shall we put it?
+    m_sz->Add( m_pButton );
+#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());
@@ -104,14 +106,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
@@ -215,8 +217,13 @@ void wxGenericCollapsiblePane::Collapse(bool collapse)
     m_pPane->Show(!collapse);
 
     // update button label
+#ifdef __WXMAC__
+    m_pButton->SetLabel(GetBtnLabel());
+#else
     // NB: this must be done after updating our "state"
     m_pButton->SetLabel(GetBtnLabel());
+#endif
+
 
     OnStateChange(GetBestSize());
 }
@@ -224,16 +231,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());
 
index 2712ddba22af428700377803fe646c76906f7d7a..0f95274ff4a2a42ecb7037c11b818ddfbe0f490a 100644 (file)
@@ -210,3 +210,73 @@ wxInt32 wxButton::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF
 
     return noErr;
 }
+
+//-------------------------------------------------------
+// wxDisclosureTriangle
+//-------------------------------------------------------
+
+bool wxDisclosureTriangle::Create(wxWindow *parent, wxWindowID id, const wxString& label,
+   const wxPoint& pos, const wxSize& size, long style,const wxValidator& validator, const wxString& name )
+{
+    m_macIsUserPane = false ;
+
+    if ( !wxControl::Create(parent, id, pos, size, style, validator, name) )
+        return false;
+
+    Rect bounds = wxMacGetBoundsForControl( this , pos , size ) ;
+    m_peer = new wxMacControl(this) ;
+
+    OSStatus err = CreateDisclosureTriangleControl(
+            MAC_WXHWND(parent->MacGetTopLevelWindowRef()) , &bounds, 
+            kControlDisclosureTrianglePointDefault,
+            CFSTR("Test"),
+            0,    // closed
+            TRUE, // draw title
+            TRUE, // auto toggle back and forth
+            m_peer->GetControlRefAddr() );
+            
+    verify_noerr( err );
+    wxASSERT_MSG( m_peer != NULL && m_peer->Ok() , wxT("No valid Mac control") ) ;
+
+    MacPostControlCreate( pos, size );
+
+    return true;
+}
+
+void wxDisclosureTriangle::SetOpen( bool open )
+{
+    // TODO
+}
+
+bool wxDisclosureTriangle::IsOpen() const
+{
+   // TODO
+   return true;
+}
+
+void wxDisclosureTriangle::SetLabel( const wxString &label )
+{
+    // TODO
+}
+
+wxString wxDisclosureTriangle::GetLabel() const
+{
+    return wxEmptyString;
+}
+
+wxInt32 wxDisclosureTriangle::MacControlHit( WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF WXUNUSED(event) )
+{
+    // Just emit button event for now
+    wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, m_windowId);
+    event.SetEventObject(this);
+    ProcessCommand(event);
+
+    return noErr;
+}
+
+wxSize wxDisclosureTriangle::DoGetBestSize() const
+{
+    return wxSize(16,16);
+}
+
+