From 1e85b547a56a9346c2bdd690b2885ab2ef520c2b Mon Sep 17 00:00:00 2001 From: David Elliott Date: Wed, 20 Oct 2004 19:18:46 +0000 Subject: [PATCH] Added CocoaSetKeyEquivalent() that sets the accelerators. Only implemented for letters, numbers, and ascii control characters. TODO: up/down/etc. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30040 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/cocoa/menuitem.h | 1 + src/cocoa/menuitem.mm | 41 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/include/wx/cocoa/menuitem.h b/include/wx/cocoa/menuitem.h index 3596f68cc0..d5ba585ac6 100644 --- a/include/wx/cocoa/menuitem.h +++ b/include/wx/cocoa/menuitem.h @@ -54,6 +54,7 @@ public: void CocoaItemSelected(); bool Cocoa_validateMenuItem(); protected: + void CocoaSetKeyEquivalent(); WX_NSMenuItem m_cocoaNSMenuItem; static wxMenuItemCocoaHash sm_cocoaHash; static wxObjcAutoRefFromAlloc sm_cocoaTarget; diff --git a/src/cocoa/menuitem.mm b/src/cocoa/menuitem.mm index 5a12767e06..c1248355e8 100644 --- a/src/cocoa/menuitem.mm +++ b/src/cocoa/menuitem.mm @@ -34,6 +34,7 @@ #import #import #import // NSOnState, NSOffState +#import // modifier key masks #if wxUSE_MENUS @@ -101,6 +102,44 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text) return wxStripMenuCodes(text); } +void wxMenuItemCocoa::CocoaSetKeyEquivalent() +{ + wxAcceleratorEntry *accel = GetAccel(); + if(!accel) + return; + + int accelFlags = accel->GetFlags(); + int keyModifierMask = 0; + if(accelFlags & wxACCEL_ALT) + keyModifierMask |= NSAlternateKeyMask; + if(accelFlags & wxACCEL_CTRL) + keyModifierMask |= NSCommandKeyMask; + int keyCode = accel->GetKeyCode(); + if(isalpha(keyCode)) + { // For alpha characters use upper/lower rather than NSShiftKeyMask + char alphaChar; + if(accelFlags & wxACCEL_SHIFT) + alphaChar = toupper(keyCode); + else + alphaChar = tolower(keyCode); + [m_cocoaNSMenuItem setKeyEquivalent:[NSString stringWithCString:&alphaChar length:1]]; + [m_cocoaNSMenuItem setKeyEquivalentModifierMask:keyModifierMask]; + } + else + { + if(accelFlags & wxACCEL_SHIFT) + keyModifierMask |= NSShiftKeyMask; + if(keyCode < 128) // low ASCII includes backspace/tab/etc. + { char alphaChar = keyCode; + [m_cocoaNSMenuItem setKeyEquivalent:[NSString stringWithCString:&alphaChar length:1]]; + } + else + { // TODO + } + [m_cocoaNSMenuItem setKeyEquivalentModifierMask:keyModifierMask]; + } +} + // ---------------------------------------------------------------------------- // ctor & dtor // ---------------------------------------------------------------------------- @@ -134,6 +173,7 @@ wxMenuItemCocoa::wxMenuItemCocoa(wxMenu *pParentMenu, else [m_cocoaNSMenuItem setTarget: sm_cocoaTarget]; [menuTitle release]; + CocoaSetKeyEquivalent(); } } @@ -245,6 +285,7 @@ void wxMenuItem::SetText(const wxString& label) wxMenuItemBase::SetText(label); wxCHECK_RET(m_kind != wxITEM_SEPARATOR, wxT("Separator items do not have titles.")); [m_cocoaNSMenuItem setTitle: wxNSStringWithWxString(wxStripMenuCodes(label))]; + CocoaSetKeyEquivalent(); } void wxMenuItem::SetCheckable(bool checkable) -- 2.45.2