X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8e4c2912462461f9a2133ac39475457d668d1686..5ed8879eaf9d220414e85764b0b97fa11a15a6aa:/src/osx/button_osx.cpp diff --git a/src/osx/button_osx.cpp b/src/osx/button_osx.cpp index 29afcd3882..bb6138b5c4 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,23 +17,50 @@ #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" +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 + IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl) +BEGIN_EVENT_TABLE(wxButton, wxControl) + EVT_ENTER_WINDOW(wxButton::OnEnterWindow) + EVT_LEAVE_WINDOW(wxButton::OnLeaveWindow) +END_EVENT_TABLE() + 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) { + 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 @@ -42,13 +69,19 @@ bool wxButton::Create(wxWindow *parent, // this check if ( style & wxBU_NOTEXT ) { - return wxControl::Create(parent, id, lbl, pos, size, style, + return wxControl::Create(parent, id, pos, size, style, validator, name); } - wxString label(lbl); - if (label.empty() && wxIsStockID(id) && !(id == wxID_HELP)) - label = wxGetStockLabel(id); + 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 ; @@ -67,7 +100,13 @@ bool wxButton::Create(wxWindow *parent, void wxButton::SetLabel(const wxString& label) { - if ( GetId() == wxID_HELP || HasFlag(wxBU_NOTEXT) ) + if ( IsHelpButtonWithStandardLabel(GetId(), label) ) + { + // ignore the standard label for the help buttons, it's not used + return; + } + + if ( HasFlag(wxBU_NOTEXT) ) { // just store the label internally but don't really use it for the // button @@ -79,28 +118,32 @@ void wxButton::SetLabel(const wxString& label) wxButtonBase::SetLabel(label); } -// there is no support for button bitmaps in wxOSX/Carbon so there is no need -// for these methods there -#if wxOSX_USE_COCOA - wxBitmap wxButton::DoGetBitmap(State which) const { - return which == State_Normal ? m_peer->GetBitmap() : wxBitmap(); + return m_bitmaps[which]; } void wxButton::DoSetBitmap(const wxBitmap& bitmap, State which) { + m_bitmaps[which] = bitmap; + if ( which == State_Normal ) m_peer->SetBitmap(bitmap); + else if ( which == State_Pressed ) + { + wxButtonImpl* bi = dynamic_cast (m_peer); + if ( bi ) + bi->SetPressedBitmap(bitmap); + } + InvalidateBestSize(); } void wxButton::DoSetBitmapPosition(wxDirection dir) { m_peer->SetBitmapPosition(dir); + InvalidateBestSize(); } -#endif // wxOSX_USE_COCOA - wxWindow *wxButton::SetDefault() { wxWindow *btnOldDefault = wxButtonBase::SetDefault(); @@ -121,6 +164,18 @@ void wxButton::Command (wxCommandEvent & WXUNUSED(event)) // ProcessCommand(event); } +void wxButton::OnEnterWindow( wxMouseEvent& WXUNUSED(event)) +{ + if ( DoGetBitmap( State_Current ).IsOk() ) + m_peer->SetBitmap( DoGetBitmap( State_Current ) ); +} + +void wxButton::OnLeaveWindow( wxMouseEvent& WXUNUSED(event)) +{ + if ( DoGetBitmap( State_Current ).IsOk() ) + m_peer->SetBitmap( DoGetBitmap( State_Normal ) ); +} + bool wxButton::OSXHandleClicked( double WXUNUSED(timestampsec) ) { wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, m_windowId);