X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0279e8448266e474d07bf7e3b0635f2a53fcc8b8..53e46b61bbe4ce72b92c8898907f0a879d5f012b:/src/gtk/combobox.cpp diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp index 0571f48fe4..023caa971e 100644 --- a/src/gtk/combobox.cpp +++ b/src/gtk/combobox.cpp @@ -101,17 +101,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, m_needParent = TRUE; m_acceptsFocus = TRUE; - wxSize newSize = size, - bestSize = DoGetBestSize(); - - if (newSize.x == -1) - newSize.x = bestSize.x; - if (newSize.y == -1) - newSize.y = bestSize.y; - if (newSize.y > 22) - newSize.y = 22; - - if (!PreCreation( parent, pos, newSize ) || + if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator, name )) { wxFAIL_MSG( wxT("wxComboBox creation failed") ); @@ -121,7 +111,11 @@ 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; @@ -158,9 +152,19 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, gtk_signal_connect( GTK_OBJECT(GTK_COMBO(m_widget)->entry), "changed", GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); + wxSize size_best( DoGetBestSize() ); + wxSize new_size( size ); + if (new_size.x == -1) + new_size.x = size_best.x; + if (new_size.y == -1) + new_size.y = size_best.y; + 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 ); + SetBackgroundColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_WINDOW ) ); SetForegroundColour( parent->GetForegroundColour() ); - SetFont( parent->GetFont() ); Show( TRUE ); @@ -577,6 +581,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() ); @@ -665,8 +670,29 @@ bool wxComboBox::IsOwnGtkWindow( GdkWindow *window ) wxSize wxComboBox::DoGetBestSize() const { - // totally bogus - should measure the strings in the combo! - return wxSize(100, 22); + wxSize ret( wxControl::DoGetBestSize() ); + + // 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; } #endif