X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3502e687e29f46c747be16a58d39fe79e7b1c7bc..b58197f24a87e0dc81ba0bdd4fc1370470a5ae2f:/src/gtk1/listbox.cpp diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index 5028599776..818775ee73 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -33,11 +33,21 @@ // conditional compilation //------------------------------------------------------------------------- -#if (GTK_MINOR_VERSION == 1) -#if (GTK_MICRO_VERSION >= 5) +#if (GTK_MINOR_VERSION > 0) #define NEW_GTK_SCROLL_CODE #endif -#endif + +//----------------------------------------------------------------------------- +// private functions +//----------------------------------------------------------------------------- + +#define CHECKBOX_STRING "[-] " + +// checklistboxes have "[±] " prepended to their lables, this macro removes it +// (NB: 4 below is the length of CHECKBOX_STRING above) +// +// the argument to it is a "const char *" pointer +#define GET_REAL_LABEL(label) ((m_hasCheckBoxes)?(label)+4 : (label)) //----------------------------------------------------------------------------- // data @@ -84,17 +94,16 @@ gtk_listbox_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, 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); + if (!str.IsEmpty()) event.m_commandString = str; } else { event.m_commandInt = -1 ; - event.m_commandString = copystring("") ; + event.m_commandString.Empty(); } listbox->GetEventHandler()->ProcessEvent( event ); - if (event.m_commandString) delete[] event.m_commandString ; } return FALSE; @@ -145,18 +154,17 @@ static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox 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); + if (!str.IsEmpty()) event.m_commandString = str; } else { event.m_commandInt = -1 ; - event.m_commandString = copystring("") ; + event.m_commandString.Empty(); } event.SetEventObject( listbox ); listbox->GetEventHandler()->ProcessEvent( event ); - if (event.m_commandString) delete[] event.m_commandString ; } //----------------------------------------------------------------------------- @@ -214,7 +222,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, debug_focus_in( s_window->vscrollbar, "wxWindow::vsrcollbar", name ); #ifdef NEW_GTK_SCROLL_CODE - GtkViewport *viewport = GTK_VIEWPORT(s_window->child); + GtkViewport *viewport = GTK_VIEWPORT( GTK_BIN(s_window)->child ); #else GtkViewport *viewport = GTK_VIEWPORT(s_window->viewport); #endif @@ -236,17 +244,14 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, GtkWidget *list_item; + wxString str(choices[i]); if (m_hasCheckBoxes) { - wxString str = "[-] "; - str += choices[i]; - list_item = gtk_list_item_new_with_label( str ); - } - else - { - list_item = gtk_list_item_new_with_label( choices[i] ); + str.Prepend(CHECKBOX_STRING); } + list_item = gtk_list_item_new_with_label( str ); + #ifdef __WXDEBUG__ debug_focus_in( list_item, "wxListBox::list_item", name ); #endif @@ -288,6 +293,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, SetBackgroundColour( parent->GetBackgroundColour() ); SetForegroundColour( parent->GetForegroundColour() ); + SetFont( parent->GetFont() ); Show( TRUE ); @@ -299,23 +305,118 @@ wxListBox::~wxListBox() Clear(); } +void wxListBox::InsertItems(int nItems, const wxString items[], int pos) +{ + wxCHECK_RET( m_list != NULL, "invalid listbox" ); + + GList *children = m_list->children; + int length = g_list_length(children); + wxCHECK_RET( pos <= length, "invalid index in wxListBox::InsertItems" ); + + // VZ: it seems that GTK 1.0.6 doesn't has a function to insert an item + // into a listbox at the given position, this is why we first delete + // all items after this position, then append these items and then + // reappend back the old ones. + + // first detach the old items + int n; // loop var + + if ( pos == length ) + { + // no need to do anything complicated + for ( n = 0; n < nItems; n++ ) + { + Append(items[n]); + } + + return; + } + + wxArrayString deletedLabels; + wxArrayPtrVoid deletedData; + wxArrayInt deletedChecks; // only for check list boxes + + GList *child = g_list_nth( children, pos ); + for ( n = 0; child != NULL; n++, child = child->next ) + { + // save label + GtkBin *bin = GTK_BIN( child->data ); + GtkLabel *label = GTK_LABEL( bin->child ); + + wxString str(GET_REAL_LABEL(label->label)); + deletedLabels.Add(str); + + // save data + void *clientData = NULL; + wxNode *node = NULL; + + if ( n < (int)m_clientObjectList.GetCount() ) + node = m_clientObjectList.Nth( n ); + + if ( node ) + { + clientData = node->GetData(); + m_clientObjectList.DeleteNode( node ); + } + + if ( !clientData ) + { + if ( n < (int)m_clientDataList.GetCount() ) + node = m_clientDataList.Nth( n ); + + if ( node ) + { + clientData = node->GetData(); + node = m_clientDataList.Nth( n ); + } + } + + deletedData.Add(clientData); + + // save check state + if ( m_hasCheckBoxes ) + { + deletedChecks.Add(((wxCheckListBox *)this)->IsChecked(pos + n)); + } + } + + int nDeletedCount = n; + + gtk_list_clear_items( m_list, pos, length ); + + // now append the new items + for ( n = 0; n < nItems; n++ ) + { + Append(items[n]); + } + + // and append the old items too + pos += nItems; // now the indices are shifter + for ( n = 0; n < nDeletedCount; n++ ) + { + Append(deletedLabels[n], deletedData[n]); + + if ( m_hasCheckBoxes ) + { + ((wxCheckListBox *)this)->Check(pos + n, (bool)deletedChecks[n]); + } + } +} + void wxListBox::AppendCommon( const wxString &item ) { wxCHECK_RET( m_list != NULL, "invalid listbox" ); GtkWidget *list_item; + wxString label(item); if (m_hasCheckBoxes) { - wxString str = "[-] "; - str += item; - list_item = gtk_list_item_new_with_label( str ); - } - else - { - list_item = gtk_list_item_new_with_label( item ); + label.Prepend(CHECKBOX_STRING); } + list_item = gtk_list_item_new_with_label( label ); + gtk_container_add( GTK_CONTAINER(m_list), list_item ); gtk_signal_connect( GTK_OBJECT(list_item), "select", @@ -335,9 +436,9 @@ void wxListBox::AppendCommon( const wxString &item ) if (m_hasCheckBoxes) { gtk_signal_connect( GTK_OBJECT(list_item), - "key_press_event", - (GtkSignalFunc)gtk_listbox_key_press_callback, - (gpointer)this ); + "key_press_event", + (GtkSignalFunc)gtk_listbox_key_press_callback, + (gpointer)this ); } gtk_widget_show( list_item ); @@ -485,10 +586,10 @@ int wxListBox::FindString( const wxString &item ) const GtkBin *bin = GTK_BIN( child->data ); GtkLabel *label = GTK_LABEL( bin->child ); - wxString str = label->label; - if (m_hasCheckBoxes) str.Remove( 0, 4 ); + wxString str = GET_REAL_LABEL(label->label); - if (str == item) return count; + if (str == item) + return count; count++; child = child->next; @@ -554,12 +655,13 @@ wxString wxListBox::GetString( int n ) const GtkBin *bin = GTK_BIN( child->data ); GtkLabel *label = GTK_LABEL( bin->child ); - wxString str = label->label; - if (m_hasCheckBoxes) str.Remove( 0, 4 ); + wxString str = GET_REAL_LABEL(label->label); return str; } + wxFAIL_MSG("wrong listbox index"); + return ""; } @@ -573,8 +675,7 @@ wxString wxListBox::GetStringSelection() const GtkBin *bin = GTK_BIN( selection->data ); GtkLabel *label = GTK_LABEL( bin->child ); - wxString str = label->label; - if (m_hasCheckBoxes) str.Remove( 0, 4 ); + wxString str = GET_REAL_LABEL(label->label); return str; } @@ -647,7 +748,8 @@ void wxListBox::SetString( int n, const wxString &string ) GtkLabel *label = GTK_LABEL( bin->child ); wxString str; - if (m_hasCheckBoxes) str += "[-] "; + if (m_hasCheckBoxes) + str += CHECKBOX_STRING; str += string; gtk_label_set( label, str );