+//
+// Helper Functions to get Mac Menus the way they should be ;-)
+//
+
+void wxMacCtoPString(const char* theCString, Str255 thePString);
+
+// remove inappropriate characters, if useShortcuts is false, the ampersand will not auto-generate a mac menu-shortcut
+
+int wxMenuItem::MacBuildMenuString(StringPtr outMacItemText, SInt16 *outMacShortcutChar , UInt8 *outMacModifiers , const char *inItemText , bool useShortcuts )
+{
+ char *p = (char *) &outMacItemText[1] ;
+ short macModifiers = 0 ;
+ SInt16 macShortCut = 0 ;
+ const char *inItemName ;
+ wxString inItemTextMac ;
+
+ if (wxApp::s_macDefaultEncodingIsPC)
+ {
+ inItemTextMac = wxMacMakeMacStringFromPC( inItemText ) ;
+ inItemName = inItemTextMac ;
+ }
+ else
+ {
+ inItemName = inItemText ;
+ }
+
+ if ( useShortcuts && !wxApp::s_macSupportPCMenuShortcuts )
+ useShortcuts = false ;
+
+ // we have problems with a leading hypen - it will be taken as a separator
+
+ while ( *inItemName == '-' )
+ inItemName++ ;
+
+ while( *inItemName )
+ {
+ switch ( *inItemName )
+ {
+ // shortcuts
+ case '&' :
+ {
+ ++inItemName ;
+ if ( *inItemName )
+ {
+ *p++ = *inItemName ;
+ if ( useShortcuts )
+ macShortCut = *inItemName ;
+ }
+ else
+ --inItemName ;
+ }
+ break ;
+ // win-like accelerators
+ case '\t' :
+ {
+ ++inItemName ;
+ bool skip = false ;
+ bool explicitCommandKey = false ;
+ while( *inItemName && !skip )
+ {
+ if (wxStrnicmp("Ctrl", inItemName, 4) == 0)
+ {
+ inItemName = inItemName + 5;
+ explicitCommandKey = true ;
+ }
+ else if (wxStrnicmp("Cntrl", inItemName, 5) == 0)
+ {
+ inItemName = inItemName + 6;
+ explicitCommandKey = true ;
+ }
+ else if (wxStrnicmp("Alt", inItemName, 3) == 0)
+ {
+ inItemName = inItemName + 4;
+ macModifiers |= kMenuOptionModifier ;
+ }
+ else if (wxStrnicmp("Shift", inItemName, 5) == 0)
+ {
+ inItemName = inItemName + 6;
+ macModifiers |= kMenuShiftModifier ;
+ }
+ else
+ {
+ 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 ;
+
+ }
+ break ;
+ default :
+ *p++ = *inItemName ;
+ }
+ ++inItemName ;
+ }
+
+ outMacItemText[0] = (p - (char *)outMacItemText) - 1;
+ if ( outMacShortcutChar )
+ *outMacShortcutChar = macShortCut ;
+ if ( outMacModifiers )
+ *outMacModifiers = macModifiers ;
+
+ return 0 ;
+}
+