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:
parent
7a7697aafe
commit
4792288831
@ -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;
|
||||
|
@ -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_
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user