X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/182cad34aa73a65ee29736d8314f8c282d02efad..72625b36b6fdaea839a5132e8f5d52dea7155bec:/src/gtk/combobox.cpp diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp index 62da3070c9..40c437fa23 100644 --- a/src/gtk/combobox.cpp +++ b/src/gtk/combobox.cpp @@ -21,7 +21,9 @@ #include "wx/arrstr.h" #endif +#include #include "wx/gtk/private.h" +#include "wx/gtk/private/gtk2-compat.h" // ---------------------------------------------------------------------------- // GTK callbacks @@ -31,8 +33,6 @@ extern "C" { static void gtkcombobox_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) { - if (!combo->m_hasVMT) return; - wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() ); event.SetString( combo->GetValue() ); event.SetEventObject( combo ); @@ -58,6 +58,7 @@ gtkcombobox_popupshown_callback(GObject *WXUNUSED(gobject), event.SetEventObject( combo ); combo->HandleWindowEvent( event ); } + } //----------------------------------------------------------------------------- @@ -84,6 +85,12 @@ BEGIN_EVENT_TABLE(wxComboBox, wxChoice) EVT_UPDATE_UI(wxID_SELECTALL, wxComboBox::OnUpdateSelectAll) END_EVENT_TABLE() +wxComboBox::~wxComboBox() +{ + if (m_entry) + GTKDisconnect(m_entry); +} + void wxComboBox::Init() { m_entry = NULL; @@ -165,25 +172,31 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, g_signal_connect_after (entry, "changed", G_CALLBACK (gtkcombobox_text_changed_callback), this); + + GTKConnectClipboardSignals(GTK_WIDGET(entry)); } g_signal_connect_after (m_widget, "changed", G_CALLBACK (gtkcombobox_changed_callback), this); +#ifndef __WXGTK3__ if ( !gtk_check_version(2,10,0) ) +#endif { g_signal_connect (m_widget, "notify::popup-shown", G_CALLBACK (gtkcombobox_popupshown_callback), this); } - SetInitialSize(size); // need this too because this is a wxControlWithItems - return true; } void wxComboBox::GTKCreateComboBoxWidget() { +#ifdef __WXGTK3__ + m_widget = gtk_combo_box_text_new_with_entry(); +#else m_widget = gtk_combo_box_entry_new_text(); +#endif g_object_ref(m_widget); m_entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(m_widget))); @@ -264,14 +277,23 @@ GtkWidget* wxComboBox::GetConnectWidget() GdkWindow* wxComboBox::GTKGetWindow(wxArrayGdkWindows& /* windows */) const { +#ifdef __WXGTK3__ + // no access to internal GdkWindows + return NULL; +#else return gtk_entry_get_text_window(GetEntry()); +#endif } // static wxVisualAttributes wxComboBox::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) { - return GetDefaultAttributesFromGTKWidget(gtk_combo_box_entry_new, true); +#ifdef __WXGTK3__ + return GetDefaultAttributesFromGTKWidget(gtk_combo_box_new_with_entry(), true); +#else + return GetDefaultAttributesFromGTKWidget(gtk_combo_box_entry_new(), true); +#endif } void wxComboBox::SetValue(const wxString& value) @@ -382,4 +404,21 @@ void wxComboBox::Dismiss() { gtk_combo_box_popdown( GTK_COMBO_BOX(m_widget) ); } + +wxSize wxComboBox::DoGetSizeFromTextSize(int xlen, int ylen) const +{ + wxSize tsize( wxChoice::DoGetSizeFromTextSize(xlen, ylen) ); + + GtkEntry* entry = GetEntry(); + if (entry) + { + // Add the margins we have previously set, but only the horizontal border + // as vertical one has been taken account in the previous call. + // Also get other GTK+ margins. + tsize.IncBy(GTKGetEntryMargins(entry).x, 0); + } + + return tsize; +} + #endif // wxUSE_COMBOBOX