]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement support for button mnemonics in wxOSX/Cocoa.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 28 Oct 2012 01:08:32 +0000 (01:08 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 28 Oct 2012 01:08:32 +0000 (01:08 +0000)
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

docs/changes.txt
include/wx/osx/button.h
src/osx/button_osx.cpp
src/osx/cocoa/button.mm

index f23e30c46351893f91de81a0c80bf0d578f835f1..c47e21243efe2b7d684c66a0f7d2b7eb3a4457ef 100644 (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)
index 602644fe2c8cc9d29d0456ccc843e060f244b62d..d5aff7ab3341f248ef2fe134055b7ccb86206ea0 100644 (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)
 };
index 6984a9af080c8e32b4ef56e05a7c8de42d02311c..b52bf2221b3655a4d21b1c0e46e5ccdbcf9a185b 100644 (file)
@@ -101,6 +101,9 @@ void wxButton::SetLabel(const wxString& label)
     }
 
     wxAnyButton::SetLabel(label);
+#if wxOSX_USE_COCOA
+    OSXSetAcceleratorFromLabel(label);
+#endif
 }
 
 wxWindow *wxButton::SetDefault()
index 8ed183958e6d1dee3ddc97eaf4698801e7fd596e..7e68cc0d79bba470b71e61314e25ef6eb49c3d57 100644 (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: @"" ];
     }