X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e75491071dbefcada61175e3eb89ce4edf335983..10992a81d39da31b79063387b7b71c0ff68737ce:/src/mac/menuitem.cpp?ds=sidebyside

diff --git a/src/mac/menuitem.cpp b/src/mac/menuitem.cpp
index ef67483ca3..153c750c44 100644
--- a/src/mac/menuitem.cpp
+++ b/src/mac/menuitem.cpp
@@ -33,6 +33,144 @@
 // 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
+
+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
 // -----------
 
@@ -63,6 +201,28 @@ wxMenuItem::~wxMenuItem()
 {
 }
 
+bool wxMenuItem::IsChecked() const
+{
+    return wxMenuItemBase::IsChecked() ;
+}
+
+wxString wxMenuItem::GetLabel() const
+{
+    return wxStripMenuCodes(m_text);
+}
+
+// accelerators
+// ------------
+
+#if wxUSE_ACCEL
+
+wxAcceleratorEntry *wxMenuItem::GetAccel() const
+{
+    return wxGetAccelFromString(GetText());
+}
+
+#endif // wxUSE_ACCEL
+
 // misc
 // ----
 
@@ -139,4 +299,56 @@ void wxMenuItem::Check(bool bDoCheck)
   	 	}
   	}
   }
-}
\ No newline at end of file
+}
+
+void wxMenuItem::SetText(const wxString& text)
+{
+    // don't do anything if label didn't change
+    if ( m_text == text )
+        return;
+
+    wxMenuItemBase::SetText(text);
+//    OWNER_DRAWN_ONLY( wxOwnerDrawn::SetName(text) );
+
+    wxCHECK_RET( m_parentMenu && m_parentMenu->GetHMenu(), wxT("menuitem without menu") );
+   	if ( 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
+  	 	}
+  	}
+
+#if wxUSE_ACCEL
+    m_parentMenu->UpdateAccel(this);
+#endif // wxUSE_ACCEL
+
+}
+void wxMenuItem::SetCheckable(bool checkable)
+{
+    wxMenuItemBase::SetCheckable(checkable);
+   // OWNER_DRAWN_ONLY( wxOwnerDrawn::SetCheckable(checkable) );
+}
+
+// ----------------------------------------------------------------------------
+// wxMenuItemBase
+// ----------------------------------------------------------------------------
+
+/* static */
+wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
+{
+    return wxStripMenuCodes(text);
+}
+
+wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu,
+                                int id,
+                                const wxString& name,
+                                const wxString& help,
+                                bool isCheckable,
+                                wxMenu *subMenu)
+{
+    return new wxMenuItem(parentMenu, id, name, help, isCheckable, subMenu);
+}