X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cd743a6f71653cc0cfa5c0377aae26c906650620..50ef256ed3e52defe91655da5e3f6a9e913c9e2a:/src/gtk1/menu.cpp diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index faa9236de7..0c0d9b98a5 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -26,6 +26,32 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenuBar,wxWindow) +wxMenuBar::wxMenuBar( long style ) +{ + m_needParent = FALSE; // hmmm + + PreCreation( (wxWindow *) NULL, -1, wxDefaultPosition, wxDefaultSize, 0, "menu" ); + + m_menus.DeleteContents( TRUE ); + + m_menubar = gtk_menu_bar_new(); + + if (style & wxMB_DOCKABLE) + { + m_widget = gtk_handle_box_new(); + gtk_container_add( GTK_CONTAINER(m_widget), GTK_WIDGET(m_menubar) ); + gtk_widget_show( GTK_WIDGET(m_menubar) ); + } + else + { + m_widget = GTK_WIDGET(m_menubar); + } + + PostCreation(); + + Show( TRUE ); +} + wxMenuBar::wxMenuBar() { m_needParent = FALSE; // hmmm @@ -468,9 +494,9 @@ void wxMenu::Append( int id, const wxString &text, wxMenu *subMenu, const wxStri wxMenuItem *mitem = new wxMenuItem(); mitem->SetId(id); mitem->SetText(text); + mitem->SetHelp(helpStr); GtkWidget *menuItem = gtk_menu_item_new_with_label(mitem->GetText()); - mitem->SetHelp(helpStr); mitem->SetMenuItem(menuItem); mitem->SetSubMenu(subMenu); @@ -488,6 +514,43 @@ void wxMenu::Append( int id, const wxString &text, wxMenu *subMenu, const wxStri m_items.Append( mitem ); } +void wxMenu::Append( wxMenuItem *item ) +{ + m_items.Append( item ); + + GtkWidget *menuItem = (GtkWidget*) NULL; + + if (item->IsSeparator()) + menuItem = gtk_menu_item_new(); + else if (item->IsSubMenu()) + menuItem = gtk_menu_item_new_with_label(item->GetText()); + else + menuItem = item->IsCheckable() ? gtk_check_menu_item_new_with_label(item->GetText()) + : gtk_menu_item_new_with_label(item->GetText()); + + if (!item->IsSeparator()) + { + gtk_signal_connect( GTK_OBJECT(menuItem), "select", + GTK_SIGNAL_FUNC(gtk_menu_hilight_callback), + (gpointer*)this ); + + gtk_signal_connect( GTK_OBJECT(menuItem), "deselect", + GTK_SIGNAL_FUNC(gtk_menu_nolight_callback), + (gpointer*)this ); + + if (!item->IsSubMenu()) + { + gtk_signal_connect( GTK_OBJECT(menuItem), "activate", + GTK_SIGNAL_FUNC(gtk_menu_clicked_callback), + (gpointer*)this ); + } + } + + gtk_menu_append( GTK_MENU(m_menu), menuItem ); + gtk_widget_show( menuItem ); + item->SetMenuItem(menuItem); +} + int wxMenu::FindItem( const wxString itemString ) const { wxString s( itemString ); @@ -642,4 +705,44 @@ wxWindow *wxMenu::GetInvokingWindow() return m_invokingWindow; } +// Update a menu and all submenus recursively. +// source is the object that has the update event handlers +// defined for it. If NULL, the menu or associated window +// will be used. +void wxMenu::UpdateUI(wxEvtHandler* source) +{ + if (!source && GetInvokingWindow()) + source = GetInvokingWindow()->GetEventHandler(); + if (!source) + source = GetEventHandler(); + if (!source) + source = this; + + wxNode* node = GetItems().First(); + while (node) + { + wxMenuItem* item = (wxMenuItem*) node->Data(); + if ( !item->IsSeparator() ) + { + wxWindowID id = item->GetId(); + wxUpdateUIEvent event(id); + event.SetEventObject( source ); + + if (source->ProcessEvent(event)) + { + if (event.GetSetText()) + SetLabel(id, event.GetText()); + if (event.GetSetChecked()) + Check(id, event.GetChecked()); + if (event.GetSetEnabled()) + Enable(id, event.GetEnabled()); + } + + if (item->GetSubMenu()) + item->GetSubMenu()->UpdateUI(source); + } + node = node->Next(); + } +} +