X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/47908e25f992135fbc8c9573870784c62654e9e9..8b21b87fe330378e8bc448eee2494e3dd2c97a37:/src/gtk1/listbox.cpp diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index 359adda8d0..e149810090 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,25 +15,47 @@ #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, wxListBox *listbox ) +static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox ) { - wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); + if (!listbox->HasVMT()) return; + if (g_blockEventsOnDrag) return; - event.SetInt( listbox->GetIndex( widget ) ); + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); - GtkBin *bin = GTK_BIN( widget ); - GtkLabel *label = GTK_LABEL( bin->child ); - wxString tmp( label->label ); - event.SetString( WXSTRINGCAST(tmp) ); + 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->GetEventHandler()->ProcessEvent( event ); -}; + if (event.m_commandString) delete[] event.m_commandString ; +} //----------------------------------------------------------------------------- @@ -42,25 +64,19 @@ IMPLEMENT_DYNAMIC_CLASS(wxListBox,wxControl) wxListBox::wxListBox(void) { m_list = NULL; -}; - -wxListBox::wxListBox( wxWindow *parent, wxWindowID id, - const wxPoint &pos, const wxSize &size, - int n, const wxString choices[], - long style, const wxString &name ) -{ - Create( parent, id, pos, size, n, choices, style, name ); -}; +} bool wxListBox::Create( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int n, const wxString choices[], - long style, const wxString &name ) + long style, const wxValidator& validator, const wxString &name ) { m_needParent = TRUE; PreCreation( parent, id, pos, size, style, name ); + SetValidator( validator ); + m_widget = gtk_scrolled_window_new( NULL, NULL ); gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(m_widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); @@ -84,15 +100,19 @@ 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 ); - }; + } PostCreation(); @@ -101,44 +121,38 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, Show( TRUE ); return TRUE; -}; +} 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 ) { 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 ); gtk_widget_show( list_item ); -}; +} void wxListBox::Clear(void) { gtk_list_clear_items( m_list, 0, Number() ); m_clientData.Clear(); -}; +} void wxListBox::Delete( int n ) { @@ -151,12 +165,12 @@ void wxListBox::Delete( int n ) } else m_clientData.DeleteNode( node ); -}; +} void wxListBox::Deselect( int n ) { gtk_list_unselect_item( m_list, n ); -}; +} int wxListBox::FindString( const wxString &item ) const { @@ -169,16 +183,16 @@ int wxListBox::FindString( const wxString &item ) const if (item == label->label) return count; count++; child = child->next; - }; + } return -1; -}; +} char *wxListBox::GetClientData( int n ) const { wxNode *node = m_clientData.Nth( n ); if (node) return ((char*)node->Data()); return NULL; -}; +} int wxListBox::GetSelection(void) const { @@ -192,10 +206,10 @@ int wxListBox::GetSelection(void) const if (child->data == selection->data) return count; count++; child = child->next; - }; - }; + } + } return -1; -}; +} int wxListBox::GetSelections(wxArrayInt& aSelections) const { @@ -220,7 +234,7 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const } return count; -}; +} wxString wxListBox::GetString( int n ) const { @@ -230,9 +244,9 @@ wxString wxListBox::GetString( int n ) const GtkBin *bin = GTK_BIN( child->data ); GtkLabel *label = GTK_LABEL( bin->child ); return label->label; - }; + } return ""; -}; +} wxString wxListBox::GetStringSelection(void) const { @@ -242,17 +256,17 @@ wxString wxListBox::GetStringSelection(void) const GtkBin *bin = GTK_BIN( selection->data ); wxString tmp = GTK_LABEL( bin->child )->label; return tmp; - }; + } return ""; -}; +} int wxListBox::Number(void) { GList *child = m_list->children; int count = 0; - while (child) { count++; child = child->next; }; + while (child) { count++; child = child->next; } return count; -}; +} bool wxListBox::Selected( int n ) { @@ -264,28 +278,28 @@ bool wxListBox::Selected( int n ) { if (child->data == target->data) return TRUE; child = child->next; - }; - }; + } + } return FALSE; -}; +} void wxListBox::Set( int WXUNUSED(n), const wxString *WXUNUSED(choices) ) { -}; +} void wxListBox::SetClientData( int n, char *clientData ) { wxNode *node = m_clientData.Nth( n ); if (node) node->SetData( (wxObject*)clientData ); -}; +} void wxListBox::SetFirstItem( int WXUNUSED(n) ) { -}; +} void wxListBox::SetFirstItem( const wxString &WXUNUSED(item) ) { -}; +} void wxListBox::SetSelection( int n, bool select ) { @@ -293,16 +307,23 @@ void wxListBox::SetSelection( int n, bool select ) gtk_list_select_item( m_list, n ); else 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 ) { SetSelection( FindString(string), select ); -}; +} int wxListBox::GetIndex( GtkWidget *item ) const { @@ -315,15 +336,15 @@ int wxListBox::GetIndex( GtkWidget *item ) const if (GTK_WIDGET(child->data) == item) return count; count++; child = child->next; - }; - }; + } + } return -1; -}; +} -GtkWidget *wxListBox::GetDropTargetWidget(void) +GtkWidget *wxListBox::GetConnectWidget(void) { return GTK_WIDGET(m_list); -}; +}