X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2b5f62a0b2db198609b45dec622a018dae37008e..a148cfb64451d6553cf66d1075b654e54e908210:/src/gtk1/menu.cpp diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index 3701f416ee..d304c46a84 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -448,6 +448,36 @@ wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) return menuOld; } +static wxMenu *CopyMenu (wxMenu *menu) +{ + wxMenu *menucopy = new wxMenu (); + wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst(); + while (node) + { + wxMenuItem *item = node->GetData(); + int itemid = item->GetId(); + wxString text = item->GetText(); + text.Replace(wxT("_"), wxT("&")); + wxMenu *submenu = item->GetSubMenu(); + if (!submenu) + { + wxMenuItem* itemcopy = new wxMenuItem(menucopy, + itemid, text, + menu->GetHelpString(itemid)); + itemcopy->SetBitmap(item->GetBitmap()); + itemcopy->SetCheckable(item->IsCheckable()); + menucopy->Append(itemcopy); + } + else + menucopy->Append (itemid, text, CopyMenu(submenu), + menu->GetHelpString(itemid)); + + node = node->GetNext(); + } + + return menucopy; +} + wxMenu *wxMenuBar::Remove(size_t pos) { wxMenu *menu = wxMenuBarBase::Remove(pos); @@ -461,13 +491,17 @@ wxMenu *wxMenuBar::Remove(size_t pos) printf( "menu shell entries before %d\n", (int)g_list_length( menu_shell->children ) ); */ + wxMenu *menucopy = CopyMenu( menu ); + // unparent calls unref() and that would delete the widget so we raise // the ref count to 2 artificially before invoking unparent. gtk_widget_ref( menu->m_menu ); gtk_widget_unparent( menu->m_menu ); gtk_widget_destroy( menu->m_owner ); + delete menu; + menu = menucopy; /* printf( "factory entries after %d\n", (int)g_slist_length(m_factory->items) ); printf( "menu shell entries after %d\n", (int)g_list_length( menu_shell->children ) ); @@ -591,6 +625,9 @@ wxString wxMenuBar::GetLabelTop( size_t pos ) const continue; } + // don't remove ampersands '&' since if we have them in the menu title + // it means that they were doubled to indicate "&" instead of accelerator + label += *pc; } @@ -778,7 +815,7 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text) for ( const wxChar *pc = text.c_str(); *pc; pc++ ) { - if ( *pc == wxT('_') ) + if ( *pc == wxT('_') ) { // GTK 1.2 escapes "xxx_xxx" to "xxx__xxx" pc++; @@ -796,9 +833,15 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text) } #endif + if ( (*pc == wxT('&')) && (*(pc+1) != wxT('&')) ) + { + // wxMSW escapes "&" + // "&" is doubled to indicate "&" instead of accelerator + continue; + } + label += *pc; } - return label; } @@ -971,6 +1014,9 @@ wxString wxMenuItem::GetFactoryPath() const continue; } + // don't remove ampersands '&' since if we have them in the menu item title + // it means that they were doubled to indicate "&" instead of accelerator + path += *pc; } @@ -1277,13 +1323,13 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item) int wxMenu::FindMenuIdByMenuItem( GtkWidget *menuItem ) const { - wxNode *node = m_items.First(); + wxMenuItemList::Node *node = m_items.GetFirst(); while (node) { - wxMenuItem *item = (wxMenuItem*)node->Data(); + wxMenuItem *item = node->GetData(); if (item->GetMenuItem() == menuItem) return item->GetId(); - node = node->Next(); + node = node->GetNext(); } return wxNOT_FOUND;