Fix handling of help buttons with non-empty label under OS X.

Creating a button with wxID_HELP and a non-empty label used to always show
this label, even if it was just a standard "Help" or "&Help". This didn't work
at all as the help buttons under OS X are too small to show any label.

To fix this, use normal buttons, not help ones, if a really custom label is
used to ensure that it can be seen. And to still use the correct help buttons
in as many cases as possible, ignore the standard "Help" label and its
variants and don't show it at all.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65258 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2010-08-11 16:03:46 +00:00
parent 34a1414265
commit 01495abf87
3 changed files with 55 additions and 9 deletions

View File

@ -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.

View File

@ -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

View File

@ -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];
}