X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9572bf1d442006beba3528dc00c3fc05eb523c24..14722c43c30918cd8fbba956b50ac3426d2fe339:/src/gtk/combobox.cpp diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp index 8ff0dc6b79..35a5e0fec8 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 @@ -58,14 +60,13 @@ gtkcombobox_popupshown_callback(GObject *WXUNUSED(gobject), event.SetEventObject( combo ); combo->HandleWindowEvent( event ); } + } //----------------------------------------------------------------------------- // wxComboBox //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxChoice) - BEGIN_EVENT_TABLE(wxComboBox, wxChoice) EVT_CHAR(wxComboBox::OnChar) @@ -118,7 +119,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, } if (HasFlag(wxCB_SORT)) - m_strings = new wxSortedArrayString(); + m_strings = new wxGtkCollatedArrayString(); GTKCreateComboBoxWidget(); @@ -136,7 +137,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, gtk_entry_set_activates_default( entry, !HasFlag(wxTE_PROCESS_ENTER) ); - gtk_entry_set_editable( entry, TRUE ); + gtk_editable_set_editable(GTK_EDITABLE(entry), true); } Append(n, choices); @@ -157,7 +158,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, // wxMSW and also because it doesn't make sense to have a string // which is not a possible choice in a read-only combobox) SetStringSelection(value); - gtk_entry_set_editable( entry, FALSE ); + gtk_editable_set_editable(GTK_EDITABLE(entry), false); } else // editable combobox { @@ -167,12 +168,16 @@ 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); @@ -185,15 +190,19 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, 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(m_widget)->child); + m_entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(m_widget))); } GtkEditable *wxComboBox::GetEditable() const { - return GTK_EDITABLE( GTK_BIN(m_widget)->child ); + return GTK_EDITABLE(gtk_bin_get_child(GTK_BIN(m_widget))); } void wxComboBox::OnChar( wxKeyEvent &event ) @@ -229,12 +238,12 @@ void wxComboBox::EnableTextChangedEvents(bool enable) if ( enable ) { - g_signal_handlers_unblock_by_func(GTK_BIN(m_widget)->child, + g_signal_handlers_unblock_by_func(gtk_bin_get_child(GTK_BIN(m_widget)), (gpointer)gtkcombobox_text_changed_callback, this); } else // disable { - g_signal_handlers_block_by_func(GTK_BIN(m_widget)->child, + g_signal_handlers_block_by_func(gtk_bin_get_child(GTK_BIN(m_widget)), (gpointer)gtkcombobox_text_changed_callback, this); } } @@ -266,14 +275,23 @@ GtkWidget* wxComboBox::GetConnectWidget() GdkWindow* wxComboBox::GTKGetWindow(wxArrayGdkWindows& /* windows */) const { - return GetEntry()->text_area; +#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)) { +#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) @@ -284,6 +302,23 @@ void wxComboBox::SetValue(const wxString& value) wxTextEntry::SetValue(value); } +void wxComboBox::SetString(unsigned int n, const wxString& text) +{ + wxChoice::SetString(n, text); + + if ( static_cast(n) == GetSelection() ) + { + // We also need to update the currently shown text, for consistency + // with wxMSW and also because it makes sense as leaving the old string + // in the text but not in the list would be confusing to the user. + SetValue(text); + + // And we need to keep the selection unchanged, modifying the item is + // not supposed to deselect it. + SetSelection(n); + } +} + // ---------------------------------------------------------------------------- // standard event handling // ----------------------------------------------------------------------------