Init(text);
}
+#if WXWIN_COMPATIBILITY_2_8
wxMenuItem::wxMenuItem(wxMenu *parentMenu,
int id,
const wxString& text,
{
Init(text);
}
+#endif
void wxMenuItem::Init(const wxString& text)
{
- m_labelWidget = (GtkWidget *) NULL;
m_menuItem = (GtkWidget *) NULL;
DoSetText(text);
// format, not GTK+ format, so we do what the other ports do.
return wxStripMenuCodes(text);
-
-#if 0
- wxString label;
-
- for ( const wxChar *pc = text.c_str(); *pc; pc++ )
- {
- if ( *pc == wxT('\t'))
- break;
-
- if ( *pc == wxT('_') )
- {
- // GTK 1.2 escapes "xxx_xxx" to "xxx__xxx"
- pc++;
- label += *pc;
- continue;
- }
-
- if ( *pc == wxT('\\') )
- {
- // GTK 2.0 escapes "xxx/xxx" to "xxx\/xxx"
- pc++;
- label += *pc;
- continue;
- }
-
- if ( (*pc == wxT('&')) && (*(pc+1) != wxT('&')) )
- {
- // wxMSW escapes "&"
- // "&" is doubled to indicate "&" instead of accelerator
- continue;
- }
-
- label += *pc;
- }
-
- // wxPrintf( wxT("GetLabelText(): text %s label %s\n"), text.c_str(), label.c_str() );
-
- return label;
-#endif
-}
-
-wxString wxMenuItem::GetItemLabel() const
-{
- wxString label = wxConvertMnemonicsFromGTK(m_text);
- if (!m_hotKey.IsEmpty())
- label << "\t" << m_hotKey;
- return label;
}
void wxMenuItem::SetItemLabel( const wxString& str )
// Some optimization to avoid flicker
wxString oldLabel = m_text;
oldLabel = wxStripMenuCodes(oldLabel);
- oldLabel.Replace(wxT("_"), wxT(""));
wxString label1 = wxStripMenuCodes(str);
#if wxUSE_ACCEL
- wxString oldhotkey = GetHotKey(); // Store the old hotkey in Ctrl-foo format
+ wxString oldhotkey = m_hotKey; // Store the old hotkey in Ctrl-foo format
wxCharBuffer oldbuf = wxGTK_CONV_SYS( GetGtkHotKey(*this) ); // and as <control>foo
#endif // wxUSE_ACCEL
#if wxUSE_ACCEL
if (oldLabel == label1 &&
- oldhotkey == GetHotKey()) // Make sure we can change a hotkey even if the label is unaltered
+ oldhotkey == m_hotKey) // Make sure we can change a hotkey even if the label is unaltered
return;
if (m_menuItem)
{
- GtkLabel *label;
- if (m_labelWidget)
- label = (GtkLabel*) m_labelWidget;
- else
- label = GTK_LABEL( GTK_BIN(m_menuItem)->child );
-
// stock menu items can have empty labels:
- wxString text = m_text;
+ wxString text = m_gtkText;
if (text.IsEmpty() && !IsSeparator())
{
wxASSERT_MSG(isstock, wxT("A non-stock menu item with an empty label?"));
text = GTKProcessMenuItemLabel(text, NULL);
}
- gtk_label_set_text_with_mnemonic( GTK_LABEL(label), wxGTK_CONV_SYS(text) );
+ GtkLabel* label = GTK_LABEL(GTK_BIN(m_menuItem)->child);
+ gtk_label_set_text_with_mnemonic(label, wxGTK_CONV_SYS(text));
}
// remove old accelerator from our parent's accelerator group, if present
hotKey->Empty();
if(*pc == wxT('\t'))
{
- pc++;
+ ++pc;
hotKey->assign(pc, str.end());
}
}
// it's valid for this function to be called even if m_menuItem == NULL
void wxMenuItem::DoSetText( const wxString& str )
{
- m_text.Empty();
- m_text = GTKProcessMenuItemLabel(str, &m_hotKey);
+ m_text = str;
+ m_gtkText = GTKProcessMenuItemLabel(str, &m_hotKey);
}
#if wxUSE_ACCEL
wxAcceleratorEntry *wxMenuItem::GetAccel() const
{
- if ( !GetHotKey() )
+ if (m_hotKey.empty())
{
// nothing
return NULL;
// accelerator parsing code looks for them after a TAB, so insert a dummy
// one here
wxString label;
- label << wxT('\t') << GetHotKey();
+ label << wxT('\t') << m_hotKey;
return wxAcceleratorEntry::Create(label);
}
GtkWidget *menuItem;
// cache some data used later
- wxString text = mitem->wxMenuItemBase::GetItemLabel();
+ wxString text = mitem->GetGtkItemLabel();
int id = mitem->GetId();
bool isstock = wxIsStockID(id);
const char *stockid = NULL;
menuItem = gtk_separator_menu_item_new();
m_prevRadio = NULL;
}
- else if ( mitem->GetBitmap().Ok() ||
+ else if ( mitem->GetBitmap().IsOk() ||
(mitem->GetKind() == wxITEM_NORMAL && isstock) )
{
wxBitmap bitmap(mitem->GetBitmap());
m_prevRadio = NULL;
}
- // TODO: this code doesn't delete the item factory item and this seems
- // impossible as of GTK 1.2.6.
- gtk_widget_destroy( mitem );
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(mitem), NULL);
+ gtk_widget_destroy(mitem);
+ item->SetMenuItem(NULL);
return item;
}
#endif // wxUSE_ACCEL
-// ----------------------------------------------------------------------------
-// Pop-up menu stuff
-// ----------------------------------------------------------------------------
-
-#if wxUSE_MENUS_NATIVE
-
-extern "C" WXDLLIMPEXP_CORE
-void gtk_pop_hide_callback( GtkWidget *WXUNUSED(widget), bool* is_waiting )
-{
- *is_waiting = false;
-}
-
-WXDLLIMPEXP_CORE void SetInvokingWindow( wxMenu *menu, wxWindow* win )
-{
- menu->SetInvokingWindow( win );
-
- wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst();
- while (node)
- {
- wxMenuItem *menuitem = node->GetData();
- if (menuitem->IsSubMenu())
- {
- SetInvokingWindow( menuitem->GetSubMenu(), win );
- }
-
- node = node->GetNext();
- }
-}
-
-extern "C" WXDLLIMPEXP_CORE
-void wxPopupMenuPositionCallback( GtkMenu *menu,
- gint *x, gint *y,
- gboolean * WXUNUSED(whatever),
- gpointer user_data )
-{
- // ensure that the menu appears entirely on screen
- GtkRequisition req;
- gtk_widget_get_child_requisition(GTK_WIDGET(menu), &req);
-
- wxSize sizeScreen = wxGetDisplaySize();
- wxPoint *pos = (wxPoint*)user_data;
-
- gint xmax = sizeScreen.x - req.width,
- ymax = sizeScreen.y - req.height;
-
- *x = pos->x < xmax ? pos->x : xmax;
- *y = pos->y < ymax ? pos->y : ymax;
-}
-
-bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y )
-{
- wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") );
-
- wxCHECK_MSG( menu != NULL, false, wxT("invalid popup-menu") );
-
- // NOTE: if you change this code, you need to update
- // the same code in taskbar.cpp as well. This
- // is ugly code duplication, I know.
-
- SetInvokingWindow( menu, this );
-
- menu->UpdateUI();
-
- wxPoint pos;
- gpointer userdata;
- GtkMenuPositionFunc posfunc;
- if ( x == -1 && y == -1 )
- {
- // use GTK's default positioning algorithm
- userdata = NULL;
- posfunc = NULL;
- }
- else
- {
- pos = ClientToScreen(wxPoint(x, y));
- userdata = &pos;
- posfunc = wxPopupMenuPositionCallback;
- }
-
- menu->m_popupShown = true;
- gtk_menu_popup(
- GTK_MENU(menu->m_menu),
- (GtkWidget *) NULL, // parent menu shell
- (GtkWidget *) NULL, // parent menu item
- posfunc, // function to position it
- userdata, // client data
- 0, // button used to activate it
- gtk_get_current_event_time()
- );
-
- while (menu->m_popupShown)
- {
- gtk_main_iteration();
- }
-
- return true;
-}
-
-#endif // wxUSE_MENUS_NATIVE
-
-#include <gtk/gtk.h>
-
const char *wxGetStockGtkID(wxWindowID id)
{
#define STOCKITEM(wx,gtk) \