Implement support for button mnemonics in wxOSX/Cocoa.

Set the mnemonic as "key equivalent".

Closes #12917.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72809 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2012-10-28 01:08:32 +00:00
parent 031847a206
commit 0afa3752f6
4 changed files with 52 additions and 4 deletions

View File

@ -600,10 +600,11 @@ wxMSW:
- Don't send any events from wxSpinCtrl::SetRange() even if the value changed.
- Display system drag images during drag and drop if available (PeterO).
wxOSX:
wxOSX/Cocoa:
- Fix pages range in the print dialog (Auria).
- Implement image support in wxNotebook for wxOSX/Cocoa (Malcolm MacLeod).
- Implement image support in wxNotebook (Malcolm MacLeod).
- Add support for button mnemonics (joostn).
2.9.4: (released 2012-07-09)

View File

@ -49,6 +49,10 @@ public:
virtual bool OSXHandleClicked( double timestampsec );
#if wxOSX_USE_COCOA
void OSXSetAcceleratorFromLabel(const wxString& label);
#endif
protected:
DECLARE_DYNAMIC_CLASS(wxButton)
};

View File

@ -101,6 +101,9 @@ void wxButton::SetLabel(const wxString& label)
}
wxAnyButton::SetLabel(label);
#if wxOSX_USE_COCOA
OSXSetAcceleratorFromLabel(label);
#endif
}
wxWindow *wxButton::SetDefault()

View File

@ -16,6 +16,7 @@
#endif
#include "wx/button.h"
#include "wx/toplevel.h"
#include "wx/osx/private.h"
@ -170,6 +171,23 @@ public:
}
}
}
void SetAcceleratorFromLabel(const wxString& label)
{
const int accelPos = wxControl::FindAccelIndex(label);
if ( accelPos != wxNOT_FOUND )
{
wxString accelstring(label[accelPos + 1]); // Skip '&' itself
accelstring.MakeLower();
wxCFStringRef cfText(accelstring);
[GetNSButton() setKeyEquivalent:cfText.AsNSString()];
[GetNSButton() setKeyEquivalentModifierMask:NSCommandKeyMask];
}
else
{
[GetNSButton() setKeyEquivalent:@""];
}
}
private:
@ -183,6 +201,23 @@ private:
} // anonymous namespace
// Set the keyboard accelerator key from the label (e.g. "Click &Me")
void wxButton::OSXSetAcceleratorFromLabel(const wxString& label)
{
// Skip setting the accelerator for the default buttons as this would
// overwrite the default "Enter" which should be preserved.
wxTopLevelWindow * const
tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);
if ( tlw )
{
if ( tlw->GetDefaultItem() == this )
return;
}
wxButtonCocoaImpl *impl = static_cast<wxButtonCocoaImpl*>(GetPeer());
impl->SetAcceleratorFromLabel(label);
}
extern "C" void SetBezelStyleFromBorderFlags(NSButton *v, long style);
// set bezel style depending on the wxBORDER_XXX flags specified by the style
@ -264,9 +299,11 @@ wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer,
}
}
[v setButtonType:NSMomentaryPushInButton];
return new wxButtonCocoaImpl( wxpeer, v );
wxButtonCocoaImpl* const impl = new wxButtonCocoaImpl( wxpeer, v );
impl->SetAcceleratorFromLabel(label);
return impl;
}
void wxWidgetCocoaImpl::SetDefaultButton( bool isDefault )
@ -274,7 +311,10 @@ void wxWidgetCocoaImpl::SetDefaultButton( bool isDefault )
if ( [m_osxView isKindOfClass:[NSButton class]] )
{
if ( isDefault )
{
[(NSButton*)m_osxView setKeyEquivalent: @"\r" ];
[(NSButton*)m_osxView setKeyEquivalentModifierMask: 0];
}
else
[(NSButton*)m_osxView setKeyEquivalent: @"" ];
}