+ wxCHECK_RET( m_list != NULL, wxT("invalid listbox") );
+
+ gtk_list_clear_items( m_list, 0, GetCount() );
+
+ if ( GTK_LIST(m_list)->last_focus_child != NULL )
+ {
+ // This should be NULL, I think.
+ GTK_LIST(m_list)->last_focus_child = NULL;
+ }
+
+ if ( HasClientObjectData() )
+ {
+ // destroy the data (due to Robert's idea of using wxList<wxObject>
+ // and not wxList<wxClientData> we can't just say
+ // m_clientList.DeleteContents(TRUE) - this would crash!
+ wxList::compatibility_iterator node = m_clientList.GetFirst();
+ while ( node )
+ {
+ delete (wxClientData *)node->GetData();
+ node = node->GetNext();
+ }
+ }
+ m_clientList.Clear();
+
+ if ( m_strings )
+ m_strings->Clear();
+}
+
+void wxListBox::Delete( int n )
+{
+ wxCHECK_RET( m_list != NULL, wxT("invalid listbox") );
+
+ GList *child = g_list_nth( m_list->children, n );
+
+ wxCHECK_RET( child, wxT("wrong listbox index") );
+
+ GList *list = g_list_append( (GList*) NULL, child->data );
+ gtk_list_remove_items( m_list, list );
+ g_list_free( list );
+
+ wxList::compatibility_iterator node = m_clientList.Item( n );
+ if ( node )
+ {
+ if ( m_clientDataItemsType == wxClientData_Object )
+ {
+ wxClientData *cd = (wxClientData*)node->GetData();
+ delete cd;
+ }
+
+ m_clientList.Erase( node );
+ }
+
+ if ( m_strings )
+ m_strings->RemoveAt(n);
+}
+
+// ----------------------------------------------------------------------------
+// client data
+// ----------------------------------------------------------------------------
+
+void wxListBox::DoSetItemClientData( int n, void* clientData )
+{
+ wxCHECK_RET( m_widget != NULL, wxT("invalid listbox control") );
+
+ wxList::compatibility_iterator node = m_clientList.Item( n );
+ wxCHECK_RET( node, wxT("invalid index in wxListBox::DoSetItemClientData") );
+
+ node->SetData( (wxObject*) clientData );
+}
+
+void* wxListBox::DoGetItemClientData( int n ) const
+{
+ wxCHECK_MSG( m_widget != NULL, NULL, wxT("invalid listbox control") );
+
+ wxList::compatibility_iterator node = m_clientList.Item( n );
+ wxCHECK_MSG( node, NULL, wxT("invalid index in wxListBox::DoGetItemClientData") );
+
+ return node->GetData();
+}
+
+void wxListBox::DoSetItemClientObject( int n, wxClientData* clientData )
+{
+ wxCHECK_RET( m_widget != NULL, wxT("invalid listbox control") );
+
+ wxList::compatibility_iterator node = m_clientList.Item( n );
+ wxCHECK_RET( node, wxT("invalid index in wxListBox::DoSetItemClientObject") );
+
+ // wxItemContainer already deletes data for us
+
+ node->SetData( (wxObject*) clientData );
+}
+
+wxClientData* wxListBox::DoGetItemClientObject( int n ) const
+{
+ wxCHECK_MSG( m_widget != NULL, (wxClientData*) NULL, wxT("invalid listbox control") );
+
+ wxList::compatibility_iterator node = m_clientList.Item( n );
+ wxCHECK_MSG( node, (wxClientData *)NULL,
+ wxT("invalid index in wxListBox::DoGetItemClientObject") );
+
+ return (wxClientData*) node->GetData();
+}
+
+// ----------------------------------------------------------------------------
+// string list access
+// ----------------------------------------------------------------------------
+
+wxString wxListBox::GetRealLabel(GList *item) const
+{
+ GtkBin *bin = GTK_BIN( item->data );