X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/51abe921b849be69f02c174365c9a7bc8b46bd08..ef3a5e0aae003c29941c7d41ed6becea4287752d:/src/mac/menuitem.cpp

diff --git a/src/mac/menuitem.cpp b/src/mac/menuitem.cpp
index fc8d7885af..33b337518e 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
 // ============================================================================
@@ -29,11 +30,148 @@
   IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject)
 #endif  //USE_SHARED_LIBRARY
 
-void wxMacBuildMenuString(StringPtr outMacItemText, char *outMacShortcutChar , short *outMacModifiers , const char *inItemName , bool useShortcuts ) ;
 // ----------------------------------------------------------------------------
 // wxMenuItem
 // ----------------------------------------------------------------------------
 
+//
+// 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 ;
+	char 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 )
+		{
+			// 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 '&' :
+				{
+					++inItemName ;
+					if ( *inItemName )
+					{
+						*p++ = *inItemName ;
+						if ( useShortcuts )
+							macShortCut = *inItemName ;
+					}
+					else
+						--inItemName ;
+				}
+				break ;
+			// win-like accelerators
+			case '\t' :
+				{
+					++inItemName ;
+					while( *inItemName )
+					{
+						if (strncmp("Ctrl", inItemName, 4) == 0) 
+						{
+							inItemName = inItemName + 5;
+							macShortCut = *inItemName;
+						}
+						else if (strncmp("Cntrl", inItemName, 5) == 0) 
+						{
+							inItemName = inItemName + 6;
+							macShortCut = *inItemName;
+						}
+						else if (strncmp("Alt", inItemName, 3) == 0) 
+						{
+							inItemName = inItemName + 4;
+							macModifiers |= kMenuOptionModifier ;
+							macShortCut = *inItemName ;
+						}
+						else if (strncmp("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 ;
+						}
+					}
+
+					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 ;
+}
+
 // ctor & dtor
 // -----------
 
@@ -180,7 +318,7 @@ void wxMenuItem::SetText(const wxString& text)
    	 	if ( index >= 1 )
    	 	{
  			Str255 label;
-			wxMacBuildMenuString( label , NULL , NULL , text ,false);
+			MacBuildMenuString( label , NULL , NULL , text ,false);
    	 		::SetMenuItemText( m_parentMenu->GetHMenu() , index , label ) ; // checkmark
   	 	}
   	}
@@ -200,6 +338,12 @@ void wxMenuItem::SetCheckable(bool checkable)
 // wxMenuItemBase
 // ----------------------------------------------------------------------------
 
+/* static */
+wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
+{
+    return wxStripMenuCodes(text);
+}
+
 wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu,
                                 int id,
                                 const wxString& name,