]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/listbox.cpp
filter out garbage Windows sends us via LVN_ODCACHEHINT
[wxWidgets.git] / src / gtk1 / listbox.cpp
index 14dd4558ae7192a79026197b879cdd35a3d19e5c..aade5967cfd9ed15af89f85a711578ed47872954 100644 (file)
@@ -51,10 +51,8 @@ extern bool g_isIdle;
 
 #if wxUSE_CHECKLISTBOX
 
-#define CHECKBOX_STRING "[-] "
-
 // checklistboxes have "[±] " prepended to their lables, this macro removes it
-// (NB: 4 below is the length of CHECKBOX_STRING above)
+// (NB: 4 below is the length of wxCHECKLBOX_STRING above)
 //
 // the argument to it is a "const char *" pointer
 #define GET_REAL_LABEL(label) ((m_hasCheckBoxes)?(label)+4 : (label))
@@ -251,14 +249,19 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis
 // "select" and "deselect"
 //-----------------------------------------------------------------------------
 
-static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox );
+static void gtk_listitem_select_cb( GtkWidget *widget, wxListBox *listbox, bool is_selection );
+
+static void gtk_listitem_select_callback( GtkWidget *widget, wxListBox *listbox )
+{
+    gtk_listitem_select_cb( widget, listbox, TRUE );
+}
 
 static void gtk_listitem_deselect_callback( GtkWidget *widget, wxListBox *listbox )
 {
-    gtk_listitem_select_callback( widget, listbox );
+    gtk_listitem_select_cb( widget, listbox, FALSE );
 }
 
-static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox )
+static void gtk_listitem_select_cb( GtkWidget *WXUNUSED(widget), wxListBox *listbox, bool is_selection )
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
@@ -267,6 +270,7 @@ static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox
 
     wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() );
     event.SetEventObject( listbox );
+    event.SetExtraLong( (long) is_selection );
 
     wxArrayInt aSelections;
     int n, count = listbox->GetSelections(aSelections);
@@ -370,7 +374,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
 
     gtk_widget_show( GTK_WIDGET(m_list) );
 
-    SetSizeOrDefault( size );
+    SetBestSize( size );
 
     if ( style & wxLB_SORT )
     {
@@ -430,24 +434,47 @@ void wxListBox::DoInsertItems(const wxArrayString& items, int pos)
     wxCHECK_RET( pos <= length, wxT("invalid index in wxListBox::InsertItems") );
 
     size_t nItems = items.GetCount();
+    int index;
 
-    if (pos == length)
+    if (m_strings)
     {
-        for ( size_t n = 0; n < nItems; n++ )
+        for (size_t n = 0; n < nItems; n++)
         {
-            GtkAddItem( items[n] );
-
-            m_clientList.Append((wxObject *)NULL);
+            index = m_strings->Add( items[n] );
+            
+            if (index != GetCount())
+            {
+                GtkAddItem( items[n], index );
+                wxNode *node = m_clientList.Nth( index );
+                m_clientList.Insert( node, (wxObject*) NULL );
+            }
+            else
+            {
+                GtkAddItem( items[n] );
+                m_clientList.Append( (wxObject*) NULL );
+            }
         }
     }
     else
     {
-        wxNode *node = m_clientList.Nth( pos );
-        for ( size_t n = 0; n < nItems; n++ )
+        if (pos == length)
+        {
+            for ( size_t n = 0; n < nItems; n++ )
+            {
+                GtkAddItem( items[n] );
+
+                m_clientList.Append((wxObject *)NULL);
+            }
+        }
+        else
         {
-            GtkAddItem( items[n], pos+n );
+            wxNode *node = m_clientList.Nth( pos );
+            for ( size_t n = 0; n < nItems; n++ )
+            {
+                GtkAddItem( items[n], pos+n );
 
-            m_clientList.Insert( node, (wxObject *)NULL );
+                m_clientList.Insert( node, (wxObject *)NULL );
+            }
         }
     }
 
@@ -491,7 +518,7 @@ void wxListBox::GtkAddItem( const wxString &item, int pos )
 #if wxUSE_CHECKLISTBOX
     if (m_hasCheckBoxes)
     {
-        label.Prepend(CHECKBOX_STRING);
+        label.Prepend(wxCHECKLBOX_STRING);
     }
 #endif // wxUSE_CHECKLISTBOX
 
@@ -620,7 +647,7 @@ void wxListBox::Clear()
 {
     wxCHECK_RET( m_list != NULL, wxT("invalid listbox") );
 
-    gtk_list_clear_items( m_list, 0, Number() );
+    gtk_list_clear_items( m_list, 0, GetCount() );
 
     if ( HasClientObjectData() )
     {
@@ -655,7 +682,7 @@ void wxListBox::Delete( int n )
     wxNode *node = m_clientList.Nth( n );
     if ( node )
     {
-        if ( m_clientDataItemsType == ClientData_Object )
+        if ( m_clientDataItemsType == wxClientData_Object )
         {
             wxClientData *cd = (wxClientData*)node->Data();
             delete cd;
@@ -685,7 +712,7 @@ void wxListBox::SetString( int n, const wxString &string )
         wxString str;
 #if wxUSE_CHECKLISTBOX
         if (m_hasCheckBoxes)
-            str += CHECKBOX_STRING;
+            str += wxCHECKLBOX_STRING;
 #endif // wxUSE_CHECKLISTBOX
         str += string;