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:
@@ -82,7 +82,11 @@ protected:
|
|||||||
int GetBorder() const;
|
int GetBorder() const;
|
||||||
|
|
||||||
// child controls
|
// child controls
|
||||||
|
#ifdef __WXMAC__
|
||||||
|
wxDisclosureTriangle *m_pButton;
|
||||||
|
#else
|
||||||
wxButton *m_pButton;
|
wxButton *m_pButton;
|
||||||
|
#endif
|
||||||
wxStaticLine *m_pStaticLine;
|
wxStaticLine *m_pStaticLine;
|
||||||
wxWindow *m_pPane;
|
wxWindow *m_pPane;
|
||||||
wxSizer *m_sz;
|
wxSizer *m_sz;
|
||||||
|
@@ -55,5 +55,41 @@ protected:
|
|||||||
DECLARE_DYNAMIC_CLASS(wxButton)
|
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
|
#endif
|
||||||
// _WX_BUTTON_H_
|
// _WX_BUTTON_H_
|
||||||
|
@@ -69,17 +69,19 @@ bool wxGenericCollapsiblePane::Create(wxWindow *parent,
|
|||||||
|
|
||||||
m_strLabel = label;
|
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
|
// create children and lay them out using a wxBoxSizer
|
||||||
// (so that we automatically get RTL features)
|
// (so that we automatically get RTL features)
|
||||||
m_pButton = new wxButton(this, wxID_ANY, GetBtnLabel(), wxPoint(0, 0),
|
m_pButton = new wxButton(this, wxID_ANY, GetBtnLabel(), wxPoint(0, 0),
|
||||||
wxDefaultSize, wxBU_EXACTFIT);
|
wxDefaultSize, wxBU_EXACTFIT);
|
||||||
m_pStaticLine = new wxStaticLine(this, wxID_ANY);
|
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
|
// on other platforms we put the static line and the button horizontally
|
||||||
m_sz = new wxBoxSizer(wxHORIZONTAL);
|
m_sz = new wxBoxSizer(wxHORIZONTAL);
|
||||||
m_sz->Add(m_pButton, 0, wxLEFT|wxTOP|wxBOTTOM, GetBorder());
|
m_sz->Add(m_pButton, 0, wxLEFT|wxTOP|wxBOTTOM, GetBorder());
|
||||||
@@ -104,15 +106,15 @@ bool wxGenericCollapsiblePane::Create(wxWindow *parent,
|
|||||||
|
|
||||||
wxGenericCollapsiblePane::~wxGenericCollapsiblePane()
|
wxGenericCollapsiblePane::~wxGenericCollapsiblePane()
|
||||||
{
|
{
|
||||||
if (m_pButton && m_pStaticLine && m_sz)
|
if (m_pButton)
|
||||||
{
|
|
||||||
m_pButton->SetContainingSizer(NULL);
|
m_pButton->SetContainingSizer(NULL);
|
||||||
|
|
||||||
|
if (m_pStaticLine)
|
||||||
m_pStaticLine->SetContainingSizer(NULL);
|
m_pStaticLine->SetContainingSizer(NULL);
|
||||||
|
|
||||||
// our sizer is not deleted automatically since we didn't use SetSizer()!
|
// our sizer is not deleted automatically since we didn't use SetSizer()!
|
||||||
wxDELETE(m_sz);
|
wxDELETE(m_sz);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
wxSize wxGenericCollapsiblePane::DoGetBestSize() const
|
wxSize wxGenericCollapsiblePane::DoGetBestSize() const
|
||||||
{
|
{
|
||||||
@@ -215,8 +217,13 @@ void wxGenericCollapsiblePane::Collapse(bool collapse)
|
|||||||
m_pPane->Show(!collapse);
|
m_pPane->Show(!collapse);
|
||||||
|
|
||||||
// update button label
|
// update button label
|
||||||
|
#ifdef __WXMAC__
|
||||||
|
m_pButton->SetLabel(GetBtnLabel());
|
||||||
|
#else
|
||||||
// NB: this must be done after updating our "state"
|
// NB: this must be done after updating our "state"
|
||||||
m_pButton->SetLabel(GetBtnLabel());
|
m_pButton->SetLabel(GetBtnLabel());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
OnStateChange(GetBestSize());
|
OnStateChange(GetBestSize());
|
||||||
}
|
}
|
||||||
@@ -224,16 +231,25 @@ void wxGenericCollapsiblePane::Collapse(bool collapse)
|
|||||||
void wxGenericCollapsiblePane::SetLabel(const wxString &label)
|
void wxGenericCollapsiblePane::SetLabel(const wxString &label)
|
||||||
{
|
{
|
||||||
m_strLabel = label;
|
m_strLabel = label;
|
||||||
|
#ifdef __WXMAC__
|
||||||
|
m_pButton->SetLabel(GetBtnLabel());
|
||||||
|
#else
|
||||||
m_pButton->SetLabel(GetBtnLabel());
|
m_pButton->SetLabel(GetBtnLabel());
|
||||||
m_pButton->SetInitialSize();
|
m_pButton->SetInitialSize();
|
||||||
|
#endif
|
||||||
|
|
||||||
Layout();
|
Layout();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxGenericCollapsiblePane::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)
|
if (!m_pButton || !m_pStaticLine || !m_pPane || !m_sz)
|
||||||
return false; // we need to complete the creation first!
|
return false; // we need to complete the creation first!
|
||||||
|
#endif
|
||||||
|
|
||||||
wxSize oursz(GetSize());
|
wxSize oursz(GetSize());
|
||||||
|
|
||||||
|
@@ -210,3 +210,73 @@ wxInt32 wxButton::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF
|
|||||||
|
|
||||||
return noErr;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user