]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/listbox.cpp
I debug DialogEd for five hours and then Karsten
[wxWidgets.git] / src / gtk / listbox.cpp
index 00cb2e6ba5044d58d4a64ce42fdc86fa38a209cf..fdd21a83ee8081060299261f9a25167403766594 100644 (file)
@@ -25,7 +25,7 @@
 extern bool   g_blockEventsOnDrag;
 
 //-----------------------------------------------------------------------------
-// wxListBox
+// "select" and "deselect"
 //-----------------------------------------------------------------------------
 
 static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox )
@@ -57,6 +57,8 @@ static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox
   if (event.m_commandString) delete[] event.m_commandString ;
 }
 
+//-----------------------------------------------------------------------------
+// wxListBox
 //-----------------------------------------------------------------------------
 
 IMPLEMENT_DYNAMIC_CLASS(wxListBox,wxControl)
@@ -83,11 +85,10 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
   
   m_list = GTK_LIST( gtk_list_new() );
   
-  // @@ what's the difference between BROWSE and SINGLE?
   GtkSelectionMode mode = GTK_SELECTION_BROWSE;
-  if ( style & wxLB_MULTIPLE )
+  if (style & wxLB_MULTIPLE)
     mode = GTK_SELECTION_MULTIPLE;
-  else if ( style & wxLB_EXTENDED )
+  else if (style & wxLB_EXTENDED)
     mode = GTK_SELECTION_EXTENDED;
 
   gtk_list_set_selection_mode( GTK_LIST(m_list), mode );
@@ -95,6 +96,11 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
   gtk_container_add (GTK_CONTAINER(m_widget), GTK_WIDGET(m_list) );
   gtk_widget_show( GTK_WIDGET(m_list) );
   
+  wxSize newSize = size;
+  if (newSize.x == -1) newSize.x = 100;
+  if (newSize.y == -1) newSize.y = 110;
+  SetSize( newSize.x, newSize.y );
+  
   for (int i = 0; i < n; i++)
   {
     GtkWidget *list_item;
@@ -105,7 +111,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
     gtk_signal_connect( GTK_OBJECT(list_item), "select", 
       GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this );
   
-    if ( style & wxLB_MULTIPLE )
+    if (style & wxLB_MULTIPLE)
       gtk_signal_connect( GTK_OBJECT(list_item), "deselect", 
         GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this );
   
@@ -130,21 +136,33 @@ void wxListBox::Append( const wxString &item )
 
 void wxListBox::Append( const wxString &item, char *clientData )
 {
-  GtkWidget *list_item;
-  list_item = gtk_list_item_new_with_label( item ); 
+  GtkWidget *list_item = gtk_list_item_new_with_label( item ); 
+  
+  if (m_hasOwnStyle)
+  {
+    GtkBin *bin = GTK_BIN( list_item );
+    gtk_widget_set_style( bin->child, 
+      gtk_style_ref(
+        gtk_widget_get_style( m_widget ) ) ); 
+  }
   
   gtk_signal_connect( GTK_OBJECT(list_item), "select", 
     GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this );
   
-  if ( GetWindowStyleFlag() & wxLB_MULTIPLE )
+  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_container_add( GTK_CONTAINER(m_list), list_item );
+  
   gtk_widget_show( list_item );
+  
+  ConnectWidget( list_item );
+  
+  ConnectDnDWidget( list_item );
+  
 }
 
 void wxListBox::Clear(void)
@@ -209,19 +227,14 @@ char *wxListBox::GetClientData( int n ) const
 
 int wxListBox::GetSelection(void) const
 {
-  GList *selection = m_list->selection;
-  if (selection)
+  GList *child = m_list->children;
+  int count = 0;
+  while (child)
   {
-    GList *child = m_list->children;
-    int count = 0;
-    while (child)
-    {
-      if (child->data == selection->data) return count;
-      count++;
-      child = child->next;
-    }
+    if (GTK_WIDGET(child->data)->state == GTK_STATE_SELECTED) return count;
+    count++;
+    child = child->next;
   }
-  wxFAIL_MSG("wrong listbox index");
   return -1;
 }
 
@@ -230,7 +243,8 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const
   // get the number of selected items first
   GList *child = m_list->children;
   int count = 0;
-  for ( child = m_list->children; child != NULL; child = child->next ) {
+  for ( child = m_list->children; child != NULL; child = child->next ) 
+  {
     if ( GTK_WIDGET(child->data)->state == GTK_STATE_SELECTED ) 
       count++;
   }
@@ -241,7 +255,8 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const
     // now fill the list
     aSelections.Alloc(count); // optimization attempt
     int i = 0;
-    for ( child = m_list->children; child != NULL; child = child->next, i++ ) {
+    for ( child = m_list->children; child != NULL; child = child->next, i++ ) 
+    {
       if ( GTK_WIDGET(child->data)->state == GTK_STATE_SELECTED ) 
         aSelections.Add(i);
     }
@@ -372,10 +387,43 @@ int wxListBox::GetIndex( GtkWidget *item ) const
   return -1;
 }
 
+void wxListBox::SetDropTarget( wxDropTarget *dropTarget )
+{
+  GList *child = m_list->children;
+  while (child)
+  {
+    DisconnectDnDWidget( GTK_WIDGET( child->data ) );
+    child = child->next;
+  }
+  
+  wxWindow::SetDropTarget( dropTarget  );
+  
+  child = m_list->children;
+  while (child)
+  {
+    ConnectDnDWidget( GTK_WIDGET( child->data ) );
+    child = child->next;
+  }
+}
+
 GtkWidget *wxListBox::GetConnectWidget(void)
 {
   return GTK_WIDGET(m_list);
 }
 
+void wxListBox::SetFont( const wxFont &font )
+{
+  wxWindow::SetFont( font );
+
+  GList *child = m_list->children;
+  while (child)
+  {
+    GtkBin *bin = (GtkBin*) child->data;
+    gtk_widget_set_style( bin->child, 
+      gtk_style_ref(
+        gtk_widget_get_style( m_widget ) ) ); 
+    child = child->next;
+  }
+}