+ return Create( parent, id, value, pos, size, chs.GetCount(),
+ chs.GetStrings(), style, validator, name );
+}
+
+bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
+ const wxPoint& pos, const wxSize& size,
+ int n, const wxString choices[],
+ long style, const wxValidator& validator,
+ const wxString& name )
+{
+ if (!PreCreation( parent, pos, size ) ||
+ !CreateBase( parent, id, pos, size, style, validator, name ))
+ {
+ wxFAIL_MSG( wxT("wxComboBox creation failed") );
+ return false;
+ }
+
+ if (HasFlag(wxCB_SORT))
+ m_strings = new wxGtkCollatedArrayString();
+
+ GTKCreateComboBoxWidget();
+
+ if (HasFlag(wxBORDER_NONE))
+ {
+ // Doesn't seem to work
+ // g_object_set (m_widget, "has-frame", FALSE, NULL);
+ }
+
+ GtkEntry * const entry = GetEntry();
+
+ if ( entry )
+ {
+ // Set it up to trigger default item on enter key press
+ gtk_entry_set_activates_default( entry,
+ !HasFlag(wxTE_PROCESS_ENTER) );
+
+ gtk_editable_set_editable(GTK_EDITABLE(entry), true);
+ }
+
+ Append(n, choices);
+
+ m_parent->DoAddChild( this );
+
+ if ( entry )
+ m_focusWidget = GTK_WIDGET( entry );
+
+ PostCreation(size);
+
+ if ( entry )
+ {
+ if (style & wxCB_READONLY)
+ {
+ // this will assert and do nothing if the value is not in our list
+ // of strings which is the desired behaviour (for consistency with
+ // 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_editable_set_editable(GTK_EDITABLE(entry), false);
+ }
+ else // editable combobox
+ {
+ // any value is accepted, even if it's not in our list
+ gtk_entry_set_text( entry, wxGTK_CONV(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);
+ }
+
+ 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)));
+}
+
+GtkEditable *wxComboBox::GetEditable() const
+{
+ return GTK_EDITABLE(gtk_bin_get_child(GTK_BIN(m_widget)));
+}
+
+void wxComboBox::OnChar( wxKeyEvent &event )
+{
+ switch ( event.GetKeyCode() )
+ {
+ case WXK_RETURN:
+ if ( HasFlag(wxTE_PROCESS_ENTER) && GetEntry() )
+ {
+ // GTK automatically selects an item if its in the list
+ wxCommandEvent eventEnter(wxEVT_COMMAND_TEXT_ENTER, GetId());
+ eventEnter.SetString( GetValue() );
+ eventEnter.SetInt( GetSelection() );
+ eventEnter.SetEventObject( this );
+
+ if ( HandleWindowEvent(eventEnter) )
+ {
+ // Catch GTK event so that GTK doesn't open the drop
+ // down list upon RETURN.
+ return;
+ }
+ }
+ break;
+ }
+
+ event.Skip();
+}
+
+void wxComboBox::EnableTextChangedEvents(bool enable)
+{
+ if ( !GetEntry() )
+ return;