X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e53b3d16de127872e39bf276f7e616b32f161645..39d0e65b6224f1307ede8a965eee122e707fd57e:/src/osx/button_osx.cpp diff --git a/src/osx/button_osx.cpp b/src/osx/button_osx.cpp index 239ded9d35..6984a9af08 100644 --- a/src/osx/button_osx.cpp +++ b/src/osx/button_osx.cpp @@ -4,7 +4,7 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: button.cpp 54845 2008-07-30 14:52:41Z SC $ +// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,41 +17,92 @@ #include "wx/panel.h" #include "wx/toplevel.h" #include "wx/dcclient.h" + #include "wx/stattext.h" #endif #include "wx/stockitem.h" #include "wx/osx/private.h" -IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl) +namespace +{ + +// Returns true only if the id is wxID_HELP and the label is "Help" or empty. +bool IsHelpButtonWithStandardLabel(wxWindowID id, const wxString& label) +{ + if ( id != wxID_HELP ) + return false; + + if ( label.empty() ) + return true; + + const wxString labelText = wxStaticText::GetLabelText(label); + return labelText == "Help" || labelText == _("Help"); +} + +} // anonymous namespace bool wxButton::Create(wxWindow *parent, wxWindowID id, - const wxString& lbl, + const wxString& labelOrig, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { - wxString label(lbl); - if (label.empty() && wxIsStockID(id)) - label = wxGetStockLabel(id); + DontCreatePeer(); + + m_marginX = + m_marginY = 0; + + // FIXME: this hack is needed because we're called from + // wxBitmapButton::Create() with this style and we currently use a + // different wxWidgetImpl method (CreateBitmapButton() rather than + // CreateButton()) for creating bitmap buttons, but we really ought + // to unify the creation of buttons of all kinds and then remove + // this check + if ( style & wxBU_NOTEXT ) + { + return wxControl::Create(parent, id, pos, size, style, + validator, name); + } + + wxString label; + + // Ignore the standard label for help buttons if possible, they use "?" + // label under Mac which looks better. + if ( !IsHelpButtonWithStandardLabel(id, labelOrig) ) + { + label = labelOrig.empty() && wxIsStockID(id) ? wxGetStockLabel(id) + : labelOrig; + } - m_macIsUserPane = false ; if ( !wxButtonBase::Create(parent, id, pos, size, style, validator, name) ) return false; - m_labelOrig = m_label = label ; - - m_peer = wxWidgetImpl::CreateButton( this, parent, id, label, pos, size, style, GetExtraStyle() ); + m_labelOrig = + m_label = label ; + + SetPeer(wxWidgetImpl::CreateButton( this, parent, id, label, pos, size, style, GetExtraStyle() )); MacPostControlCreate( pos, size ); return true; } +void wxButton::SetLabel(const wxString& label) +{ + if ( IsHelpButtonWithStandardLabel(GetId(), label) ) + { + // ignore the standard label for the help buttons, it's not used + return; + } + + wxAnyButton::SetLabel(label); +} + wxWindow *wxButton::SetDefault() { wxWindow *btnOldDefault = wxButtonBase::SetDefault(); @@ -61,18 +112,18 @@ wxWindow *wxButton::SetDefault() btnOldDefault->GetPeer()->SetDefaultButton( false ); } - m_peer->SetDefaultButton( true ); + GetPeer()->SetDefaultButton( true ); return btnOldDefault; } -void wxButton::Command (wxCommandEvent & event) +void wxButton::Command (wxCommandEvent & WXUNUSED(event)) { - m_peer->PerformClick() ; + GetPeer()->PerformClick() ; // ProcessCommand(event); } -bool wxButton::HandleClicked( double timestampsec ) +bool wxButton::OSXHandleClicked( double WXUNUSED(timestampsec) ) { wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, m_windowId); event.SetEventObject(this); @@ -80,57 +131,43 @@ bool wxButton::HandleClicked( double timestampsec ) return true; } +/* static */ +wxSize wxButtonBase::GetDefaultSize() +{ + return wxAnyButton::GetDefaultSize(); +} + //------------------------------------------------------- // 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 ; - +{ + DontCreatePeer(); if ( !wxControl::Create(parent, id, pos, size, style, validator, name) ) return false; -#if wxOSX_USE_CARBON - Rect bounds = wxMacGetBoundsForControl( this , pos , size ) ; - m_peer = new wxMacControl(this) ; - - OSStatus err = CreateDisclosureTriangleControl( - MAC_WXHWND(parent->MacGetTopLevelWindowRef()) , &bounds, - kControlDisclosureTrianglePointDefault, - wxCFStringRef( label ), - 0, // closed - TRUE, // draw title - TRUE, // auto toggle back and forth - m_peer->GetControlRefAddr() ); - - verify_noerr( err ); -#endif - wxASSERT_MSG( m_peer != NULL && m_peer->IsOk() , wxT("No valid Mac control") ) ; + SetPeer(wxWidgetImpl::CreateDisclosureTriangle(this, parent, id, label, pos, size, style, GetExtraStyle() )); MacPostControlCreate( pos, size ); - // passing the text in the param doesn't seem to work, so lets do if again + // passing the text in the param doesn't seem to work, so let's do it again SetLabel( label ); - + return true; } void wxDisclosureTriangle::SetOpen( bool open ) { -#if wxOSX_USE_CARBON - m_peer->SetValue( open ? 1 : 0 ); -#endif + GetPeer()->SetValue( open ? 1 : 0 ); } bool wxDisclosureTriangle::IsOpen() const { -#if wxOSX_USE_CARBON - return m_peer->GetValue() == 1; -#endif + return GetPeer()->GetValue() == 1; } -bool wxDisclosureTriangle::HandleClicked( double timestampsec ) +bool wxDisclosureTriangle::OSXHandleClicked( double WXUNUSED(timestampsec) ) { // Just emit button event for now wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, m_windowId); @@ -142,6 +179,14 @@ bool wxDisclosureTriangle::HandleClicked( double timestampsec ) wxSize wxDisclosureTriangle::DoGetBestSize() const { - return wxSize(16,16); + wxSize size = wxWindow::DoGetBestSize(); + + // under Carbon the base class GetBestSize() implementation doesn't seem to + // take the label into account at all, correct for it here +#if wxOSX_USE_CARBON + size.x += GetTextExtent(GetLabel()).x; +#endif // wxOSX_USE_CARBON + + return size; }