]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/menu.cpp
A little clarification
[wxWidgets.git] / src / mac / menu.cpp
index 69bbdfd26d86e396870b6f5dfe6e96a88919414d..046f7e0166fbb7097e0611b2f72ff99a260d74dd 100644 (file)
@@ -1,15 +1,14 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        menu.cpp
 // Purpose:     wxMenu, wxMenuBar, wxMenuItem
 /////////////////////////////////////////////////////////////////////////////
 // Name:        menu.cpp
 // Purpose:     wxMenu, wxMenuBar, wxMenuItem
-// Author:      AUTHOR
+// Author:      Stefan Csomor
 // Modified by:
 // Modified by:
-// Created:     ??/??/98
+// Created:     1998-01-01
 // RCS-ID:      $Id$
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) Stefan Csomor
+// Licence:       wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 /////////////////////////////////////////////////////////////////////////////
 
-
 #ifdef __GNUG__
 #pragma implementation "menu.h"
 #pragma implementation "menuitem.h"
 #ifdef __GNUG__
 #pragma implementation "menu.h"
 #pragma implementation "menuitem.h"
@@ -70,12 +69,12 @@ void wxMenu::Init()
     m_startRadioGroup = -1;
 
     // create the menu
     m_startRadioGroup = -1;
 
     // create the menu
-       m_macMenuId = s_macNextMenuId++; 
-       m_hMenu = UMANewMenu(m_macMenuId, m_title);
+    m_macMenuId = s_macNextMenuId++;
+    m_hMenu = UMANewMenu(m_macMenuId, m_title);
 
     if ( !m_hMenu )
     {
 
     if ( !m_hMenu )
     {
-        wxLogLastError("UMANewMenu failed");
+        wxLogLastError(wxT("UMANewMenu failed"));
     }
 
     // if we have a title, insert it in the beginning of the menu
     }
 
     // if we have a title, insert it in the beginning of the menu
@@ -88,13 +87,13 @@ void wxMenu::Init()
 
 wxMenu::~wxMenu()
 {
 
 wxMenu::~wxMenu()
 {
-       if (MAC_WXHMENU(m_hMenu))
-               ::DisposeMenu(MAC_WXHMENU(m_hMenu));
+    if (MAC_WXHMENU(m_hMenu))
+        ::DisposeMenu(MAC_WXHMENU(m_hMenu));
 }
 
 void wxMenu::Break()
 {
 }
 
 void wxMenu::Break()
 {
-       // not available on the mac platform
+    // not available on the mac platform
 }
 
 void wxMenu::Attach(wxMenuBarBase *menubar)
 }
 
 void wxMenu::Attach(wxMenuBarBase *menubar)
@@ -108,62 +107,68 @@ void wxMenu::Attach(wxMenuBarBase *menubar)
 // append a new item or submenu to the menu
 bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
 {
 // append a new item or submenu to the menu
 bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
 {
-    wxASSERT_MSG( pItem != NULL, "can't append NULL item to the menu" );
-
-       if ( pItem->IsSeparator() )
-       {
-               if ( pos == (size_t)-1 )
-                       MacAppendMenu(MAC_WXHMENU(m_hMenu), "\p-");
-               else
-                       MacInsertMenuItem(MAC_WXHMENU(m_hMenu), "\p-" , pos);
-       }
-       else 
-       {
-               wxMenu *pSubMenu = pItem->GetSubMenu() ;
-               if ( pSubMenu != NULL )
-               {
-                       wxASSERT_MSG( pSubMenu->m_hMenu != NULL , "invalid submenu added");
-                   pSubMenu->m_menuParent = this ;
-               
-                       if (wxMenuBar::MacGetInstalledMenuBar() == m_menuBar) 
-                               ::InsertMenu( MAC_WXHMENU( pSubMenu->m_hMenu ) , -1 ) ;
-                       
-                       if ( pos == (size_t)-1 )
-                               UMAAppendSubMenuItem(MAC_WXHMENU(m_hMenu), pItem->GetText(), pSubMenu->m_macMenuId);
-                       else
-                               UMAInsertSubMenuItem(MAC_WXHMENU(m_hMenu), pItem->GetText() , pos, pSubMenu->m_macMenuId);
-                       pItem->UpdateItemBitmap() ;
-                       pItem->UpdateItemStatus() ;
-               }
-               else
-               {
-                       if ( pos == (size_t)-1 )
-                       {
-                               UMAAppendMenuItem(MAC_WXHMENU(m_hMenu), "a" );
-                               pos = CountMenuItems(MAC_WXHMENU(m_hMenu)) ;
-                       }
-                       else
-                       {
-                               UMAInsertMenuItem(MAC_WXHMENU(m_hMenu), "a" , pos);
-                       }
-
-                       SetMenuItemCommandID( MAC_WXHMENU(m_hMenu) , pos , pItem->GetId() ) ;
-                       pItem->UpdateItemText() ;
-                       pItem->UpdateItemBitmap() ;
-                       pItem->UpdateItemStatus() ;
-
-                       if ( pItem->GetId() == idMenuTitle ) 
-                       {
-                               UMAEnableMenuItem(MAC_WXHMENU(m_hMenu) , pos , false ) ;
-                       }
-               }
-       }
+    wxASSERT_MSG( pItem != NULL, wxT("can't append NULL item to the menu") );
+
+    if ( pItem->IsSeparator() )
+    {
+        if ( pos == (size_t)-1 )
+            MacAppendMenu(MAC_WXHMENU(m_hMenu), "\p-");
+        else
+            MacInsertMenuItem(MAC_WXHMENU(m_hMenu), "\p-" , pos);
+    }
+    else
+    {
+        wxMenu *pSubMenu = pItem->GetSubMenu() ;
+        if ( pSubMenu != NULL )
+        {
+               wxASSERT_MSG( pSubMenu->m_hMenu != NULL , wxT("invalid submenu added"));
+            pSubMenu->m_menuParent = this ;
+
+            if (wxMenuBar::MacGetInstalledMenuBar() == m_menuBar)
+            {
+                pSubMenu->MacBeforeDisplay( true ) ;
+             }
+
+            if ( pos == (size_t)-1 )
+                UMAAppendSubMenuItem(MAC_WXHMENU(m_hMenu), pItem->GetText(), pSubMenu->m_macMenuId);
+            else
+                UMAInsertSubMenuItem(MAC_WXHMENU(m_hMenu), pItem->GetText() , pos, pSubMenu->m_macMenuId);
+            pItem->UpdateItemBitmap() ;
+            pItem->UpdateItemStatus() ;
+        }
+        else
+        {
+            if ( pos == (size_t)-1 )
+            {
+                UMAAppendMenuItem(MAC_WXHMENU(m_hMenu), wxT("a") );
+                pos = CountMenuItems(MAC_WXHMENU(m_hMenu)) ;
+            }
+            else
+            {
+                // MacOS counts menu items from 1 and inserts after, therefore having the
+                // same effect as wx 0 based and inserting before, we must correct pos
+                // after however for updates to be correct
+                UMAInsertMenuItem(MAC_WXHMENU(m_hMenu), wxT("a") , pos);
+                pos += 1 ;
+            }
+
+            SetMenuItemCommandID( MAC_WXHMENU(m_hMenu) , pos , pItem->GetId() ) ;
+            pItem->UpdateItemText() ;
+            pItem->UpdateItemBitmap() ;
+            pItem->UpdateItemStatus() ;
+
+              if ( pItem->GetId() == idMenuTitle )
+              {
+                UMAEnableMenuItem(MAC_WXHMENU(m_hMenu) , pos , false ) ;
+              }
+        }
+    }
     // if we're already attached to the menubar, we must update it
     if ( IsAttached() )
     {
         m_menuBar->Refresh();
     }
     // if we're already attached to the menubar, we must update it
     if ( IsAttached() )
     {
         m_menuBar->Refresh();
     }
-       return TRUE ;
+    return TRUE ;
 }
 
 void wxMenu::EndRadioGroup()
 }
 
 void wxMenu::EndRadioGroup()
@@ -250,7 +255,7 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
     // DoRemove() (unlike Remove) can only be called for existing item!
     wxCHECK_MSG( node, NULL, wxT("bug in wxMenu::Remove logic") );
 
     // DoRemove() (unlike Remove) can only be called for existing item!
     wxCHECK_MSG( node, NULL, wxT("bug in wxMenu::Remove logic") );
 
-       ::DeleteMenuItem(MAC_WXHMENU(m_hMenu) , pos + 1);
+    ::DeleteMenuItem(MAC_WXHMENU(m_hMenu) , pos + 1);
 
     if ( IsAttached() )
     {
 
     if ( IsAttached() )
     {
@@ -264,22 +269,13 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
 
 void wxMenu::SetTitle(const wxString& label)
 {
 
 void wxMenu::SetTitle(const wxString& label)
 {
-       m_title = label ;
-       UMASetMenuTitle(MAC_WXHMENU(m_hMenu) , label ) ;
+       m_title = label ;
+    UMASetMenuTitle(MAC_WXHMENU(m_hMenu) , label ) ;
 }
 bool wxMenu::ProcessCommand(wxCommandEvent & event)
 {
     bool processed = FALSE;
 
 }
 bool wxMenu::ProcessCommand(wxCommandEvent & event)
 {
     bool processed = FALSE;
 
-#if WXWIN_COMPATIBILITY
-    // Try a callback
-    if (m_callback)
-    {
-        (void)(*(m_callback))(*this, event);
-        processed = TRUE;
-    }
-#endif WXWIN_COMPATIBILITY
-
     // Try the menu's event handler
     if ( !processed && GetEventHandler())
     {
     // Try the menu's event handler
     if ( !processed && GetEventHandler())
     {
@@ -310,10 +306,10 @@ wxWindow *wxMenu::GetWindow() const
     return NULL;
 }
 
     return NULL;
 }
 
-// helper functions returning the mac menu position for a certain item, note that this is 
+// helper functions returning the mac menu position for a certain item, note that this is
 // mac-wise 1 - based, i.e. the first item has index 1 whereas on MSWin it has pos 0
 
 // mac-wise 1 - based, i.e. the first item has index 1 whereas on MSWin it has pos 0
 
-int wxMenu::MacGetIndexFromId( int id ) 
+int wxMenu::MacGetIndexFromId( int id )
 {
     size_t pos;
     wxMenuItemList::Node *node = GetMenuItems().GetFirst();
 {
     size_t pos;
     wxMenuItemList::Node *node = GetMenuItems().GetFirst();
@@ -324,14 +320,14 @@ int wxMenu::MacGetIndexFromId( int id )
 
         node = node->GetNext();
     }
 
         node = node->GetNext();
     }
-       
+
     if (!node)
     if (!node)
-               return 0;
-               
-       return pos + 1 ;
+        return 0;
+
+    return pos + 1 ;
 }
 
 }
 
-int wxMenu::MacGetIndexFromItem( wxMenuItem *pItem ) 
+int wxMenu::MacGetIndexFromItem( wxMenuItem *pItem )
 {
     size_t pos;
     wxMenuItemList::Node *node = GetMenuItems().GetFirst();
 {
     size_t pos;
     wxMenuItemList::Node *node = GetMenuItems().GetFirst();
@@ -344,21 +340,89 @@ int wxMenu::MacGetIndexFromItem( wxMenuItem *pItem )
     }
 
     if (!node)
     }
 
     if (!node)
-               return 0;
-               
-       return pos + 1 ;
+        return 0;
+
+    return pos + 1 ;
+}
+
+void wxMenu::MacEnableMenu( bool bDoEnable )
+{
+    UMAEnableMenuItem(MAC_WXHMENU(m_hMenu) , 0 , bDoEnable ) ;
+
+    ::DrawMenuBar() ;
 }
 
 }
 
-void wxMenu::MacEnableMenu( bool bDoEnable ) 
+// MacOS needs to know about submenus somewhere within this menu
+// before it can be displayed , also hide special menu items like preferences
+// that are handled by the OS
+void wxMenu::MacBeforeDisplay( bool isSubMenu )
 {
 {
-       UMAEnableMenuItem(MAC_WXHMENU(m_hMenu) , 0 , bDoEnable ) ;
-               
-       ::DrawMenuBar() ;
+    wxMenuItem* previousItem = NULL ;
+    size_t pos ;
+    wxMenuItemList::Node *node;
+    wxMenuItem *item;
+    for (pos = 0, node = GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++)
+    {
+        item = (wxMenuItem *)node->GetData();
+        wxMenu* subMenu = item->GetSubMenu() ;
+        if (subMenu)
+        {
+            subMenu->MacBeforeDisplay( true ) ;
+        }
+        else
+        {
+            #if TARGET_CARBON
+            if ( UMAGetSystemVersion() >= 0x1000 )
+            {
+                if ( item->GetId() == wxApp::s_macPreferencesMenuItemId || item->GetId() == wxApp::s_macExitMenuItemId)
+                {
+                    ChangeMenuItemAttributes( MAC_WXHMENU( GetHMenu() ) , pos + 1, kMenuItemAttrHidden, 0 );
+                    if ( GetMenuItems().GetCount() == pos + 1 &&
+                            previousItem != NULL &&
+                                previousItem->IsSeparator() )
+                    {
+                        ChangeMenuItemAttributes( MAC_WXHMENU( GetHMenu() ) , pos , kMenuItemAttrHidden, 0 );
+                    }
+                }
+            }
+            #endif
+        }
+        previousItem = item ;
+    }
+
+    if ( isSubMenu )
+        ::InsertMenu(MAC_WXHMENU( GetHMenu()), -1);
+
+}
+// undo all changes from the MacBeforeDisplay call
+void wxMenu::MacAfterDisplay( bool isSubMenu )
+{
+    if ( isSubMenu )
+        ::DeleteMenu(MacGetMenuId());
+
+    wxMenuItem* previousItem = NULL ;
+    int pos ;
+    wxMenuItemList::Node *node;
+    wxMenuItem *item;
+    for (pos = 0, node = GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++)
+    {
+        item = (wxMenuItem *)node->GetData();
+        wxMenu* subMenu = item->GetSubMenu() ;
+        if (subMenu)
+        {
+            subMenu->MacAfterDisplay( true ) ;
+        }
+        else
+        {
+            // no need to undo hidings
+        }
+        previousItem = item ;
+    }
 }
 
 // Menu Bar
 
 }
 
 // Menu Bar
 
-/* 
+/*
 
 Mac Implementation note :
 
 
 Mac Implementation note :
 
@@ -366,16 +430,17 @@ The Mac has only one global menubar, so we attempt to install the currently
 active menubar from a frame, we currently don't take into account mdi-frames
 which would ask for menu-merging
 
 active menubar from a frame, we currently don't take into account mdi-frames
 which would ask for menu-merging
 
-Secondly there is no mac api for changing a menubar that is not the current 
+Secondly there is no mac api for changing a menubar that is not the current
 menubar, so we have to wait for preparing the actual menubar until the
 wxMenubar is to be used
 
 menubar, so we have to wait for preparing the actual menubar until the
 wxMenubar is to be used
 
-We can in subsequent versions use MacInstallMenuBar to provide some sort of 
+We can in subsequent versions use MacInstallMenuBar to provide some sort of
 auto-merge for MDI in case this will be necessary
 
 */
 
 wxMenuBar* wxMenuBar::s_macInstalledMenuBar = NULL ;
 auto-merge for MDI in case this will be necessary
 
 */
 
 wxMenuBar* wxMenuBar::s_macInstalledMenuBar = NULL ;
+wxMenuBar* wxMenuBar::s_macCommonMenuBar = NULL ;
 
 void wxMenuBar::Init()
 {
 
 void wxMenuBar::Init()
 {
@@ -412,11 +477,13 @@ wxMenuBar::wxMenuBar(int count, wxMenu *menus[], const wxString titles[])
 
 wxMenuBar::~wxMenuBar()
 {
 
 wxMenuBar::~wxMenuBar()
 {
-       if (s_macInstalledMenuBar == this)
-       {
-               ::ClearMenuBar();
-               s_macInstalledMenuBar = NULL;
-       }
+    if (s_macCommonMenuBar == this)
+        s_macCommonMenuBar = NULL;
+    if (s_macInstalledMenuBar == this)
+    {
+        ::ClearMenuBar();
+        s_macInstalledMenuBar = NULL;
+    }
 
 }
 
 
 }
 
@@ -427,16 +494,16 @@ void wxMenuBar::Refresh(bool WXUNUSED(eraseBackground), const wxRect *WXUNUSED(r
     DrawMenuBar();
 }
 
     DrawMenuBar();
 }
 
-void wxMenuBar::MacInstallMenuBar() 
+void wxMenuBar::MacInstallMenuBar()
 {
     if ( s_macInstalledMenuBar == this )
         return ;
 {
     if ( s_macInstalledMenuBar == this )
         return ;
-               
+
     wxStAppResource resload ;
     wxStAppResource resload ;
-               
+
     Handle menubar = ::GetNewMBar( kwxMacMenuBarResource ) ;
     wxString message ;
     Handle menubar = ::GetNewMBar( kwxMacMenuBarResource ) ;
     wxString message ;
-    wxCHECK_RET( menubar != NULL, "can't read MBAR resource" );
+    wxCHECK_RET( menubar != NULL, wxT("can't read MBAR resource") );
     ::SetMenuBar( menubar ) ;
 #if TARGET_API_MAC_CARBON
     ::DisposeMenuBar( menubar ) ;
     ::SetMenuBar( menubar ) ;
 #if TARGET_API_MAC_CARBON
     ::DisposeMenuBar( menubar ) ;
@@ -451,144 +518,99 @@ void wxMenuBar::MacInstallMenuBar()
         ::AppendResMenu(menu, 'DRVR');
     }
 #endif
         ::AppendResMenu(menu, 'DRVR');
     }
 #endif
+
     // clean-up the help menu before adding new items
     // clean-up the help menu before adding new items
-       MenuHandle mh = NULL ;
-       if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) == noErr )
-       {
-           for ( int i = CountMenuItems( mh ) ; i >= firstUserHelpMenuItem ; --i )
-           {
-               DeleteMenuItem( mh , i ) ;
-           }
-       }
-       else
-       {
-           mh = NULL ;
-       }
+    MenuHandle mh = NULL ;
+    if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) == noErr )
+    {
+        for ( int i = CountMenuItems( mh ) ; i >= firstUserHelpMenuItem ; --i )
+        {
+            DeleteMenuItem( mh , i ) ;
+        }
+    }
+    else
+    {
+        mh = NULL ;
+    }
 #if TARGET_CARBON
 #if TARGET_CARBON
-       if ( UMAGetSystemVersion() >= 0x1000 && wxApp::s_macPreferencesMenuItemId)
-       {
-               wxMenuItem *item = FindItem( wxApp::s_macPreferencesMenuItemId , NULL ) ;
-               if ( item == NULL || !(item->IsEnabled()) )
-                       DisableMenuCommand( NULL , kHICommandPreferences ) ;
-               else
-                       EnableMenuCommand( NULL , kHICommandPreferences ) ;
-       }
+    if ( UMAGetSystemVersion() >= 0x1000 && wxApp::s_macPreferencesMenuItemId)
+    {
+        wxMenuItem *item = FindItem( wxApp::s_macPreferencesMenuItemId , NULL ) ;
+        if ( item == NULL || !(item->IsEnabled()) )
+            DisableMenuCommand( NULL , kHICommandPreferences ) ;
+        else
+            EnableMenuCommand( NULL , kHICommandPreferences ) ;
+    }
 #endif
 #endif
-       for (size_t i = 0; i < m_menus.GetCount(); i++)
-       {
-        Str255         label;
+       for (size_t i = 0; i < m_menus.GetCount(); i++)
+      {
         wxMenuItemList::Node *node;
         wxMenuItem *item;
         int pos ;
         wxMenuItemList::Node *node;
         wxMenuItem *item;
         int pos ;
-       wxMenu* menu = m_menus[i] , *subMenu = NULL ;
-
-       if( m_titles[i] == "?" || m_titles[i] == "&?"  || m_titles[i] == wxApp::s_macHelpMenuTitleName )
-       {
-                       if ( mh == NULL )
-                       {
-                           continue ;
-                       }
-                               
-                       for (pos = 0 , node = menu->GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++) 
-                       {
-                               item = (wxMenuItem *)node->GetData();
-                               subMenu = item->GetSubMenu() ;
-                               if (subMenu)                    
-                               {
-                                       // we don't support hierarchical menus in the help menu yet
-                               }
-                               else            
-                               {
-                                       if ( item->IsSeparator() )
-                                       {
-                                               if ( mh )
-                                                       MacAppendMenu(mh, "\p-" );
-                                       }
-                                       else
-                                       {
-                                               wxAcceleratorEntry* entry = wxGetAccelFromString( item->GetText() ) ;
-
-                                               if ( item->GetId() == wxApp::s_macAboutMenuItemId )
-                                               { 
-                                                               UMASetMenuItemText( GetMenuHandle( kwxMacAppleMenuId ) , 1 , item->GetText()  );
-                                                               UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 , true );
-                                                               SetMenuItemCommandID( GetMenuHandle( kwxMacAppleMenuId ) , 1 , item->GetId() ) ;
-                                                               UMASetMenuItemShortcut( GetMenuHandle( kwxMacAppleMenuId ) , 1 , entry ) ;
-                                               }
-                                               else
-                                               {
-                                                       if ( mh )
-                                                       {
-                                                               UMAAppendMenuItem(mh, item->GetText()  , entry );
-                                                               SetMenuItemCommandID( mh , CountMenuItems(mh) , item->GetId() ) ;
-                                                       }
-                                               }
-                                               
-                                               delete entry ;
-                                       }
-                               }
-                       }
-               }
-               else
-               {
-                       UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , m_titles[i] ) ;
-                       wxArrayPtrVoid submenus ;
-                       wxMenuItem* previousItem = NULL ;
-                       for (pos = 0, node = menu->GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++) 
-                       {
-                               item = (wxMenuItem *)node->GetData();
-                               subMenu = item->GetSubMenu() ;
-                               if (subMenu)                    
-                               {
-                                 submenus.Add(subMenu) ;
-                               }
-                               else
-                               {
-#if TARGET_CARBON
-                                       if ( UMAGetSystemVersion() >= 0x1000 )
-                                       {
-                                               if ( item->GetId() == wxApp::s_macPreferencesMenuItemId || item->GetId() == wxApp::s_macExitMenuItemId)
-                                               {
-                                                       ChangeMenuItemAttributes( MAC_WXHMENU( menu->GetHMenu() ) , pos + 1, kMenuItemAttrHidden, 0 );
-                                                       if ( menu->GetMenuItems().GetCount() == pos + 1 && previousItem != NULL && previousItem->IsSeparator() )
-                                                       {
-                                                               ChangeMenuItemAttributes( MAC_WXHMENU( menu->GetHMenu() ) , pos , kMenuItemAttrHidden, 0 );
-                                                       }
-                                               }
-                                       }
-#endif 
-                               }
-                               previousItem = item ;
-                       }
-                       ::InsertMenu(MAC_WXHMENU(m_menus[i]->GetHMenu()), 0);
-                       for ( size_t i = 0 ; i < submenus.GetCount() ; ++i )
-                       {
-                           wxMenu* submenu = (wxMenu*) submenus[i] ;
-               wxMenuItemList::Node *subnode;
-               wxMenuItem *subitem;
-               int subpos ;
-                for ( subpos = 0 , subnode = submenu->GetMenuItems().GetFirst(); subnode; subnode = subnode->GetNext(), subpos++) 
-                               {
-                                       subitem = (wxMenuItem *)subnode->GetData();
-                                       wxMenu* itsSubMenu = subitem->GetSubMenu() ;
-                                       if (itsSubMenu)                 
-                                       {
-                                               submenus.Add(itsSubMenu) ;
-                                       }                               
-                               }
-                               ::InsertMenu( MAC_WXHMENU(submenu->GetHMenu()) , -1 ) ;
-                   }
-               }
-       }
-       ::DrawMenuBar() ;
-       s_macInstalledMenuBar = this;
+        wxMenu* menu = m_menus[i] , *subMenu = NULL ;
+
+        if( m_titles[i] == wxT("?") || m_titles[i] == wxT("&?")  || m_titles[i] == wxApp::s_macHelpMenuTitleName )
+        {
+            if ( mh == NULL )
+            {
+                continue ;
+            }
+
+              for (pos = 0 , node = menu->GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++)
+              {
+                 item = (wxMenuItem *)node->GetData();
+                 subMenu = item->GetSubMenu() ;
+                if (subMenu)
+                {
+                    // we don't support hierarchical menus in the help menu yet
+                }
+                else
+                {
+                    if ( item->IsSeparator() )
+                    {
+                        if ( mh )
+                            MacAppendMenu(mh, "\p-" );
+                    }
+                    else
+                    {
+                        wxAcceleratorEntry* entry = wxGetAccelFromString( item->GetText() ) ;
+
+                        if ( item->GetId() == wxApp::s_macAboutMenuItemId )
+                        {
+                                UMASetMenuItemText( GetMenuHandle( kwxMacAppleMenuId ) , 1 , item->GetText()  );
+                                UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 , true );
+                                SetMenuItemCommandID( GetMenuHandle( kwxMacAppleMenuId ) , 1 , item->GetId() ) ;
+                                UMASetMenuItemShortcut( GetMenuHandle( kwxMacAppleMenuId ) , 1 , entry ) ;
+                         }
+                        else
+                        {
+                            if ( mh )
+                            {
+                                UMAAppendMenuItem(mh, item->GetText()  , entry );
+                                SetMenuItemCommandID( mh , CountMenuItems(mh) , item->GetId() ) ;
+                            }
+                        }
+
+                        delete entry ;
+                    }
+                }
+            }
+        }
+        else
+        {
+            UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , m_titles[i] ) ;
+            m_menus[i]->MacBeforeDisplay(false) ;
+            ::InsertMenu(MAC_WXHMENU(m_menus[i]->GetHMenu()), 0);
+        }
+    }
+    ::DrawMenuBar() ;
+    s_macInstalledMenuBar = this;
 }
 
 void wxMenuBar::EnableTop(size_t pos, bool enable)
 {
     wxCHECK_RET( IsAttached(), wxT("doesn't work with unattached menubars") );
 }
 
 void wxMenuBar::EnableTop(size_t pos, bool enable)
 {
     wxCHECK_RET( IsAttached(), wxT("doesn't work with unattached menubars") );
-       m_menus[pos]->MacEnableMenu( enable ) ;
+    m_menus[pos]->MacEnableMenu( enable ) ;
     Refresh();
 }
 
     Refresh();
 }
 
@@ -604,11 +626,11 @@ void wxMenuBar::SetLabelTop(size_t pos, const wxString& label)
     }
 
     m_menus[pos]->SetTitle( label ) ;
     }
 
     m_menus[pos]->SetTitle( label ) ;
-       if (wxMenuBar::s_macInstalledMenuBar == this) // are we currently installed ?
-       {
-               ::SetMenuBar( GetMenuBar() ) ;
-               ::InvalMenuBar() ;
-       }
+    if (wxMenuBar::s_macInstalledMenuBar == this) // are we currently installed ?
+    {
+        ::SetMenuBar( GetMenuBar() ) ;
+        ::InvalMenuBar() ;
+    }
 }
 
 wxString wxMenuBar::GetLabelTop(size_t pos) const
 }
 
 wxString wxMenuBar::GetLabelTop(size_t pos) const
@@ -628,7 +650,7 @@ int wxMenuBar::FindMenu(const wxString& title)
     {
         wxString title = wxStripMenuCodes(m_titles[i]);
         if ( menuTitle == title )
     {
         wxString title = wxStripMenuCodes(m_titles[i]);
         if ( menuTitle == title )
-            return i; 
+            return i;
     }
 
     return wxNOT_FOUND;
     }
 
     return wxNOT_FOUND;
@@ -653,21 +675,23 @@ wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title)
 
     if ( IsAttached() )
     {
 
     if ( IsAttached() )
     {
-               if (s_macInstalledMenuBar == this)
-               {
-                       ::DeleteMenu( menuOld->MacGetMenuId() /* m_menus[pos]->MacGetMenuId() */ ) ;
-                       {
-                               UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , title ) ;
-                               if ( pos == m_menus.GetCount() - 1)
-                               {
-                                       ::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , 0 ) ;
-                               }
-                               else
-                               {
-                                       ::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , m_menus[pos+1]->MacGetMenuId() ) ;
-                               }
-                       }
-               }
+        if (s_macInstalledMenuBar == this)
+        {
+            menuOld->MacAfterDisplay( false ) ;
+            ::DeleteMenu( menuOld->MacGetMenuId() /* m_menus[pos]->MacGetMenuId() */ ) ;
+            {
+                menu->MacBeforeDisplay( false ) ;
+                UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , title ) ;
+                if ( pos == m_menus.GetCount() - 1)
+                {
+                    ::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , 0 ) ;
+                }
+                else
+                {
+                    ::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , m_menus[pos+1]->MacGetMenuId() ) ;
+                }
+            }
+        }
 
         Refresh();
     }
 
         Refresh();
     }
@@ -682,18 +706,22 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
 
     m_titles.Insert(title, pos);
 
 
     m_titles.Insert(title, pos);
 
-       UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , title ) ;
+    UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , title ) ;
 
 
-    if ( IsAttached() )
+    if ( IsAttached() && s_macInstalledMenuBar == this )
     {
     {
-       if ( pos == (size_t) -1  || pos + 1 == m_menus.GetCount() )
-               {
-                       ::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , 0 ) ;
-               }
-               else
-               {
-                       ::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , m_menus[pos+1]->MacGetMenuId() ) ;
-               }
+        if (s_macInstalledMenuBar == this)
+        {
+            menu->MacBeforeDisplay( false ) ;
+            if ( pos == (size_t) -1  || pos + 1 == m_menus.GetCount() )
+            {
+                ::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , 0 ) ;
+            }
+            else
+            {
+                ::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , m_menus[pos+1]->MacGetMenuId() ) ;
+            }
+        }
         Refresh();
     }
 
         Refresh();
     }
 
@@ -708,17 +736,15 @@ wxMenu *wxMenuBar::Remove(size_t pos)
 
     if ( IsAttached() )
     {
 
     if ( IsAttached() )
     {
-               if (s_macInstalledMenuBar == this)
-               {
-                       ::DeleteMenu( menu->MacGetMenuId() /* m_menus[pos]->MacGetMenuId() */ ) ;
-               }
-
-        menu->Detach();
+        if (s_macInstalledMenuBar == this)
+        {
+            ::DeleteMenu( menu->MacGetMenuId() /* m_menus[pos]->MacGetMenuId() */ ) ;
+        }
 
         Refresh();
     }
 
 
         Refresh();
     }
 
-    m_titles.Remove(pos);
+    m_titles.RemoveAt(pos);
 
     return menu;
 }
 
     return menu;
 }
@@ -732,15 +758,15 @@ bool wxMenuBar::Append(wxMenu *menu, const wxString& title)
         return FALSE;
 
     m_titles.Add(title);
         return FALSE;
 
     m_titles.Add(title);
-    
-       UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , title ) ;
+
+    UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , title ) ;
 
     if ( IsAttached() )
     {
 
     if ( IsAttached() )
     {
-               if (s_macInstalledMenuBar == this)
-               {
-                       ::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , 0 ) ;
-               }
+        if (s_macInstalledMenuBar == this)
+        {
+            ::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , 0 ) ;
+        }
 
         Refresh();
     }
 
         Refresh();
     }