X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d1d1f8175d3f71a4f021ffa8d255f80a05eaffd0..bf2c43c76e2819be443ab1d830ab68d9569d66b1:/src/gtk/combobox.cpp diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp index 3abab97145..27ad2e756c 100644 --- a/src/gtk/combobox.cpp +++ b/src/gtk/combobox.cpp @@ -2,7 +2,6 @@ // Name: src/gtk/combobox.cpp // Purpose: // Author: Robert Roebling -// Id: $Id$ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,11 +16,13 @@ #ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/settings.h" - #include "wx/textctrl.h" // for wxEVT_COMMAND_TEXT_UPDATED + #include "wx/textctrl.h" // for wxEVT_TEXT #include "wx/arrstr.h" #endif +#include #include "wx/gtk/private.h" +#include "wx/gtk/private/gtk2-compat.h" // ---------------------------------------------------------------------------- // GTK callbacks @@ -31,9 +32,7 @@ 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() ); + wxCommandEvent event( wxEVT_TEXT, combo->GetId() ); event.SetString( combo->GetValue() ); event.SetEventObject( combo ); combo->HandleWindowEvent( event ); @@ -42,7 +41,7 @@ gtkcombobox_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *comb static void gtkcombobox_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) { - combo->SendSelectionChangedEvent(wxEVT_COMMAND_COMBOBOX_SELECTED); + combo->SendSelectionChangedEvent(wxEVT_COMBOBOX); } static void @@ -52,20 +51,19 @@ gtkcombobox_popupshown_callback(GObject *WXUNUSED(gobject), { gboolean isShown; g_object_get( combo->m_widget, "popup-shown", &isShown, NULL ); - wxCommandEvent event( isShown ? wxEVT_COMMAND_COMBOBOX_DROPDOWN - : wxEVT_COMMAND_COMBOBOX_CLOSEUP, + wxCommandEvent event( isShown ? wxEVT_COMBOBOX_DROPDOWN + : wxEVT_COMBOBOX_CLOSEUP, combo->GetId() ); event.SetEventObject( combo ); combo->HandleWindowEvent( event ); } + } //----------------------------------------------------------------------------- // wxComboBox //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxChoice) - BEGIN_EVENT_TABLE(wxComboBox, wxChoice) EVT_CHAR(wxComboBox::OnChar) @@ -86,6 +84,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; @@ -118,7 +122,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 +140,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 +161,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,33 +171,40 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, g_signal_connect_after (entry, "changed", G_CALLBACK (gtkcombobox_text_changed_callback), this); + + GTKConnectInsertTextSignal(entry); + 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(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 ) @@ -204,7 +215,7 @@ void wxComboBox::OnChar( wxKeyEvent &event ) if ( HasFlag(wxTE_PROCESS_ENTER) && GetEntry() ) { // GTK automatically selects an item if its in the list - wxCommandEvent eventEnter(wxEVT_COMMAND_TEXT_ENTER, GetId()); + wxCommandEvent eventEnter(wxEVT_TEXT_ENTER, GetId()); eventEnter.SetString( GetValue() ); eventEnter.SetInt( GetSelection() ); eventEnter.SetEventObject( this ); @@ -222,11 +233,26 @@ void wxComboBox::OnChar( wxKeyEvent &event ) event.Skip(); } -void wxComboBox::DisableEvents() +void wxComboBox::EnableTextChangedEvents(bool enable) { - if ( GetEntry() ) - g_signal_handlers_block_by_func(GTK_BIN(m_widget)->child, + if ( !GetEntry() ) + return; + + if ( enable ) + { + 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_get_child(GTK_BIN(m_widget)), (gpointer)gtkcombobox_text_changed_callback, this); + } +} + +void wxComboBox::GTKDisableEvents() +{ + EnableTextChangedEvents(false); g_signal_handlers_block_by_func(m_widget, (gpointer)gtkcombobox_changed_callback, this); @@ -234,11 +260,9 @@ void wxComboBox::DisableEvents() (gpointer)gtkcombobox_popupshown_callback, this); } -void wxComboBox::EnableEvents() +void wxComboBox::GTKEnableEvents() { - if ( GetEntry() ) - g_signal_handlers_unblock_by_func(GTK_BIN(m_widget)->child, - (gpointer)gtkcombobox_text_changed_callback, this); + EnableTextChangedEvents(true); g_signal_handlers_unblock_by_func(m_widget, (gpointer)gtkcombobox_changed_callback, this); @@ -253,14 +277,48 @@ 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)) { - 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) +{ + if ( HasFlag(wxCB_READONLY) ) + SetStringSelection(value); + else + 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); + } } // ---------------------------------------------------------------------------- @@ -346,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