+ list_item = gtk_list_item_new_with_label( str.mbc_str() );
+
+ 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 );
+
+ if (style & wxLB_MULTIPLE)
+ gtk_signal_connect( GTK_OBJECT(list_item), "deselect",
+ GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this );
+
+ gtk_signal_connect( GTK_OBJECT(list_item),
+ "button_press_event",
+ (GtkSignalFunc)gtk_listbox_button_press_callback,
+ (gpointer) this );
+
+ gtk_signal_connect_after( GTK_OBJECT(list_item),
+ "button_release_event",
+ (GtkSignalFunc)gtk_listbox_button_release_callback,
+ (gpointer) this );
+
+#if wxUSE_CHECKLISTBOX
+ if (m_hasCheckBoxes)
+ {
+ gtk_signal_connect( GTK_OBJECT(list_item),
+ "key_press_event",
+ (GtkSignalFunc)gtk_listbox_key_press_callback,
+ (gpointer)this );
+ }
+#endif // wxUSE_CHECKLISTBOX
+
+ ConnectWidget( list_item );
+
+ gtk_widget_show( list_item );
+ }
+
+ m_parent->DoAddChild( this );
+
+ PostCreation();
+
+ SetBackgroundColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_WINDOW ) );
+ SetForegroundColour( parent->GetForegroundColour() );
+ SetFont( parent->GetFont() );
+
+ Show( TRUE );
+
+ return TRUE;
+}
+
+wxListBox::~wxListBox()
+{
+ Clear();
+}
+
+void wxListBox::InsertItems(int nItems, const wxString items[], int pos)
+{
+ wxCHECK_RET( m_list != NULL, _T("invalid listbox") );
+
+ GList *children = m_list->children;
+ int length = g_list_length(children);
+ wxCHECK_RET( pos <= length, _T("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),*wxConvCurrent);
+ 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);
+
+#if wxUSE_CHECKLISTBOX
+ // save check state
+ if ( m_hasCheckBoxes )
+ {
+ deletedChecks.Add(((wxCheckListBox *)this)->IsChecked(pos + n));
+ }
+#endif // wxUSE_CHECKLISTBOX
+ }
+
+ 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 wxUSE_CHECKLISTBOX
+ if ( m_hasCheckBoxes )
+ {
+ ((wxCheckListBox *)this)->Check(pos + n, (bool)deletedChecks[n]);
+ }
+#endif // wxUSE_CHECKLISTBOX
+ }
+}
+
+void wxListBox::AppendCommon( const wxString &item )
+{
+ wxCHECK_RET( m_list != NULL, _T("invalid listbox") );