X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a6fc8ae3c22f72f1caa78bc993ac8db545c49b6a..ee3510132b8b4160f848bd4f502a6f5315f90dbc:/src/gtk1/combobox.cpp diff --git a/src/gtk1/combobox.cpp b/src/gtk1/combobox.cpp index 8369ebbf0f..de35777f0b 100644 --- a/src/gtk1/combobox.cpp +++ b/src/gtk1/combobox.cpp @@ -18,6 +18,8 @@ #include "wx/settings.h" #include "wx/intl.h" +#include "wx/textctrl.h" // for wxEVT_COMMAND_TEXT_UPDATED + #include #include @@ -55,8 +57,18 @@ gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) combo->m_alreadySent = TRUE; + int curSelection = combo->GetSelection(); + + if (combo->m_prevSelection != curSelection) + { + GtkWidget *list = GTK_COMBO(combo->m_widget)->list; + gtk_list_unselect_item( GTK_LIST(list), combo->m_prevSelection ); + } + + combo->m_prevSelection = curSelection; + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, combo->GetId() ); - event.SetInt( combo->GetSelection() ); + event.SetInt( curSelection ); event.SetString( combo->GetStringSelection() ); event.SetEventObject( combo ); @@ -100,6 +112,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, m_alreadySent = FALSE; m_needParent = TRUE; m_acceptsFocus = TRUE; + m_prevSelection = 0; if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator, name )) @@ -111,10 +124,16 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, m_widget = gtk_combo_new(); // make it more useable - gtk_combo_set_use_arrows_always(GTK_COMBO(m_widget), TRUE); + gtk_combo_set_use_arrows_always( GTK_COMBO(m_widget), TRUE ); + + // and case-sensitive + gtk_combo_set_case_sensitive( GTK_COMBO(m_widget), TRUE ); + GtkWidget *list = GTK_COMBO(m_widget)->list; + gtk_list_set_selection_mode( GTK_LIST(list), GTK_SELECTION_MULTIPLE ); + for (int i = 0; i < n; i++) { /* don't send first event, which GTK sends aways when @@ -135,11 +154,11 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, } m_parent->DoAddChild( this ); + + m_focusWidget = GTK_COMBO(m_widget)->entry; PostCreation(); - ApplyWidgetStyle(); - ConnectWidget( GTK_COMBO(m_widget)->button ); if (!value.IsNull()) SetValue( value ); @@ -159,9 +178,15 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, if (new_size.y > size_best.y) new_size.y = size_best.y; if ((new_size.x != size.x) || (new_size.y != size.y)) + { SetSize( new_size.x, new_size.y ); + + // This is required for tool bar support + gtk_widget_set_usize( m_widget, new_size.x, new_size.y ); + } + - SetBackgroundColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_WINDOW ) ); + SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); SetForegroundColour( parent->GetForegroundColour() ); Show( TRUE ); @@ -268,7 +293,7 @@ wxClientData* wxComboBox::GetClientObject( int n ) { wxCHECK_MSG( m_widget != NULL, (wxClientData*)NULL, wxT("invalid combobox") ); - wxNode *node = m_clientDataList.Nth( n ); + wxNode *node = m_clientObjectList.Nth( n ); if (!node) return (wxClientData*) NULL; return (wxClientData*) node->Data(); @@ -429,7 +454,9 @@ void wxComboBox::SetSelection( int n ) DisableEvents(); GtkWidget *list = GTK_COMBO(m_widget)->list; + gtk_list_unselect_item( GTK_LIST(list), m_prevSelection ); gtk_list_select_item( GTK_LIST(list), n ); + m_prevSelection = n; EnableEvents(); } @@ -579,6 +606,7 @@ void wxComboBox::OnChar( wxKeyEvent &event ) if ( FindString(value) == wxNOT_FOUND ) { Append(value); + SetStringSelection(value); // and generate the selected event for it wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() ); @@ -587,7 +615,26 @@ void wxComboBox::OnChar( wxKeyEvent &event ) event.SetEventObject( this ); GetEventHandler()->ProcessEvent( event ); } - //else: do nothing, this will open the listbox + else + { + // This will invoke the dialog default action, such + // as the clicking the default button. + + wxWindow *top_frame = m_parent; + while (top_frame->GetParent() && !(top_frame->IsTopLevel())) + top_frame = top_frame->GetParent(); + + if (top_frame && GTK_IS_WINDOW(top_frame->m_widget)) + { + GtkWindow *window = GTK_WINDOW(top_frame->m_widget); + + if (window->default_widget) + { + gtk_widget_activate (window->default_widget); + return; + } + } + } } }