1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/button_osx.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"
19 #include "wx/dcclient.h"
20 #include "wx/stattext.h"
23 #include "wx/stockitem.h"
25 #include "wx/osx/private.h"
30 // Returns true only if the id is wxID_HELP and the label is "Help" or empty.
31 bool IsHelpButtonWithStandardLabel(wxWindowID id
, const wxString
& label
)
33 if ( id
!= wxID_HELP
)
39 const wxString labelText
= wxStaticText::GetLabelText(label
);
40 return labelText
== "Help" || labelText
== _("Help");
43 } // anonymous namespace
45 BEGIN_EVENT_TABLE(wxButton
, wxControl
)
46 EVT_ENTER_WINDOW(wxButton::OnEnterWindow
)
47 EVT_LEAVE_WINDOW(wxButton::OnLeaveWindow
)
50 bool wxButton::Create(wxWindow
*parent
,
52 const wxString
& labelOrig
,
56 const wxValidator
& validator
,
62 // FIXME: this hack is needed because we're called from
63 // wxBitmapButton::Create() with this style and we currently use a
64 // different wxWidgetImpl method (CreateBitmapButton() rather than
65 // CreateButton()) for creating bitmap buttons, but we really ought
66 // to unify the creation of buttons of all kinds and then remove
68 if ( style
& wxBU_NOTEXT
)
70 return wxControl::Create(parent
, id
, pos
, size
, style
,
76 // Ignore the standard label for help buttons if possible, they use "?"
77 // label under Mac which looks better.
78 if ( !IsHelpButtonWithStandardLabel(id
, labelOrig
) )
80 label
= labelOrig
.empty() && wxIsStockID(id
) ? wxGetStockLabel(id
)
84 m_macIsUserPane
= false ;
86 if ( !wxButtonBase::Create(parent
, id
, pos
, size
, style
, validator
, name
) )
92 m_peer
= wxWidgetImpl::CreateButton( this, parent
, id
, label
, pos
, size
, style
, GetExtraStyle() );
94 MacPostControlCreate( pos
, size
);
99 void wxButton::SetLabel(const wxString
& label
)
101 if ( IsHelpButtonWithStandardLabel(GetId(), label
) )
103 // ignore the standard label for the help buttons, it's not used
107 if ( HasFlag(wxBU_NOTEXT
) )
109 // just store the label internally but don't really use it for the
116 wxButtonBase::SetLabel(label
);
119 wxBitmap
wxButton::DoGetBitmap(State which
) const
121 return m_bitmaps
[which
];
124 void wxButton::DoSetBitmap(const wxBitmap
& bitmap
, State which
)
126 m_bitmaps
[which
] = bitmap
;
128 if ( which
== State_Normal
)
129 m_peer
->SetBitmap(bitmap
);
130 else if ( which
== State_Pressed
)
132 wxButtonImpl
* bi
= dynamic_cast<wxButtonImpl
*> (m_peer
);
134 bi
->SetPressedBitmap(bitmap
);
136 InvalidateBestSize();
139 void wxButton::DoSetBitmapPosition(wxDirection dir
)
141 m_peer
->SetBitmapPosition(dir
);
142 InvalidateBestSize();
145 #if wxUSE_MARKUP && wxOSX_USE_COCOA
147 bool wxButton::DoSetLabelMarkup(const wxString
& markup
)
149 if ( !wxButtonBase::DoSetLabelMarkup(markup
) )
152 m_peer
->SetLabelMarkup(markup
);
157 #endif // wxUSE_MARKUP && wxOSX_USE_COCOA
159 wxWindow
*wxButton::SetDefault()
161 wxWindow
*btnOldDefault
= wxButtonBase::SetDefault();
165 btnOldDefault
->GetPeer()->SetDefaultButton( false );
168 m_peer
->SetDefaultButton( true );
170 return btnOldDefault
;
173 void wxButton::Command (wxCommandEvent
& WXUNUSED(event
))
175 m_peer
->PerformClick() ;
176 // ProcessCommand(event);
179 void wxButton::OnEnterWindow( wxMouseEvent
& WXUNUSED(event
))
181 if ( DoGetBitmap( State_Current
).IsOk() )
182 m_peer
->SetBitmap( DoGetBitmap( State_Current
) );
185 void wxButton::OnLeaveWindow( wxMouseEvent
& WXUNUSED(event
))
187 if ( DoGetBitmap( State_Current
).IsOk() )
188 m_peer
->SetBitmap( DoGetBitmap( State_Normal
) );
191 bool wxButton::OSXHandleClicked( double WXUNUSED(timestampsec
) )
193 wxCommandEvent
event(wxEVT_COMMAND_BUTTON_CLICKED
, m_windowId
);
194 event
.SetEventObject(this);
195 ProcessCommand(event
);
199 //-------------------------------------------------------
200 // wxDisclosureTriangle
201 //-------------------------------------------------------
203 bool wxDisclosureTriangle::Create(wxWindow
*parent
, wxWindowID id
, const wxString
& label
,
204 const wxPoint
& pos
, const wxSize
& size
, long style
,const wxValidator
& validator
, const wxString
& name
)
206 m_macIsUserPane
= false ;
208 if ( !wxControl::Create(parent
, id
, pos
, size
, style
, validator
, name
) )
211 m_peer
= wxWidgetImpl::CreateDisclosureTriangle(this, parent
, id
, label
, pos
, size
, style
, GetExtraStyle() );
213 MacPostControlCreate( pos
, size
);
214 // passing the text in the param doesn't seem to work, so lets do it again
220 void wxDisclosureTriangle::SetOpen( bool open
)
222 m_peer
->SetValue( open
? 1 : 0 );
225 bool wxDisclosureTriangle::IsOpen() const
227 return m_peer
->GetValue() == 1;
230 bool wxDisclosureTriangle::OSXHandleClicked( double WXUNUSED(timestampsec
) )
232 // Just emit button event for now
233 wxCommandEvent
event(wxEVT_COMMAND_BUTTON_CLICKED
, m_windowId
);
234 event
.SetEventObject(this);
235 ProcessCommand(event
);
240 wxSize
wxDisclosureTriangle::DoGetBestSize() const
242 wxSize size
= wxWindow::DoGetBestSize();
244 // under Carbon the base class GetBestSize() implementation doesn't seem to
245 // take the label into account at all, correct for it here
247 size
.x
+= GetTextExtent(GetLabel()).x
;
248 #endif // wxOSX_USE_CARBON