From 7cf8cb48f85cb82dceaff60b7cb8f3f05e479e5f Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 12 Mar 1999 21:36:27 +0000 Subject: [PATCH] another attempt to improve combobox behaviour git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1920 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/gtk/combobox.cpp | 58 ++++++++++++++++++++++++++++++------------- src/gtk1/combobox.cpp | 58 ++++++++++++++++++++++++++++++------------- 2 files changed, 82 insertions(+), 34 deletions(-) diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp index 9550e296d3..5ab1cd7b75 100644 --- a/src/gtk/combobox.cpp +++ b/src/gtk/combobox.cpp @@ -314,14 +314,13 @@ int wxComboBox::FindString( const wxString &item ) { GtkBin *bin = GTK_BIN( child->data ); GtkLabel *label = GTK_LABEL( bin->child ); - if (item == label->label) return count; + if (item == label->label) + return count; count++; child = child->next; } - wxFAIL_MSG( "wxComboBox: string not found" ); - - return -1; + return wxNOT_FOUND; } int wxComboBox::GetSelection() const @@ -354,17 +353,20 @@ wxString wxComboBox::GetString( int n ) const GtkWidget *list = GTK_COMBO(m_widget)->list; + wxString str; GList *child = g_list_nth( GTK_LIST(list)->children, n ); if (child) { GtkBin *bin = GTK_BIN( child->data ); GtkLabel *label = GTK_LABEL( bin->child ); - return label->label; + str = label->label; + } + else + { + wxFAIL_MSG( "wxComboBox: wrong index" ); } - wxFAIL_MSG( "wxComboBox: wrong index" ); - - return ""; + return str; } wxString wxComboBox::GetStringSelection() const @@ -529,18 +531,40 @@ void wxComboBox::SetEditable( bool editable ) void wxComboBox::OnChar( wxKeyEvent &event ) { - // make Enter generate "selected" event if there is only one item in the - // combobox - without it, it's impossible to select it at all! - if ( (event.KeyCode() == WXK_RETURN) && (Number() == 0) ) + if ( event.KeyCode() == WXK_RETURN ) { - wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() ); - event.SetInt( 0 ); - event.SetString( copystring(GetValue()) ); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( event ); + wxString value = GetValue(); - delete [] event.GetString(); + if ( Number() == 0 ) + { + // make Enter generate "selected" event if there is only one item + // in the combobox - without it, it's impossible to select it at + // all! + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() ); + event.SetInt( 0 ); + event.SetString( (char *)value.c_str() ); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent( event ); + } + else + { + // add the item to the list if it's not there yet + if ( FindString(value) == wxNOT_FOUND ) + { + Append(value); + + // and generate the selected event for it + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() ); + event.SetInt( Number() - 1 ); + event.SetString( (char *)value.c_str() ); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent( event ); + } + //else: do nothing, this will open the listbox + } } + + event.Skip(); } void wxComboBox::OnSize( wxSizeEvent &event ) diff --git a/src/gtk1/combobox.cpp b/src/gtk1/combobox.cpp index 9550e296d3..5ab1cd7b75 100644 --- a/src/gtk1/combobox.cpp +++ b/src/gtk1/combobox.cpp @@ -314,14 +314,13 @@ int wxComboBox::FindString( const wxString &item ) { GtkBin *bin = GTK_BIN( child->data ); GtkLabel *label = GTK_LABEL( bin->child ); - if (item == label->label) return count; + if (item == label->label) + return count; count++; child = child->next; } - wxFAIL_MSG( "wxComboBox: string not found" ); - - return -1; + return wxNOT_FOUND; } int wxComboBox::GetSelection() const @@ -354,17 +353,20 @@ wxString wxComboBox::GetString( int n ) const GtkWidget *list = GTK_COMBO(m_widget)->list; + wxString str; GList *child = g_list_nth( GTK_LIST(list)->children, n ); if (child) { GtkBin *bin = GTK_BIN( child->data ); GtkLabel *label = GTK_LABEL( bin->child ); - return label->label; + str = label->label; + } + else + { + wxFAIL_MSG( "wxComboBox: wrong index" ); } - wxFAIL_MSG( "wxComboBox: wrong index" ); - - return ""; + return str; } wxString wxComboBox::GetStringSelection() const @@ -529,18 +531,40 @@ void wxComboBox::SetEditable( bool editable ) void wxComboBox::OnChar( wxKeyEvent &event ) { - // make Enter generate "selected" event if there is only one item in the - // combobox - without it, it's impossible to select it at all! - if ( (event.KeyCode() == WXK_RETURN) && (Number() == 0) ) + if ( event.KeyCode() == WXK_RETURN ) { - wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() ); - event.SetInt( 0 ); - event.SetString( copystring(GetValue()) ); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( event ); + wxString value = GetValue(); - delete [] event.GetString(); + if ( Number() == 0 ) + { + // make Enter generate "selected" event if there is only one item + // in the combobox - without it, it's impossible to select it at + // all! + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() ); + event.SetInt( 0 ); + event.SetString( (char *)value.c_str() ); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent( event ); + } + else + { + // add the item to the list if it's not there yet + if ( FindString(value) == wxNOT_FOUND ) + { + Append(value); + + // and generate the selected event for it + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() ); + event.SetInt( Number() - 1 ); + event.SetString( (char *)value.c_str() ); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent( event ); + } + //else: do nothing, this will open the listbox + } } + + event.Skip(); } void wxComboBox::OnSize( wxSizeEvent &event ) -- 2.47.2