From: Vadim Zeitlin Date: Sun, 28 Oct 2012 01:08:32 +0000 (+0000) Subject: Implement support for button mnemonics in wxOSX/Cocoa. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/0afa3752f635a4fb621e2f55dfa41dce4f062d94 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 --- diff --git a/docs/changes.txt b/docs/changes.txt index f23e30c463..c47e21243e 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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) diff --git a/include/wx/osx/button.h b/include/wx/osx/button.h index 602644fe2c..d5aff7ab33 100644 --- a/include/wx/osx/button.h +++ b/include/wx/osx/button.h @@ -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) }; diff --git a/src/osx/button_osx.cpp b/src/osx/button_osx.cpp index 6984a9af08..b52bf2221b 100644 --- a/src/osx/button_osx.cpp +++ b/src/osx/button_osx.cpp @@ -101,6 +101,9 @@ void wxButton::SetLabel(const wxString& label) } wxAnyButton::SetLabel(label); +#if wxOSX_USE_COCOA + OSXSetAcceleratorFromLabel(label); +#endif } wxWindow *wxButton::SetDefault() diff --git a/src/osx/cocoa/button.mm b/src/osx/cocoa/button.mm index 8ed183958e..7e68cc0d79 100644 --- a/src/osx/cocoa/button.mm +++ b/src/osx/cocoa/button.mm @@ -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(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: @"" ]; }