X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f90fbcc192ed20ef078872f80353a98a3faeadaa..67e49a98bbba6793cf1e344477bee9e46d4d5c71:/src/gtk/listbox.cpp diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index 14dd4558ae..9339a6dedf 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -51,10 +51,8 @@ extern bool g_isIdle; #if wxUSE_CHECKLISTBOX -#define CHECKBOX_STRING "[-] " - // checklistboxes have "[±] " prepended to their lables, this macro removes it -// (NB: 4 below is the length of CHECKBOX_STRING above) +// (NB: 4 below is the length of wxCHECKLBOX_STRING above) // // the argument to it is a "const char *" pointer #define GET_REAL_LABEL(label) ((m_hasCheckBoxes)?(label)+4 : (label)) @@ -251,14 +249,19 @@ 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_select_cb( GtkWidget *widget, wxListBox *listbox, bool is_selection ); + +static void gtk_listitem_select_callback( GtkWidget *widget, wxListBox *listbox ) +{ + gtk_listitem_select_cb( widget, listbox, TRUE ); +} static void gtk_listitem_deselect_callback( GtkWidget *widget, wxListBox *listbox ) { - gtk_listitem_select_callback( widget, listbox ); + gtk_listitem_select_cb( widget, listbox, FALSE ); } -static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox ) +static void gtk_listitem_select_cb( GtkWidget *widget, wxListBox *listbox, bool is_selection ) { if (g_isIdle) wxapp_install_idle_handler(); @@ -267,6 +270,19 @@ static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); event.SetEventObject( listbox ); +// MSW doesn't do that either +// event.SetExtraLong( (long) is_selection ); + + + if ((listbox->GetWindowStyleFlag() & wxLB_SINGLE) != 0) + { + int sel = listbox->GtkGetIndex( widget ); + + if (listbox->m_prevSelection != sel) + gtk_list_unselect_item( listbox->m_list, listbox->m_prevSelection ); + + listbox->m_prevSelection = sel; + } wxArrayInt aSelections; int n, count = listbox->GetSelections(aSelections); @@ -286,8 +302,9 @@ static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox event.m_commandInt = n; - listbox->GetEventHandler()->AddPendingEvent( event ); -// listbox->GetEventHandler()->ProcessEvent( event ); +// No longer required with new code in wxLB_SINGLE +// listbox->GetEventHandler()->AddPendingEvent( event ); + listbox->GetEventHandler()->ProcessEvent( event ); } //----------------------------------------------------------------------------- @@ -316,6 +333,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, { m_needParent = TRUE; m_acceptsFocus = TRUE; + m_prevSelection = 0; // or -1 ?? if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator, name )) @@ -351,7 +369,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, { // if style was 0 set single mode m_windowStyle |= wxLB_SINGLE; - mode = GTK_SELECTION_BROWSE; + mode = GTK_SELECTION_MULTIPLE; } gtk_list_set_selection_mode( GTK_LIST(m_list), mode ); @@ -370,7 +388,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, gtk_widget_show( GTK_WIDGET(m_list) ); - SetSizeOrDefault( size ); + SetBestSize( size ); if ( style & wxLB_SORT ) { @@ -430,24 +448,47 @@ void wxListBox::DoInsertItems(const wxArrayString& items, int pos) wxCHECK_RET( pos <= length, wxT("invalid index in wxListBox::InsertItems") ); size_t nItems = items.GetCount(); + int index; - if (pos == length) + if (m_strings) { - for ( size_t n = 0; n < nItems; n++ ) + for (size_t n = 0; n < nItems; n++) { - GtkAddItem( items[n] ); - - m_clientList.Append((wxObject *)NULL); + index = m_strings->Add( items[n] ); + + if (index != GetCount()) + { + GtkAddItem( items[n], index ); + wxNode *node = m_clientList.Nth( index ); + m_clientList.Insert( node, (wxObject*) NULL ); + } + else + { + GtkAddItem( items[n] ); + m_clientList.Append( (wxObject*) NULL ); + } } } else { - wxNode *node = m_clientList.Nth( pos ); - for ( size_t n = 0; n < nItems; n++ ) + if (pos == length) { - GtkAddItem( items[n], pos+n ); + for ( size_t n = 0; n < nItems; n++ ) + { + GtkAddItem( items[n] ); - m_clientList.Insert( node, (wxObject *)NULL ); + m_clientList.Append((wxObject *)NULL); + } + } + else + { + wxNode *node = m_clientList.Nth( pos ); + for ( size_t n = 0; n < nItems; n++ ) + { + GtkAddItem( items[n], pos+n ); + + m_clientList.Insert( node, (wxObject *)NULL ); + } } } @@ -491,7 +532,7 @@ void wxListBox::GtkAddItem( const wxString &item, int pos ) #if wxUSE_CHECKLISTBOX if (m_hasCheckBoxes) { - label.Prepend(CHECKBOX_STRING); + label.Prepend(wxCHECKLBOX_STRING); } #endif // wxUSE_CHECKLISTBOX @@ -508,7 +549,7 @@ void wxListBox::GtkAddItem( const wxString &item, int pos ) gtk_signal_connect( GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); - if (HasFlag(wxLB_MULTIPLE)) + if (HasFlag(wxLB_MULTIPLE) || HasFlag(wxLB_EXTENDED)) gtk_signal_connect( GTK_OBJECT(list_item), "deselect", GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); @@ -620,7 +661,7 @@ void wxListBox::Clear() { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); - gtk_list_clear_items( m_list, 0, Number() ); + gtk_list_clear_items( m_list, 0, GetCount() ); if ( HasClientObjectData() ) { @@ -655,7 +696,7 @@ void wxListBox::Delete( int n ) wxNode *node = m_clientList.Nth( n ); if ( node ) { - if ( m_clientDataItemsType == ClientData_Object ) + if ( m_clientDataItemsType == wxClientData_Object ) { wxClientData *cd = (wxClientData*)node->Data(); delete cd; @@ -685,7 +726,7 @@ void wxListBox::SetString( int n, const wxString &string ) wxString str; #if wxUSE_CHECKLISTBOX if (m_hasCheckBoxes) - str += CHECKBOX_STRING; + str += wxCHECKLBOX_STRING; #endif // wxUSE_CHECKLISTBOX str += string; @@ -817,7 +858,12 @@ void wxListBox::SetSelection( int n, bool select ) GtkDisableEvents(); if (select) + { + if ((m_windowStyle & wxLB_SINGLE) != 0) + gtk_list_unselect_item( m_list, m_prevSelection ); gtk_list_select_item( m_list, n ); + m_prevSelection = n; + } else gtk_list_unselect_item( m_list, n ); @@ -901,7 +947,7 @@ void wxListBox::GtkDisableEvents() gtk_signal_disconnect_by_func( GTK_OBJECT(child->data), GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); - if (HasFlag(wxLB_MULTIPLE)) + if (HasFlag(wxLB_MULTIPLE) || HasFlag(wxLB_EXTENDED)) gtk_signal_disconnect_by_func( GTK_OBJECT(child->data), GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); @@ -917,7 +963,7 @@ void wxListBox::GtkEnableEvents() gtk_signal_connect( GTK_OBJECT(child->data), "select", GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); - if (HasFlag(wxLB_MULTIPLE)) + if (HasFlag(wxLB_MULTIPLE) || HasFlag(wxLB_EXTENDED)) gtk_signal_connect( GTK_OBJECT(child->data), "deselect", GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this );