Use native DisclosureTriangle control for wxCollapsiblePane, II

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50581 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2007-12-08 18:49:08 +00:00
parent 7a7697aafe
commit 4792288831
4 changed files with 138 additions and 12 deletions

View 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;

View 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_

View 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());

View 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);
}