X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e40298d54ecd5b109222a7c60aa2ef084a304d69..3f85391ea7ec33be616af1a323e2d5c2e0f6e74f:/src/mac/carbon/menu.cpp diff --git a/src/mac/carbon/menu.cpp b/src/mac/carbon/menu.cpp index 1d3195a6a7..1739308b03 100644 --- a/src/mac/carbon/menu.cpp +++ b/src/mac/carbon/menu.cpp @@ -107,7 +107,7 @@ void wxMenu::Attach(wxMenuBarBase *menubar) // 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" ); + wxASSERT_MSG( pItem != NULL, wxT("can't append NULL item to the menu") ); if ( pItem->IsSeparator() ) { @@ -121,11 +121,13 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) wxMenu *pSubMenu = pItem->GetSubMenu() ; if ( pSubMenu != NULL ) { - wxASSERT_MSG( pSubMenu->m_hMenu != NULL , "invalid submenu added"); + wxASSERT_MSG( pSubMenu->m_hMenu != NULL , wxT("invalid submenu added")); pSubMenu->m_menuParent = this ; if (wxMenuBar::MacGetInstalledMenuBar() == m_menuBar) - ::InsertMenu( MAC_WXHMENU( pSubMenu->m_hMenu ) , -1 ) ; + { + pSubMenu->MacBeforeDisplay( true ) ; + } if ( pos == (size_t)-1 ) UMAAppendSubMenuItem(MAC_WXHMENU(m_hMenu), pItem->GetText(), pSubMenu->m_macMenuId); @@ -138,12 +140,12 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) { if ( pos == (size_t)-1 ) { - UMAAppendMenuItem(MAC_WXHMENU(m_hMenu), "a" ); + UMAAppendMenuItem(MAC_WXHMENU(m_hMenu), wxT("a") ); pos = CountMenuItems(MAC_WXHMENU(m_hMenu)) ; } else { - UMAInsertMenuItem(MAC_WXHMENU(m_hMenu), "a" , pos); + UMAInsertMenuItem(MAC_WXHMENU(m_hMenu), wxT("a") , pos); } SetMenuItemCommandID( MAC_WXHMENU(m_hMenu) , pos , pItem->GetId() ) ; @@ -355,6 +357,72 @@ void wxMenu::MacEnableMenu( bool bDoEnable ) ::DrawMenuBar() ; } +// 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 ) +{ + 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->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 /* @@ -435,7 +503,7 @@ void wxMenuBar::MacInstallMenuBar() 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 ) ; @@ -476,13 +544,12 @@ void wxMenuBar::MacInstallMenuBar() #endif for (size_t i = 0; i < m_menus.GetCount(); i++) { - Str255 label; 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( m_titles[i] == wxT("?") || m_titles[i] == wxT("&?") || m_titles[i] == wxApp::s_macHelpMenuTitleName ) { if ( mh == NULL ) { @@ -532,52 +599,8 @@ void wxMenuBar::MacInstallMenuBar() 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 ; - } + m_menus[i]->MacBeforeDisplay(false) ; ::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() ; @@ -654,8 +677,10 @@ wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) { 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) { @@ -683,15 +708,19 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& 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 + if (s_macInstalledMenuBar == this) { - ::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , m_menus[pos+1]->MacGetMenuId() ) ; + 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(); }