X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d04995b3a6d56d610d0eb7af9c07ba91eaf4884d..b7d74e9ca32b2ffd17bd0f98fde97361b6d5ec0f:/src/cocoa/menuitem.mm diff --git a/src/cocoa/menuitem.mm b/src/cocoa/menuitem.mm index 5a12767e06..b5d1daa220 100644 --- a/src/cocoa/menuitem.mm +++ b/src/cocoa/menuitem.mm @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: menuitem.cpp +// Name: src/cocoa/menuitem.mm // Purpose: wxMenuItem implementation // Author: David Elliott // Modified by: @@ -18,15 +18,20 @@ // ---------------------------------------------------------------------------- #include "wx/wxprec.h" + +#if wxUSE_MENUS + +#include "wx/menuitem.h" + +#include "wx/cocoa/objc/objc_uniquifying.h" + #ifndef WX_PRECOMP #include "wx/menu.h" - #include "wx/menuitem.h" #include "wx/utils.h" #include "wx/frame.h" #include "wx/log.h" #endif -#include "wx/cocoa/ObjcPose.h" #include "wx/cocoa/autorelease.h" #include "wx/cocoa/string.h" @@ -34,8 +39,7 @@ #import #import #import // NSOnState, NSOffState - -#if wxUSE_MENUS +#import // modifier key masks // ---------------------------------------------------------------------------- // functions prototypes @@ -51,6 +55,7 @@ - (void)wxMenuItemAction: (id)sender; - (BOOL)validateMenuItem: (id)menuItem; @end //interface wxNSMenuItemTarget +WX_DECLARE_GET_OBJC_CLASS(wxNSMenuItemTarget,NSObject) @implementation wxNSMenuItemTarget : NSObject @@ -72,14 +77,14 @@ } @end //implementation wxNSMenuItemTarget +WX_IMPLEMENT_GET_OBJC_CLASS(wxNSMenuItemTarget,NSObject) // ============================================================================ // wxMenuItemCocoa implementation // ============================================================================ -IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject) wxMenuItemCocoaHash wxMenuItemCocoa::sm_cocoaHash; -wxObjcAutoRefFromAlloc wxMenuItemCocoa::sm_cocoaTarget = [[wxNSMenuItemTarget alloc] init]; +wxObjcAutoRefFromAlloc wxMenuItemCocoa::sm_cocoaTarget = [[WX_GET_OBJC_CLASS(wxNSMenuItemTarget) alloc] init]; // ---------------------------------------------------------------------------- // wxMenuItemBase @@ -95,10 +100,42 @@ wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu, return new wxMenuItem(parentMenu, itemid, name, help, kind, subMenu); } -/* static */ -wxString wxMenuItemBase::GetLabelFromText(const wxString& text) +void wxMenuItemCocoa::CocoaSetKeyEquivalent() { - return wxStripMenuCodes(text); + 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]; + } } // ---------------------------------------------------------------------------- @@ -134,6 +171,7 @@ wxMenuItemCocoa::wxMenuItemCocoa(wxMenu *pParentMenu, else [m_cocoaNSMenuItem setTarget: sm_cocoaTarget]; [menuTitle release]; + CocoaSetKeyEquivalent(); } } @@ -187,7 +225,7 @@ void wxMenuItem::SetBitmaps(const wxBitmap& bmpChecked, } else { - wxASSERT_MSG(!bmpUnchecked.Ok(),wxT("Normal menu items should only have one bitmap")); + wxASSERT_MSG(!bmpUnchecked.IsOk(),wxT("Normal menu items should only have one bitmap")); [m_cocoaNSMenuItem setImage: bmpChecked.GetNSImage(true)]; } } @@ -240,11 +278,12 @@ void wxMenuItem::Check(bool check) } } -void wxMenuItem::SetText(const wxString& label) +void wxMenuItem::SetItemLabel(const wxString& label) { - wxMenuItemBase::SetText(label); + wxMenuItemBase::SetItemLabel(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)