Added hotkeys to menus "E&xit\tAlt-X" and such.
Added hotkeys to minimal sample. Please on wxMSW. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2317 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -73,6 +73,8 @@ public:
|
|||||||
// implementation
|
// implementation
|
||||||
void SetMenuItem(GtkWidget *menuItem) { m_menuItem = menuItem; }
|
void SetMenuItem(GtkWidget *menuItem) { m_menuItem = menuItem; }
|
||||||
GtkWidget *GetMenuItem() const { return m_menuItem; }
|
GtkWidget *GetMenuItem() const { return m_menuItem; }
|
||||||
|
|
||||||
|
wxString GetHotKey() const { return m_hotKey; }
|
||||||
|
|
||||||
void SetCheckedFlag(bool checked) { m_isChecked = checked; }
|
void SetCheckedFlag(bool checked) { m_isChecked = checked; }
|
||||||
bool GetCheckedFlag() const { return m_isChecked; }
|
bool GetCheckedFlag() const { return m_isChecked; }
|
||||||
@@ -80,6 +82,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
int m_id;
|
int m_id;
|
||||||
wxString m_text;
|
wxString m_text;
|
||||||
|
wxString m_hotKey;
|
||||||
bool m_isCheckMenu;
|
bool m_isCheckMenu;
|
||||||
bool m_isChecked;
|
bool m_isChecked;
|
||||||
bool m_isEnabled;
|
bool m_isEnabled;
|
||||||
|
@@ -73,6 +73,8 @@ public:
|
|||||||
// implementation
|
// implementation
|
||||||
void SetMenuItem(GtkWidget *menuItem) { m_menuItem = menuItem; }
|
void SetMenuItem(GtkWidget *menuItem) { m_menuItem = menuItem; }
|
||||||
GtkWidget *GetMenuItem() const { return m_menuItem; }
|
GtkWidget *GetMenuItem() const { return m_menuItem; }
|
||||||
|
|
||||||
|
wxString GetHotKey() const { return m_hotKey; }
|
||||||
|
|
||||||
void SetCheckedFlag(bool checked) { m_isChecked = checked; }
|
void SetCheckedFlag(bool checked) { m_isChecked = checked; }
|
||||||
bool GetCheckedFlag() const { return m_isChecked; }
|
bool GetCheckedFlag() const { return m_isChecked; }
|
||||||
@@ -80,6 +82,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
int m_id;
|
int m_id;
|
||||||
wxString m_text;
|
wxString m_text;
|
||||||
|
wxString m_hotKey;
|
||||||
bool m_isCheckMenu;
|
bool m_isCheckMenu;
|
||||||
bool m_isChecked;
|
bool m_isChecked;
|
||||||
bool m_isEnabled;
|
bool m_isEnabled;
|
||||||
|
@@ -506,7 +506,7 @@ m_text(NULL), m_notebook(NULL)
|
|||||||
(*m_multitext) << " Appended.";
|
(*m_multitext) << " Appended.";
|
||||||
m_multitext->SetInsertionPoint(0);
|
m_multitext->SetInsertionPoint(0);
|
||||||
m_multitext->WriteText( "Prepended. " );
|
m_multitext->WriteText( "Prepended. " );
|
||||||
m_multitext->AppendText( "\nPress function keys to test different wxTextCtrl functions." );
|
m_multitext->AppendText( "\nPress function keys for test different tests." );
|
||||||
|
|
||||||
(*m_multitext) << "\nDoes it have cross cursor?";
|
(*m_multitext) << "\nDoes it have cross cursor?";
|
||||||
m_multitext->SetCursor(*wxCROSS_CURSOR);
|
m_multitext->SetCursor(*wxCROSS_CURSOR);
|
||||||
|
@@ -151,9 +151,9 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
|||||||
// create a menu bar
|
// create a menu bar
|
||||||
wxMenu *menuFile = new wxMenu;
|
wxMenu *menuFile = new wxMenu;
|
||||||
|
|
||||||
menuFile->Append(Minimal_About, "&About...", "Show about dialog");
|
menuFile->Append(Minimal_About, "&About...\tCtrl-A", "Show about dialog");
|
||||||
menuFile->AppendSeparator();
|
menuFile->AppendSeparator();
|
||||||
menuFile->Append(Minimal_Quit, "E&xit", "Quit this program");
|
menuFile->Append(Minimal_Quit, "E&xit\tAlt-X", "Quit this program");
|
||||||
|
|
||||||
// now append the freshly created menu to the menu bar...
|
// now append the freshly created menu to the menu bar...
|
||||||
wxMenuBar *menuBar = new wxMenuBar;
|
wxMenuBar *menuBar = new wxMenuBar;
|
||||||
|
@@ -769,16 +769,16 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// do we have exactly one child?
|
/* do we have exactly one child? */
|
||||||
wxWindow *child = (wxWindow *)NULL;
|
wxWindow *child = (wxWindow *)NULL;
|
||||||
for ( wxNode *node = GetChildren().First(); node; node = node->Next() )
|
for ( wxNode *node = GetChildren().First(); node; node = node->Next() )
|
||||||
{
|
{
|
||||||
wxWindow *win = (wxWindow *)node->Data();
|
wxWindow *win = (wxWindow *)node->Data();
|
||||||
if ( !wxIS_KIND_OF(win,wxFrame) && !wxIS_KIND_OF(win,wxDialog) )
|
if ( !wxIS_KIND_OF(win,wxFrame) && !wxIS_KIND_OF(win,wxDialog) )
|
||||||
{
|
{
|
||||||
if ( child )
|
if (child)
|
||||||
{
|
{
|
||||||
// it's the second one: do nothing
|
/* it's the second one: do nothing */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -786,10 +786,10 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// no children at all?
|
/* no children at all? */
|
||||||
if ( child )
|
if (child)
|
||||||
{
|
{
|
||||||
// yes: set it's size to fill all the frame
|
/* yes: set it's size to fill all the frame */
|
||||||
int client_x, client_y;
|
int client_x, client_y;
|
||||||
GetClientSize( &client_x, &client_y );
|
GetClientSize( &client_x, &client_y );
|
||||||
child->SetSize( 1, 1, client_x-2, client_y-2 );
|
child->SetSize( 1, 1, client_x-2, client_y-2 );
|
||||||
@@ -800,6 +800,12 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) )
|
|||||||
static void SetInvokingWindow( wxMenu *menu, wxWindow *win )
|
static void SetInvokingWindow( wxMenu *menu, wxWindow *win )
|
||||||
{
|
{
|
||||||
menu->SetInvokingWindow( win );
|
menu->SetInvokingWindow( win );
|
||||||
|
|
||||||
|
#if (GTK_MINOR_VERSION > 0)
|
||||||
|
/* support for native hot keys */
|
||||||
|
gtk_accel_group_attach( menu->m_accel, GTK_OBJECT(win->m_widget));
|
||||||
|
#endif
|
||||||
|
|
||||||
wxNode *node = menu->GetItems().First();
|
wxNode *node = menu->GetItems().First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
@@ -819,8 +825,8 @@ void wxFrame::SetMenuBar( wxMenuBar *menuBar )
|
|||||||
|
|
||||||
if (m_frameMenuBar)
|
if (m_frameMenuBar)
|
||||||
{
|
{
|
||||||
/* support for native key accelerators indicated by underscroes */
|
|
||||||
#if (GTK_MINOR_VERSION > 0) && (GTK_MICRO_VERSION > 0)
|
#if (GTK_MINOR_VERSION > 0) && (GTK_MICRO_VERSION > 0)
|
||||||
|
/* support for native key accelerators indicated by underscroes */
|
||||||
gtk_accel_group_attach( m_frameMenuBar->m_accel, GTK_OBJECT(m_widget));
|
gtk_accel_group_attach( m_frameMenuBar->m_accel, GTK_OBJECT(m_widget));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -474,8 +474,10 @@ wxMenuItem::wxMenuItem()
|
|||||||
// it's valid for this function to be called even if m_menuItem == NULL
|
// it's valid for this function to be called even if m_menuItem == NULL
|
||||||
void wxMenuItem::SetName( const wxString& str )
|
void wxMenuItem::SetName( const wxString& str )
|
||||||
{
|
{
|
||||||
|
/* '\t' is the deliminator indicating a hot key */
|
||||||
m_text = _T("");
|
m_text = _T("");
|
||||||
for ( const wxChar *pc = str; *pc != _T('\0'); pc++ )
|
const wxChar *pc = str;
|
||||||
|
for (; (*pc != _T('\0')) && (*pc != _T('\t')); pc++ )
|
||||||
{
|
{
|
||||||
if (*pc == _T('&'))
|
if (*pc == _T('&'))
|
||||||
{
|
{
|
||||||
@@ -486,6 +488,13 @@ void wxMenuItem::SetName( const wxString& str )
|
|||||||
else
|
else
|
||||||
m_text << *pc;
|
m_text << *pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* only GTK 1.2 know about hot keys */
|
||||||
|
m_hotKey = _T("");
|
||||||
|
#if (GTK_MINOR_VERSION > 0)
|
||||||
|
pc++;
|
||||||
|
m_hotKey = pc;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (m_menuItem)
|
if (m_menuItem)
|
||||||
{
|
{
|
||||||
@@ -607,7 +616,6 @@ void wxMenu::Append( int id, const wxString &item, const wxString &helpStr, bool
|
|||||||
|
|
||||||
GtkItemFactoryEntry entry;
|
GtkItemFactoryEntry entry;
|
||||||
entry.path = buf;
|
entry.path = buf;
|
||||||
entry.accelerator = (gchar*) NULL;
|
|
||||||
entry.callback = (GtkItemFactoryCallback) gtk_menu_clicked_callback;
|
entry.callback = (GtkItemFactoryCallback) gtk_menu_clicked_callback;
|
||||||
entry.callback_action = 0;
|
entry.callback_action = 0;
|
||||||
if (checkable)
|
if (checkable)
|
||||||
@@ -615,12 +623,48 @@ void wxMenu::Append( int id, const wxString &item, const wxString &helpStr, bool
|
|||||||
else
|
else
|
||||||
entry.item_type = "<Item>";
|
entry.item_type = "<Item>";
|
||||||
|
|
||||||
|
entry.accelerator = (gchar*) NULL;
|
||||||
|
char hotbuf[50];
|
||||||
|
wxString hotkey( mitem->GetHotKey() );
|
||||||
|
if (!hotkey.IsEmpty())
|
||||||
|
{
|
||||||
|
switch (hotkey[0])
|
||||||
|
{
|
||||||
|
case _T('a'): /* Alt */
|
||||||
|
case _T('A'):
|
||||||
|
case _T('m'): /* Meta */
|
||||||
|
case _T('M'):
|
||||||
|
{
|
||||||
|
strcpy( hotbuf, "<alt>" );
|
||||||
|
wxString last = hotkey.Right(1);
|
||||||
|
strcat( hotbuf, last.mb_str() );
|
||||||
|
entry.accelerator = hotbuf;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case _T('c'): /* Ctrl */
|
||||||
|
case _T('C'):
|
||||||
|
case _T('s'): /* Strg, yeah man, I'm German */
|
||||||
|
case _T('S'):
|
||||||
|
{
|
||||||
|
strcpy( hotbuf, "<control>" );
|
||||||
|
wxString last = hotkey.Right(1);
|
||||||
|
strcat( hotbuf, last.mb_str() );
|
||||||
|
entry.accelerator = hotbuf;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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 ? */
|
||||||
|
|
||||||
/* 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 */
|
||||||
wxString s = _T("<main>/");
|
wxString s = _T("<main>/");
|
||||||
for ( const wxChar *pc = text; *pc != _T('\0'); pc++ )
|
for ( const wxChar *pc = text; *pc != _T('\0'); pc++ )
|
||||||
{
|
{
|
||||||
|
if (*pc == _T('\t')) break;
|
||||||
if (*pc == _T('_')) pc++; /* skip it */
|
if (*pc == _T('_')) pc++; /* skip it */
|
||||||
s << *pc;
|
s << *pc;
|
||||||
}
|
}
|
||||||
|
@@ -65,9 +65,9 @@ gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
|
|||||||
{
|
{
|
||||||
if (g_isIdle) wxapp_install_idle_handler();
|
if (g_isIdle) wxapp_install_idle_handler();
|
||||||
|
|
||||||
if (!win->m_hasVMT) return;
|
|
||||||
|
|
||||||
win->CalculateScrollbar();
|
win->CalculateScrollbar();
|
||||||
|
|
||||||
|
if (!win->m_hasVMT) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -140,7 +140,7 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
|
|||||||
m_vScrollbarVisible = FALSE;
|
m_vScrollbarVisible = FALSE;
|
||||||
|
|
||||||
bool multi_line = (style & wxTE_MULTILINE) != 0;
|
bool multi_line = (style & wxTE_MULTILINE) != 0;
|
||||||
if ( multi_line )
|
if (multi_line)
|
||||||
{
|
{
|
||||||
/* a multi-line edit control: create a vertical scrollbar by default and
|
/* a multi-line edit control: create a vertical scrollbar by default and
|
||||||
horizontal if requested */
|
horizontal if requested */
|
||||||
@@ -171,9 +171,14 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
|
|||||||
gtk_widget_show(hscrollbar);
|
gtk_widget_show(hscrollbar);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we create the vertical scrollbar on demand */
|
/* finally, put the vertical scrollbar in the upper right corner */
|
||||||
m_vScrollbar = (GtkWidget*) NULL;
|
m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj );
|
||||||
|
GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS );
|
||||||
|
|
||||||
|
gtk_table_attach(GTK_TABLE(m_widget), m_vScrollbar, 1, 2, 0, 1,
|
||||||
|
GTK_FILL,
|
||||||
|
(GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK),
|
||||||
|
0, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -194,15 +199,18 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
|
|||||||
PostCreation();
|
PostCreation();
|
||||||
|
|
||||||
if (multi_line)
|
if (multi_line)
|
||||||
{
|
|
||||||
// gtk_widget_realize(m_text);
|
|
||||||
gtk_widget_show(m_text);
|
gtk_widget_show(m_text);
|
||||||
}
|
|
||||||
|
|
||||||
/* we want to be notified about text changes */
|
/* we want to be notified about text changes */
|
||||||
gtk_signal_connect( GTK_OBJECT(m_text), "changed",
|
gtk_signal_connect( GTK_OBJECT(m_text), "changed",
|
||||||
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
|
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
|
||||||
|
|
||||||
|
if (multi_line)
|
||||||
|
{
|
||||||
|
gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed",
|
||||||
|
(GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this );
|
||||||
|
}
|
||||||
|
|
||||||
if (!value.IsEmpty())
|
if (!value.IsEmpty())
|
||||||
{
|
{
|
||||||
gint tmp = 0;
|
gint tmp = 0;
|
||||||
@@ -243,12 +251,6 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
|
|||||||
|
|
||||||
Show( TRUE );
|
Show( TRUE );
|
||||||
|
|
||||||
if (multi_line)
|
|
||||||
{
|
|
||||||
gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed",
|
|
||||||
(GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this );
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,18 +273,6 @@ void wxTextCtrl::CalculateScrollbar()
|
|||||||
{
|
{
|
||||||
if (!m_vScrollbarVisible)
|
if (!m_vScrollbarVisible)
|
||||||
{
|
{
|
||||||
if (!m_vScrollbar)
|
|
||||||
{
|
|
||||||
/* finally, put the vertical scrollbar in the upper right corner */
|
|
||||||
m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj );
|
|
||||||
GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS );
|
|
||||||
|
|
||||||
gtk_table_attach(GTK_TABLE(m_widget), m_vScrollbar, 1, 2, 0, 1,
|
|
||||||
GTK_FILL,
|
|
||||||
(GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK),
|
|
||||||
0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
gtk_widget_show( m_vScrollbar );
|
gtk_widget_show( m_vScrollbar );
|
||||||
|
|
||||||
m_vScrollbarVisible = TRUE;
|
m_vScrollbarVisible = TRUE;
|
||||||
|
@@ -769,16 +769,16 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// do we have exactly one child?
|
/* do we have exactly one child? */
|
||||||
wxWindow *child = (wxWindow *)NULL;
|
wxWindow *child = (wxWindow *)NULL;
|
||||||
for ( wxNode *node = GetChildren().First(); node; node = node->Next() )
|
for ( wxNode *node = GetChildren().First(); node; node = node->Next() )
|
||||||
{
|
{
|
||||||
wxWindow *win = (wxWindow *)node->Data();
|
wxWindow *win = (wxWindow *)node->Data();
|
||||||
if ( !wxIS_KIND_OF(win,wxFrame) && !wxIS_KIND_OF(win,wxDialog) )
|
if ( !wxIS_KIND_OF(win,wxFrame) && !wxIS_KIND_OF(win,wxDialog) )
|
||||||
{
|
{
|
||||||
if ( child )
|
if (child)
|
||||||
{
|
{
|
||||||
// it's the second one: do nothing
|
/* it's the second one: do nothing */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -786,10 +786,10 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// no children at all?
|
/* no children at all? */
|
||||||
if ( child )
|
if (child)
|
||||||
{
|
{
|
||||||
// yes: set it's size to fill all the frame
|
/* yes: set it's size to fill all the frame */
|
||||||
int client_x, client_y;
|
int client_x, client_y;
|
||||||
GetClientSize( &client_x, &client_y );
|
GetClientSize( &client_x, &client_y );
|
||||||
child->SetSize( 1, 1, client_x-2, client_y-2 );
|
child->SetSize( 1, 1, client_x-2, client_y-2 );
|
||||||
@@ -800,6 +800,12 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) )
|
|||||||
static void SetInvokingWindow( wxMenu *menu, wxWindow *win )
|
static void SetInvokingWindow( wxMenu *menu, wxWindow *win )
|
||||||
{
|
{
|
||||||
menu->SetInvokingWindow( win );
|
menu->SetInvokingWindow( win );
|
||||||
|
|
||||||
|
#if (GTK_MINOR_VERSION > 0)
|
||||||
|
/* support for native hot keys */
|
||||||
|
gtk_accel_group_attach( menu->m_accel, GTK_OBJECT(win->m_widget));
|
||||||
|
#endif
|
||||||
|
|
||||||
wxNode *node = menu->GetItems().First();
|
wxNode *node = menu->GetItems().First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
@@ -819,8 +825,8 @@ void wxFrame::SetMenuBar( wxMenuBar *menuBar )
|
|||||||
|
|
||||||
if (m_frameMenuBar)
|
if (m_frameMenuBar)
|
||||||
{
|
{
|
||||||
/* support for native key accelerators indicated by underscroes */
|
|
||||||
#if (GTK_MINOR_VERSION > 0) && (GTK_MICRO_VERSION > 0)
|
#if (GTK_MINOR_VERSION > 0) && (GTK_MICRO_VERSION > 0)
|
||||||
|
/* support for native key accelerators indicated by underscroes */
|
||||||
gtk_accel_group_attach( m_frameMenuBar->m_accel, GTK_OBJECT(m_widget));
|
gtk_accel_group_attach( m_frameMenuBar->m_accel, GTK_OBJECT(m_widget));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -474,8 +474,10 @@ wxMenuItem::wxMenuItem()
|
|||||||
// it's valid for this function to be called even if m_menuItem == NULL
|
// it's valid for this function to be called even if m_menuItem == NULL
|
||||||
void wxMenuItem::SetName( const wxString& str )
|
void wxMenuItem::SetName( const wxString& str )
|
||||||
{
|
{
|
||||||
|
/* '\t' is the deliminator indicating a hot key */
|
||||||
m_text = _T("");
|
m_text = _T("");
|
||||||
for ( const wxChar *pc = str; *pc != _T('\0'); pc++ )
|
const wxChar *pc = str;
|
||||||
|
for (; (*pc != _T('\0')) && (*pc != _T('\t')); pc++ )
|
||||||
{
|
{
|
||||||
if (*pc == _T('&'))
|
if (*pc == _T('&'))
|
||||||
{
|
{
|
||||||
@@ -486,6 +488,13 @@ void wxMenuItem::SetName( const wxString& str )
|
|||||||
else
|
else
|
||||||
m_text << *pc;
|
m_text << *pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* only GTK 1.2 know about hot keys */
|
||||||
|
m_hotKey = _T("");
|
||||||
|
#if (GTK_MINOR_VERSION > 0)
|
||||||
|
pc++;
|
||||||
|
m_hotKey = pc;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (m_menuItem)
|
if (m_menuItem)
|
||||||
{
|
{
|
||||||
@@ -607,7 +616,6 @@ void wxMenu::Append( int id, const wxString &item, const wxString &helpStr, bool
|
|||||||
|
|
||||||
GtkItemFactoryEntry entry;
|
GtkItemFactoryEntry entry;
|
||||||
entry.path = buf;
|
entry.path = buf;
|
||||||
entry.accelerator = (gchar*) NULL;
|
|
||||||
entry.callback = (GtkItemFactoryCallback) gtk_menu_clicked_callback;
|
entry.callback = (GtkItemFactoryCallback) gtk_menu_clicked_callback;
|
||||||
entry.callback_action = 0;
|
entry.callback_action = 0;
|
||||||
if (checkable)
|
if (checkable)
|
||||||
@@ -615,12 +623,48 @@ void wxMenu::Append( int id, const wxString &item, const wxString &helpStr, bool
|
|||||||
else
|
else
|
||||||
entry.item_type = "<Item>";
|
entry.item_type = "<Item>";
|
||||||
|
|
||||||
|
entry.accelerator = (gchar*) NULL;
|
||||||
|
char hotbuf[50];
|
||||||
|
wxString hotkey( mitem->GetHotKey() );
|
||||||
|
if (!hotkey.IsEmpty())
|
||||||
|
{
|
||||||
|
switch (hotkey[0])
|
||||||
|
{
|
||||||
|
case _T('a'): /* Alt */
|
||||||
|
case _T('A'):
|
||||||
|
case _T('m'): /* Meta */
|
||||||
|
case _T('M'):
|
||||||
|
{
|
||||||
|
strcpy( hotbuf, "<alt>" );
|
||||||
|
wxString last = hotkey.Right(1);
|
||||||
|
strcat( hotbuf, last.mb_str() );
|
||||||
|
entry.accelerator = hotbuf;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case _T('c'): /* Ctrl */
|
||||||
|
case _T('C'):
|
||||||
|
case _T('s'): /* Strg, yeah man, I'm German */
|
||||||
|
case _T('S'):
|
||||||
|
{
|
||||||
|
strcpy( hotbuf, "<control>" );
|
||||||
|
wxString last = hotkey.Right(1);
|
||||||
|
strcat( hotbuf, last.mb_str() );
|
||||||
|
entry.accelerator = hotbuf;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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 ? */
|
||||||
|
|
||||||
/* 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 */
|
||||||
wxString s = _T("<main>/");
|
wxString s = _T("<main>/");
|
||||||
for ( const wxChar *pc = text; *pc != _T('\0'); pc++ )
|
for ( const wxChar *pc = text; *pc != _T('\0'); pc++ )
|
||||||
{
|
{
|
||||||
|
if (*pc == _T('\t')) break;
|
||||||
if (*pc == _T('_')) pc++; /* skip it */
|
if (*pc == _T('_')) pc++; /* skip it */
|
||||||
s << *pc;
|
s << *pc;
|
||||||
}
|
}
|
||||||
|
@@ -65,9 +65,9 @@ gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
|
|||||||
{
|
{
|
||||||
if (g_isIdle) wxapp_install_idle_handler();
|
if (g_isIdle) wxapp_install_idle_handler();
|
||||||
|
|
||||||
if (!win->m_hasVMT) return;
|
|
||||||
|
|
||||||
win->CalculateScrollbar();
|
win->CalculateScrollbar();
|
||||||
|
|
||||||
|
if (!win->m_hasVMT) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -140,7 +140,7 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
|
|||||||
m_vScrollbarVisible = FALSE;
|
m_vScrollbarVisible = FALSE;
|
||||||
|
|
||||||
bool multi_line = (style & wxTE_MULTILINE) != 0;
|
bool multi_line = (style & wxTE_MULTILINE) != 0;
|
||||||
if ( multi_line )
|
if (multi_line)
|
||||||
{
|
{
|
||||||
/* a multi-line edit control: create a vertical scrollbar by default and
|
/* a multi-line edit control: create a vertical scrollbar by default and
|
||||||
horizontal if requested */
|
horizontal if requested */
|
||||||
@@ -171,9 +171,14 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
|
|||||||
gtk_widget_show(hscrollbar);
|
gtk_widget_show(hscrollbar);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we create the vertical scrollbar on demand */
|
/* finally, put the vertical scrollbar in the upper right corner */
|
||||||
m_vScrollbar = (GtkWidget*) NULL;
|
m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj );
|
||||||
|
GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS );
|
||||||
|
|
||||||
|
gtk_table_attach(GTK_TABLE(m_widget), m_vScrollbar, 1, 2, 0, 1,
|
||||||
|
GTK_FILL,
|
||||||
|
(GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK),
|
||||||
|
0, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -194,15 +199,18 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
|
|||||||
PostCreation();
|
PostCreation();
|
||||||
|
|
||||||
if (multi_line)
|
if (multi_line)
|
||||||
{
|
|
||||||
// gtk_widget_realize(m_text);
|
|
||||||
gtk_widget_show(m_text);
|
gtk_widget_show(m_text);
|
||||||
}
|
|
||||||
|
|
||||||
/* we want to be notified about text changes */
|
/* we want to be notified about text changes */
|
||||||
gtk_signal_connect( GTK_OBJECT(m_text), "changed",
|
gtk_signal_connect( GTK_OBJECT(m_text), "changed",
|
||||||
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
|
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
|
||||||
|
|
||||||
|
if (multi_line)
|
||||||
|
{
|
||||||
|
gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed",
|
||||||
|
(GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this );
|
||||||
|
}
|
||||||
|
|
||||||
if (!value.IsEmpty())
|
if (!value.IsEmpty())
|
||||||
{
|
{
|
||||||
gint tmp = 0;
|
gint tmp = 0;
|
||||||
@@ -243,12 +251,6 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
|
|||||||
|
|
||||||
Show( TRUE );
|
Show( TRUE );
|
||||||
|
|
||||||
if (multi_line)
|
|
||||||
{
|
|
||||||
gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed",
|
|
||||||
(GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this );
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,18 +273,6 @@ void wxTextCtrl::CalculateScrollbar()
|
|||||||
{
|
{
|
||||||
if (!m_vScrollbarVisible)
|
if (!m_vScrollbarVisible)
|
||||||
{
|
{
|
||||||
if (!m_vScrollbar)
|
|
||||||
{
|
|
||||||
/* finally, put the vertical scrollbar in the upper right corner */
|
|
||||||
m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj );
|
|
||||||
GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS );
|
|
||||||
|
|
||||||
gtk_table_attach(GTK_TABLE(m_widget), m_vScrollbar, 1, 2, 0, 1,
|
|
||||||
GTK_FILL,
|
|
||||||
(GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK),
|
|
||||||
0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
gtk_widget_show( m_vScrollbar );
|
gtk_widget_show( m_vScrollbar );
|
||||||
|
|
||||||
m_vScrollbarVisible = TRUE;
|
m_vScrollbarVisible = TRUE;
|
||||||
|
Reference in New Issue
Block a user