X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/427ff66291af2d8dd34ff5ee68c81436997144a1..0ebb0e5c842c2a0be09364bda0d14b3281ddec43:/src/mac/menu.cpp?ds=inline diff --git a/src/mac/menu.cpp b/src/mac/menu.cpp index 417240fc09..046f7e0166 100644 --- a/src/mac/menu.cpp +++ b/src/mac/menu.cpp @@ -69,12 +69,12 @@ void wxMenu::Init() m_startRadioGroup = -1; // create the menu - m_macMenuId = s_macNextMenuId++; + m_macMenuId = s_macNextMenuId++; m_hMenu = UMANewMenu(m_macMenuId, m_title); if ( !m_hMenu ) { - wxLogLastError("UMANewMenu failed"); + wxLogLastError(wxT("UMANewMenu failed")); } // if we have a title, insert it in the beginning of the menu @@ -116,19 +116,19 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) else MacInsertMenuItem(MAC_WXHMENU(m_hMenu), "\p-" , pos); } - else + 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) + + if (wxMenuBar::MacGetInstalledMenuBar() == m_menuBar) { pSubMenu->MacBeforeDisplay( true ) ; } - + if ( pos == (size_t)-1 ) UMAAppendSubMenuItem(MAC_WXHMENU(m_hMenu), pItem->GetText(), pSubMenu->m_macMenuId); else @@ -145,7 +145,11 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) } 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() ) ; @@ -153,7 +157,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) pItem->UpdateItemBitmap() ; pItem->UpdateItemStatus() ; - if ( pItem->GetId() == idMenuTitle ) + if ( pItem->GetId() == idMenuTitle ) { UMAEnableMenuItem(MAC_WXHMENU(m_hMenu) , pos , false ) ; } @@ -272,15 +276,6 @@ 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()) { @@ -311,10 +306,10 @@ wxWindow *wxMenu::GetWindow() const 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 -int wxMenu::MacGetIndexFromId( int id ) +int wxMenu::MacGetIndexFromId( int id ) { size_t pos; wxMenuItemList::Node *node = GetMenuItems().GetFirst(); @@ -325,14 +320,14 @@ int wxMenu::MacGetIndexFromId( int id ) node = node->GetNext(); } - + if (!node) return 0; - + return pos + 1 ; } -int wxMenu::MacGetIndexFromItem( wxMenuItem *pItem ) +int wxMenu::MacGetIndexFromItem( wxMenuItem *pItem ) { size_t pos; wxMenuItemList::Node *node = GetMenuItems().GetFirst(); @@ -346,31 +341,31 @@ int wxMenu::MacGetIndexFromItem( wxMenuItem *pItem ) if (!node) return 0; - + return pos + 1 ; } -void wxMenu::MacEnableMenu( bool bDoEnable ) +void wxMenu::MacEnableMenu( bool bDoEnable ) { UMAEnableMenuItem(MAC_WXHMENU(m_hMenu) , 0 , 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 ) +void wxMenu::MacBeforeDisplay( bool isSubMenu ) { wxMenuItem* previousItem = NULL ; - int pos ; + size_t pos ; wxMenuItemList::Node *node; wxMenuItem *item; - for (pos = 0, node = GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++) + for (pos = 0, node = GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++) { item = (wxMenuItem *)node->GetData(); wxMenu* subMenu = item->GetSubMenu() ; - if (subMenu) + if (subMenu) { subMenu->MacBeforeDisplay( true ) ; } @@ -382,13 +377,15 @@ void wxMenu::MacBeforeDisplay( bool isSubMenu ) 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() ) + if ( GetMenuItems().GetCount() == pos + 1 && + previousItem != NULL && + previousItem->IsSeparator() ) { ChangeMenuItemAttributes( MAC_WXHMENU( GetHMenu() ) , pos , kMenuItemAttrHidden, 0 ); } } } - #endif + #endif } previousItem = item ; } @@ -398,7 +395,7 @@ void wxMenu::MacBeforeDisplay( bool isSubMenu ) } // undo all changes from the MacBeforeDisplay call -void wxMenu::MacAfterDisplay( bool isSubMenu ) +void wxMenu::MacAfterDisplay( bool isSubMenu ) { if ( isSubMenu ) ::DeleteMenu(MacGetMenuId()); @@ -407,11 +404,11 @@ void wxMenu::MacAfterDisplay( bool isSubMenu ) int pos ; wxMenuItemList::Node *node; wxMenuItem *item; - for (pos = 0, node = GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++) + for (pos = 0, node = GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++) { item = (wxMenuItem *)node->GetData(); wxMenu* subMenu = item->GetSubMenu() ; - if (subMenu) + if (subMenu) { subMenu->MacAfterDisplay( true ) ; } @@ -425,7 +422,7 @@ void wxMenu::MacAfterDisplay( bool isSubMenu ) // Menu Bar -/* +/* Mac Implementation note : @@ -433,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 -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 -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 ; +wxMenuBar* wxMenuBar::s_macCommonMenuBar = NULL ; void wxMenuBar::Init() { @@ -479,6 +477,8 @@ wxMenuBar::wxMenuBar(int count, wxMenu *menus[], const wxString titles[]) wxMenuBar::~wxMenuBar() { + if (s_macCommonMenuBar == this) + s_macCommonMenuBar = NULL; if (s_macInstalledMenuBar == this) { ::ClearMenuBar(); @@ -494,13 +494,13 @@ void wxMenuBar::Refresh(bool WXUNUSED(eraseBackground), const wxRect *WXUNUSED(r DrawMenuBar(); } -void wxMenuBar::MacInstallMenuBar() +void wxMenuBar::MacInstallMenuBar() { if ( s_macInstalledMenuBar == this ) return ; - + wxStAppResource resload ; - + Handle menubar = ::GetNewMBar( kwxMacMenuBarResource ) ; wxString message ; wxCHECK_RET( menubar != NULL, wxT("can't read MBAR resource") ); @@ -518,7 +518,7 @@ void wxMenuBar::MacInstallMenuBar() ::AppendResMenu(menu, 'DRVR'); } #endif - + // clean-up the help menu before adding new items MenuHandle mh = NULL ; if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) == noErr ) @@ -544,7 +544,6 @@ void wxMenuBar::MacInstallMenuBar() #endif for (size_t i = 0; i < m_menus.GetCount(); i++) { - Str255 label; wxMenuItemList::Node *node; wxMenuItem *item; int pos ; @@ -556,16 +555,16 @@ void wxMenuBar::MacInstallMenuBar() { continue ; } - - for (pos = 0 , node = menu->GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++) + + for (pos = 0 , node = menu->GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++) { item = (wxMenuItem *)node->GetData(); subMenu = item->GetSubMenu() ; - if (subMenu) + if (subMenu) { // we don't support hierarchical menus in the help menu yet } - else + else { if ( item->IsSeparator() ) { @@ -577,7 +576,7 @@ void wxMenuBar::MacInstallMenuBar() 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() ) ; @@ -591,7 +590,7 @@ void wxMenuBar::MacInstallMenuBar() SetMenuItemCommandID( mh , CountMenuItems(mh) , item->GetId() ) ; } } - + delete entry ; } } @@ -651,7 +650,7 @@ int wxMenuBar::FindMenu(const wxString& title) { wxString title = wxStripMenuCodes(m_titles[i]); if ( menuTitle == title ) - return i; + return i; } return wxNOT_FOUND; @@ -742,12 +741,10 @@ wxMenu *wxMenuBar::Remove(size_t pos) ::DeleteMenu( menu->MacGetMenuId() /* m_menus[pos]->MacGetMenuId() */ ) ; } - menu->Detach(); - Refresh(); } - m_titles.Remove(pos); + m_titles.RemoveAt(pos); return menu; } @@ -761,7 +758,7 @@ bool wxMenuBar::Append(wxMenu *menu, const wxString& title) return FALSE; m_titles.Add(title); - + UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , title ) ; if ( IsAttached() )