]> git.saurik.com Git - wxWidgets.git/commitdiff
avoid duplicated empty help menu in localized applications (patch 1600747)
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 14 Mar 2007 00:37:07 +0000 (00:37 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 14 Mar 2007 00:37:07 +0000 (00:37 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44798 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/mac/carbon/uma.h
src/mac/carbon/app.cpp
src/mac/carbon/menu.cpp
src/mac/carbon/uma.cpp

index fa3decc304f493e670ca91b99ad33ed5a1e7f7fd..214ed1f1b7758e5ad97521fa95cc180e66ac3e58 100644 (file)
@@ -50,6 +50,10 @@ wxGTK:
 - Added support for colour cursors (Pascal Monasse).
 - Setting foreground colour of single line wxTextCtrl now works
 
+wxMac:
+
+- Fix duplicate (empty) help menu in non-English programs (Andreas Jacobs)
+
 wxMSW:
 
 - Fixed infinite loop in wxThread::Wait() in console applications.
index 6fc10b61203de3c6aafc21612c840a9a8cdca747..3d12a552cd8871e1d415ca8e1c05782efbea954e 100644 (file)
@@ -94,10 +94,17 @@ bool            UMAIsWindowModal( WindowRef inWindow ) ;
 
 void UMAHighlightAndActivateWindow( WindowRef inWindowRef , bool inActivate ) ;
 
+// Retrieves the Help menu handle. Warning: As a side-effect this functions also
+// creates the Help menu if it didn't exist yet.
 OSStatus UMAGetHelpMenu(
   MenuRef *        outHelpMenu,
   MenuItemIndex *  outFirstCustomItemIndex);      /* can be NULL */
 
+// Same as UMAGetHelpMenu, but doesn't create the Help menu if UMAGetHelpMenu hasn't been called yet.
+OSStatus UMAGetHelpMenuDontCreate(
+  MenuRef *        outHelpMenu,
+  MenuItemIndex *  outFirstCustomItemIndex);      /* can be NULL */
+
 // Appearance Drawing
 
 OSStatus UMADrawThemePlacard( const Rect *inRect , ThemeDrawState inState ) ;
index 8e587d23061f052ef07229f42fe1fa22e90508a4..ec3b13491db7072b9617971dc61d5797a4ddece0 100644 (file)
@@ -451,16 +451,16 @@ wxMenu* wxFindMenuFromMacCommand( const HICommand &command , wxMenuItem* &item )
         id = wxMacCommandToId( command.commandID ) ;
         // make sure it is one of our own menus, or of the 'synthetic' apple and help menus , otherwise don't touch
         MenuItemIndex firstUserHelpMenuItem ;
-        static MenuHandle mh = NULL ;
-        if ( mh == NULL )
+        static MenuHandle helpMenuHandle = NULL ;
+        if ( helpMenuHandle == NULL )
         {
-            if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) != noErr )
-                mh = NULL ;
+            if ( UMAGetHelpMenuDontCreate( &helpMenuHandle , &firstUserHelpMenuItem) != noErr )
+                helpMenuHandle = NULL ;
         }
 
         // is it part of the application or the Help menu, then look for the id directly
         if ( ( GetMenuHandle( kwxMacAppleMenuId ) != NULL && command.menu.menuRef == GetMenuHandle( kwxMacAppleMenuId ) ) ||
-             ( mh != NULL && command.menu.menuRef == mh ) )
+             ( helpMenuHandle != NULL && command.menu.menuRef == helpMenuHandle ) )
         {
             wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar() ;
             if ( mbar )
index 09cf4450c17dbc03aa1200f3bacb14fe6580fd6a..74f31353f20818ce3d17455f26d9fec3489cf677 100644 (file)
@@ -613,21 +613,18 @@ void wxMenuBar::MacInstallMenuBar()
                 CFSTR("About..."), 0, 0, 0); 
     MacInsertMenu( appleMenu , 0 ) ;
 
-    // clean-up the help menu before adding new items
-    static MenuHandle mh = NULL ;
+    // if we have a mac help menu, clean it up before adding new items
+    MenuHandle helpMenuHandle ;
+    MenuItemIndex firstUserHelpMenuItem ;
 
-    if ( mh != NULL )
+    if ( UMAGetHelpMenuDontCreate( &helpMenuHandle , &firstUserHelpMenuItem) == noErr )
     {
-        MenuItemIndex firstUserHelpMenuItem ;
-        if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) == noErr )
-        {
-            for ( int i = CountMenuItems( mh ) ; i >= firstUserHelpMenuItem ; --i )
-                DeleteMenuItem( mh , i ) ;
-        }
-        else
-        {
-            mh = NULL ;
-        }
+        for ( int i = CountMenuItems( helpMenuHandle ) ; i >= firstUserHelpMenuItem ; --i )
+            DeleteMenuItem( helpMenuHandle , i ) ;
+    }
+    else
+    {
+        helpMenuHandle = NULL ;
     }
 
 #if TARGET_CARBON
@@ -654,14 +651,17 @@ void wxMenuBar::MacInstallMenuBar()
     }
 #endif
 
+    wxString strippedHelpMenuTitle = wxStripMenuCodes( wxApp::s_macHelpMenuTitleName ) ;
+    wxString strippedTranslatedHelpMenuTitle = wxStripMenuCodes( wxString( _("&Help") ) ) ;
     wxMenuList::compatibility_iterator menuIter = m_menus.GetFirst();
     for (size_t i = 0; i < m_menus.GetCount(); i++, menuIter = menuIter->GetNext())
     {
         wxMenuItemList::compatibility_iterator node;
         wxMenuItem *item;
         wxMenu* menu = menuIter->GetData() , *subMenu = NULL ;
+        wxString strippedMenuTitle = wxStripMenuCodes(m_titles[i]);
 
-        if ( m_titles[i] == wxT("?") || m_titles[i] == wxT("&?")  || m_titles[i] == wxApp::s_macHelpMenuTitleName )
+        if ( strippedMenuTitle == wxT("?") || strippedMenuTitle == strippedHelpMenuTitle || strippedMenuTitle == strippedTranslatedHelpMenuTitle )
         {
             for (node = menu->GetMenuItems().GetFirst(); node; node = node->GetNext())
             {
@@ -675,12 +675,13 @@ void wxMenuBar::MacInstallMenuBar()
                 {
                     if ( item->GetId() != wxApp::s_macAboutMenuItemId )
                     {
-                        if ( mh == NULL )
+                        // we have found a user help menu and an item other than the about item,
+                        // so we can create the mac help menu now, if we haven't created it yet
+                        if ( helpMenuHandle == NULL )
                         {
-                            MenuItemIndex firstUserHelpMenuItem ;
-                            if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) != noErr )
+                            if ( UMAGetHelpMenu( &helpMenuHandle , &firstUserHelpMenuItem) != noErr )
                             {
-                                mh = NULL ;
+                                helpMenuHandle = NULL ;
                                 break ;
                             }
                         }
@@ -688,8 +689,8 @@ void wxMenuBar::MacInstallMenuBar()
 
                     if ( item->IsSeparator() )
                     {
-                        if ( mh )
-                            AppendMenuItemTextWithCFString( mh,
+                        if ( helpMenuHandle )
+                            AppendMenuItemTextWithCFString( helpMenuHandle,
                                 CFSTR(""), kMenuItemAttrSeparator, 0,NULL); 
                     }
                     else
@@ -703,11 +704,11 @@ void wxMenuBar::MacInstallMenuBar()
                         }
                         else
                         {
-                            if ( mh )
+                            if ( helpMenuHandle )
                             {
-                                UMAAppendMenuItem(mh, wxStripMenuCodes(item->GetText()) , wxFont::GetDefaultEncoding(), entry);
-                                SetMenuItemCommandID( mh , CountMenuItems(mh) , wxIdToMacCommand ( item->GetId() ) ) ;
-                                SetMenuItemRefCon( mh , CountMenuItems(mh) , (URefCon) item ) ;
+                                UMAAppendMenuItem(helpMenuHandle, wxStripMenuCodes(item->GetText()) , wxFont::GetDefaultEncoding(), entry);
+                                SetMenuItemCommandID( helpMenuHandle , CountMenuItems(helpMenuHandle) , wxIdToMacCommand ( item->GetId() ) ) ;
+                                SetMenuItemRefCon( helpMenuHandle , CountMenuItems(helpMenuHandle) , (URefCon) item ) ;
                             }
                         }
 
index 161708406b5628f33a84abd36051524c723605b9..0857a2411dfeaa09457bde69999a6d7f00c237ad 100644 (file)
@@ -645,14 +645,29 @@ static OSStatus helpMenuStatus = noErr ;
 static MenuItemIndex firstCustomItemIndex = 0 ;
 #endif
 
-OSStatus UMAGetHelpMenu(
+static OSStatus UMAGetHelpMenu(
     MenuRef *        outHelpMenu,
-    MenuItemIndex *  outFirstCustomItemIndex)
+    MenuItemIndex *  outFirstCustomItemIndex,
+    bool             allowHelpMenuCreation);
+
+static OSStatus UMAGetHelpMenu(
+    MenuRef *        outHelpMenu,
+    MenuItemIndex *  outFirstCustomItemIndex,
+    bool             allowHelpMenuCreation)
 {
 #if TARGET_CARBON
-    return HMGetHelpMenu( outHelpMenu , outFirstCustomItemIndex ) ;
+    static bool s_createdHelpMenu = false ;
 
+    if ( !s_createdHelpMenu && !allowHelpMenuCreation )
+    {
+        return paramErr ;
+    }
+
+    OSStatus status = HMGetHelpMenu( outHelpMenu , outFirstCustomItemIndex ) ;
+    s_createdHelpMenu = ( status == noErr ) ;
+    return status ;
 #else
+    wxUnusedVar( allowHelpMenuCreation ) ;
     MenuRef helpMenuHandle ;
 
     helpMenuStatus = HMGetHelpMenuHandle( &helpMenuHandle ) ;
@@ -668,6 +683,20 @@ OSStatus UMAGetHelpMenu(
 #endif
 }
 
+OSStatus UMAGetHelpMenu(
+    MenuRef *        outHelpMenu,
+    MenuItemIndex *  outFirstCustomItemIndex)
+{
+    return UMAGetHelpMenu( outHelpMenu , outFirstCustomItemIndex , true );
+}
+
+OSStatus UMAGetHelpMenuDontCreate(
+    MenuRef *        outHelpMenu,
+    MenuItemIndex *  outFirstCustomItemIndex)
+{
+    return UMAGetHelpMenu( outHelpMenu , outFirstCustomItemIndex , false );
+}
+
 #ifndef __LP64__
 
 wxMacPortStateHelper::wxMacPortStateHelper( GrafPtr newport )