X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dc86cb34c3a8f141686339f1285cf259dec5faaa..5de5db0eb14aa86b5b177050720deb0f4c210fba:/src/gtk1/menu.cpp diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index b6d4de7986..09c77c3479 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -7,9 +7,9 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - #ifdef __GNUG__ #pragma implementation "menu.h" +#pragma implementation "menuitem.h" #endif #include "wx/menu.h" @@ -31,7 +31,7 @@ wxMenuBar::wxMenuBar() m_menus.DeleteContents( TRUE ); m_menubar = gtk_menu_bar_new(); - + m_widget = GTK_WIDGET(m_menubar); PostCreation(); @@ -159,7 +159,7 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu ) wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, id ); event.SetEventObject( menu ); event.SetInt(id ); - + if (menu->m_callback) { (void) (*(menu->m_callback)) (*menu, event); @@ -187,7 +187,7 @@ static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu ) wxCommandEvent event( wxEVT_MENU_HIGHLIGHT, id ); event.SetEventObject( menu ); event.SetInt(id ); - + /* wxMSW doesn't call callback here either if (menu->m_callback) { @@ -203,7 +203,7 @@ static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu ) } //----------------------------------------------------------------------------- -// wxMenu +// wxMenuItem //----------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxMenuItem,wxObject) @@ -218,33 +218,48 @@ wxMenuItem::wxMenuItem() m_menuItem = (GtkWidget *) NULL; } -void wxMenuItem::SetText(const wxString& str) +// it's valid for this function to be called even if m_menuItem == NULL +void wxMenuItem::SetName(const wxString& str) { m_text = ""; - for ( const char *pc = str; *pc != '\0'; pc++ ) { + for ( const char *pc = str; *pc != '\0'; pc++ ) + { if ( *pc == '&' ) pc++; // skip it m_text << *pc; } + + if ( m_menuItem ) + { + GtkLabel *label = GTK_LABEL( GTK_BIN(m_menuItem)->child ); + + gtk_label_set( label, m_text.c_str()); + } } void wxMenuItem::Check( bool check ) { + wxCHECK_RET( m_menuItem, "invalid menu item" ); + wxCHECK_RET( IsCheckable(), "Can't check uncheckable item!" ) m_isChecked = check; gtk_check_menu_item_set_state( (GtkCheckMenuItem*)m_menuItem, (gint)check ); } -void wxMenuItem::Enable( bool enable ) -{ +void wxMenuItem::Enable( bool enable ) +{ + wxCHECK_RET( m_menuItem, "invalid menu item" ); + gtk_widget_set_sensitive( m_menuItem, enable ); - m_isEnabled = enable; + m_isEnabled = enable; } bool wxMenuItem::IsChecked() const { + wxCHECK_MSG( m_menuItem, FALSE, "invalid menu item" ); + wxCHECK( IsCheckable(), FALSE ); // can't get state of uncheckable item! bool bIsChecked = ((GtkCheckMenuItem*)m_menuItem)->active != 0; @@ -254,6 +269,10 @@ bool wxMenuItem::IsChecked() const return bIsChecked; } +//----------------------------------------------------------------------------- +// wxMenuItem +//----------------------------------------------------------------------------- + IMPLEMENT_DYNAMIC_CLASS(wxMenu,wxEvtHandler) wxMenu::wxMenu( const wxString& title, const wxFunction func ) @@ -262,8 +281,11 @@ wxMenu::wxMenu( const wxString& title, const wxFunction func ) m_items.DeleteContents( TRUE ); m_invokingWindow = (wxWindow *) NULL; m_menu = gtk_menu_new(); // Do not show! + m_callback = func; m_eventHandler = this; + m_clientData = (void*) NULL; + if (m_title.IsNull()) m_title = ""; if (m_title != "") { @@ -305,7 +327,7 @@ void wxMenu::Append( int id, const wxString &item, const wxString &helpStr, bool const char *text = mitem->GetText(); GtkWidget *menuItem = checkable ? gtk_check_menu_item_new_with_label(text) : gtk_menu_item_new_with_label(text); - + mitem->SetMenuItem(menuItem); gtk_signal_connect( GTK_OBJECT(menuItem), "activate", @@ -446,7 +468,7 @@ wxMenuItem *wxMenu::FindItem(int id) const // Not finding anything here can be correct // when search the entire menu system for // an entry -> no error message. - + return (wxMenuItem *) NULL; }