]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/menuitem.cpp
implemented menu drawing in the GTK theme
[wxWidgets.git] / src / mac / menuitem.cpp
index 22b07f575d83e385089483cb25107422a66b9e17..062a2f6edd9b773477c2f657cb232c9414de4f41 100644 (file)
 // headers & declarations
 // ============================================================================
 
 // headers & declarations
 // ============================================================================
 
+#include "wx/app.h"
 #include "wx/menu.h"
 #include "wx/menuitem.h"
 
 #include "wx/menu.h"
 #include "wx/menuitem.h"
 
-#include <wx/mac/uma.h>
+#include "wx/mac/uma.h"
 // ============================================================================
 // implementation
 // ============================================================================
 // ============================================================================
 // implementation
 // ============================================================================
 // dynamic classes implementation
 // ----------------------------------------------------------------------------
 
 // dynamic classes implementation
 // ----------------------------------------------------------------------------
 
+#if !USE_SHARED_LIBRARY
   IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject)
   IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject)
-
-void wxMacBuildMenuString(StringPtr outMacItemText, char *outMacShortcutChar , short *outMacModifiers , const char *inItemName , bool useShortcuts ) ;
-
-wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
-{
-    return wxStripMenuCodes(text);
-}
+#endif  //USE_SHARED_LIBRARY
 
 // ----------------------------------------------------------------------------
 // wxMenuItem
 // ----------------------------------------------------------------------------
 
 
 // ----------------------------------------------------------------------------
 // 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
 // -----------
 
 // ctor & dtor
 // -----------
 
@@ -58,7 +192,7 @@ wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id,
     m_help        = strHelp;
 
 
     m_help        = strHelp;
 
 
-    if ( m_text ==  "E&xit"  ||m_text == "Exit" )
+    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" ;
     }
     {
         m_text = "Quit\tCtrl+Q" ;
     }
@@ -115,30 +249,30 @@ void wxMenuItem::Enable(bool bDoEnable)
     if ( m_subMenu == NULL ) 
     {     
        // normal menu item
     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 )
            {
                        int index = m_parentMenu->MacGetIndexFromItem( this ) ;
                        if ( index >= 1 )
                        {
                                if ( bDoEnable )
-                                       UMAEnableMenuItem( m_parentMenu->GetHMenu() , index ) ;
+                                       UMAEnableMenuItem( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index ) ;
                                else
                                else
-                                       UMADisableMenuItem( m_parentMenu->GetHMenu() , index ) ;
+                                       UMADisableMenuItem( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index ) ;
                        }
            }
     }
     else                            
     {
                // submenu
                        }
            }
     }
     else                            
     {
                // submenu
-           if ( m_parentMenu->GetHMenu() )
+           if ( MAC_WXHMENU(m_parentMenu->GetHMenu()) )
            {
                        int index = m_parentMenu->MacGetIndexFromItem( this ) ;
                        if ( index >= 1 )
                        {
                                if ( bDoEnable )
            {
                        int index = m_parentMenu->MacGetIndexFromItem( this ) ;
                        if ( index >= 1 )
                        {
                                if ( bDoEnable )
-                                       UMAEnableMenuItem( m_parentMenu->GetHMenu() , index ) ;
+                                       UMAEnableMenuItem( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index ) ;
                                else
                                else
-                                       UMADisableMenuItem( m_parentMenu->GetHMenu() , index ) ;
+                                       UMADisableMenuItem( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index ) ;
                        }
            }
     }
                        }
            }
     }
@@ -154,15 +288,15 @@ void wxMenuItem::Check(bool bDoCheck)
   if ( m_isChecked != bDoCheck ) 
   {
     m_isChecked = 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 )
     {
                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
                                else
-                                       ::SetItemMark( m_parentMenu->GetHMenu() , index , 0 ) ; // no mark
+                                       ::SetItemMark( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index , 0 ) ; // no mark
                }
        }
   }
                }
        }
   }
@@ -178,14 +312,14 @@ void wxMenuItem::SetText(const wxString& text)
 //    OWNER_DRAWN_ONLY( wxOwnerDrawn::SetName(text) );
 
     wxCHECK_RET( m_parentMenu && m_parentMenu->GetHMenu(), wxT("menuitem without menu") );
 //    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;
     {
                int index = m_parentMenu->MacGetIndexFromItem( this ) ;
                if ( index >= 1 )
                {
                        Str255 label;
-                       wxMacBuildMenuString( label , NULL , NULL , text ,false);
-                       ::SetMenuItemText( m_parentMenu->GetHMenu() , index , label ) ; // checkmark
+                       MacBuildMenuString( label , NULL , NULL , text ,false);
+                       ::SetMenuItemText( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index , label ) ; // checkmark
                }
        }
 
                }
        }
 
@@ -204,6 +338,12 @@ void wxMenuItem::SetCheckable(bool checkable)
 // wxMenuItemBase
 // ----------------------------------------------------------------------------
 
 // wxMenuItemBase
 // ----------------------------------------------------------------------------
 
+/* static */
+wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
+{
+    return wxStripMenuCodes(text);
+}
+
 wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu,
                                 int id,
                                 const wxString& name,
 wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu,
                                 int id,
                                 const wxString& name,