]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/lboxcmn.cpp
Palm compiler needs const_cast for passing const int parameters to function taking...
[wxWidgets.git] / src / common / lboxcmn.cpp
index 218ba8a71adf0459c32c3aad7dcc955f01d43aac..dfd4b695644a32f0918198125bb30608e6da5484 100644 (file)
@@ -33,6 +33,8 @@
     #include "wx/arrstr.h"
 #endif
 
+#include "wx/log.h"
+
 // ============================================================================
 // implementation
 // ============================================================================
@@ -42,33 +44,6 @@ wxListBoxBase::~wxListBoxBase()
     // this destructor is required for Darwin
 }
 
-// ----------------------------------------------------------------------------
-// adding items
-// ----------------------------------------------------------------------------
-
-void wxListBoxBase::InsertItems(unsigned int nItems, const wxString *items, unsigned int pos)
-{
-    wxArrayString aItems;
-    for ( unsigned int n = 0; n < nItems; n++ )
-    {
-        aItems.Add(items[n]);
-    }
-
-    DoInsertItems(aItems, pos);
-}
-
-
-void wxListBoxBase::Set(int nItems, const wxString* items, void **clientData)
-{
-    wxArrayString aItems;
-    for ( int n = 0; n < nItems; n++ )
-    {
-        aItems.Add(items[n]);
-    }
-
-    DoSetItems(aItems, clientData);
-}
-
 // ----------------------------------------------------------------------------
 // selection
 // ----------------------------------------------------------------------------
@@ -109,6 +84,112 @@ void wxListBoxBase::DeselectAll(int itemToLeaveSelected)
     }
 }
 
+void wxListBoxBase::UpdateOldSelections()
+{
+    if (HasFlag(wxLB_MULTIPLE) || HasFlag(wxLB_EXTENDED))
+        GetSelections( m_oldSelections );
+}
+
+static void LBSendEvent( wxCommandEvent &event, wxListBoxBase *listbox, int item )
+{
+    event.SetInt( item );
+    event.SetString( listbox->GetString( item ) );
+    if ( listbox->HasClientObjectData() )
+        event.SetClientObject( listbox->GetClientObject(item) );
+    else if ( listbox->HasClientUntypedData() )
+        event.SetClientData( listbox->GetClientData(item) );
+    listbox->HandleWindowEvent( event );
+}
+
+void wxListBoxBase::CalcAndSendEvent()
+{
+    wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, GetId() );
+    event.SetEventObject( this );
+
+    wxArrayInt selections;
+    GetSelections( selections );
+        
+        if ((selections.GetCount() == 0) && (m_oldSelections.GetCount() == 0))
+        {
+            // nothing changed, just leave
+            return;
+        }
+        
+        if (selections.GetCount() == m_oldSelections.GetCount())
+        {
+            bool changed = false;
+            size_t idx;
+            for (idx = 0; idx < selections.GetCount(); idx++)
+            {
+                if (selections[idx] != m_oldSelections[idx])
+                {
+                    changed = true;
+                    break;
+                }
+            }
+            
+            // nothing changed, just leave
+            if (!changed)
+               return;
+        }
+
+        if (selections.GetCount() == 0)
+        {
+            // indicate that this is a deselection
+            event.SetExtraLong( 0 );
+            int item = m_oldSelections[0];
+            m_oldSelections = selections;
+            LBSendEvent( event, this, item );
+            return;
+        }
+        
+        int item;
+        // Now test if any new item is selected
+        bool any_new_selected = false;
+        size_t idx;
+        for (idx = 0; idx < selections.GetCount(); idx++)
+        {
+            item = selections[idx];
+            if (m_oldSelections.Index(item) == wxNOT_FOUND)
+            {
+                any_new_selected = true;
+                break;
+            }
+        }
+        
+        if (any_new_selected)
+        {
+            // indicate that this is a selection
+            event.SetExtraLong( 1 );
+            m_oldSelections = selections;
+            LBSendEvent( event, this, item );
+            return;
+        }
+        
+        // Now test if any new item is deselected
+        bool any_new_deselected = false;
+        for (idx = 0; idx < m_oldSelections.GetCount(); idx++)
+        {
+            item = m_oldSelections[idx];
+            if (selections.Index(item) == wxNOT_FOUND)
+            {
+                any_new_deselected = true;
+                break;
+            }
+        }
+        
+        if (any_new_deselected)
+        {
+            // indicate that this is a selection
+            event.SetExtraLong( 0 );
+            m_oldSelections = selections;
+            LBSendEvent( event, this, item );
+            return;
+        }
+        
+        wxLogError( wxT("Wrong wxListBox selection") );
+}
+
 // ----------------------------------------------------------------------------
 // misc
 // ----------------------------------------------------------------------------