X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bce926c580f496b63c9ea9a68618df5b6ff93b98..ed3aece5aea77b4fc62493fac7873496056aeec5:/src/gtk/choice.cpp diff --git a/src/gtk/choice.cpp b/src/gtk/choice.cpp index 462d9266ef..28832ef3e4 100644 --- a/src/gtk/choice.cpp +++ b/src/gtk/choice.cpp @@ -17,8 +17,9 @@ #include "wx/arrstr.h" #endif +#include #include "wx/gtk/private.h" - +#include "wx/gtk/private/gtk2-compat.h" // ---------------------------------------------------------------------------- // GTK callbacks @@ -38,8 +39,6 @@ gtk_choice_changed_callback( GtkWidget *WXUNUSED(widget), wxChoice *choice ) // wxChoice //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControlWithItems) - void wxChoice::Init() { m_strings = NULL; @@ -78,7 +77,11 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id, m_strings = new wxGtkCollatedArrayString; } +#ifdef __WXGTK3__ + m_widget = gtk_combo_box_text_new(); +#else m_widget = gtk_combo_box_new_text(); +#endif g_object_ref(m_widget); Append(n, choices); @@ -100,9 +103,6 @@ wxChoice::~wxChoice() void wxChoice::SendSelectionChangedEvent(wxEventType evt_type) { - if (!m_hasVMT) - return; - if (GetSelection() == -1) return; @@ -119,7 +119,11 @@ void wxChoice::SendSelectionChangedEvent(wxEventType evt_type) void wxChoice::GTKInsertComboBoxTextItem( unsigned int n, const wxString& text ) { +#ifdef __WXGTK3__ + gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(m_widget), n, wxGTK_CONV(text)); +#else gtk_combo_box_insert_text( GTK_COMBO_BOX( m_widget ), n, wxGTK_CONV( text ) ); +#endif } int wxChoice::DoInsertItems(const wxArrayStringsAdapter & items, @@ -336,44 +340,22 @@ void wxChoice::GTKEnableEvents() GdkWindow *wxChoice::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const { - return m_widget->window; + return gtk_widget_get_window(m_widget); } -// Notice that this method shouldn't be necessary, because GTK calculates -// properly size of the combobox but for unknown reasons it doesn't work -// correctly in wx without this. wxSize wxChoice::DoGetBestSize() const { - // strangely, this returns a width of 188 pixels from GTK+ (?) - wxSize ret( wxControl::DoGetBestSize() ); - - // we know better our horizontal extent: it depends on the longest string - // in the combobox - if ( m_widget ) - { - ret.x = GetCount() > 0 ? 0 : 60; // start with something "sensible" - int width; - unsigned int count = GetCount(); - for ( unsigned int n = 0; n < count; n++ ) - { - GetTextExtent(GetString(n), &width, NULL, NULL, NULL ); - if ( width + 40 > ret.x ) // 40 for drop down arrow and space around text - ret.x = width + 40; - } - } - - // empty combobox should have some reasonable default size too - if ((GetCount() == 0) && (ret.x < 80)) - ret.x = 80; - - CacheBestSize(ret); - return ret; + // Get the height of the control from GTK+ itself, but use our own version + // to compute the width large enough to show all our strings as GTK+ + // doesn't seem to take the control contents into account. + return wxSize(wxChoiceBase::DoGetBestSize().x + 40, + wxControl::DoGetBestSize().y); } void wxChoice::DoApplyWidgetStyle(GtkRcStyle *style) { - gtk_widget_modify_style(m_widget, style); - gtk_widget_modify_style(GTK_BIN(m_widget)->child, style); + GTKApplyStyle(m_widget, style); + GTKApplyStyle(gtk_bin_get_child(GTK_BIN(m_widget)), style); }