X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/489468feaa08b8f504735eecca522fb8d0f825d2..52cda80e1c94758a720d48c5b9743dbb18764cb6:/src/osx/carbon/button.cpp diff --git a/src/osx/carbon/button.cpp b/src/osx/carbon/button.cpp index 87fa56c82b..ea77565438 100644 --- a/src/osx/carbon/button.cpp +++ b/src/osx/carbon/button.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/mac/carbon/button.cpp +// Name: src/osx/carbon/button.cpp // Purpose: wxButton // Author: Stefan Csomor // Modified by: @@ -21,98 +21,11 @@ #include "wx/stockitem.h" -#include "wx/mac/uma.h" +#include "wx/osx/private.h" -IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl) - - -bool wxButton::Create(wxWindow *parent, - wxWindowID id, - const wxString& lbl, - 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); - - m_macIsUserPane = false ; - - if ( !wxButtonBase::Create(parent, id, pos, size, style, validator, name) ) - return false; - - m_labelOrig = m_label = label ; - - OSStatus err; - Rect bounds = wxMacGetBoundsForControl( this , pos , size ) ; - m_peer = new wxMacControl(this) ; - if ( id == wxID_HELP ) - { - ControlButtonContentInfo info ; - info.contentType = kControlContentIconRef ; - GetIconRef(kOnSystemDisk, kSystemIconsCreator, kHelpIcon, &info.u.iconRef); - err = CreateRoundButtonControl( - MAC_WXHWND(parent->MacGetTopLevelWindowRef()), - &bounds, kControlRoundButtonNormalSize, - &info, m_peer->GetControlRefAddr() ); - } - else if ( label.Find('\n' ) == wxNOT_FOUND && label.Find('\r' ) == wxNOT_FOUND) - { - // Button height is static in Mac, can't be changed, so we need to force it here - if ( GetWindowVariant() == wxWINDOW_VARIANT_NORMAL || GetWindowVariant() == wxWINDOW_VARIANT_LARGE ) - { - bounds.bottom = bounds.top + 20 ; - m_maxHeight = 20 ; - } - else if ( GetWindowVariant() == wxWINDOW_VARIANT_SMALL ) - { - bounds.bottom = bounds.top + 17 ; - m_maxHeight = 17 ; - } - else if ( GetWindowVariant() == wxWINDOW_VARIANT_MINI ) - { - bounds.bottom = bounds.top + 15 ; - m_maxHeight = 15 ; - } - err = CreatePushButtonControl( - MAC_WXHWND(parent->MacGetTopLevelWindowRef()), - &bounds, CFSTR(""), m_peer->GetControlRefAddr() ); - } - else - { - ControlButtonContentInfo info ; - info.contentType = kControlNoContent ; - err = CreateBevelButtonControl( - MAC_WXHWND(parent->MacGetTopLevelWindowRef()) , &bounds, CFSTR(""), - kControlBevelButtonLargeBevel, kControlBehaviorPushbutton, - &info, 0, 0, 0, m_peer->GetControlRefAddr() ); - } - - verify_noerr( err ); - wxASSERT_MSG( m_peer != NULL && m_peer->Ok() , wxT("No valid Mac control") ) ; - - MacPostControlCreate( pos, size ); - - return true; -} - -wxWindow *wxButton::SetDefault() -{ - wxWindow *btnOldDefault = wxButtonBase::SetDefault(); - - if ( btnOldDefault ) - { - // cast needed to access the protected member - btnOldDefault->GetPeer()->SetData(kControlButtonPart , kControlPushButtonDefaultTag , (Boolean) 0 ) ; - } - - m_peer->SetData(kControlButtonPart , kControlPushButtonDefaultTag , (Boolean) 1 ) ; - - return btnOldDefault; -} +// +// +// wxSize wxButton::DoGetBestSize() const { @@ -140,6 +53,7 @@ wxSize wxButton::DoGetBestSize() const break; } +#if wxOSX_USE_CARBON Rect bestsize = { 0 , 0 , 0 , 0 } ; m_peer->GetBestRect( &bestsize ) ; @@ -152,14 +66,21 @@ wxSize wxButton::DoGetBestSize() const OSStatus err = m_peer->GetData( kControlEntireControl, kControlFontStyleTag, &controlFont ); verify_noerr( err ); - wxCFStringRef str( m_label, GetFont().GetEncoding() ); + // GetThemeTextDimensions will cache strings and the documentation + // says not to use the NoCopy string creation calls. + // This also means that we can't use CFSTR without + // -fno-constant-cfstrings if the library might be unloaded, + // as GetThemeTextDimensions may cache a pointer to our + // unloaded segment. + wxCFStringRef str( !m_label.empty() ? m_label : wxString(" "), + GetFont().GetEncoding() ); -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT SInt16 baseline; if ( m_font.MacGetThemeFontID() != kThemeCurrentPortFont ) { err = GetThemeTextDimensions( - (!m_label.empty() ? (CFStringRef)str : CFSTR(" ")), + (CFStringRef)str, m_font.MacGetThemeFontID(), kThemeStateActive, false, &bounds, &baseline ); verify_noerr( err ); } @@ -181,9 +102,9 @@ wxSize wxButton::DoGetBestSize() const // non 'normal' window variants don't return the correct height // sz.y = bestsize.bottom - bestsize.top ; } - if ((wBtn > sz.x) || ( GetWindowStyle() & wxBU_EXACTFIT)) sz.x = wBtn; +#endif return sz ; } @@ -196,78 +117,95 @@ wxSize wxButton::GetDefaultSize() return wxSize(wBtn, hBtn); } -void wxButton::Command (wxCommandEvent & event) +wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, + wxWindowMac* parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos, + const wxSize& size, + long WXUNUSED(style), + long WXUNUSED(extraStyle)) { - m_peer->Flash(kControlButtonPart) ; - ProcessCommand(event); + OSStatus err; + Rect bounds = wxMacGetBoundsForControl( wxpeer , pos , size ) ; + wxMacControl* peer = new wxMacControl(wxpeer) ; + if ( id == wxID_HELP ) + { + ControlButtonContentInfo info ; + info.contentType = kControlContentIconRef ; + GetIconRef(kOnSystemDisk, kSystemIconsCreator, kHelpIcon, &info.u.iconRef); + err = CreateRoundButtonControl( + MAC_WXHWND(parent->MacGetTopLevelWindowRef()), + &bounds, kControlRoundButtonNormalSize, + &info, peer->GetControlRefAddr() ); + } + else if ( label.Find('\n' ) == wxNOT_FOUND && label.Find('\r' ) == wxNOT_FOUND) + { + // Button height is static in Mac, can't be changed, so we need to force it here + int maxHeight; + switch (wxpeer->GetWindowVariant() ) + { + default: + wxFAIL_MSG( "unknown window variant" ); + // fall through + + case wxWINDOW_VARIANT_NORMAL: + case wxWINDOW_VARIANT_LARGE: + maxHeight = 20 ; + break; + case wxWINDOW_VARIANT_SMALL: + maxHeight = 17; + break; + case wxWINDOW_VARIANT_MINI: + maxHeight = 15; + } + bounds.bottom = bounds.top + maxHeight ; + wxpeer->SetMaxSize( wxSize( wxpeer->GetMaxWidth() , maxHeight )); + err = CreatePushButtonControl( + MAC_WXHWND(parent->MacGetTopLevelWindowRef()), + &bounds, CFSTR(""), peer->GetControlRefAddr() ); + } + else + { + ControlButtonContentInfo info ; + info.contentType = kControlNoContent ; + err = CreateBevelButtonControl( + MAC_WXHWND(parent->MacGetTopLevelWindowRef()) , &bounds, CFSTR(""), + kControlBevelButtonLargeBevel, kControlBehaviorPushbutton, + &info, 0, 0, 0, peer->GetControlRefAddr() ); + } + verify_noerr( err ); + return peer; } -wxInt32 wxButton::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF WXUNUSED(event) ) +void wxMacControl::SetDefaultButton( bool isDefault ) { - wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, m_windowId); - event.SetEventObject(this); - ProcessCommand(event); - - return noErr; + SetData(kControlButtonPart , kControlPushButtonDefaultTag , (Boolean) isDefault ) ; } -//------------------------------------------------------- -// 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 ) +wxWidgetImplType* wxWidgetImpl::CreateDisclosureTriangle( wxWindowMac* wxpeer, + wxWindowMac* parent, + wxWindowID WXUNUSED(id), + const wxString& label, + const wxPoint& pos, + const wxSize& size, + long WXUNUSED(style), + long WXUNUSED(extraStyle)) { - 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) ; + Rect bounds = wxMacGetBoundsForControl( wxpeer , pos , size ) ; + wxMacControl* peer = new wxMacControl(wxpeer) ; OSStatus err = CreateDisclosureTriangleControl( - MAC_WXHWND(parent->MacGetTopLevelWindowRef()) , &bounds, + 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 ); - wxASSERT_MSG( m_peer != NULL && m_peer->Ok() , wxT("No valid Mac control") ) ; - - MacPostControlCreate( pos, size ); - // passing the text in the param doesn't seem to work, so lets do if again - SetLabel( label ); - - return true; -} + peer->GetControlRefAddr() ); -void wxDisclosureTriangle::SetOpen( bool open ) -{ - m_peer->SetValue( open ? 1 : 0 ); -} - -bool wxDisclosureTriangle::IsOpen() const -{ - return m_peer->GetValue() == 1; -} - -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); + verify_noerr( err ); + return peer; }