]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/menuitem.cpp
Committed Stefan's temporary fix for crashing in Mac Classic.
[wxWidgets.git] / src / mac / carbon / menuitem.cpp
index 52e68bfdad2c0af0ba9da4c34b1340142053d733..6c41427f76dfb0dbf25eec9dd28d9833561f7cf4 100644 (file)
@@ -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) 
+                                               else
                                                {
-                                                       inItemName += strlen( inItemName ) ;
-                                                       // no function keys at the moment
-                                                       // macModifiers |= kMenuShiftModifier ;
-                                                       // macShortCut = *inItemName ;
+                                                   skip = true ;
                                                }
-                                               else
+                                       }
+                                       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" ) )
                                                {
-                                                       break ;
+                                                   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 ;
                                                
@@ -175,24 +178,16 @@ int wxMenuItem::MacBuildMenuString(StringPtr outMacItemText, SInt16 *outMacShort
 // ctor & dtor
 // -----------
 
-wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id,
-                       const wxString& text, const wxString& strHelp,
-                       bool bCheckable,
+wxMenuItem::wxMenuItem(wxMenu *pParentMenu,
+                       int id,
+                       const wxString& text,
+                       const wxString& strHelp,
+                       wxItemKind kind,
                        wxMenu *pSubMenu) 
+          : wxMenuItemBase(pParentMenu, id, text, strHelp, kind, pSubMenu)
 {
-    wxASSERT( pParentMenu != NULL );
-
-    m_parentMenu  = pParentMenu;
-    m_subMenu     = pSubMenu;
-    m_isEnabled   = TRUE;
-    m_isChecked   = FALSE;
-    m_id          = id;
-    m_text        = text;
-    m_isCheckable = bCheckable;
-    m_help        = strHelp;
-
-
-    if ( m_text ==  "E&xit"  ||m_text == "Exit" )
+    // VZ: what about translations?? (FIXME)
+    if ( m_text ==  "E&xit"  ||m_text == "Exit"  ||m_text.Left(5) == "Exit\t" || m_text.Left(6) == "E&xit\t" )
     {
         m_text = "Quit\tCtrl+Q" ;
     }
@@ -348,8 +343,8 @@ wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu,
                                 int id,
                                 const wxString& name,
                                 const wxString& help,
-                                bool isCheckable,
+                                wxItemKind kind,
                                 wxMenu *subMenu)
 {
-    return new wxMenuItem(parentMenu, id, name, help, isCheckable, subMenu);
+    return new wxMenuItem(parentMenu, id, name, help, kind, subMenu);
 }