From 5c1926da5578c2e77223ce7161a7b9888f63d7e1 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 26 Feb 2003 20:27:46 +0000 Subject: [PATCH] More update to wxComboBox git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@19345 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/gtk/combobox.cpp | 100 +++++++++++++++--------------------------- src/gtk1/combobox.cpp | 100 +++++++++++++++--------------------------- 2 files changed, 70 insertions(+), 130 deletions(-) diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp index 631317cf53..32493b04a3 100644 --- a/src/gtk/combobox.cpp +++ b/src/gtk/combobox.cpp @@ -36,11 +36,11 @@ extern bool g_isIdle; extern bool g_blockEventsOnDrag; //----------------------------------------------------------------------------- -// "select" +// "select-child" - click/cursor get select-child, changed, select-child //----------------------------------------------------------------------------- static void -gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) +gtk_combo_select_child_callback( GtkList *WXUNUSED(list), GtkWidget *WXUNUSED(widget), wxComboBox *combo ) { if (g_isIdle) wxapp_install_idle_handler(); @@ -63,8 +63,6 @@ gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) GtkWidget *list = GTK_COMBO(combo->m_widget)->list; gtk_list_unselect_item( GTK_LIST(list), combo->m_prevSelection ); } - else if ((curSelection >= 0) && (combo->GetString(curSelection) == combo->GetValue())) - return; combo->m_prevSelection = curSelection; @@ -77,7 +75,8 @@ gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) } //----------------------------------------------------------------------------- -// "changed" +// "changed" - typing and list item matches get changed, select-child, changed +// if it doesn't match an item then just get a single changed //----------------------------------------------------------------------------- static void @@ -87,13 +86,6 @@ gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) if (!combo->m_hasVMT) return; - // avoids double events when the GetValue = one of the selections - if (combo->m_alreadySent) - { - combo->m_alreadySent = FALSE; - return; - } - wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() ); event.SetString( combo->GetValue() ); event.SetEventObject( combo ); @@ -145,10 +137,6 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, for (int i = 0; i < n; i++) { - /* don't send first event, which GTK sends aways when - inserting the first item */ - m_alreadySent = TRUE; - GtkWidget *list_item = gtk_list_item_new_with_label( wxGTK_CONV( choices[i] ) ); m_clientDataList.Append( (wxObject*)NULL ); @@ -156,9 +144,6 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, gtk_container_add( GTK_CONTAINER(list), list_item ); - gtk_signal_connect( GTK_OBJECT(list_item), "select", - GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); - gtk_widget_show( list_item ); } @@ -170,13 +155,18 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, ConnectWidget( GTK_COMBO(m_widget)->button ); - if (!value.IsNull()) SetValue( value ); + // MSW's combo box starts empty + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + gtk_entry_set_text( GTK_ENTRY(entry), "" ); if (style & wxCB_READONLY) gtk_entry_set_editable( GTK_ENTRY( GTK_COMBO(m_widget)->entry ), FALSE ); gtk_signal_connect( GTK_OBJECT(GTK_COMBO(m_widget)->entry), "changed", - GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this ); + + gtk_signal_connect( GTK_OBJECT(GTK_COMBO(m_widget)->list), "select-child", + GTK_SIGNAL_FUNC(gtk_combo_select_child_callback), (gpointer)this ); wxSize size_best( DoGetBestSize() ); wxSize new_size( size ); @@ -194,7 +184,6 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, gtk_widget_set_usize( m_widget, new_size.x, new_size.y ); } - SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); SetForegroundColour( parent->GetForegroundColour() ); @@ -232,15 +221,14 @@ void wxComboBox::AppendCommon( const wxString &item ) { wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") ); + DisableEvents(); + GtkWidget *list = GTK_COMBO(m_widget)->list; GtkWidget *list_item = gtk_list_item_new_with_label( wxGTK_CONV( item ) ); gtk_container_add( GTK_CONTAINER(list), list_item ); - gtk_signal_connect( GTK_OBJECT(list_item), "select", - GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); - if (GTK_WIDGET_REALIZED(m_widget)) { gtk_widget_realize( list_item ); @@ -250,6 +238,8 @@ void wxComboBox::AppendCommon( const wxString &item ) } gtk_widget_show( list_item ); + + EnableEvents(); } void wxComboBox::Append( const wxString &item ) @@ -323,6 +313,8 @@ void wxComboBox::Clear() { wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") ); + DisableEvents(); + GtkWidget *list = GTK_COMBO(m_widget)->list; gtk_list_clear_items( GTK_LIST(list), 0, Number() ); @@ -336,6 +328,8 @@ void wxComboBox::Clear() m_clientObjectList.Clear(); m_clientDataList.Clear(); + + EnableEvents(); } void wxComboBox::Delete( int n ) @@ -352,6 +346,8 @@ void wxComboBox::Delete( int n ) return; } + DisableEvents(); + GList *list = g_list_append( (GList*) NULL, child->data ); gtk_list_remove_items( listbox, list ); g_list_free( list ); @@ -369,6 +365,8 @@ void wxComboBox::Delete( int n ) { m_clientDataList.DeleteNode( node ); } + + EnableEvents(); } int wxComboBox::FindString( const wxString &item ) @@ -624,29 +622,15 @@ void wxComboBox::OnChar( wxKeyEvent &event ) { if ( event.KeyCode() == WXK_RETURN ) { - wxString value = GetValue(); - int selection = GetSelection(); - - // note that gtk automatically selects an item if its in the list - // so you don't have to call FindString - if ((selection >= 0) && (GetString(selection) == value)) - { - // make Enter generate "selected" event if it equals an item - wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() ); - event.SetInt( selection ); - event.SetString( value ); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( event ); - } - else - { - wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, GetId()); - event.SetString(value); - event.SetInt(selection); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( event ); - } + // GTK automatically selects an item if its in the list + wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, GetId()); + event.SetString( GetValue() ); + event.SetInt( GetSelection() ); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent( event ); + // Catch GTK event so that GTK doesn't open the drop + // down list upon RETURN. return; } @@ -655,28 +639,14 @@ void wxComboBox::OnChar( wxKeyEvent &event ) void wxComboBox::DisableEvents() { - GtkList *list = GTK_LIST( GTK_COMBO(m_widget)->list ); - GList *child = list->children; - while (child) - { - gtk_signal_disconnect_by_func( GTK_OBJECT(child->data), - GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); - - child = child->next; - } + gtk_signal_disconnect_by_func( GTK_OBJECT(GTK_COMBO(m_widget)->list), + GTK_SIGNAL_FUNC(gtk_combo_select_child_callback), (gpointer)this ); } void wxComboBox::EnableEvents() { - GtkList *list = GTK_LIST( GTK_COMBO(m_widget)->list ); - GList *child = list->children; - while (child) - { - gtk_signal_connect( GTK_OBJECT(child->data), "select", - GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); - - child = child->next; - } + gtk_signal_connect( GTK_OBJECT(GTK_COMBO(m_widget)->list), "select-child", + GTK_SIGNAL_FUNC(gtk_combo_select_child_callback), (gpointer)this ); } void wxComboBox::OnSize( wxSizeEvent &event ) diff --git a/src/gtk1/combobox.cpp b/src/gtk1/combobox.cpp index 631317cf53..32493b04a3 100644 --- a/src/gtk1/combobox.cpp +++ b/src/gtk1/combobox.cpp @@ -36,11 +36,11 @@ extern bool g_isIdle; extern bool g_blockEventsOnDrag; //----------------------------------------------------------------------------- -// "select" +// "select-child" - click/cursor get select-child, changed, select-child //----------------------------------------------------------------------------- static void -gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) +gtk_combo_select_child_callback( GtkList *WXUNUSED(list), GtkWidget *WXUNUSED(widget), wxComboBox *combo ) { if (g_isIdle) wxapp_install_idle_handler(); @@ -63,8 +63,6 @@ gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) GtkWidget *list = GTK_COMBO(combo->m_widget)->list; gtk_list_unselect_item( GTK_LIST(list), combo->m_prevSelection ); } - else if ((curSelection >= 0) && (combo->GetString(curSelection) == combo->GetValue())) - return; combo->m_prevSelection = curSelection; @@ -77,7 +75,8 @@ gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) } //----------------------------------------------------------------------------- -// "changed" +// "changed" - typing and list item matches get changed, select-child, changed +// if it doesn't match an item then just get a single changed //----------------------------------------------------------------------------- static void @@ -87,13 +86,6 @@ gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) if (!combo->m_hasVMT) return; - // avoids double events when the GetValue = one of the selections - if (combo->m_alreadySent) - { - combo->m_alreadySent = FALSE; - return; - } - wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() ); event.SetString( combo->GetValue() ); event.SetEventObject( combo ); @@ -145,10 +137,6 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, for (int i = 0; i < n; i++) { - /* don't send first event, which GTK sends aways when - inserting the first item */ - m_alreadySent = TRUE; - GtkWidget *list_item = gtk_list_item_new_with_label( wxGTK_CONV( choices[i] ) ); m_clientDataList.Append( (wxObject*)NULL ); @@ -156,9 +144,6 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, gtk_container_add( GTK_CONTAINER(list), list_item ); - gtk_signal_connect( GTK_OBJECT(list_item), "select", - GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); - gtk_widget_show( list_item ); } @@ -170,13 +155,18 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, ConnectWidget( GTK_COMBO(m_widget)->button ); - if (!value.IsNull()) SetValue( value ); + // MSW's combo box starts empty + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + gtk_entry_set_text( GTK_ENTRY(entry), "" ); if (style & wxCB_READONLY) gtk_entry_set_editable( GTK_ENTRY( GTK_COMBO(m_widget)->entry ), FALSE ); gtk_signal_connect( GTK_OBJECT(GTK_COMBO(m_widget)->entry), "changed", - GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this ); + + gtk_signal_connect( GTK_OBJECT(GTK_COMBO(m_widget)->list), "select-child", + GTK_SIGNAL_FUNC(gtk_combo_select_child_callback), (gpointer)this ); wxSize size_best( DoGetBestSize() ); wxSize new_size( size ); @@ -194,7 +184,6 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, gtk_widget_set_usize( m_widget, new_size.x, new_size.y ); } - SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); SetForegroundColour( parent->GetForegroundColour() ); @@ -232,15 +221,14 @@ void wxComboBox::AppendCommon( const wxString &item ) { wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") ); + DisableEvents(); + GtkWidget *list = GTK_COMBO(m_widget)->list; GtkWidget *list_item = gtk_list_item_new_with_label( wxGTK_CONV( item ) ); gtk_container_add( GTK_CONTAINER(list), list_item ); - gtk_signal_connect( GTK_OBJECT(list_item), "select", - GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); - if (GTK_WIDGET_REALIZED(m_widget)) { gtk_widget_realize( list_item ); @@ -250,6 +238,8 @@ void wxComboBox::AppendCommon( const wxString &item ) } gtk_widget_show( list_item ); + + EnableEvents(); } void wxComboBox::Append( const wxString &item ) @@ -323,6 +313,8 @@ void wxComboBox::Clear() { wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") ); + DisableEvents(); + GtkWidget *list = GTK_COMBO(m_widget)->list; gtk_list_clear_items( GTK_LIST(list), 0, Number() ); @@ -336,6 +328,8 @@ void wxComboBox::Clear() m_clientObjectList.Clear(); m_clientDataList.Clear(); + + EnableEvents(); } void wxComboBox::Delete( int n ) @@ -352,6 +346,8 @@ void wxComboBox::Delete( int n ) return; } + DisableEvents(); + GList *list = g_list_append( (GList*) NULL, child->data ); gtk_list_remove_items( listbox, list ); g_list_free( list ); @@ -369,6 +365,8 @@ void wxComboBox::Delete( int n ) { m_clientDataList.DeleteNode( node ); } + + EnableEvents(); } int wxComboBox::FindString( const wxString &item ) @@ -624,29 +622,15 @@ void wxComboBox::OnChar( wxKeyEvent &event ) { if ( event.KeyCode() == WXK_RETURN ) { - wxString value = GetValue(); - int selection = GetSelection(); - - // note that gtk automatically selects an item if its in the list - // so you don't have to call FindString - if ((selection >= 0) && (GetString(selection) == value)) - { - // make Enter generate "selected" event if it equals an item - wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() ); - event.SetInt( selection ); - event.SetString( value ); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( event ); - } - else - { - wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, GetId()); - event.SetString(value); - event.SetInt(selection); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( event ); - } + // GTK automatically selects an item if its in the list + wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, GetId()); + event.SetString( GetValue() ); + event.SetInt( GetSelection() ); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent( event ); + // Catch GTK event so that GTK doesn't open the drop + // down list upon RETURN. return; } @@ -655,28 +639,14 @@ void wxComboBox::OnChar( wxKeyEvent &event ) void wxComboBox::DisableEvents() { - GtkList *list = GTK_LIST( GTK_COMBO(m_widget)->list ); - GList *child = list->children; - while (child) - { - gtk_signal_disconnect_by_func( GTK_OBJECT(child->data), - GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); - - child = child->next; - } + gtk_signal_disconnect_by_func( GTK_OBJECT(GTK_COMBO(m_widget)->list), + GTK_SIGNAL_FUNC(gtk_combo_select_child_callback), (gpointer)this ); } void wxComboBox::EnableEvents() { - GtkList *list = GTK_LIST( GTK_COMBO(m_widget)->list ); - GList *child = list->children; - while (child) - { - gtk_signal_connect( GTK_OBJECT(child->data), "select", - GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); - - child = child->next; - } + gtk_signal_connect( GTK_OBJECT(GTK_COMBO(m_widget)->list), "select-child", + GTK_SIGNAL_FUNC(gtk_combo_select_child_callback), (gpointer)this ); } void wxComboBox::OnSize( wxSizeEvent &event )