X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8377a10750046b6fd8ae1548efd4b78d220f17bf..a201463482dc4417592ee014ff1a9706e8971dd6:/src/mac/carbon/menu.cpp diff --git a/src/mac/carbon/menu.cpp b/src/mac/carbon/menu.cpp index 09cf4450c1..b790e19ccf 100644 --- a/src/mac/carbon/menu.cpp +++ b/src/mac/carbon/menu.cpp @@ -81,6 +81,54 @@ void wxRemoveMacMenuAssociation(wxMenu *menu) } } +void wxInsertMenuItemsInMenu(wxMenu* menu, MenuRef wm, MenuItemIndex insertAfter) +{ + wxMenuItemList::compatibility_iterator node; + wxMenuItem *item; + wxMenu *subMenu = NULL ; + bool newItems = false; + + for (node = menu->GetMenuItems().GetFirst(); node; node = node->GetNext()) + { + item = (wxMenuItem *)node->GetData(); + subMenu = item->GetSubMenu() ; + if (subMenu) + { + wxInsertMenuItemsInMenu(subMenu, (MenuRef)subMenu->GetHMenu(), 0); + } + if ( item->IsSeparator() ) + { + if ( wm && newItems) + InsertMenuItemTextWithCFString( wm, + CFSTR(""), insertAfter, kMenuItemAttrSeparator, 0); + + newItems = false; + } + else + { + wxAcceleratorEntry* + entry = wxAcceleratorEntry::Create( item->GetText() ) ; + + MenuItemIndex winListPos = (MenuItemIndex)-1; + OSStatus err = GetIndMenuItemWithCommandID(wm, + wxIdToMacCommand ( item->GetId() ), 1, NULL, &winListPos); + + if ( wm && err == menuItemNotFoundErr ) + { + // NB: the only way to determine whether or not we should add + // a separator is to know if we've added menu items to the menu + // before the separator. + newItems = true; + UMAInsertMenuItem(wm, wxStripMenuCodes(item->GetText()) , wxFont::GetDefaultEncoding(), insertAfter, entry); + SetMenuItemCommandID( wm , insertAfter+1 , wxIdToMacCommand ( item->GetId() ) ) ; + SetMenuItemRefCon( wm , insertAfter+1 , (URefCon) item ) ; + } + + delete entry ; + } + } +} + // ============================================================================ // implementation // ============================================================================ @@ -162,10 +210,10 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) { if ( pos == (size_t)-1 ) AppendMenuItemTextWithCFString( MAC_WXHMENU(m_hMenu), - CFSTR(""), kMenuItemAttrSeparator, 0,NULL); + CFSTR(""), kMenuItemAttrSeparator, 0,NULL); else InsertMenuItemTextWithCFString( MAC_WXHMENU(m_hMenu), - CFSTR(""), pos, kMenuItemAttrSeparator, 0); + CFSTR(""), pos, kMenuItemAttrSeparator, 0); } else { @@ -607,27 +655,24 @@ void wxMenuBar::MacInstallMenuBar() // However, the change from 10.2 to 10.3 suggests it is preferred #if TARGET_API_MAC_OSX InsertMenuItemTextWithCFString( appleMenu, - CFSTR(""), 0, kMenuItemAttrSeparator, 0); + CFSTR(""), 0, kMenuItemAttrSeparator, 0); #endif InsertMenuItemTextWithCFString( appleMenu, - CFSTR("About..."), 0, 0, 0); + CFSTR("About..."), 0, 0, 0); MacInsertMenu( appleMenu , 0 ) ; - // clean-up the help menu before adding new items - static MenuHandle mh = NULL ; + // if we have a mac help menu, clean it up before adding new items + MenuHandle helpMenuHandle ; + MenuItemIndex firstUserHelpMenuItem ; - if ( mh != NULL ) + if ( UMAGetHelpMenuDontCreate( &helpMenuHandle , &firstUserHelpMenuItem) == noErr ) { - MenuItemIndex firstUserHelpMenuItem ; - if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) == noErr ) - { - for ( int i = CountMenuItems( mh ) ; i >= firstUserHelpMenuItem ; --i ) - DeleteMenuItem( mh , i ) ; - } - else - { - mh = NULL ; - } + for ( int i = CountMenuItems( helpMenuHandle ) ; i >= firstUserHelpMenuItem ; --i ) + DeleteMenuItem( helpMenuHandle , i ) ; + } + else + { + helpMenuHandle = NULL ; } #if TARGET_CARBON @@ -654,14 +699,17 @@ void wxMenuBar::MacInstallMenuBar() } #endif + wxString strippedHelpMenuTitle = wxStripMenuCodes( wxApp::s_macHelpMenuTitleName ) ; + wxString strippedTranslatedHelpMenuTitle = wxStripMenuCodes( wxString( _("&Help") ) ) ; wxMenuList::compatibility_iterator menuIter = m_menus.GetFirst(); for (size_t i = 0; i < m_menus.GetCount(); i++, menuIter = menuIter->GetNext()) { wxMenuItemList::compatibility_iterator node; wxMenuItem *item; wxMenu* menu = menuIter->GetData() , *subMenu = NULL ; + wxString strippedMenuTitle = wxStripMenuCodes(m_titles[i]); - if ( m_titles[i] == wxT("?") || m_titles[i] == wxT("&?") || m_titles[i] == wxApp::s_macHelpMenuTitleName ) + if ( strippedMenuTitle == wxT("?") || strippedMenuTitle == strippedHelpMenuTitle || strippedMenuTitle == strippedTranslatedHelpMenuTitle ) { for (node = menu->GetMenuItems().GetFirst(); node; node = node->GetNext()) { @@ -675,12 +723,13 @@ void wxMenuBar::MacInstallMenuBar() { if ( item->GetId() != wxApp::s_macAboutMenuItemId ) { - if ( mh == NULL ) + // we have found a user help menu and an item other than the about item, + // so we can create the mac help menu now, if we haven't created it yet + if ( helpMenuHandle == NULL ) { - MenuItemIndex firstUserHelpMenuItem ; - if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) != noErr ) + if ( UMAGetHelpMenu( &helpMenuHandle , &firstUserHelpMenuItem) != noErr ) { - mh = NULL ; + helpMenuHandle = NULL ; break ; } } @@ -688,9 +737,9 @@ void wxMenuBar::MacInstallMenuBar() if ( item->IsSeparator() ) { - if ( mh ) - AppendMenuItemTextWithCFString( mh, - CFSTR(""), kMenuItemAttrSeparator, 0,NULL); + if ( helpMenuHandle ) + AppendMenuItemTextWithCFString( helpMenuHandle, + CFSTR(""), kMenuItemAttrSeparator, 0,NULL); } else { @@ -703,11 +752,11 @@ void wxMenuBar::MacInstallMenuBar() } else { - if ( mh ) + if ( helpMenuHandle ) { - UMAAppendMenuItem(mh, wxStripMenuCodes(item->GetText()) , wxFont::GetDefaultEncoding(), entry); - SetMenuItemCommandID( mh , CountMenuItems(mh) , wxIdToMacCommand ( item->GetId() ) ) ; - SetMenuItemRefCon( mh , CountMenuItems(mh) , (URefCon) item ) ; + UMAAppendMenuItem(helpMenuHandle, wxStripMenuCodes(item->GetText()) , wxFont::GetDefaultEncoding(), entry); + SetMenuItemCommandID( helpMenuHandle , CountMenuItems(helpMenuHandle) , wxIdToMacCommand ( item->GetId() ) ) ; + SetMenuItemRefCon( helpMenuHandle , CountMenuItems(helpMenuHandle) , (URefCon) item ) ; } } @@ -716,10 +765,42 @@ void wxMenuBar::MacInstallMenuBar() } } } + + else if ( ( m_titles[i] == wxT("Window") || m_titles[i] == wxT("&Window") ) + && GetAutoWindowMenu() ) + { + if ( MacGetWindowMenuHMenu() == NULL ) + { + CreateStandardWindowMenu( 0 , (MenuHandle*) &s_macWindowMenuHandle ) ; + } + + MenuRef wm = (MenuRef)MacGetWindowMenuHMenu(); + if ( wm == NULL ) + break; + + // get the insertion point in the standard menu + MenuItemIndex winListStart; + GetIndMenuItemWithCommandID(wm, + kHICommandWindowListSeparator, 1, NULL, &winListStart); + + // add a separator so that the standard items and the custom items + // aren't mixed together, but only if this is the first run + OSStatus err = GetIndMenuItemWithCommandID(wm, + 'WXWM', 1, NULL, NULL); + + if ( err == menuItemNotFoundErr ) + { + InsertMenuItemTextWithCFString( wm, + CFSTR(""), winListStart-1, kMenuItemAttrSeparator, 'WXWM'); + } + + wxInsertMenuItemsInMenu(menu, wm, winListStart); + } else { UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , m_titles[i], m_font.GetEncoding() ) ; menu->MacBeforeDisplay(false) ; + ::InsertMenu(MAC_WXHMENU(_wxMenuAt(m_menus, i)->GetHMenu()), 0); } }