X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce4169a4d129fc6cd165b2e9ccc5cf5d48356020..93c95e18f416c25995bf84843694c30a488499c6:/src/gtk1/listbox.cpp diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index 4c496c67a0..fe31b2e16d 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -193,6 +193,13 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis // "select" and "deselect" //----------------------------------------------------------------------------- +static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox ); + +static void gtk_listitem_deselect_callback( GtkWidget *widget, wxListBox *listbox ) +{ + gtk_listitem_select_callback( widget, listbox ); +} + static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox ) { if (g_isIdle) wxapp_install_idle_handler(); @@ -244,11 +251,12 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, m_needParent = TRUE; m_acceptsFocus = TRUE; - PreCreation( parent, id, pos, size, style, name ); - -#if wxUSE_VALIDATORS - SetValidator( validator ); -#endif + if (!PreCreation( parent, pos, size ) || + !CreateBase( parent, id, pos, size, style, validator, name )) + { + wxFAIL_MSG( _T("wxListBox creation failed") ); + return FALSE; + } m_widget = gtk_scrolled_window_new( (GtkAdjustment*) NULL, (GtkAdjustment*) NULL ); if (style & wxLB_ALWAYS_SB) @@ -309,7 +317,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, if (style & wxLB_MULTIPLE) gtk_signal_connect( GTK_OBJECT(list_item), "deselect", - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); gtk_signal_connect( GTK_OBJECT(list_item), "button_press_event", @@ -479,7 +487,7 @@ void wxListBox::AppendCommon( const wxString &item ) if (HasFlag(wxLB_MULTIPLE)) gtk_signal_connect( GTK_OBJECT(list_item), "deselect", - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); gtk_signal_connect( GTK_OBJECT(list_item), "button_press_event", @@ -640,7 +648,11 @@ void wxListBox::Deselect( int n ) { wxCHECK_RET( m_list != NULL, _T("invalid listbox") ); + DisableEvents(); + gtk_list_unselect_item( m_list, n ); + + EnableEvents(); } int wxListBox::FindString( const wxString &item ) const @@ -799,10 +811,14 @@ void wxListBox::SetSelection( int n, bool select ) { wxCHECK_RET( m_list != NULL, _T("invalid listbox") ); + DisableEvents(); + if (select) gtk_list_select_item( m_list, n ); else gtk_list_unselect_item( m_list, n ); + + EnableEvents(); } void wxListBox::SetString( int n, const wxString &string ) @@ -859,7 +875,7 @@ void wxListBox::ApplyToolTip( GtkTooltips *tips, const wxChar *tip ) GList *child = m_list->children; while (child) { - gtk_tooltips_set_tip( tips, GTK_WIDGET( child->data ), wxConvLocal.cWX2MB(tip), (gchar*) NULL ); + gtk_tooltips_set_tip( tips, GTK_WIDGET( child->data ), wxConvCurrent->cWX2MB(tip), (gchar*) NULL ); child = child->next; } } @@ -898,6 +914,38 @@ void wxListBox::SetDropTarget( wxDropTarget *dropTarget ) } #endif +void wxListBox::DisableEvents() +{ + GList *child = m_list->children; + while (child) + { + gtk_signal_disconnect_by_func( GTK_OBJECT(child->data), + GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + + if (HasFlag(wxLB_MULTIPLE)) + gtk_signal_disconnect_by_func( GTK_OBJECT(child->data), + GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); + + child = child->next; + } +} + +void wxListBox::EnableEvents() +{ + GList *child = m_list->children; + while (child) + { + gtk_signal_connect( GTK_OBJECT(child->data), "select", + GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + + if (HasFlag(wxLB_MULTIPLE)) + gtk_signal_connect( GTK_OBJECT(child->data), "deselect", + GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); + + child = child->next; + } +} + GtkWidget *wxListBox::GetConnectWidget() { return GTK_WIDGET(m_list);