From 1502cb12e19de1cd9a54a9e5e08116e1f92aefc6 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sat, 23 Nov 2002 08:02:50 +0000 Subject: [PATCH] changes for supporting more menu shortcuts git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17952 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/mac/carbon/menuitem.cpp | 91 ++++++++++---------- src/mac/carbon/uma.cpp | 164 +++++++++++++++++++++++++++++++----- src/mac/menuitem.cpp | 91 ++++++++++---------- src/mac/uma.cpp | 164 +++++++++++++++++++++++++++++++----- 4 files changed, 382 insertions(+), 128 deletions(-) diff --git a/src/mac/carbon/menuitem.cpp b/src/mac/carbon/menuitem.cpp index 544bfd6004..6c41427f76 100644 --- a/src/mac/carbon/menuitem.cpp +++ b/src/mac/carbon/menuitem.cpp @@ -46,7 +46,7 @@ int wxMenuItem::MacBuildMenuString(StringPtr outMacItemText, SInt16 *outMacShort { char *p = (char *) &outMacItemText[1] ; short macModifiers = 0 ; - char macShortCut = 0 ; + SInt16 macShortCut = 0 ; const char *inItemName ; wxString inItemTextMac ; @@ -72,31 +72,6 @@ int wxMenuItem::MacBuildMenuString(StringPtr outMacItemText, SInt16 *outMacShort { switch ( *inItemName ) { - // special characters for macintosh menus -> use some replacement - case ';' : - *p++ = ',' ; - break ; - case '^' : - *p++ = ' ' ; - break ; - case '!' : - *p++ = ' ' ; - break ; - case '<' : - *p++ = '[' ; - break ; - case '>' : - *p++ = ']' ; - break ; - case '/' : - *p++ = '|' ; - break ; - case '(' : - *p++ = '[' ; - break ; - case ')' : - *p++ = ']' ; - break ; // shortcuts case '&' : { @@ -115,43 +90,71 @@ int wxMenuItem::MacBuildMenuString(StringPtr outMacItemText, SInt16 *outMacShort case '\t' : { ++inItemName ; - while( *inItemName ) + bool skip = false ; + bool explicitCommandKey = false ; + while( *inItemName && !skip ) { - if (strncmp("Ctrl", inItemName, 4) == 0) + if (wxStrnicmp("Ctrl", inItemName, 4) == 0) { inItemName = inItemName + 5; - macShortCut = *inItemName; + explicitCommandKey = true ; } - else if (strncmp("Cntrl", inItemName, 5) == 0) + else if (wxStrnicmp("Cntrl", inItemName, 5) == 0) { inItemName = inItemName + 6; - macShortCut = *inItemName; + explicitCommandKey = true ; } - else if (strncmp("Alt", inItemName, 3) == 0) + else if (wxStrnicmp("Alt", inItemName, 3) == 0) { inItemName = inItemName + 4; macModifiers |= kMenuOptionModifier ; - macShortCut = *inItemName ; } - else if (strncmp("Shift", inItemName, 5) == 0) + else if (wxStrnicmp("Shift", inItemName, 5) == 0) { inItemName = inItemName + 6; macModifiers |= kMenuShiftModifier ; - macShortCut = *inItemName ; - } - else if (strncmp("F", inItemName, 1) == 0) - { - inItemName += strlen( inItemName ) ; - // no function keys at the moment - // macModifiers |= kMenuShiftModifier ; - // macShortCut = *inItemName ; } else { - break ; + skip = true ; } } - + if ( *inItemName ) + { + if ( strlen(inItemName) == 1 ) + { + macShortCut = *inItemName; + } + else if ( !wxStricmp( inItemName , "Delete" ) || !wxStricmp( inItemName , "Del" ) ) + { + macShortCut = WXK_DELETE ; + } + else if ( !wxStricmp( inItemName , "Back" ) || !wxStricmp( inItemName , "Backspace" ) ) + { + macShortCut = WXK_BACK ; + } + else if ( !wxStricmp( inItemName , "Return" ) ) + { + macShortCut = WXK_RETURN ; + } + else if ( !wxStricmp( inItemName , "Enter" ) ) + { + macShortCut = kEnterCharCode ; + } + else if ( *inItemName == 'F' ) + { + int fkey = atol(inItemName+1) ; + if (fkey >= 1 && fkey < 15 ) + { + macShortCut = WXK_F1 + fkey - 1 ; + } + if ( !explicitCommandKey ) + macModifiers |= kMenuNoCommandModifier ; + } + } + + inItemName += strlen( inItemName ) ; + if ( *inItemName == 0 ) --inItemName ; diff --git a/src/mac/carbon/uma.cpp b/src/mac/carbon/uma.cpp index a0759d2551..1c6afd4eb6 100644 --- a/src/mac/carbon/uma.cpp +++ b/src/mac/carbon/uma.cpp @@ -237,33 +237,157 @@ void UMAInsertSubMenuItem( MenuRef menu , StringPtr l , MenuItemIndex item , SIn SetMenuItemHierarchicalID( menu , item , id ) ; } +void UMASetMenuItemShortcut( MenuRef menu , MenuItemIndex item , SInt16 key , UInt8 modifiers ) +{ + if ( key ) + { + SInt16 glyph = 0 ; + SInt16 macKey = key ; + if ( key >= WXK_F1 && key <= WXK_F15 ) + { + macKey = kFunctionKeyCharCode ; + glyph = kMenuF1Glyph + ( key - WXK_F1 ) ; + if ( key >= WXK_F13 ) + glyph += 13 ; + switch( key ) + { + case WXK_F1 : + macKey += ( 0x7a << 8 ) ; + break ; + case WXK_F2 : + macKey += ( 0x78 << 8 ) ; + break ; + case WXK_F3 : + macKey += ( 0x63 << 8 ) ; + break ; + case WXK_F4 : + macKey += ( 0x76 << 8 ) ; + break ; + case WXK_F5 : + macKey += ( 0x60 << 8 ) ; + break ; + case WXK_F6 : + macKey += ( 0x61 << 8 ) ; + break ; + case WXK_F7 : + macKey += ( 0x62 << 8 ) ; + break ; + case WXK_F8 : + macKey += ( 0x64 << 8 ) ; + break ; + case WXK_F9 : + macKey += ( 0x65 << 8 ) ; + break ; + case WXK_F10 : + macKey += ( 0x6D << 8 ) ; + break ; + case WXK_F11 : + macKey += ( 0x67 << 8 ) ; + break ; + case WXK_F12 : + macKey += ( 0x6F << 8 ) ; + break ; + case WXK_F13 : + macKey += ( 0x69 << 8 ) ; + break ; + case WXK_F14 : + macKey += ( 0x6B << 8 ) ; + break ; + case WXK_F15 : + macKey += ( 0x71 << 8 ) ; + break ; + default : + break ; + } ; + // unfortunately this does not yet trigger the right key , + // for some reason mac justs picks the first function key menu + // defined, so we turn this off + macKey = 0 ; + glyph = 0 ; + } + else + { + switch( key ) + { + case WXK_BACK : + macKey = kBackspaceCharCode ; + glyph = kMenuDeleteLeftGlyph ; + break ; + case WXK_TAB : + macKey = kTabCharCode ; + glyph = kMenuTabRightGlyph ; + break ; + case kEnterCharCode : + macKey = kEnterCharCode ; + glyph = kMenuEnterGlyph ; + break ; + case WXK_RETURN : + macKey = kReturnCharCode ; + glyph = kMenuReturnGlyph ; + break ; + case WXK_ESCAPE : + macKey = kEscapeCharCode ; + glyph = kMenuEscapeGlyph ; + break ; + case WXK_SPACE : + macKey = ' ' ; + glyph = kMenuSpaceGlyph ; + break ; + case WXK_DELETE : + macKey = kDeleteCharCode ; + glyph = kMenuDeleteRightGlyph ; + break ; + case WXK_CLEAR : + macKey = kClearCharCode ; + glyph = kMenuClearGlyph ; + break ; + case WXK_PRIOR : // PAGE UP + macKey = kPageUpCharCode ; + glyph = kMenuPageUpGlyph ; + break ; + case WXK_NEXT : + macKey = kPageDownCharCode ; + glyph = kMenuPageDownGlyph ; + break ; + case WXK_LEFT : + macKey = kLeftArrowCharCode ; + glyph = kMenuLeftArrowGlyph ; + break ; + case WXK_UP : + macKey = kUpArrowCharCode ; + glyph = kMenuUpArrowGlyph ; + break ; + case WXK_RIGHT : + macKey = kRightArrowCharCode ; + glyph = kMenuRightArrowGlyph ; + break ; + case WXK_DOWN : + macKey = kDownArrowCharCode ; + glyph = kMenuDownArrowGlyph ; + break ; + } + } + + SetItemCmd( menu, item , macKey ); + SetMenuItemModifiers(menu, item , modifiers ) ; + + if ( glyph ) + SetMenuItemKeyGlyph(menu, item , glyph ) ; + } +} void UMAAppendMenuItem( MenuRef menu , StringPtr l , SInt16 key, UInt8 modifiers ) { - Str255 label ; - memcpy( label , l , l[0]+1 ) ; - if ( key ) - { - int pos = label[0] ; - label[++pos] = '/'; - label[++pos] = toupper( key ); - label[0] = pos ; - } - MacAppendMenu( menu , label ) ; + MacAppendMenu(menu, "\pA"); + SetMenuItemText(menu, (SInt16) ::CountMenuItems(menu), l); + UMASetMenuItemShortcut( menu , (SInt16) ::CountMenuItems(menu), key , modifiers ) ; } void UMAInsertMenuItem( MenuRef menu , StringPtr l , MenuItemIndex item , SInt16 key, UInt8 modifiers ) { - Str255 label ; - memcpy( label , l , l[0]+1 ) ; - if ( key ) - { - int pos = label[0] ; - label[++pos] = '/'; - label[++pos] = toupper( key ); - label[0] = pos ; - } - MacInsertMenuItem( menu , label , item) ; + MacInsertMenuItem( menu , "\p" , item) ; + SetMenuItemText(menu, item , l); + UMASetMenuItemShortcut( menu , item , key , modifiers ) ; } // quickdraw diff --git a/src/mac/menuitem.cpp b/src/mac/menuitem.cpp index 544bfd6004..6c41427f76 100644 --- a/src/mac/menuitem.cpp +++ b/src/mac/menuitem.cpp @@ -46,7 +46,7 @@ int wxMenuItem::MacBuildMenuString(StringPtr outMacItemText, SInt16 *outMacShort { char *p = (char *) &outMacItemText[1] ; short macModifiers = 0 ; - char macShortCut = 0 ; + SInt16 macShortCut = 0 ; const char *inItemName ; wxString inItemTextMac ; @@ -72,31 +72,6 @@ int wxMenuItem::MacBuildMenuString(StringPtr outMacItemText, SInt16 *outMacShort { switch ( *inItemName ) { - // special characters for macintosh menus -> use some replacement - case ';' : - *p++ = ',' ; - break ; - case '^' : - *p++ = ' ' ; - break ; - case '!' : - *p++ = ' ' ; - break ; - case '<' : - *p++ = '[' ; - break ; - case '>' : - *p++ = ']' ; - break ; - case '/' : - *p++ = '|' ; - break ; - case '(' : - *p++ = '[' ; - break ; - case ')' : - *p++ = ']' ; - break ; // shortcuts case '&' : { @@ -115,43 +90,71 @@ int wxMenuItem::MacBuildMenuString(StringPtr outMacItemText, SInt16 *outMacShort case '\t' : { ++inItemName ; - while( *inItemName ) + bool skip = false ; + bool explicitCommandKey = false ; + while( *inItemName && !skip ) { - if (strncmp("Ctrl", inItemName, 4) == 0) + if (wxStrnicmp("Ctrl", inItemName, 4) == 0) { inItemName = inItemName + 5; - macShortCut = *inItemName; + explicitCommandKey = true ; } - else if (strncmp("Cntrl", inItemName, 5) == 0) + else if (wxStrnicmp("Cntrl", inItemName, 5) == 0) { inItemName = inItemName + 6; - macShortCut = *inItemName; + explicitCommandKey = true ; } - else if (strncmp("Alt", inItemName, 3) == 0) + else if (wxStrnicmp("Alt", inItemName, 3) == 0) { inItemName = inItemName + 4; macModifiers |= kMenuOptionModifier ; - macShortCut = *inItemName ; } - else if (strncmp("Shift", inItemName, 5) == 0) + else if (wxStrnicmp("Shift", inItemName, 5) == 0) { inItemName = inItemName + 6; macModifiers |= kMenuShiftModifier ; - macShortCut = *inItemName ; - } - else if (strncmp("F", inItemName, 1) == 0) - { - inItemName += strlen( inItemName ) ; - // no function keys at the moment - // macModifiers |= kMenuShiftModifier ; - // macShortCut = *inItemName ; } else { - break ; + skip = true ; } } - + if ( *inItemName ) + { + if ( strlen(inItemName) == 1 ) + { + macShortCut = *inItemName; + } + else if ( !wxStricmp( inItemName , "Delete" ) || !wxStricmp( inItemName , "Del" ) ) + { + macShortCut = WXK_DELETE ; + } + else if ( !wxStricmp( inItemName , "Back" ) || !wxStricmp( inItemName , "Backspace" ) ) + { + macShortCut = WXK_BACK ; + } + else if ( !wxStricmp( inItemName , "Return" ) ) + { + macShortCut = WXK_RETURN ; + } + else if ( !wxStricmp( inItemName , "Enter" ) ) + { + macShortCut = kEnterCharCode ; + } + else if ( *inItemName == 'F' ) + { + int fkey = atol(inItemName+1) ; + if (fkey >= 1 && fkey < 15 ) + { + macShortCut = WXK_F1 + fkey - 1 ; + } + if ( !explicitCommandKey ) + macModifiers |= kMenuNoCommandModifier ; + } + } + + inItemName += strlen( inItemName ) ; + if ( *inItemName == 0 ) --inItemName ; diff --git a/src/mac/uma.cpp b/src/mac/uma.cpp index a0759d2551..1c6afd4eb6 100644 --- a/src/mac/uma.cpp +++ b/src/mac/uma.cpp @@ -237,33 +237,157 @@ void UMAInsertSubMenuItem( MenuRef menu , StringPtr l , MenuItemIndex item , SIn SetMenuItemHierarchicalID( menu , item , id ) ; } +void UMASetMenuItemShortcut( MenuRef menu , MenuItemIndex item , SInt16 key , UInt8 modifiers ) +{ + if ( key ) + { + SInt16 glyph = 0 ; + SInt16 macKey = key ; + if ( key >= WXK_F1 && key <= WXK_F15 ) + { + macKey = kFunctionKeyCharCode ; + glyph = kMenuF1Glyph + ( key - WXK_F1 ) ; + if ( key >= WXK_F13 ) + glyph += 13 ; + switch( key ) + { + case WXK_F1 : + macKey += ( 0x7a << 8 ) ; + break ; + case WXK_F2 : + macKey += ( 0x78 << 8 ) ; + break ; + case WXK_F3 : + macKey += ( 0x63 << 8 ) ; + break ; + case WXK_F4 : + macKey += ( 0x76 << 8 ) ; + break ; + case WXK_F5 : + macKey += ( 0x60 << 8 ) ; + break ; + case WXK_F6 : + macKey += ( 0x61 << 8 ) ; + break ; + case WXK_F7 : + macKey += ( 0x62 << 8 ) ; + break ; + case WXK_F8 : + macKey += ( 0x64 << 8 ) ; + break ; + case WXK_F9 : + macKey += ( 0x65 << 8 ) ; + break ; + case WXK_F10 : + macKey += ( 0x6D << 8 ) ; + break ; + case WXK_F11 : + macKey += ( 0x67 << 8 ) ; + break ; + case WXK_F12 : + macKey += ( 0x6F << 8 ) ; + break ; + case WXK_F13 : + macKey += ( 0x69 << 8 ) ; + break ; + case WXK_F14 : + macKey += ( 0x6B << 8 ) ; + break ; + case WXK_F15 : + macKey += ( 0x71 << 8 ) ; + break ; + default : + break ; + } ; + // unfortunately this does not yet trigger the right key , + // for some reason mac justs picks the first function key menu + // defined, so we turn this off + macKey = 0 ; + glyph = 0 ; + } + else + { + switch( key ) + { + case WXK_BACK : + macKey = kBackspaceCharCode ; + glyph = kMenuDeleteLeftGlyph ; + break ; + case WXK_TAB : + macKey = kTabCharCode ; + glyph = kMenuTabRightGlyph ; + break ; + case kEnterCharCode : + macKey = kEnterCharCode ; + glyph = kMenuEnterGlyph ; + break ; + case WXK_RETURN : + macKey = kReturnCharCode ; + glyph = kMenuReturnGlyph ; + break ; + case WXK_ESCAPE : + macKey = kEscapeCharCode ; + glyph = kMenuEscapeGlyph ; + break ; + case WXK_SPACE : + macKey = ' ' ; + glyph = kMenuSpaceGlyph ; + break ; + case WXK_DELETE : + macKey = kDeleteCharCode ; + glyph = kMenuDeleteRightGlyph ; + break ; + case WXK_CLEAR : + macKey = kClearCharCode ; + glyph = kMenuClearGlyph ; + break ; + case WXK_PRIOR : // PAGE UP + macKey = kPageUpCharCode ; + glyph = kMenuPageUpGlyph ; + break ; + case WXK_NEXT : + macKey = kPageDownCharCode ; + glyph = kMenuPageDownGlyph ; + break ; + case WXK_LEFT : + macKey = kLeftArrowCharCode ; + glyph = kMenuLeftArrowGlyph ; + break ; + case WXK_UP : + macKey = kUpArrowCharCode ; + glyph = kMenuUpArrowGlyph ; + break ; + case WXK_RIGHT : + macKey = kRightArrowCharCode ; + glyph = kMenuRightArrowGlyph ; + break ; + case WXK_DOWN : + macKey = kDownArrowCharCode ; + glyph = kMenuDownArrowGlyph ; + break ; + } + } + + SetItemCmd( menu, item , macKey ); + SetMenuItemModifiers(menu, item , modifiers ) ; + + if ( glyph ) + SetMenuItemKeyGlyph(menu, item , glyph ) ; + } +} void UMAAppendMenuItem( MenuRef menu , StringPtr l , SInt16 key, UInt8 modifiers ) { - Str255 label ; - memcpy( label , l , l[0]+1 ) ; - if ( key ) - { - int pos = label[0] ; - label[++pos] = '/'; - label[++pos] = toupper( key ); - label[0] = pos ; - } - MacAppendMenu( menu , label ) ; + MacAppendMenu(menu, "\pA"); + SetMenuItemText(menu, (SInt16) ::CountMenuItems(menu), l); + UMASetMenuItemShortcut( menu , (SInt16) ::CountMenuItems(menu), key , modifiers ) ; } void UMAInsertMenuItem( MenuRef menu , StringPtr l , MenuItemIndex item , SInt16 key, UInt8 modifiers ) { - Str255 label ; - memcpy( label , l , l[0]+1 ) ; - if ( key ) - { - int pos = label[0] ; - label[++pos] = '/'; - label[++pos] = toupper( key ); - label[0] = pos ; - } - MacInsertMenuItem( menu , label , item) ; + MacInsertMenuItem( menu , "\p" , item) ; + SetMenuItemText(menu, item , l); + UMASetMenuItemShortcut( menu , item , key , modifiers ) ; } // quickdraw