X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1a70c9e2bf5f683c8e7adbd4a0c3299accac9c06..c719013fd40f1d9f0cd1eff5be177da9a743d5c7:/src/gtk1/menu.cpp diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index 2a2e7bdc25..fa3f149dd0 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: menu.cpp +// Name: src/gtk1/menu.cpp // Purpose: // Author: Robert Roebling // Id: $Id$ @@ -11,43 +11,32 @@ #include "wx/wxprec.h" #include "wx/menu.h" -#include "wx/log.h" -#include "wx/intl.h" -#include "wx/app.h" -#include "wx/bitmap.h" +#include "wx/stockitem.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/app.h" + #include "wx/bitmap.h" +#endif #if wxUSE_ACCEL #include "wx/accel.h" #endif // wxUSE_ACCEL -#include "wx/gtk/private.h" +#include "wx/gtk1/private.h" #include -// FIXME: is this right? somehow I don't think so (VZ) -#ifdef __WXGTK20__ - #include - - #define gtk_accel_group_attach(g, o) gtk_window_add_accel_group((o), (g)) - #define gtk_accel_group_detach(g, o) gtk_window_remove_accel_group((o), (g)) - #define gtk_menu_ensure_uline_accel_group(m) gtk_menu_get_accel_group(m) - - #define ACCEL_OBJECT GtkWindow - #define ACCEL_OBJECTS(a) (a)->acceleratables - #define ACCEL_OBJ_CAST(obj) ((GtkWindow*) obj) -#else // GTK+ 1.x - #define ACCEL_OBJECT GtkObject - #define ACCEL_OBJECTS(a) (a)->attach_objects - #define ACCEL_OBJ_CAST(obj) GTK_OBJECT(obj) -#endif +#define ACCEL_OBJECT GtkObject +#define ACCEL_OBJECTS(a) (a)->attach_objects +#define ACCEL_OBJ_CAST(obj) GTK_OBJECT(obj) // we use normal item but with a special id for the menu title static const int wxGTK_TITLE_ID = -3; // defined in window.cpp -#ifndef __WXGTK20__ - extern guint32 wxGtkTimeLastClick; -#endif +extern guint32 wxGtkTimeLastClick; //----------------------------------------------------------------------------- // idle system @@ -155,7 +144,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenuBar,wxWindow) void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long style) { // the parent window is known after wxFrame::SetMenu() - m_needParent = FALSE; + m_needParent = false; m_style = style; m_invokingWindow = (wxWindow*) NULL; @@ -167,9 +156,7 @@ void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long st } m_menubar = gtk_menu_bar_new(); -#ifndef __WXGTK20__ m_accel = gtk_accel_group_new(); -#endif if (style & wxMB_DOCKABLE) { @@ -227,10 +214,8 @@ static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win ) while (top_frame->GetParent() && !(top_frame->IsTopLevel())) top_frame = top_frame->GetParent(); -#ifndef __WXGTK20__ // support for native hot keys gtk_accel_group_detach( menu->m_accel, ACCEL_OBJ_CAST(top_frame->m_widget) ); -#endif wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst(); while (node) @@ -272,12 +257,10 @@ void wxMenuBar::SetInvokingWindow( wxWindow *win ) while (top_frame->GetParent() && !(top_frame->IsTopLevel())) top_frame = top_frame->GetParent(); -#ifndef __WXGTK20__ // support for native key accelerators indicated by underscroes ACCEL_OBJECT *obj = ACCEL_OBJ_CAST(top_frame->m_widget); if ( !g_slist_find( ACCEL_OBJECTS(m_accel), obj ) ) gtk_accel_group_attach( m_accel, obj ); -#endif wxMenuList::compatibility_iterator node = m_menus.GetFirst(); while (node) @@ -295,10 +278,8 @@ void wxMenuBar::UnsetInvokingWindow( wxWindow *win ) while (top_frame->GetParent() && !(top_frame->IsTopLevel())) top_frame = top_frame->GetParent(); -#ifndef __WXGTK20__ // support for native key accelerators indicated by underscroes gtk_accel_group_detach( m_accel, ACCEL_OBJ_CAST(top_frame->m_widget) ); -#endif wxMenuList::compatibility_iterator node = m_menus.GetFirst(); while (node) @@ -312,7 +293,7 @@ void wxMenuBar::UnsetInvokingWindow( wxWindow *win ) bool wxMenuBar::Append( wxMenu *menu, const wxString &title ) { if ( !wxMenuBarBase::Append( menu, title ) ) - return FALSE; + return false; return GtkAppend(menu, title); } @@ -325,9 +306,6 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) menu->SetTitle( str ); // The "m_owner" is the "menu item" -#ifdef __WXGTK20__ - menu->m_owner = gtk_menu_item_new_with_mnemonic( wxGTK_CONV( str ) ); -#else menu->m_owner = gtk_menu_item_new_with_label( wxGTK_CONV( str ) ); GtkLabel *label = GTK_LABEL( GTK_BIN(menu->m_owner)->child ); // set new text @@ -343,7 +321,6 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) GDK_MOD1_MASK, GTK_ACCEL_LOCKED); } -#endif gtk_widget_show( menu->m_owner ); @@ -376,20 +353,20 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) frame->UpdateMenuBarSize(); } - return TRUE; + return true; } bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) { if ( !wxMenuBarBase::Insert(pos, menu, title) ) - return FALSE; + return false; // TODO if ( !GtkAppend(menu, title, (int)pos) ) - return FALSE; + return false; - return TRUE; + return true; } wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) @@ -774,16 +751,6 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text) continue; } -#ifdef __WXGTK20__ - if ( *pc == wxT('\\') ) - { - // GTK 2.0 escapes "xxx/xxx" to "xxx\/xxx" - pc++; - label += *pc; - continue; - } -#endif - if ( (*pc == wxT('&')) && (*(pc+1) != wxT('&')) ) { // wxMSW escapes "&" @@ -799,12 +766,20 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text) return label; } -void wxMenuItem::SetText( const wxString& str ) +void wxMenuItem::SetText( const wxString& string ) { + wxString str = string; + if ( str.empty() && !IsSeparator() ) + { + wxASSERT_MSG(wxIsStockID(GetId()), wxT("A non-stock menu item with an empty label?")); + str = wxGetStockLabel(GetId(), wxSTOCK_WITH_ACCELERATOR | + wxSTOCK_WITH_MNEMONIC); + } + // Some optimization to avoid flicker wxString oldLabel = m_text; oldLabel = wxStripMenuCodes(oldLabel); - oldLabel.Replace(wxT("_"), wxT("")); + oldLabel.Replace(wxT("_"), wxEmptyString); wxString label1 = wxStripMenuCodes(str); wxString oldhotkey = GetHotKey(); // Store the old hotkey in Ctrl-foo format wxCharBuffer oldbuf = wxGTK_CONV( GetGtkHotKey(*this) ); // and as foo @@ -823,16 +798,12 @@ void wxMenuItem::SetText( const wxString& str ) else label = GTK_LABEL( GTK_BIN(m_menuItem)->child ); -#ifdef __WXGTK20__ - gtk_label_set_text_with_mnemonic( GTK_LABEL(label), wxGTK_CONV(m_text) ); -#else // set new text gtk_label_set( label, wxGTK_CONV( m_text ) ); // reparse key accel (void)gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV(m_text) ); gtk_accel_label_refetch( GTK_ACCEL_LABEL(label) ); -#endif } guint accel_key; @@ -888,15 +859,13 @@ void wxMenuItem::DoSetText( const wxString& str ) ++pc; } - m_hotKey = wxT(""); + m_hotKey = wxEmptyString; if(*pc == wxT('\t')) { pc++; m_hotKey = pc; } - - // wxPrintf( wxT("DoSetText(): str %s m_text %s hotkey %s\n"), str.c_str(), m_text.c_str(), m_hotKey.c_str() ); } #if wxUSE_ACCEL @@ -909,11 +878,12 @@ wxAcceleratorEntry *wxMenuItem::GetAccel() const return (wxAcceleratorEntry *)NULL; } - // as wxGetAccelFromString() looks for TAB, insert a dummy one here + // accelerator parsing code looks for them after a TAB, so insert a dummy + // one here wxString label; label << wxT('\t') << GetHotKey(); - return wxGetAccelFromString(label); + return wxAcceleratorEntry::Create(label); } #endif // wxUSE_ACCEL @@ -949,9 +919,9 @@ void wxMenuItem::Enable( bool enable ) bool wxMenuItem::IsChecked() const { - wxCHECK_MSG( m_menuItem, FALSE, wxT("invalid menu item") ); + wxCHECK_MSG( m_menuItem, false, wxT("invalid menu item") ); - wxCHECK_MSG( IsCheckable(), FALSE, + wxCHECK_MSG( IsCheckable(), false, wxT("can't get state of uncheckable item!") ); return ((GtkCheckMenuItem*)m_menuItem)->active != 0; @@ -1013,51 +983,22 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) GtkWidget *menuItem; wxString text; -#ifndef __WXGTK20__ - GtkLabel* label; -#endif + GtkLabel* label = NULL; if ( mitem->IsSeparator() ) { -#ifdef __WXGTK20__ - menuItem = gtk_separator_menu_item_new(); -#else // TODO menuItem = gtk_menu_item_new(); -#endif } else if (mitem->GetBitmap().Ok()) { text = mitem->GetText(); const wxBitmap *bitmap = &mitem->GetBitmap(); -#ifdef __WXGTK20__ - menuItem = gtk_image_menu_item_new_with_mnemonic( wxGTK_CONV( text ) ); - - GtkWidget *image; - if (bitmap->HasPixbuf()) - { - image = gtk_image_new_from_pixbuf(bitmap->GetPixbuf()); - } - else - { - GdkPixmap *gdk_pixmap = bitmap->GetPixmap(); - GdkBitmap *gdk_bitmap = bitmap->GetMask() ? - bitmap->GetMask()->GetBitmap() : - (GdkBitmap*) NULL; - image = gtk_image_new_from_pixmap( gdk_pixmap, gdk_bitmap ); - } - - gtk_widget_show(image); - - gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM(menuItem), image ); - -#else - // TODO + // TODO wxUnusedVar(bitmap); menuItem = gtk_menu_item_new_with_label( wxGTK_CONV( text ) ); label = GTK_LABEL( GTK_BIN(menuItem)->child ); -#endif m_prevRadio = NULL; } @@ -1070,14 +1011,10 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) { case wxITEM_CHECK: { -#ifdef __WXGTK20__ - menuItem = gtk_check_menu_item_new_with_mnemonic( wxGTK_CONV( text ) ); -#else menuItem = gtk_check_menu_item_new_with_label( wxGTK_CONV( text ) ); label = GTK_LABEL( GTK_BIN(menuItem)->child ); // set new text gtk_label_set_text( label, wxGTK_CONV( text ) ); -#endif m_prevRadio = NULL; break; } @@ -1088,25 +1025,16 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) if ( m_prevRadio == NULL ) { // start of a new radio group -#ifdef __WXGTK20__ - m_prevRadio = menuItem = gtk_radio_menu_item_new_with_mnemonic( group, wxGTK_CONV( text ) ); -#else m_prevRadio = menuItem = gtk_radio_menu_item_new_with_label( group, wxGTK_CONV( text ) ); label = GTK_LABEL( GTK_BIN(menuItem)->child ); // set new text gtk_label_set_text( label, wxGTK_CONV( text ) ); -#endif } else // continue the radio group { -#ifdef __WXGTK20__ - group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (m_prevRadio)); - m_prevRadio = menuItem = gtk_radio_menu_item_new_with_mnemonic( group, wxGTK_CONV( text ) ); -#else group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (m_prevRadio)); m_prevRadio = menuItem = gtk_radio_menu_item_new_with_label( group, wxGTK_CONV( text ) ); label = GTK_LABEL( GTK_BIN(menuItem)->child ); -#endif } break; } @@ -1117,12 +1045,8 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) case wxITEM_NORMAL: { -#ifdef __WXGTK20__ - menuItem = gtk_menu_item_new_with_mnemonic( wxGTK_CONV( text ) ); -#else menuItem = gtk_menu_item_new_with_label( wxGTK_CONV( text ) ); label = GTK_LABEL( GTK_BIN(menuItem)->child ); -#endif m_prevRadio = NULL; break; } @@ -1184,7 +1108,6 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) (gpointer)this ); } -#ifndef __WXGTK20__ guint accel_key = gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV( text ) ); if (accel_key != GDK_VoidSymbol) { @@ -1195,7 +1118,6 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) GDK_MOD1_MASK, GTK_ACCEL_LOCKED); } -#endif } mitem->SetMenuItem(menuItem); @@ -1206,7 +1128,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) // gtk_widget_lock_accelerators(mitem->GetMenuItem()); } - return TRUE; + return true; } wxMenuItem* wxMenu::DoAppend(wxMenuItem *mitem) @@ -1322,12 +1244,10 @@ static wxString GetGtkHotKey( const wxMenuItem& item ) hotkey << wxT("Down" ); break; case WXK_PAGEUP: - case WXK_PRIOR: - hotkey << wxT("Prior" ); + hotkey << wxT("PgUp" ); break; case WXK_PAGEDOWN: - case WXK_NEXT: - hotkey << wxT("Next" ); + hotkey << wxT("PgDn" ); break; case WXK_LEFT: hotkey << wxT("Left" ); @@ -1444,11 +1364,11 @@ static wxString GetGtkHotKey( const wxMenuItem& item ) case WXK_NUMPAD_DOWN: hotkey << wxT("KP_Down" ); break; - case WXK_NUMPAD_PRIOR: case WXK_NUMPAD_PAGEUP: - hotkey << wxT("KP_Prior" ); + case WXK_NUMPAD_PAGEUP: + hotkey << wxT("KP_PgUp" ); break; - case WXK_NUMPAD_NEXT: case WXK_NUMPAD_PAGEDOWN: - hotkey << wxT("KP_Next" ); + case WXK_NUMPAD_PAGEDOWN: + hotkey << wxT("KP_PgDn" ); break; case WXK_NUMPAD_END: hotkey << wxT("KP_End" ); @@ -1503,7 +1423,7 @@ static wxString GetGtkHotKey( const wxMenuItem& item ) hotkey += wxString::Format(wxT("Special%d"), code - WXK_SPECIAL1 + 1); break; */ - // if there are any other keys wxGetAccelFromString() may + // if there are any other keys wxAcceleratorEntry::Create() may // return, we should process them here default: @@ -1534,13 +1454,13 @@ static wxString GetGtkHotKey( const wxMenuItem& item ) #if wxUSE_MENUS_NATIVE -extern "C" +extern "C" WXDLLIMPEXP_CORE void gtk_pop_hide_callback( GtkWidget *WXUNUSED(widget), bool* is_waiting ) { - *is_waiting = FALSE; + *is_waiting = false; } -void SetInvokingWindow( wxMenu *menu, wxWindow* win ) +WXDLLIMPEXP_CORE void SetInvokingWindow( wxMenu *menu, wxWindow* win ) { menu->SetInvokingWindow( win ); @@ -1557,12 +1477,9 @@ void SetInvokingWindow( wxMenu *menu, wxWindow* win ) } } -extern "C" +extern "C" WXDLLIMPEXP_CORE void wxPopupMenuPositionCallback( GtkMenu *menu, gint *x, gint *y, -#ifdef __WXGTK20__ - gboolean * WXUNUSED(whatever), -#endif gpointer user_data ) { // ensure that the menu appears entirely on screen @@ -1626,11 +1543,7 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) posfunc, // function to position it userdata, // client data 0, // button used to activate it -#ifdef __WXGTK20__ - gtk_get_current_event_time() -#else wxGtkTimeLastClick // the time of activation -#endif ); while (is_waiting) @@ -1647,4 +1560,3 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) } #endif // wxUSE_MENUS_NATIVE -