X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e437cc535e8c26fd918796a9680c6495afe800db..dc259b792613550edda31cc6202b42e172e2a240:/src/mac/menuitem.cpp

diff --git a/src/mac/menuitem.cpp b/src/mac/menuitem.cpp
index 5ffdf54955..6c41427f76 100644
--- a/src/mac/menuitem.cpp
+++ b/src/mac/menuitem.cpp
@@ -13,10 +13,11 @@
 // headers & declarations
 // ============================================================================
 
+#include "wx/app.h"
 #include "wx/menu.h"
 #include "wx/menuitem.h"
 
-#include <wx/mac/uma.h>
+#include "wx/mac/uma.h"
 // ============================================================================
 // implementation
 // ============================================================================
@@ -45,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 ;
 	
@@ -71,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 '&' :
 				{
@@ -114,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 ;
 						
@@ -174,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" ;
     }
@@ -248,30 +244,30 @@ void wxMenuItem::Enable(bool bDoEnable)
     if ( m_subMenu == NULL ) 
     {     
     	// normal menu item
-	    if ( m_parentMenu->GetHMenu() )
+	    if ( MAC_WXHMENU(m_parentMenu->GetHMenu()) )
 	    {
 	   	 	int index = m_parentMenu->MacGetIndexFromItem( this ) ;
 	   	 	if ( index >= 1 )
 	   	 	{
 	   	 		if ( bDoEnable )
-	   	 			UMAEnableMenuItem( m_parentMenu->GetHMenu() , index ) ;
+	   	 			UMAEnableMenuItem( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index ) ;
 	   	 		else
-	   	 			UMADisableMenuItem( m_parentMenu->GetHMenu() , index ) ;
+	   	 			UMADisableMenuItem( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index ) ;
 	   	 	}
 	    }
     }
     else                            
     {
   		// submenu
-	    if ( m_parentMenu->GetHMenu() )
+	    if ( MAC_WXHMENU(m_parentMenu->GetHMenu()) )
 	    {
 	   	 	int index = m_parentMenu->MacGetIndexFromItem( this ) ;
 	   	 	if ( index >= 1 )
 	   	 	{
 	   	 		if ( bDoEnable )
-	   	 			UMAEnableMenuItem( m_parentMenu->GetHMenu() , index ) ;
+	   	 			UMAEnableMenuItem( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index ) ;
 	   	 		else
-	   	 			UMADisableMenuItem( m_parentMenu->GetHMenu() , index ) ;
+	   	 			UMADisableMenuItem( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index ) ;
 	   	 	}
 	    }
     }
@@ -287,15 +283,15 @@ void wxMenuItem::Check(bool bDoCheck)
   if ( m_isChecked != bDoCheck ) 
   {
     m_isChecked = bDoCheck;
-   	if ( m_parentMenu->GetHMenu() )
+   	if ( MAC_WXHMENU(m_parentMenu->GetHMenu()) )
     {
    	 	int index = m_parentMenu->MacGetIndexFromItem( this ) ;
    	 	if ( index >= 1 )
    	 	{
    	 		if ( bDoCheck )
-					::SetItemMark( m_parentMenu->GetHMenu() , index , 0x12 ) ; // checkmark
+					::SetItemMark( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index , 0x12 ) ; // checkmark
 				else
- 					::SetItemMark( m_parentMenu->GetHMenu() , index , 0 ) ; // no mark
+ 					::SetItemMark( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index , 0 ) ; // no mark
   	 	}
   	}
   }
@@ -311,14 +307,14 @@ void wxMenuItem::SetText(const wxString& text)
 //    OWNER_DRAWN_ONLY( wxOwnerDrawn::SetName(text) );
 
     wxCHECK_RET( m_parentMenu && m_parentMenu->GetHMenu(), wxT("menuitem without menu") );
-   	if ( m_parentMenu->GetHMenu() )
+   	if ( MAC_WXHMENU(m_parentMenu->GetHMenu()) )
     {
    	 	int index = m_parentMenu->MacGetIndexFromItem( this ) ;
    	 	if ( index >= 1 )
    	 	{
  			Str255 label;
 			MacBuildMenuString( label , NULL , NULL , text ,false);
-   	 		UMASetMenuItemText( m_parentMenu->GetHMenu() , index , label ) ; // checkmark
+   	 		::SetMenuItemText( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index , label ) ; // checkmark
   	 	}
   	}
 
@@ -347,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);
 }