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"
18 #include "wx/toplevel.h"
21 #include "wx/stockitem.h"
23 #include "wx/mac/uma.h"
25 IMPLEMENT_DYNAMIC_CLASS(wxButton
, wxControl
)
28 bool wxButton::Create(wxWindow
*parent
,
34 const wxValidator
& validator
,
38 if (label
.empty() && wxIsStockID(id
))
39 label
= wxGetStockLabel(id
);
41 m_macIsUserPane
= false ;
43 if ( !wxButtonBase::Create(parent
, id
, pos
, size
, style
, validator
, name
) )
49 Rect bounds
= wxMacGetBoundsForControl( this , pos
, size
) ;
50 m_peer
= new wxMacControl(this) ;
51 if ( id
== wxID_HELP
)
53 ControlButtonContentInfo info
;
54 info
.contentType
= kControlContentIconRef
;
55 GetIconRef(kOnSystemDisk
, kSystemIconsCreator
, kHelpIcon
, &info
.u
.iconRef
);
56 err
= CreateRoundButtonControl(
57 MAC_WXHWND(parent
->MacGetTopLevelWindowRef()),
58 &bounds
, kControlRoundButtonNormalSize
,
59 &info
, m_peer
->GetControlRefAddr() );
61 else if ( label
.Find('\n' ) == wxNOT_FOUND
&& label
.Find('\r' ) == wxNOT_FOUND
)
63 #if TARGET_API_MAC_OSX
64 // Button height is static in Mac, can't be changed, so we need to force it here
65 if ( GetWindowVariant() == wxWINDOW_VARIANT_NORMAL
|| GetWindowVariant() == wxWINDOW_VARIANT_LARGE
)
67 bounds
.bottom
= bounds
.top
+ 20 ;
70 else if ( GetWindowVariant() == wxWINDOW_VARIANT_SMALL
)
72 bounds
.bottom
= bounds
.top
+ 17 ;
75 else if ( GetWindowVariant() == wxWINDOW_VARIANT_MINI
)
77 bounds
.bottom
= bounds
.top
+ 15 ;
82 err
= CreatePushButtonControl(
83 MAC_WXHWND(parent
->MacGetTopLevelWindowRef()),
84 &bounds
, CFSTR(""), m_peer
->GetControlRefAddr() );
88 ControlButtonContentInfo info
;
89 info
.contentType
= kControlNoContent
;
90 err
= CreateBevelButtonControl(
91 MAC_WXHWND(parent
->MacGetTopLevelWindowRef()) , &bounds
, CFSTR(""),
92 kControlBevelButtonLargeBevel
, kControlBehaviorPushbutton
,
93 &info
, 0, 0, 0, m_peer
->GetControlRefAddr() );
97 wxASSERT_MSG( m_peer
!= NULL
&& m_peer
->Ok() , wxT("No valid Mac control") ) ;
99 MacPostControlCreate( pos
, size
);
104 void wxButton::SetDefault()
106 wxTopLevelWindow
*tlw
= wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow
);
107 wxButton
*btnOldDefault
= NULL
;
110 btnOldDefault
= wxDynamicCast(tlw
->GetDefaultItem(), wxButton
);
111 tlw
->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
);