1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/mac/carbon/button.cpp 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) Stefan Csomor 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #include "wx/wxprec.h" 
  14 #include "wx/button.h" 
  20 #include "wx/stockitem.h" 
  22 #include "wx/mac/uma.h" 
  24 IMPLEMENT_DYNAMIC_CLASS(wxButton
, wxControl
) 
  27 bool wxButton::Create(wxWindow 
*parent
, 
  33     const wxValidator
& validator
, 
  37     if (label
.empty() && wxIsStockID(id
)) 
  38         label 
= wxGetStockLabel(id
); 
  40     m_macIsUserPane 
= false ; 
  42     if ( !wxButtonBase::Create(parent
, id
, pos
, size
, style
, validator
, name
) ) 
  48     Rect bounds 
= wxMacGetBoundsForControl( this , pos 
, size 
) ; 
  49     m_peer 
= new wxMacControl(this) ; 
  50     if ( id 
== wxID_HELP 
) 
  52         ControlButtonContentInfo info 
; 
  53         info
.contentType 
= kControlContentIconRef 
; 
  54         GetIconRef(kOnSystemDisk
, kSystemIconsCreator
, kHelpIcon
, &info
.u
.iconRef
); 
  55         err 
= CreateRoundButtonControl( 
  56             MAC_WXHWND(parent
->MacGetTopLevelWindowRef()), 
  57             &bounds
, kControlRoundButtonNormalSize
, 
  58             &info
, m_peer
->GetControlRefAddr() ); 
  60     else if ( label
.Find('\n' ) == wxNOT_FOUND 
&& label
.Find('\r' ) == wxNOT_FOUND
) 
  62 #if TARGET_API_MAC_OSX 
  63         // Button height is static in Mac, can't be changed, so we need to force it here 
  64         if ( GetWindowVariant() == wxWINDOW_VARIANT_NORMAL 
|| GetWindowVariant() == wxWINDOW_VARIANT_LARGE 
) 
  66             bounds
.bottom 
= bounds
.top 
+ 20 ; 
  69         else if ( GetWindowVariant() == wxWINDOW_VARIANT_SMALL 
) 
  71             bounds
.bottom 
= bounds
.top 
+ 17 ; 
  74         else if ( GetWindowVariant() == wxWINDOW_VARIANT_MINI 
) 
  76             bounds
.bottom 
= bounds
.top 
+ 15 ; 
  81         err 
= CreatePushButtonControl( 
  82             MAC_WXHWND(parent
->MacGetTopLevelWindowRef()), 
  83             &bounds
, CFSTR(""), m_peer
->GetControlRefAddr() ); 
  87         ControlButtonContentInfo info 
; 
  88         info
.contentType 
= kControlNoContent 
; 
  89         err 
= CreateBevelButtonControl( 
  90             MAC_WXHWND(parent
->MacGetTopLevelWindowRef()) , &bounds
, CFSTR(""), 
  91             kControlBevelButtonLargeBevel
, kControlBehaviorPushbutton
, 
  92             &info
, 0, 0, 0, m_peer
->GetControlRefAddr() ); 
  96     wxASSERT_MSG( m_peer 
!= NULL 
&& m_peer
->Ok() , wxT("No valid Mac control") ) ; 
  98     MacPostControlCreate( pos
, size 
); 
 103 void wxButton::SetDefault() 
 105     wxWindow 
*parent 
= GetParent(); 
 106     wxButton 
*btnOldDefault 
= NULL
; 
 110         btnOldDefault 
= wxDynamicCast(parent
->GetDefaultItem(), wxButton
); 
 111         parent
->SetDefaultItem(this); 
 115         btnOldDefault
->m_peer
->SetData(kControlButtonPart 
, kControlPushButtonDefaultTag 
, (Boolean
) 0 ) ; 
 117     m_peer
->SetData(kControlButtonPart 
, kControlPushButtonDefaultTag 
, (Boolean
) 1 ) ; 
 120 wxSize 
wxButton::DoGetBestSize() const 
 122     if ( GetId() == wxID_HELP 
) 
 123         return wxSize( 20 , 20 ) ; 
 125     wxSize sz 
= GetDefaultSize() ; 
 128     switch (GetWindowVariant()) 
 130         case wxWINDOW_VARIANT_NORMAL
: 
 131         case wxWINDOW_VARIANT_LARGE
: 
 136         case wxWINDOW_VARIANT_SMALL
: 
 140         case wxWINDOW_VARIANT_MINI
: 
 148     Rect    bestsize 
= { 0 , 0 , 0 , 0 } ; 
 149     m_peer
->GetBestRect( &bestsize 
) ; 
 152     if ( EmptyRect( &bestsize 
) ) 
 154         wBtn 
= m_label
.length() * charspace 
+ 12 ; 
 158         wBtn 
= bestsize
.right 
- bestsize
.left 
; 
 159         sz
.y 
= bestsize
.bottom 
- bestsize
.top 
; 
 162     if ((wBtn 
> sz
.x
) || ( GetWindowStyle() & wxBU_EXACTFIT
)) 
 168 wxSize 
wxButton::GetDefaultSize() 
 173     return wxSize(wBtn
, hBtn
); 
 176 void wxButton::Command (wxCommandEvent 
& event
) 
 178     m_peer
->Flash(kControlButtonPart
) ; 
 179     ProcessCommand(event
); 
 182 wxInt32 
wxButton::MacControlHit(WXEVENTHANDLERREF 
WXUNUSED(handler
) , WXEVENTREF 
WXUNUSED(event
) ) 
 184     wxCommandEvent 
event(wxEVT_COMMAND_BUTTON_CLICKED
, m_windowId
); 
 185     event
.SetEventObject(this); 
 186     ProcessCommand(event
);