]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/menuitem.cpp
Applied patch for non-Latin keyboards.
[wxWidgets.git] / src / mac / menuitem.cpp
index ef67483ca3d139c126062f37b38a3c97a69ec18c..6db2d125619f6415a5b4db41b52f10a526f53f1a 100644 (file)
@@ -13,6 +13,7 @@
 // headers & declarations
 // ============================================================================
 
+#include "wx/app.h"
 #include "wx/menu.h"
 #include "wx/menuitem.h"
 
 // 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
 // -----------
 
@@ -63,6 +202,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 +300,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);
+}