X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e2414cbe8c21931afbb590132232553514da824c..3b8b23873a175edc3065f67a1865b7808dd6f80d:/src/gtk1/listbox.cpp diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index aca4762937..c8a8bea0d7 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -5,7 +5,7 @@ // Created: 01/02/97 // Id: // Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -15,27 +15,46 @@ #include "wx/dynarray.h" #include "wx/listbox.h" +#include "wx/utils.h" +#include + +//----------------------------------------------------------------------------- +// data +//----------------------------------------------------------------------------- + +extern bool g_blockEventsOnDrag; //----------------------------------------------------------------------------- // wxListBox //----------------------------------------------------------------------------- -void gtk_listitem_select_callback( GtkWidget *widget, gpointer data ) +static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox ) { - wxListBox *listbox = (wxListBox*)data; - - wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); + if (!listbox->HasVMT()) return; + if (g_blockEventsOnDrag) return; - event.SetInt( listbox->GetIndex( widget ) ); - - GtkBin *bin = GTK_BIN( widget ); - GtkLabel *label = GTK_LABEL( bin->child ); - wxString tmp( label->label ); - event.SetString( WXSTRINGCAST(tmp) ); + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); + wxArrayInt aSelections; + int count = listbox->GetSelections(aSelections); + if ( count > 0 ) + { + event.m_commandInt = aSelections[0] ; + event.m_clientData = listbox->GetClientData(event.m_commandInt); + wxString str(listbox->GetString(event.m_commandInt)); + if (str != "") + event.m_commandString = copystring((char *)(const char *)str); + } + else + { + event.m_commandInt = -1 ; + event.m_commandString = copystring("") ; + } + event.SetEventObject( listbox ); - - listbox->ProcessEvent( event ); + + listbox->GetEventHandler()->ProcessEvent( event ); + if (event.m_commandString) delete[] event.m_commandString ; }; //----------------------------------------------------------------------------- @@ -87,11 +106,15 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, GtkWidget *list_item; list_item = gtk_list_item_new_with_label( choices[i] ); + gtk_container_add( GTK_CONTAINER(m_list), list_item ); + gtk_signal_connect( GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); - gtk_container_add( GTK_CONTAINER(m_list), list_item ); - + if ( style & wxLB_MULTIPLE ) + gtk_signal_connect( GTK_OBJECT(list_item), "deselect", + GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + m_clientData.Append( (wxObject*)NULL ); gtk_widget_show( list_item ); @@ -99,6 +122,8 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, PostCreation(); + gtk_widget_realize( GTK_WIDGET(m_list) ); + Show( TRUE ); return TRUE; @@ -106,17 +131,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, void wxListBox::Append( const wxString &item ) { - GtkWidget *list_item; - list_item = gtk_list_item_new_with_label( item ); - - gtk_signal_connect( GTK_OBJECT(list_item), "select", - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); - - gtk_container_add( GTK_CONTAINER(m_list), list_item ); - - m_clientData.Append( (wxObject*)NULL ); - - gtk_widget_show( list_item ); + Append( item, (char*)NULL ); }; void wxListBox::Append( const wxString &item, char *clientData ) @@ -124,9 +139,13 @@ void wxListBox::Append( const wxString &item, char *clientData ) GtkWidget *list_item; list_item = gtk_list_item_new_with_label( item ); - gtk_signal_connect( GTK_OBJECT(list_item), "select", + gtk_signal_connect( GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + if ( GetWindowStyleFlag() & wxLB_MULTIPLE ) + gtk_signal_connect( GTK_OBJECT(list_item), "deselect", + GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + gtk_container_add( GTK_CONTAINER(m_list), list_item ); m_clientData.Append( (wxObject*)clientData ); @@ -296,8 +315,15 @@ void wxListBox::SetSelection( int n, bool select ) gtk_list_unselect_item( m_list, n ); }; -void wxListBox::SetString( int WXUNUSED(n), const wxString &WXUNUSED(string) ) +void wxListBox::SetString( int n, const wxString &string ) { + GList *child = g_list_nth( m_list->children, n ); + if (child) + { + GtkBin *bin = GTK_BIN( child->data ); + GtkLabel *label = GTK_LABEL( bin->child ); + gtk_label_set( label, string ); + }; }; void wxListBox::SetStringSelection( const wxString &string, bool select ) @@ -321,4 +347,10 @@ int wxListBox::GetIndex( GtkWidget *item ) const return -1; }; +GtkWidget *wxListBox::GetConnectWidget(void) +{ + return GTK_WIDGET(m_list); +}; + +