Support underscroes in menu item names under GTK2
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19167 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -145,7 +145,7 @@ static wxString wxReplaceUnderscore( const wxString& title )
|
||||
#endif
|
||||
else
|
||||
{
|
||||
#if __WXGTK12__
|
||||
#ifdef __WXGTK12__
|
||||
if ( *pc == wxT('_') )
|
||||
{
|
||||
// underscores must be doubled to prevent them from being
|
||||
@@ -322,7 +322,7 @@ void wxMenuBar::UnsetInvokingWindow( wxWindow *win )
|
||||
while (top_frame->GetParent() && !(top_frame->IsTopLevel()))
|
||||
top_frame = top_frame->GetParent();
|
||||
|
||||
/* support for native key accelerators indicated by underscroes */
|
||||
// support for native key accelerators indicated by underscroes
|
||||
gtk_accel_group_detach( m_accel, ACCEL_OBJ_CAST(top_frame->m_widget) );
|
||||
#endif // GTK+ 1.2.1+
|
||||
|
||||
@@ -347,16 +347,16 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title)
|
||||
{
|
||||
wxString str( wxReplaceUnderscore( title ) );
|
||||
|
||||
/* this doesn't have much effect right now */
|
||||
// This doesn't have much effect right now.
|
||||
menu->SetTitle( str );
|
||||
|
||||
/* GTK 1.2.0 doesn't have gtk_item_factory_get_item(), but GTK 1.2.1 has. */
|
||||
// GTK 1.2.0 doesn't have gtk_item_factory_get_item(), but GTK 1.2.1 has.
|
||||
#if GTK_CHECK_VERSION(1, 2, 1)
|
||||
|
||||
wxString buf;
|
||||
buf << wxT('/') << str.c_str();
|
||||
|
||||
/* local buffer in multibyte form */
|
||||
// local buffer in multibyte form
|
||||
char cbuf[400];
|
||||
strcpy(cbuf, wxGTK_CONV(buf) );
|
||||
|
||||
@@ -367,8 +367,8 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title)
|
||||
entry.callback_action = 0;
|
||||
entry.item_type = (char *)"<Branch>";
|
||||
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
|
||||
/* in order to get the pointer to the item we need the item text _without_ underscores */
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); // what is 2 ?
|
||||
// in order to get the pointer to the item we need the item text _without_ underscores
|
||||
wxString tmp = wxT("<main>/");
|
||||
const wxChar *pc;
|
||||
for ( pc = str; *pc != wxT('\0'); pc++ )
|
||||
@@ -404,7 +404,7 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title)
|
||||
// see (and refactor :) similar code in Remove
|
||||
// below.
|
||||
|
||||
wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame );
|
||||
wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame );
|
||||
|
||||
if( frame )
|
||||
frame->UpdateMenuBarSize();
|
||||
@@ -511,9 +511,9 @@ wxMenu *wxMenuBar::Remove(size_t pos)
|
||||
{
|
||||
// OPTIMISE ME: see comment in GtkAppend
|
||||
|
||||
wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame );
|
||||
wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame );
|
||||
|
||||
if( frame )
|
||||
if( frame )
|
||||
frame->UpdateMenuBarSize();
|
||||
}
|
||||
|
||||
@@ -842,6 +842,9 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
|
||||
|
||||
label += *pc;
|
||||
}
|
||||
|
||||
// wxPrintf( L"text %s label %s\n", text.c_str(), label.c_str() );
|
||||
|
||||
return label;
|
||||
}
|
||||
|
||||
@@ -908,6 +911,7 @@ void wxMenuItem::DoSetText( const wxString& str )
|
||||
else if ( *pc == wxT('_') ) // escape underscores
|
||||
{
|
||||
// m_text << wxT("__"); doesn't work
|
||||
m_text << wxT("__");
|
||||
}
|
||||
else if (*pc == wxT('/')) // we have to escape slashes
|
||||
{
|
||||
@@ -933,6 +937,8 @@ void wxMenuItem::DoSetText( const wxString& str )
|
||||
++pc;
|
||||
}
|
||||
|
||||
// wxPrintf( L"str %s m_text %s\n", str.c_str(), m_text.c_str() );
|
||||
|
||||
m_hotKey = wxT("");
|
||||
|
||||
if(*pc == wxT('\t'))
|
||||
@@ -1002,16 +1008,20 @@ bool wxMenuItem::IsChecked() const
|
||||
|
||||
wxString wxMenuItem::GetFactoryPath() const
|
||||
{
|
||||
/* in order to get the pointer to the item we need the item text
|
||||
_without_ underscores */
|
||||
// In order to get the pointer to the item we need the item
|
||||
// text _without_ underscores in GTK 1.2
|
||||
wxString path( wxT("<main>/") );
|
||||
|
||||
for ( const wxChar *pc = m_text.c_str(); *pc; pc++ )
|
||||
{
|
||||
if ( *pc == wxT('_') )
|
||||
{
|
||||
#ifdef __WXGTK20__
|
||||
pc++;
|
||||
#else
|
||||
// remove '_' unconditionally
|
||||
continue;
|
||||
#endif
|
||||
}
|
||||
|
||||
// don't remove ampersands '&' since if we have them in the menu item title
|
||||
@@ -1037,9 +1047,9 @@ void wxMenu::Init()
|
||||
|
||||
m_owner = (GtkWidget*) NULL;
|
||||
|
||||
/* Tearoffs are entries, just like separators. So if we want this
|
||||
menu to be a tear-off one, we just append a tearoff entry
|
||||
immediately. */
|
||||
// Tearoffs are entries, just like separators. So if we want this
|
||||
// menu to be a tear-off one, we just append a tearoff entry
|
||||
// immediately.
|
||||
if(m_style & wxMENU_TEAROFF)
|
||||
{
|
||||
GtkItemFactoryEntry entry;
|
||||
@@ -1048,7 +1058,7 @@ void wxMenu::Init()
|
||||
entry.callback_action = 0;
|
||||
entry.item_type = (char *)"<Tearoff>";
|
||||
entry.accelerator = (gchar*) NULL;
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); // what is 2 ?
|
||||
//GtkWidget *menuItem = gtk_item_factory_get_widget( m_factory, "<main>/tearoff" );
|
||||
}
|
||||
|
||||
@@ -1089,9 +1099,9 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
|
||||
entry.item_type = (char *)"<Separator>";
|
||||
entry.accelerator = (gchar*) NULL;
|
||||
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); // what is 2 ?
|
||||
|
||||
/* this will be wrong for more than one separator. do we care? */
|
||||
// this will be wrong for more than one separator. do we care?
|
||||
menuItem = gtk_item_factory_get_widget( m_factory, "<main>/sep" );
|
||||
|
||||
// we might have a separator inside a radio group
|
||||
@@ -1099,10 +1109,10 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
|
||||
}
|
||||
else if ( mitem->IsSubMenu() )
|
||||
{
|
||||
/* text has "_" instead of "&" after mitem->SetText() */
|
||||
// text has "_" instead of "&" after mitem->SetText()
|
||||
wxString text( mitem->GetText() );
|
||||
|
||||
/* local buffer in multibyte form */
|
||||
// local buffer in multibyte form
|
||||
char buf[200];
|
||||
strcpy( buf, "/" );
|
||||
strcat( buf, wxGTK_CONV( text ) );
|
||||
@@ -1114,7 +1124,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
|
||||
entry.item_type = (char *)"<Branch>";
|
||||
entry.accelerator = (gchar*) NULL;
|
||||
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); // what is 2 ?
|
||||
|
||||
wxString path( mitem->GetFactoryPath() );
|
||||
menuItem = gtk_item_factory_get_item( m_factory, wxGTK_CONV( path ) );
|
||||
@@ -1282,7 +1292,6 @@ bool wxMenu::DoInsert(size_t pos, wxMenuItem *item)
|
||||
if ( !wxMenuBase::DoInsert(pos, item) )
|
||||
return FALSE;
|
||||
|
||||
#ifdef __WXGTK12__
|
||||
// GTK+ doesn't have a function to insert a menu using GtkItemFactory (as
|
||||
// of version 1.2.6), so we first append the item and then change its
|
||||
// index
|
||||
@@ -1301,12 +1310,6 @@ bool wxMenu::DoInsert(size_t pos, wxMenuItem *item)
|
||||
menu_shell->children = g_list_insert(menu_shell->children, data, pos);
|
||||
|
||||
return TRUE;
|
||||
#else // GTK < 1.2
|
||||
// this should be easy to do...
|
||||
wxFAIL_MSG( wxT("not implemented") );
|
||||
|
||||
return FALSE;
|
||||
#endif // GTK 1.2/1.0
|
||||
}
|
||||
|
||||
wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
|
||||
|
@@ -145,7 +145,7 @@ static wxString wxReplaceUnderscore( const wxString& title )
|
||||
#endif
|
||||
else
|
||||
{
|
||||
#if __WXGTK12__
|
||||
#ifdef __WXGTK12__
|
||||
if ( *pc == wxT('_') )
|
||||
{
|
||||
// underscores must be doubled to prevent them from being
|
||||
@@ -322,7 +322,7 @@ void wxMenuBar::UnsetInvokingWindow( wxWindow *win )
|
||||
while (top_frame->GetParent() && !(top_frame->IsTopLevel()))
|
||||
top_frame = top_frame->GetParent();
|
||||
|
||||
/* support for native key accelerators indicated by underscroes */
|
||||
// support for native key accelerators indicated by underscroes
|
||||
gtk_accel_group_detach( m_accel, ACCEL_OBJ_CAST(top_frame->m_widget) );
|
||||
#endif // GTK+ 1.2.1+
|
||||
|
||||
@@ -347,16 +347,16 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title)
|
||||
{
|
||||
wxString str( wxReplaceUnderscore( title ) );
|
||||
|
||||
/* this doesn't have much effect right now */
|
||||
// This doesn't have much effect right now.
|
||||
menu->SetTitle( str );
|
||||
|
||||
/* GTK 1.2.0 doesn't have gtk_item_factory_get_item(), but GTK 1.2.1 has. */
|
||||
// GTK 1.2.0 doesn't have gtk_item_factory_get_item(), but GTK 1.2.1 has.
|
||||
#if GTK_CHECK_VERSION(1, 2, 1)
|
||||
|
||||
wxString buf;
|
||||
buf << wxT('/') << str.c_str();
|
||||
|
||||
/* local buffer in multibyte form */
|
||||
// local buffer in multibyte form
|
||||
char cbuf[400];
|
||||
strcpy(cbuf, wxGTK_CONV(buf) );
|
||||
|
||||
@@ -367,8 +367,8 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title)
|
||||
entry.callback_action = 0;
|
||||
entry.item_type = (char *)"<Branch>";
|
||||
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
|
||||
/* in order to get the pointer to the item we need the item text _without_ underscores */
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); // what is 2 ?
|
||||
// in order to get the pointer to the item we need the item text _without_ underscores
|
||||
wxString tmp = wxT("<main>/");
|
||||
const wxChar *pc;
|
||||
for ( pc = str; *pc != wxT('\0'); pc++ )
|
||||
@@ -404,7 +404,7 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title)
|
||||
// see (and refactor :) similar code in Remove
|
||||
// below.
|
||||
|
||||
wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame );
|
||||
wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame );
|
||||
|
||||
if( frame )
|
||||
frame->UpdateMenuBarSize();
|
||||
@@ -511,9 +511,9 @@ wxMenu *wxMenuBar::Remove(size_t pos)
|
||||
{
|
||||
// OPTIMISE ME: see comment in GtkAppend
|
||||
|
||||
wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame );
|
||||
wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame );
|
||||
|
||||
if( frame )
|
||||
if( frame )
|
||||
frame->UpdateMenuBarSize();
|
||||
}
|
||||
|
||||
@@ -842,6 +842,9 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
|
||||
|
||||
label += *pc;
|
||||
}
|
||||
|
||||
// wxPrintf( L"text %s label %s\n", text.c_str(), label.c_str() );
|
||||
|
||||
return label;
|
||||
}
|
||||
|
||||
@@ -908,6 +911,7 @@ void wxMenuItem::DoSetText( const wxString& str )
|
||||
else if ( *pc == wxT('_') ) // escape underscores
|
||||
{
|
||||
// m_text << wxT("__"); doesn't work
|
||||
m_text << wxT("__");
|
||||
}
|
||||
else if (*pc == wxT('/')) // we have to escape slashes
|
||||
{
|
||||
@@ -933,6 +937,8 @@ void wxMenuItem::DoSetText( const wxString& str )
|
||||
++pc;
|
||||
}
|
||||
|
||||
// wxPrintf( L"str %s m_text %s\n", str.c_str(), m_text.c_str() );
|
||||
|
||||
m_hotKey = wxT("");
|
||||
|
||||
if(*pc == wxT('\t'))
|
||||
@@ -1002,16 +1008,20 @@ bool wxMenuItem::IsChecked() const
|
||||
|
||||
wxString wxMenuItem::GetFactoryPath() const
|
||||
{
|
||||
/* in order to get the pointer to the item we need the item text
|
||||
_without_ underscores */
|
||||
// In order to get the pointer to the item we need the item
|
||||
// text _without_ underscores in GTK 1.2
|
||||
wxString path( wxT("<main>/") );
|
||||
|
||||
for ( const wxChar *pc = m_text.c_str(); *pc; pc++ )
|
||||
{
|
||||
if ( *pc == wxT('_') )
|
||||
{
|
||||
#ifdef __WXGTK20__
|
||||
pc++;
|
||||
#else
|
||||
// remove '_' unconditionally
|
||||
continue;
|
||||
#endif
|
||||
}
|
||||
|
||||
// don't remove ampersands '&' since if we have them in the menu item title
|
||||
@@ -1037,9 +1047,9 @@ void wxMenu::Init()
|
||||
|
||||
m_owner = (GtkWidget*) NULL;
|
||||
|
||||
/* Tearoffs are entries, just like separators. So if we want this
|
||||
menu to be a tear-off one, we just append a tearoff entry
|
||||
immediately. */
|
||||
// Tearoffs are entries, just like separators. So if we want this
|
||||
// menu to be a tear-off one, we just append a tearoff entry
|
||||
// immediately.
|
||||
if(m_style & wxMENU_TEAROFF)
|
||||
{
|
||||
GtkItemFactoryEntry entry;
|
||||
@@ -1048,7 +1058,7 @@ void wxMenu::Init()
|
||||
entry.callback_action = 0;
|
||||
entry.item_type = (char *)"<Tearoff>";
|
||||
entry.accelerator = (gchar*) NULL;
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); // what is 2 ?
|
||||
//GtkWidget *menuItem = gtk_item_factory_get_widget( m_factory, "<main>/tearoff" );
|
||||
}
|
||||
|
||||
@@ -1089,9 +1099,9 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
|
||||
entry.item_type = (char *)"<Separator>";
|
||||
entry.accelerator = (gchar*) NULL;
|
||||
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); // what is 2 ?
|
||||
|
||||
/* this will be wrong for more than one separator. do we care? */
|
||||
// this will be wrong for more than one separator. do we care?
|
||||
menuItem = gtk_item_factory_get_widget( m_factory, "<main>/sep" );
|
||||
|
||||
// we might have a separator inside a radio group
|
||||
@@ -1099,10 +1109,10 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
|
||||
}
|
||||
else if ( mitem->IsSubMenu() )
|
||||
{
|
||||
/* text has "_" instead of "&" after mitem->SetText() */
|
||||
// text has "_" instead of "&" after mitem->SetText()
|
||||
wxString text( mitem->GetText() );
|
||||
|
||||
/* local buffer in multibyte form */
|
||||
// local buffer in multibyte form
|
||||
char buf[200];
|
||||
strcpy( buf, "/" );
|
||||
strcat( buf, wxGTK_CONV( text ) );
|
||||
@@ -1114,7 +1124,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
|
||||
entry.item_type = (char *)"<Branch>";
|
||||
entry.accelerator = (gchar*) NULL;
|
||||
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
|
||||
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); // what is 2 ?
|
||||
|
||||
wxString path( mitem->GetFactoryPath() );
|
||||
menuItem = gtk_item_factory_get_item( m_factory, wxGTK_CONV( path ) );
|
||||
@@ -1282,7 +1292,6 @@ bool wxMenu::DoInsert(size_t pos, wxMenuItem *item)
|
||||
if ( !wxMenuBase::DoInsert(pos, item) )
|
||||
return FALSE;
|
||||
|
||||
#ifdef __WXGTK12__
|
||||
// GTK+ doesn't have a function to insert a menu using GtkItemFactory (as
|
||||
// of version 1.2.6), so we first append the item and then change its
|
||||
// index
|
||||
@@ -1301,12 +1310,6 @@ bool wxMenu::DoInsert(size_t pos, wxMenuItem *item)
|
||||
menu_shell->children = g_list_insert(menu_shell->children, data, pos);
|
||||
|
||||
return TRUE;
|
||||
#else // GTK < 1.2
|
||||
// this should be easy to do...
|
||||
wxFAIL_MSG( wxT("not implemented") );
|
||||
|
||||
return FALSE;
|
||||
#endif // GTK 1.2/1.0
|
||||
}
|
||||
|
||||
wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
|
||||
|
Reference in New Issue
Block a user