X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/db434467a143a2c847c4bcfe987f0202c2d02bf2..6f806543a4e26b02acbfdc8e6eac5b4e0ac6ab29:/src/gtk/combobox.cpp diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp index eb10d33e38..c138c48a42 100644 --- a/src/gtk/combobox.cpp +++ b/src/gtk/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 ); @@ -429,7 +448,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 +600,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() ); @@ -668,7 +690,27 @@ bool wxComboBox::IsOwnGtkWindow( GdkWindow *window ) wxSize wxComboBox::DoGetBestSize() const { wxSize ret( wxControl::DoGetBestSize() ); - if (ret.x < 100) ret.x = 100; + + // we know better our horizontal extent: it depends on the longest string + // in the combobox + ret.x = 0; + if ( m_widget ) + { + GdkFont *font = m_font.GetInternalFont(); + + wxCoord width; + size_t count = Number(); + for ( size_t n = 0; n < count; n++ ) + { + width = (wxCoord)gdk_string_width(font, GetString(n).mbc_str()); + if ( width > ret.x ) + ret.x = width; + } + } + + // empty combobox should have some reasonable default size too + if ( ret.x < 100 ) + ret.x = 100; return ret; }