]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/listbox.cpp
Include missing.h to find O_* flags.
[wxWidgets.git] / src / gtk / listbox.cpp
index 15c355869d815c2143e9df1f74a0cbd0825ca56e..37154d6edaf17c94dcc63c8d03043d189a416269 100644 (file)
@@ -223,6 +223,44 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis
     }
 #endif // wxUSE_CHECKLISTBOX
 
+    // Check or uncheck item with SPACE
+    if ((gdk_event->keyval == ' ') && (!ret) && 
+         (((listbox->GetWindowStyleFlag() & wxLB_MULTIPLE) != 0) ||
+          ((listbox->GetWindowStyleFlag() & wxLB_EXTENDED) != 0)) )
+    {
+        int sel = listbox->GtkGetIndex( widget );
+        
+        if (sel != -1)
+        {
+            ret = TRUE;
+            
+            if (listbox->IsSelected( sel ))
+                gtk_list_unselect_item( listbox->m_list, sel );
+            else
+                gtk_list_select_item( listbox->m_list, sel );
+            
+            wxCommandEvent new_event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() );
+            new_event.SetEventObject( listbox );
+            wxArrayInt aSelections;
+            int n, count = listbox->GetSelections(aSelections);
+            if ( count > 0 )
+            {
+                n = aSelections[0];
+                if ( listbox->HasClientObjectData() )
+                    new_event.SetClientObject( listbox->GetClientObject(n) );
+                else if ( listbox->HasClientUntypedData() )
+                    new_event.SetClientData( listbox->GetClientData(n) );
+                new_event.SetString( listbox->GetString(n) );
+            }
+            else
+            {
+                n = -1;
+            }
+            new_event.m_commandInt = n;
+            listbox->GetEventHandler()->ProcessEvent( new_event );
+        }
+    }
+    
     if (ret)
     {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "key_press_event" );
@@ -439,6 +477,8 @@ void wxListBox::DoInsertItems(const wxArrayString& items, int pos)
     wxASSERT_MSG( m_clientList.GetCount() == (size_t)GetCount(),
                   wxT("bug in client data management") );
 
+    InvalidateBestSize();
+
     GList *children = m_list->children;
     int length = g_list_length(children);
 
@@ -495,6 +535,8 @@ void wxListBox::DoInsertItems(const wxArrayString& items, int pos)
 
 int wxListBox::DoAppend( const wxString& item )
 {
+    InvalidateBestSize();
+
     if (m_strings)
     {
         // need to determine the index
@@ -574,21 +616,21 @@ void wxListBox::GtkAddItem( const wxString &item, int pos )
         gtk_widget_realize( list_item );
         gtk_widget_realize( GTK_BIN(list_item)->child );
 
-        // Apply current widget style to the new list_item
-        GtkRcStyle *style = CreateWidgetStyle();
-        if (style)
-        {
-            gtk_widget_modify_style( GTK_WIDGET( list_item ), style );
-            GtkBin *bin = GTK_BIN( list_item );
-            GtkWidget *label = GTK_WIDGET( bin->child );
-            gtk_widget_modify_style( label, style );
-            gtk_rc_style_unref( style );
-        }
-
 #if wxUSE_TOOLTIPS
         if (m_tooltip) m_tooltip->Apply( this );
 #endif
     }
+
+    // Apply current widget style to the new list_item
+    GtkRcStyle *style = CreateWidgetStyle();
+    if (style)
+    {
+        gtk_widget_modify_style( GTK_WIDGET( list_item ), style );
+        GtkBin *bin = GTK_BIN( list_item );
+        GtkWidget *label = GTK_WIDGET( bin->child );
+        gtk_widget_modify_style( label, style );
+        gtk_rc_style_unref( style );
+    }
 }
 
 void wxListBox::DoSetItems( const wxArrayString& items,
@@ -963,11 +1005,15 @@ void wxListBox::ApplyToolTip( GtkTooltips *tips, const wxChar *tip )
 
 GtkWidget *wxListBox::GetConnectWidget()
 {
-    return GTK_WIDGET(m_list);
+    // return GTK_WIDGET(m_list);
+    return m_widget;
 }
 
 bool wxListBox::IsOwnGtkWindow( GdkWindow *window )
 {
+    return TRUE;
+
+#if 0    
     if (m_widget->window == window) return TRUE;
 
     if (GTK_WIDGET(m_list)->window == window) return TRUE;
@@ -981,6 +1027,7 @@ bool wxListBox::IsOwnGtkWindow( GdkWindow *window )
     }
 
     return FALSE;
+#endif
 }
 
 void wxListBox::DoApplyWidgetStyle(GtkRcStyle *style)
@@ -1076,7 +1123,9 @@ wxSize wxListBox::DoGetBestSize() const
     // make it too small neither
     lbHeight = (cy+4) * wxMin(wxMax(GetCount(), 3), 10);
 
-    return wxSize(lbWidth, lbHeight);
+    wxSize best(lbWidth, lbHeight);
+    CacheBestSize(best);        
+    return best;
 }
 
 void wxListBox::FixUpMouseEvent(GtkWidget *widget, wxCoord& x, wxCoord& y)