From: Stefan Csomor Date: Thu, 27 May 2004 14:47:50 +0000 (+0000) Subject: having the refcon of a menu item to bear the pointer to the wxMenuItem, and have... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/de5914a150879ce964ac4ac8500b00baaa0dcb09 having the refcon of a menu item to bear the pointer to the wxMenuItem, and have an map of menuref->wxMenu* git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27461 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/mac/carbon/menu.cpp b/src/mac/carbon/menu.cpp index 476a45c477..adb3fb2e95 100644 --- a/src/mac/carbon/menu.cpp +++ b/src/mac/carbon/menu.cpp @@ -41,12 +41,42 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, wxEvtHandler) #endif // the (popup) menu title has this special id -static const int idMenuTitle = -2; +static const int idMenuTitle = -3; static MenuItemIndex firstUserHelpMenuItem = 0 ; const short kwxMacMenuBarResource = 1 ; const short kwxMacAppleMenuId = 1 ; + +// Find an item given the Macintosh Menu Reference + +wxList wxWinMacMenuList(wxKEY_INTEGER); +wxMenu *wxFindMenuFromMacMenu(MenuRef inMenuRef) +{ + wxNode *node = wxWinMacMenuList.Find((long)inMenuRef); + if (!node) + return NULL; + return (wxMenu *)node->GetData(); +} + +void wxAssociateMenuWithMacMenu(MenuRef inMenuRef, wxMenu *menu) ; +void wxAssociateMenuWithMacMenu(MenuRef inMenuRef, wxMenu *menu) +{ + // adding NULL MenuRef is (first) surely a result of an error and + // (secondly) breaks menu command processing + wxCHECK_RET( inMenuRef != (MenuRef) NULL, wxT("attempt to add a NULL MenuRef to menu list") ); + + if ( !wxWinMacMenuList.Find((long)inMenuRef) ) + wxWinMacMenuList.Append((long)inMenuRef, menu); +} + +void wxRemoveMacMenuAssociation(wxMenu *menu) ; +void wxRemoveMacMenuAssociation(wxMenu *menu) +{ + wxWinMacMenuList.DeleteObject(menu); +} + + // ============================================================================ // implementation // ============================================================================ @@ -77,6 +107,8 @@ void wxMenu::Init() wxLogLastError(wxT("UMANewMenu failed")); } + wxAssociateMenuWithMacMenu( (MenuRef)m_hMenu , this ) ; + // if we have a title, insert it in the beginning of the menu if ( !!m_title ) { @@ -87,6 +119,7 @@ void wxMenu::Init() wxMenu::~wxMenu() { + wxRemoveMacMenuAssociation( this ) ; if (MAC_WXHMENU(m_hMenu)) ::DisposeMenu(MAC_WXHMENU(m_hMenu)); } @@ -153,6 +186,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) } SetMenuItemCommandID( MAC_WXHMENU(m_hMenu) , pos , pItem->GetId() ) ; + SetMenuItemRefCon( MAC_WXHMENU(m_hMenu) , pos , (UInt32) pItem ) ; pItem->UpdateItemText() ; pItem->UpdateItemBitmap() ; pItem->UpdateItemStatus() ; @@ -582,6 +616,7 @@ void wxMenuBar::MacInstallMenuBar() UMASetMenuItemText( GetMenuHandle( kwxMacAppleMenuId ) , 1 , item->GetText() , wxFont::GetDefaultEncoding() ); UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 , true ); SetMenuItemCommandID( GetMenuHandle( kwxMacAppleMenuId ) , 1 , item->GetId() ) ; + SetMenuItemRefCon(GetMenuHandle( kwxMacAppleMenuId ) , 1 , (UInt32)item ) ; UMASetMenuItemShortcut( GetMenuHandle( kwxMacAppleMenuId ) , 1 , entry ) ; } else @@ -590,6 +625,7 @@ void wxMenuBar::MacInstallMenuBar() { UMAAppendMenuItem(mh, item->GetText() , wxFont::GetDefaultEncoding(), entry); SetMenuItemCommandID( mh , CountMenuItems(mh) , item->GetId() ) ; + SetMenuItemRefCon( mh , CountMenuItems(mh) , (UInt32)item ) ; } }