From 7143fe6b26d373a1c3c0fd3fa47cd8289c48c9c0 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sat, 21 Sep 2002 20:49:35 +0000 Subject: [PATCH] switched menu handling to command ids git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17331 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/mac/app.cpp | 37 ++--- src/mac/carbon/app.cpp | 37 ++--- src/mac/carbon/menu.cpp | 290 ++++++++++---------------------------- src/mac/carbon/window.cpp | 12 +- src/mac/menu.cpp | 290 ++++++++++---------------------------- src/mac/window.cpp | 12 +- 6 files changed, 190 insertions(+), 488 deletions(-) diff --git a/src/mac/app.cpp b/src/mac/app.cpp index b3982b776e..6e824ed0ae 100644 --- a/src/mac/app.cpp +++ b/src/mac/app.cpp @@ -101,6 +101,8 @@ long wxApp::s_lastModifiers = 0 ; bool wxApp::s_macDefaultEncodingIsPC = true ; bool wxApp::s_macSupportPCMenuShortcuts = true ; long wxApp::s_macAboutMenuItemId = wxID_ABOUT ; +long wxApp::s_macPreferencesMenuItemId = 0 ; +long wxApp::s_macExitMenuItemId = wxID_EXIT ; wxString wxApp::s_macHelpMenuTitleName = "&Help" ; pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long refcon ) ; @@ -2314,35 +2316,14 @@ void wxApp::MacHandleMenuSelect( int macMenuId , int macMenuItemNum ) } else { + MenuCommand id ; + GetMenuItemCommandID( GetMenuHandle(macMenuId) , macMenuItemNum , &id ) ; wxWindow* frontwindow = wxFindWinFromMacWindow( ::FrontWindow() ) ; - if ( frontwindow && wxMenuBar::MacGetInstalledMenuBar() ) - wxMenuBar::MacGetInstalledMenuBar()->MacMenuSelect( frontwindow->GetEventHandler() , 0 , macMenuId , macMenuItemNum ) ; + wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, id ); + event.m_timeStamp = ((EventRecord*) MacGetCurrentEvent())->when ; + event.SetEventObject(frontwindow->GetEventHandler()); + event.SetInt( id ); + frontwindow->GetEventHandler()->ProcessEvent(event); } HiliteMenu(0); } - -/* -long wxApp::MacTranslateKey(char key, int mods) -{ -} - -void wxApp::MacAdjustCursor() -{ -} - -*/ -/* -void -wxApp::macAdjustCursor() -{ - if (ev->what != kHighLevelEvent) - { - wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow()); - if (theMacWxFrame) - { - if (!theMacWxFrame->MacAdjustCursor(ev->where)) - ::SetCursor(&(qd.arrow)); - } - } -} -*/ diff --git a/src/mac/carbon/app.cpp b/src/mac/carbon/app.cpp index b3982b776e..6e824ed0ae 100644 --- a/src/mac/carbon/app.cpp +++ b/src/mac/carbon/app.cpp @@ -101,6 +101,8 @@ long wxApp::s_lastModifiers = 0 ; bool wxApp::s_macDefaultEncodingIsPC = true ; bool wxApp::s_macSupportPCMenuShortcuts = true ; long wxApp::s_macAboutMenuItemId = wxID_ABOUT ; +long wxApp::s_macPreferencesMenuItemId = 0 ; +long wxApp::s_macExitMenuItemId = wxID_EXIT ; wxString wxApp::s_macHelpMenuTitleName = "&Help" ; pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long refcon ) ; @@ -2314,35 +2316,14 @@ void wxApp::MacHandleMenuSelect( int macMenuId , int macMenuItemNum ) } else { + MenuCommand id ; + GetMenuItemCommandID( GetMenuHandle(macMenuId) , macMenuItemNum , &id ) ; wxWindow* frontwindow = wxFindWinFromMacWindow( ::FrontWindow() ) ; - if ( frontwindow && wxMenuBar::MacGetInstalledMenuBar() ) - wxMenuBar::MacGetInstalledMenuBar()->MacMenuSelect( frontwindow->GetEventHandler() , 0 , macMenuId , macMenuItemNum ) ; + wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, id ); + event.m_timeStamp = ((EventRecord*) MacGetCurrentEvent())->when ; + event.SetEventObject(frontwindow->GetEventHandler()); + event.SetInt( id ); + frontwindow->GetEventHandler()->ProcessEvent(event); } HiliteMenu(0); } - -/* -long wxApp::MacTranslateKey(char key, int mods) -{ -} - -void wxApp::MacAdjustCursor() -{ -} - -*/ -/* -void -wxApp::macAdjustCursor() -{ - if (ev->what != kHighLevelEvent) - { - wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow()); - if (theMacWxFrame) - { - if (!theMacWxFrame->MacAdjustCursor(ev->where)) - ::SetCursor(&(qd.arrow)); - } - } -} -*/ diff --git a/src/mac/carbon/menu.cpp b/src/mac/carbon/menu.cpp index caadf18ce3..0ded39739c 100644 --- a/src/mac/carbon/menu.cpp +++ b/src/mac/carbon/menu.cpp @@ -209,10 +209,11 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) if ( pos == (size_t)-1 ) { UMAAppendMenuItem(MAC_WXHMENU(m_hMenu), label,key,modifiers); + SetMenuItemCommandID( MAC_WXHMENU(m_hMenu) , CountMenuItems(MAC_WXHMENU(m_hMenu)) , pItem->GetId() ) ; if ( pItem->GetBitmap().Ok() ) { ControlButtonContentInfo info ; - wxMacCreateBitmapButton( &info , pItem->GetBitmap() , true ) ; + wxMacCreateBitmapButton( &info , pItem->GetBitmap() , kControlContentCIconHandle ) ; if ( info.contentType != kControlNoContent ) { if ( info.contentType == kControlContentCIconHandle ) @@ -225,10 +226,11 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) else { UMAInsertMenuItem(MAC_WXHMENU(m_hMenu), label , pos,key,modifiers); + SetMenuItemCommandID( MAC_WXHMENU(m_hMenu) , pos , pItem->GetId() ) ; if ( pItem->GetBitmap().Ok() ) { ControlButtonContentInfo info ; - wxMacCreateBitmapButton( &info , pItem->GetBitmap() , true ) ; + wxMacCreateBitmapButton( &info , pItem->GetBitmap() , kControlContentCIconHandle ) ; if ( info.contentType != kControlNoContent ) { if ( info.contentType == kControlContentCIconHandle ) @@ -429,114 +431,6 @@ void wxMenu::MacEnableMenu( bool bDoEnable ) ::DrawMenuBar() ; } -bool wxMenu::MacMenuSelect( wxEvtHandler* handler, long when , int macMenuId, int macMenuItemNum ) -{ - int pos; - wxNode *node; - - if ( m_macMenuId == macMenuId ) - { - node = GetMenuItems().Nth(macMenuItemNum-1); - if (node) - { - wxMenuItem *pItem = (wxMenuItem*)node->Data(); - - if (pItem->IsCheckable()) - pItem->Check(! pItem->IsChecked()); - - wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, pItem->GetId()); - event.m_timeStamp = when; - event.SetEventObject(handler); - event.SetInt( pItem->GetId() ); - { - bool processed = false ; - -#if WXWIN_COMPATIBILITY - // Try a callback - if (m_callback) - { - (void) (*(m_callback)) (*this, event); - processed = TRUE; - } -#endif - // Try the menu's event handler - if ( !processed && handler) - { - processed = handler->ProcessEvent(event); - } - - // Try the window the menu was popped up from (and up - // through the hierarchy) - if ( !processed && GetInvokingWindow()) - processed = GetInvokingWindow()->GetEventHandler()->ProcessEvent(event); - } - return true ; - } - } - else if ( macMenuId == kHMHelpMenuID ) - { - int menuItem = firstUserHelpMenuItem-1 ; - for (pos = 0, node = GetMenuItems().First(); node; node = node->Next(), pos++) - { - wxMenuItem * pItem = (wxMenuItem *) node->Data() ; - - wxMenu *pSubMenu = pItem->GetSubMenu() ; - if ( pSubMenu != NULL ) - { - } - else - { - if ( pItem->GetId() != wxApp::s_macAboutMenuItemId ) - ++menuItem ; - - if ( menuItem == macMenuItemNum ) - { - wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, pItem->GetId()); - event.m_timeStamp = when; - event.SetEventObject(handler); - event.SetInt( pItem->GetId() ); - { - bool processed = false ; -#if WXWIN_COMPATIBILITY - // Try a callback - if (m_callback) - { - (void) (*(m_callback)) (*this, event); - processed = TRUE; - } -#endif - // Try the menu's event handler - if ( !processed && handler) - { - processed = handler->ProcessEvent(event); - } - - // Try the window the menu was popped up from (and up - // through the hierarchy) - if ( !processed && GetInvokingWindow()) - processed = GetInvokingWindow()->GetEventHandler()->ProcessEvent(event); - } - return true ; - } - } - } - } - - for (pos = 0, node = GetMenuItems().First(); node; node = node->Next(), pos++) - { - wxMenuItem * pItem = (wxMenuItem *) node->Data() ; - - wxMenu *pSubMenu = pItem->GetSubMenu() ; - if ( pSubMenu != NULL ) - { - if ( pSubMenu->MacMenuSelect( handler , when , macMenuId , macMenuItemNum ) ) - return true ; - } - } - - return false ; -} - // Menu Bar /* @@ -664,89 +558,93 @@ void wxMenuBar::MacInstallMenuBar() for (size_t i = 0; i < m_menus.GetCount(); i++) { - Str255 label; - wxNode *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 ) + Str255 label; + wxNode *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 ) + { + MenuHandle mh = NULL ; + if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) != noErr ) { - MenuHandle mh = NULL ; - if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) != noErr ) - { continue ; - } + } for ( int i = CountMenuItems( mh ) ; i >= firstUserHelpMenuItem ; --i ) { - DeleteMenuItem( mh , i ) ; + DeleteMenuItem( mh , i ) ; } - - for (pos = 0 , node = menu->GetMenuItems().First(); node; node = node->Next(), pos++) - { - item = (wxMenuItem *)node->Data(); - subMenu = item->GetSubMenu() ; - if (subMenu) + + for (pos = 0 , node = menu->GetMenuItems().First(); node; node = node->Next(), pos++) + { + item = (wxMenuItem *)node->Data(); + subMenu = item->GetSubMenu() ; + if (subMenu) + { + // we don't support hierarchical menus in the help menu yet + } + else + { + if ( item->IsSeparator() ) { - // we don't support hierarchical menus in the help menu yet + if ( mh ) + MacAppendMenu(mh, "\p-" ); } - else + else { - if ( item->IsSeparator() ) + Str255 label ; + UInt8 modifiers ; + SInt16 key ; + wxMenuItem::MacBuildMenuString( label, &key , &modifiers , item->GetText(), item->GetId() != wxApp::s_macAboutMenuItemId); // no shortcut in about menu + if ( label[0] == 0 ) { - if ( mh ) - MacAppendMenu(mh, "\p-" ); + // we cannot add empty menus on mac + label[0] = 1 ; + label[1] = ' ' ; } + if ( item->GetId() == wxApp::s_macAboutMenuItemId ) + { + ::SetMenuItemText( GetMenuHandle( kwxMacAppleMenuId ) , 1 , label ); + UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 ); + SetMenuItemCommandID( GetMenuHandle( kwxMacAppleMenuId ) , 1 , item->GetId() ) ; + } else { - Str255 label ; - UInt8 modifiers ; - SInt16 key ; - wxMenuItem::MacBuildMenuString( label, &key , &modifiers , item->GetText(), item->GetId() != wxApp::s_macAboutMenuItemId); // no shortcut in about menu - if ( label[0] == 0 ) + if ( mh ) { - // we cannot add empty menus on mac - label[0] = 1 ; - label[1] = ' ' ; - } - if ( item->GetId() == wxApp::s_macAboutMenuItemId ) - { - ::SetMenuItemText( GetMenuHandle( kwxMacAppleMenuId ) , 1 , label ); - UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 ); - } - else - { - if ( mh ) - UMAAppendMenuItem(mh, label , key , modifiers ); + UMAAppendMenuItem(mh, label , key , modifiers ); + SetMenuItemCommandID( mh , CountMenuItems(mh) , item->GetId() ) ; } } } } } - else - { - wxMenuItem::MacBuildMenuString( label, NULL , NULL , m_titles[i] , false ); - UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , label ) ; - wxArrayPtrVoid submenus ; - - for (pos = 0, node = menu->GetMenuItems().First(); node; node = node->Next(), pos++) - { - item = (wxMenuItem *)node->Data(); - subMenu = item->GetSubMenu() ; - if (subMenu) - { - submenus.Add(subMenu) ; - } - } - ::InsertMenu(MAC_WXHMENU(m_menus[i]->GetHMenu()), 0); - for ( size_t i = 0 ; i < submenus.GetCount() ; ++i ) + } + else + { + wxMenuItem::MacBuildMenuString( label, NULL , NULL , m_titles[i] , false ); + UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , label ) ; + wxArrayPtrVoid submenus ; + + for (pos = 0, node = menu->GetMenuItems().First(); node; node = node->Next(), pos++) + { + item = (wxMenuItem *)node->Data(); + subMenu = item->GetSubMenu() ; + if (subMenu) { - wxMenu* submenu = (wxMenu*) submenus[i] ; - wxNode *subnode; - wxMenuItem *subitem; - int subpos ; - for ( subpos = 0 , subnode = submenu->GetMenuItems().First(); subnode; subnode = subnode->Next(), subpos++) + submenus.Add(subMenu) ; + } + } + ::InsertMenu(MAC_WXHMENU(m_menus[i]->GetHMenu()), 0); + for ( size_t i = 0 ; i < submenus.GetCount() ; ++i ) + { + wxMenu* submenu = (wxMenu*) submenus[i] ; + wxNode *subnode; + wxMenuItem *subitem; + int subpos ; + for ( subpos = 0 , subnode = submenu->GetMenuItems().First(); subnode; subnode = subnode->Next(), subpos++) { subitem = (wxMenuItem *)subnode->Data(); wxMenu* itsSubMenu = subitem->GetSubMenu() ; @@ -755,11 +653,11 @@ void wxMenuBar::MacInstallMenuBar() submenus.Add(itsSubMenu) ; } } - ::InsertMenu( MAC_WXHMENU(submenu->GetHMenu()) , -1 ) ; - } - } + ::InsertMenu( MAC_WXHMENU(submenu->GetHMenu()) , -1 ) ; + } } - ::DrawMenuBar() ; + } + ::DrawMenuBar() ; s_macInstalledMenuBar = this; } @@ -900,44 +798,6 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) return TRUE; } -void wxMenuBar::MacMenuSelect(wxEvtHandler* handler, long when , int macMenuId, int macMenuItemNum) -{ - // first scan fast for direct commands, i.e. menus which have these commands directly in their own list - - if ( macMenuId == kwxMacAppleMenuId && macMenuItemNum == 1 ) - { - wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, wxApp::s_macAboutMenuItemId ); - event.m_timeStamp = when; - event.SetEventObject(handler); - event.SetInt( wxApp::s_macAboutMenuItemId ); - handler->ProcessEvent(event); - } - else - { - for (size_t i = 0; i < m_menus.GetCount() ; i++) - { - if ( m_menus[i]->MacGetMenuId() == macMenuId || ( macMenuId == kHMHelpMenuID && ( m_titles[i] == "?" || m_titles[i] == "&?" || m_titles[i] == wxApp::s_macHelpMenuTitleName ) ) ) - { - if ( m_menus[i]->MacMenuSelect( handler , when , macMenuId , macMenuItemNum ) ) - return ; - else - { - //TODO flag this as an error since it must contain the item - return ; - } - } - } - - for (size_t i = 0; i < m_menus.GetCount(); i++) - { - if ( m_menus[i]->MacMenuSelect( handler , when , macMenuId , macMenuItemNum ) ) - { - break ; - } - } - } -} - wxMenu *wxMenuBar::Remove(size_t pos) { wxMenu *menu = wxMenuBarBase::Remove(pos); diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index bc83a282a2..510d695ce5 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -353,7 +353,17 @@ bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y) ::InsertMenu( (MenuHandle) menu->GetHMenu() , -1 ) ; long menuResult = ::PopUpMenuSelect((MenuHandle) menu->GetHMenu() ,y,x, 0) ; - menu->MacMenuSelect( this , TickCount() , HiWord(menuResult) , LoWord(menuResult) ) ; + if ( HiWord(menuResult) != 0 ) + { + MenuCommand id ; + GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult)) , LoWord(menuResult) , &id ) ; + + wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, id ); + event.m_timeStamp = TickCount() ; + event.SetEventObject(this->GetEventHandler()); + event.SetInt( id ); + GetEventHandler()->ProcessEvent(event); + } ::DeleteMenu( menu->MacGetMenuId() ) ; menu->SetInvokingWindow(NULL); diff --git a/src/mac/menu.cpp b/src/mac/menu.cpp index caadf18ce3..0ded39739c 100644 --- a/src/mac/menu.cpp +++ b/src/mac/menu.cpp @@ -209,10 +209,11 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) if ( pos == (size_t)-1 ) { UMAAppendMenuItem(MAC_WXHMENU(m_hMenu), label,key,modifiers); + SetMenuItemCommandID( MAC_WXHMENU(m_hMenu) , CountMenuItems(MAC_WXHMENU(m_hMenu)) , pItem->GetId() ) ; if ( pItem->GetBitmap().Ok() ) { ControlButtonContentInfo info ; - wxMacCreateBitmapButton( &info , pItem->GetBitmap() , true ) ; + wxMacCreateBitmapButton( &info , pItem->GetBitmap() , kControlContentCIconHandle ) ; if ( info.contentType != kControlNoContent ) { if ( info.contentType == kControlContentCIconHandle ) @@ -225,10 +226,11 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) else { UMAInsertMenuItem(MAC_WXHMENU(m_hMenu), label , pos,key,modifiers); + SetMenuItemCommandID( MAC_WXHMENU(m_hMenu) , pos , pItem->GetId() ) ; if ( pItem->GetBitmap().Ok() ) { ControlButtonContentInfo info ; - wxMacCreateBitmapButton( &info , pItem->GetBitmap() , true ) ; + wxMacCreateBitmapButton( &info , pItem->GetBitmap() , kControlContentCIconHandle ) ; if ( info.contentType != kControlNoContent ) { if ( info.contentType == kControlContentCIconHandle ) @@ -429,114 +431,6 @@ void wxMenu::MacEnableMenu( bool bDoEnable ) ::DrawMenuBar() ; } -bool wxMenu::MacMenuSelect( wxEvtHandler* handler, long when , int macMenuId, int macMenuItemNum ) -{ - int pos; - wxNode *node; - - if ( m_macMenuId == macMenuId ) - { - node = GetMenuItems().Nth(macMenuItemNum-1); - if (node) - { - wxMenuItem *pItem = (wxMenuItem*)node->Data(); - - if (pItem->IsCheckable()) - pItem->Check(! pItem->IsChecked()); - - wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, pItem->GetId()); - event.m_timeStamp = when; - event.SetEventObject(handler); - event.SetInt( pItem->GetId() ); - { - bool processed = false ; - -#if WXWIN_COMPATIBILITY - // Try a callback - if (m_callback) - { - (void) (*(m_callback)) (*this, event); - processed = TRUE; - } -#endif - // Try the menu's event handler - if ( !processed && handler) - { - processed = handler->ProcessEvent(event); - } - - // Try the window the menu was popped up from (and up - // through the hierarchy) - if ( !processed && GetInvokingWindow()) - processed = GetInvokingWindow()->GetEventHandler()->ProcessEvent(event); - } - return true ; - } - } - else if ( macMenuId == kHMHelpMenuID ) - { - int menuItem = firstUserHelpMenuItem-1 ; - for (pos = 0, node = GetMenuItems().First(); node; node = node->Next(), pos++) - { - wxMenuItem * pItem = (wxMenuItem *) node->Data() ; - - wxMenu *pSubMenu = pItem->GetSubMenu() ; - if ( pSubMenu != NULL ) - { - } - else - { - if ( pItem->GetId() != wxApp::s_macAboutMenuItemId ) - ++menuItem ; - - if ( menuItem == macMenuItemNum ) - { - wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, pItem->GetId()); - event.m_timeStamp = when; - event.SetEventObject(handler); - event.SetInt( pItem->GetId() ); - { - bool processed = false ; -#if WXWIN_COMPATIBILITY - // Try a callback - if (m_callback) - { - (void) (*(m_callback)) (*this, event); - processed = TRUE; - } -#endif - // Try the menu's event handler - if ( !processed && handler) - { - processed = handler->ProcessEvent(event); - } - - // Try the window the menu was popped up from (and up - // through the hierarchy) - if ( !processed && GetInvokingWindow()) - processed = GetInvokingWindow()->GetEventHandler()->ProcessEvent(event); - } - return true ; - } - } - } - } - - for (pos = 0, node = GetMenuItems().First(); node; node = node->Next(), pos++) - { - wxMenuItem * pItem = (wxMenuItem *) node->Data() ; - - wxMenu *pSubMenu = pItem->GetSubMenu() ; - if ( pSubMenu != NULL ) - { - if ( pSubMenu->MacMenuSelect( handler , when , macMenuId , macMenuItemNum ) ) - return true ; - } - } - - return false ; -} - // Menu Bar /* @@ -664,89 +558,93 @@ void wxMenuBar::MacInstallMenuBar() for (size_t i = 0; i < m_menus.GetCount(); i++) { - Str255 label; - wxNode *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 ) + Str255 label; + wxNode *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 ) + { + MenuHandle mh = NULL ; + if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) != noErr ) { - MenuHandle mh = NULL ; - if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) != noErr ) - { continue ; - } + } for ( int i = CountMenuItems( mh ) ; i >= firstUserHelpMenuItem ; --i ) { - DeleteMenuItem( mh , i ) ; + DeleteMenuItem( mh , i ) ; } - - for (pos = 0 , node = menu->GetMenuItems().First(); node; node = node->Next(), pos++) - { - item = (wxMenuItem *)node->Data(); - subMenu = item->GetSubMenu() ; - if (subMenu) + + for (pos = 0 , node = menu->GetMenuItems().First(); node; node = node->Next(), pos++) + { + item = (wxMenuItem *)node->Data(); + subMenu = item->GetSubMenu() ; + if (subMenu) + { + // we don't support hierarchical menus in the help menu yet + } + else + { + if ( item->IsSeparator() ) { - // we don't support hierarchical menus in the help menu yet + if ( mh ) + MacAppendMenu(mh, "\p-" ); } - else + else { - if ( item->IsSeparator() ) + Str255 label ; + UInt8 modifiers ; + SInt16 key ; + wxMenuItem::MacBuildMenuString( label, &key , &modifiers , item->GetText(), item->GetId() != wxApp::s_macAboutMenuItemId); // no shortcut in about menu + if ( label[0] == 0 ) { - if ( mh ) - MacAppendMenu(mh, "\p-" ); + // we cannot add empty menus on mac + label[0] = 1 ; + label[1] = ' ' ; } + if ( item->GetId() == wxApp::s_macAboutMenuItemId ) + { + ::SetMenuItemText( GetMenuHandle( kwxMacAppleMenuId ) , 1 , label ); + UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 ); + SetMenuItemCommandID( GetMenuHandle( kwxMacAppleMenuId ) , 1 , item->GetId() ) ; + } else { - Str255 label ; - UInt8 modifiers ; - SInt16 key ; - wxMenuItem::MacBuildMenuString( label, &key , &modifiers , item->GetText(), item->GetId() != wxApp::s_macAboutMenuItemId); // no shortcut in about menu - if ( label[0] == 0 ) + if ( mh ) { - // we cannot add empty menus on mac - label[0] = 1 ; - label[1] = ' ' ; - } - if ( item->GetId() == wxApp::s_macAboutMenuItemId ) - { - ::SetMenuItemText( GetMenuHandle( kwxMacAppleMenuId ) , 1 , label ); - UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 ); - } - else - { - if ( mh ) - UMAAppendMenuItem(mh, label , key , modifiers ); + UMAAppendMenuItem(mh, label , key , modifiers ); + SetMenuItemCommandID( mh , CountMenuItems(mh) , item->GetId() ) ; } } } } } - else - { - wxMenuItem::MacBuildMenuString( label, NULL , NULL , m_titles[i] , false ); - UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , label ) ; - wxArrayPtrVoid submenus ; - - for (pos = 0, node = menu->GetMenuItems().First(); node; node = node->Next(), pos++) - { - item = (wxMenuItem *)node->Data(); - subMenu = item->GetSubMenu() ; - if (subMenu) - { - submenus.Add(subMenu) ; - } - } - ::InsertMenu(MAC_WXHMENU(m_menus[i]->GetHMenu()), 0); - for ( size_t i = 0 ; i < submenus.GetCount() ; ++i ) + } + else + { + wxMenuItem::MacBuildMenuString( label, NULL , NULL , m_titles[i] , false ); + UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , label ) ; + wxArrayPtrVoid submenus ; + + for (pos = 0, node = menu->GetMenuItems().First(); node; node = node->Next(), pos++) + { + item = (wxMenuItem *)node->Data(); + subMenu = item->GetSubMenu() ; + if (subMenu) { - wxMenu* submenu = (wxMenu*) submenus[i] ; - wxNode *subnode; - wxMenuItem *subitem; - int subpos ; - for ( subpos = 0 , subnode = submenu->GetMenuItems().First(); subnode; subnode = subnode->Next(), subpos++) + submenus.Add(subMenu) ; + } + } + ::InsertMenu(MAC_WXHMENU(m_menus[i]->GetHMenu()), 0); + for ( size_t i = 0 ; i < submenus.GetCount() ; ++i ) + { + wxMenu* submenu = (wxMenu*) submenus[i] ; + wxNode *subnode; + wxMenuItem *subitem; + int subpos ; + for ( subpos = 0 , subnode = submenu->GetMenuItems().First(); subnode; subnode = subnode->Next(), subpos++) { subitem = (wxMenuItem *)subnode->Data(); wxMenu* itsSubMenu = subitem->GetSubMenu() ; @@ -755,11 +653,11 @@ void wxMenuBar::MacInstallMenuBar() submenus.Add(itsSubMenu) ; } } - ::InsertMenu( MAC_WXHMENU(submenu->GetHMenu()) , -1 ) ; - } - } + ::InsertMenu( MAC_WXHMENU(submenu->GetHMenu()) , -1 ) ; + } } - ::DrawMenuBar() ; + } + ::DrawMenuBar() ; s_macInstalledMenuBar = this; } @@ -900,44 +798,6 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) return TRUE; } -void wxMenuBar::MacMenuSelect(wxEvtHandler* handler, long when , int macMenuId, int macMenuItemNum) -{ - // first scan fast for direct commands, i.e. menus which have these commands directly in their own list - - if ( macMenuId == kwxMacAppleMenuId && macMenuItemNum == 1 ) - { - wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, wxApp::s_macAboutMenuItemId ); - event.m_timeStamp = when; - event.SetEventObject(handler); - event.SetInt( wxApp::s_macAboutMenuItemId ); - handler->ProcessEvent(event); - } - else - { - for (size_t i = 0; i < m_menus.GetCount() ; i++) - { - if ( m_menus[i]->MacGetMenuId() == macMenuId || ( macMenuId == kHMHelpMenuID && ( m_titles[i] == "?" || m_titles[i] == "&?" || m_titles[i] == wxApp::s_macHelpMenuTitleName ) ) ) - { - if ( m_menus[i]->MacMenuSelect( handler , when , macMenuId , macMenuItemNum ) ) - return ; - else - { - //TODO flag this as an error since it must contain the item - return ; - } - } - } - - for (size_t i = 0; i < m_menus.GetCount(); i++) - { - if ( m_menus[i]->MacMenuSelect( handler , when , macMenuId , macMenuItemNum ) ) - { - break ; - } - } - } -} - wxMenu *wxMenuBar::Remove(size_t pos) { wxMenu *menu = wxMenuBarBase::Remove(pos); diff --git a/src/mac/window.cpp b/src/mac/window.cpp index bc83a282a2..510d695ce5 100644 --- a/src/mac/window.cpp +++ b/src/mac/window.cpp @@ -353,7 +353,17 @@ bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y) ::InsertMenu( (MenuHandle) menu->GetHMenu() , -1 ) ; long menuResult = ::PopUpMenuSelect((MenuHandle) menu->GetHMenu() ,y,x, 0) ; - menu->MacMenuSelect( this , TickCount() , HiWord(menuResult) , LoWord(menuResult) ) ; + if ( HiWord(menuResult) != 0 ) + { + MenuCommand id ; + GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult)) , LoWord(menuResult) , &id ) ; + + wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, id ); + event.m_timeStamp = TickCount() ; + event.SetEventObject(this->GetEventHandler()); + event.SetInt( id ); + GetEventHandler()->ProcessEvent(event); + } ::DeleteMenu( menu->MacGetMenuId() ) ; menu->SetInvokingWindow(NULL);