static void carbon_menu_item_update_submenu (CarbonMenuItem *carbon_item, GtkWidget *widget) { GtkWidget *submenu; submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget)); if (submenu) { const gchar *label_text; CFStringRef cfstr = NULL; label_text = get_menu_label_text (widget, NULL); if (label_text) cfstr = CFStringCreateWithCString (NULL, label_text, kCFStringEncodingUTF8); CreateNewMenu (0, 0, &carbon_item->submenu); SetMenuTitleWithCFString (carbon_item->submenu, cfstr); SetMenuItemHierarchicalMenu (carbon_item->menu, carbon_item->index, carbon_item->submenu); sync_menu_shell (GTK_MENU_SHELL (submenu), carbon_item->submenu, FALSE, FALSE); if (cfstr) CFRelease (cfstr); } else { SetMenuItemHierarchicalMenu (carbon_item->menu, carbon_item->index, NULL); carbon_item->submenu = NULL; } }
S32 PopupMenu::insertSubMenu(S32 pos, const char *title, PopupMenu *submenu) { for(S32 i = 0;i < mSubmenus->size();i++) { if(submenu == (*mSubmenus)[i]) { Con::errorf("PopupMenu::insertSubMenu - Attempting to add submenu twice"); return -1; } } CFStringRef cftitle = CFStringCreateWithCString(NULL,title,kCFStringEncodingUTF8); InsertMenuItemTextWithCFString(mData->mMenu, cftitle, pos, 0, kHICommandTorque + 1); CFRelease( cftitle ); // ensure that we have the correct index for the new menu item MenuRef outref; MenuItemIndex item; GetIndMenuItemWithCommandID(mData->mMenu, kHICommandTorque+1, 1, &outref, &item); SetMenuItemCommandID(mData->mMenu, item, 0); S32 tag = PlatformPopupMenuData::getTag(); SetMenuItemRefCon( mData->mMenu, item, tag); // store a pointer to the PopupMenu this item represents. See PopupMenu::removeItem() SetMenuItemProperty(mData->mMenu, item, 'GG2d', 'subm', sizeof(PopupMenu*), submenu); SetMenuItemHierarchicalMenu( mData->mMenu, item, submenu->mData->mMenu); mSubmenus->addObject(submenu); return tag; }
void UMAAppendSubMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , MenuRef submenu ) { AppendMenuItemTextWithCFString( menu, CFSTR("A"), 0, 0,NULL); UMASetMenuItemText( menu, (SInt16) ::CountMenuItems(menu), title , encoding ); SetMenuItemHierarchicalMenu( menu , CountMenuItems( menu ) , submenu ) ; SetMenuTitleWithCFString(submenu , wxCFStringRef(title , encoding) ); }
virtual void InsertOrAppend(wxMenuItem *pItem, size_t pos) { // 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 MenuItemIndex index = pos; if ( pos == (size_t) -1 ) index = CountMenuItems(m_osxMenu); if ( pItem->IsSeparator() ) { InsertMenuItemTextWithCFString( m_osxMenu, CFSTR(""), index, kMenuItemAttrSeparator, 0); // now switch to the Carbon 1 based counting index += 1 ; } else { InsertMenuItemTextWithCFString( m_osxMenu, CFSTR("placeholder"), index, 0, 0 ); // now switch to the Carbon 1 based counting index += 1 ; if ( pItem->IsSubMenu() ) { MenuRef submenu = pItem->GetSubMenu()->GetHMenu(); SetMenuItemHierarchicalMenu(m_osxMenu, index, submenu); // carbon is using the title of the submenu, eg in the menubar SetMenuTitleWithCFString(submenu, wxCFStringRef(pItem->GetItemLabelText())); } else { SetMenuItemCommandID( m_osxMenu, index , wxIdToMacCommand(pItem->GetId()) ) ; } } wxMenuItemCarbonImpl* impl = (wxMenuItemCarbonImpl*) pItem->GetPeer(); impl->AttachToParent( m_osxMenu, index ); // only now can all settings be updated correctly pItem->UpdateItemText(); pItem->UpdateItemStatus(); pItem->UpdateItemBitmap(); }
MenuRef IGraphicsCarbon::CreateMenu(IPopupMenu* pMenu) { MenuRef menuRef = 0; ResID menuID = UniqueID ('MENU'); int numItems = pMenu->GetNItems(); if (numItems && CreateNewMenu(menuID, kMenuAttrCondenseSeparators, &menuRef) == noErr) { for (int i = 0; i < numItems; ++i) { IPopupMenuItem* menuItem = pMenu->GetItem(i); if (menuItem->GetIsSeparator()) { AppendMenuItemTextWithCFString(menuRef, CFSTR(""), kMenuItemAttrSeparator, 0, NULL); } else { CFStringRef itemString = CFStringCreateWithCString(NULL, menuItem->GetText(), kCFStringEncodingUTF8); if (pMenu->GetPrefix()) { CFStringRef prefixString = 0; switch (pMenu->GetPrefix()) { case 0: prefixString = CFStringCreateWithFormat(NULL, 0, CFSTR(""),i+1); break; case 1: prefixString = CFStringCreateWithFormat(NULL, 0, CFSTR("%1d: "),i+1); break; case 2: prefixString = CFStringCreateWithFormat(NULL, 0, CFSTR("%02d: "),i+1); break; case 3: prefixString = CFStringCreateWithFormat(NULL, 0, CFSTR("%03d: "),i+1); break; } CFMutableStringRef newItemString = CFStringCreateMutable(0, 0); CFStringAppend (newItemString, prefixString); CFStringAppend (newItemString, itemString); CFRelease (itemString); CFRelease (prefixString); itemString = newItemString; } if (itemString == 0) continue; MenuItemAttributes itemAttribs = kMenuItemAttrIgnoreMeta; if (!menuItem->GetEnabled()) { itemAttribs |= kMenuItemAttrDisabled; } if (menuItem->GetIsTitle()) { itemAttribs |= kMenuItemAttrSectionHeader; } InsertMenuItemTextWithCFString(menuRef, itemString, i, itemAttribs, 0); if (menuItem->GetChecked()) { CheckMenuItem(menuRef, i+1, true); } if (menuItem->GetSubmenu()) { MenuRef submenu = CreateMenu(menuItem->GetSubmenu()); if (submenu) { SetMenuItemHierarchicalMenu(menuRef, i+1, submenu); CFRelease (submenu); } } CFRelease (itemString); } } // if (pMenu->getStyle() & kCheckStyle && !multipleCheck) // CheckMenuItem (menuRef, pMenu->getCurrentIndex (true) + 1, true); SetMenuItemRefCon(menuRef, 0, (int32_t)pMenu); //swell collision #undef InsertMenu InsertMenu(menuRef, kInsertHierarchicalMenu); #define InsertMenu SWELL_InsertMenu } return menuRef; }