diff --git a/interface/wx/button.h b/interface/wx/button.h index 3cef3626ab..79d9858866 100644 --- a/interface/wx/button.h +++ b/interface/wx/button.h @@ -107,7 +107,15 @@ public: The preferred way to create standard buttons is to use default value of @a label. If no label is supplied and @a id is one of standard IDs from - @ref page_stockitems "this list", a standard label will be used. + @ref page_stockitems "this list", a standard label will be used. In + other words, if you use a predefined @c wxID_XXX constant, just omit + the label completely rather than specifying it. In particular, help + buttons (the ones with @a id of @c wxID_HELP) under Mac OS X can't + display any label at all and while wxButton will detect if the standard + "Help" label is used and ignore it, using any other label will prevent + the button from correctly appearing as a help button and so should be + avoided. + In addition to that, the button will be decorated with stock icons under GTK+ 2. diff --git a/src/osx/button_osx.cpp b/src/osx/button_osx.cpp index 2fef7837da..ceedc162b4 100644 --- a/src/osx/button_osx.cpp +++ b/src/osx/button_osx.cpp @@ -17,12 +17,31 @@ #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) @@ -32,7 +51,7 @@ END_EVENT_TABLE() bool wxButton::Create(wxWindow *parent, wxWindowID id, - const wxString& lbl, + const wxString& labelOrig, const wxPoint& pos, const wxSize& size, long style, @@ -54,9 +73,15 @@ bool wxButton::Create(wxWindow *parent, 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 ; @@ -75,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 diff --git a/src/osx/cocoa/button.mm b/src/osx/cocoa/button.mm index 5e4d5db404..d4560769be 100644 --- a/src/osx/cocoa/button.mm +++ b/src/osx/cocoa/button.mm @@ -20,7 +20,10 @@ wxSize wxButton::DoGetBestSize() const { - if ( GetId() == wxID_HELP ) + // We only use help button bezel if we don't have any (non standard) label + // to display in the button. Otherwise even wxID_HELP buttons look like + // normal push buttons. + if ( GetId() == wxID_HELP && GetLabel().empty() ) return wxSize( 23 , 23 ) ; wxRect r ; @@ -157,7 +160,7 @@ void SetBezelStyleFromBorderFlags(NSButton *v, long style) wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), wxWindowID id, - const wxString& WXUNUSED(label), + const wxString& label, const wxPoint& pos, const wxSize& size, long WXUNUSED(style), @@ -166,7 +169,11 @@ wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; - if ( id == wxID_HELP ) + // We can't display a custom label inside a button with help bezel style so + // we only use it if we are using the default label. wxButton itself checks + // if the label is just "Help" in which case it discards it and passes us + // an empty string. + if ( id == wxID_HELP && label.empty() ) { [v setBezelStyle:NSHelpButtonBezelStyle]; }