]> git.saurik.com Git - wxWidgets.git/commitdiff
Move event generation code for multiple selection mode to common code
authorRobert Roebling <robert@roebling.de>
Fri, 23 May 2008 10:12:50 +0000 (10:12 +0000)
committerRobert Roebling <robert@roebling.de>
Fri, 23 May 2008 10:12:50 +0000 (10:12 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53715 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/listbox.h
include/wx/listbox.h
src/common/lboxcmn.cpp
src/gtk/listbox.cpp

index c592a2b43e811224537353643cc9cc1851a4b38f..ed32f28246a5e9049077811b0861a4eb98d492a2 100644 (file)
@@ -97,9 +97,6 @@ public:
 
     void GtkDisableEvents();
     void GtkEnableEvents();
-    
-    wxArrayInt m_oldSelection;
-    void GtkUpdateOldSelection();
 
 protected:
     virtual void DoClear();
index 6e97d31864afd23241dca6869ece54576b074d42..b009bf35757214e1820d4c260bfcb7af382cff3d 100644 (file)
@@ -94,6 +94,11 @@ public:
     // returns the item number at a point or wxNOT_FOUND
     int HitTest(const wxPoint& point) const { return DoListHitTest(point); }
 
+    // For generating events in multiple and extended mode
+    wxArrayInt m_oldSelections;
+    void UpdateOldSelections();
+    void CalcAndSendEvent();
+
 protected:
     virtual void DoSetFirstItem(int n) = 0;
 
index 2d764f33bf6ae2fade8d1119e7c94c29dedcbdeb..27def6167d581a7f3fca56ee43327bc7f60970d6 100644 (file)
@@ -82,6 +82,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
 // ----------------------------------------------------------------------------
index 225c06994d2f7f0ed2b4e6fbcd2170cff313d4f8..a4b21a34ac3ba75b9cb9e2c814eee59f2c3cad7e 100644 (file)
@@ -112,17 +112,6 @@ gtk_listbox_row_activated_callback(GtkTreeView        * WXUNUSED(treeview),
 // "changed"
 //-----------------------------------------------------------------------------
 
-static void SendEvent( wxCommandEvent &event, wxListBox *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 );
-}
-
 extern "C" {
 static void
 gtk_listitem_changed_callback(GtkTreeSelection * WXUNUSED(selection),
@@ -130,96 +119,15 @@ gtk_listitem_changed_callback(GtkTreeSelection * WXUNUSED(selection),
 {
     if (g_blockEventsOnDrag) return;
 
-    wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() );
-    event.SetEventObject( listbox );
-
     if (listbox->HasFlag(wxLB_MULTIPLE) || listbox->HasFlag(wxLB_EXTENDED))
     {
-        wxArrayInt selections;
-        listbox->GetSelections( selections );
-        
-        if ((selections.GetCount() == 0) && (listbox->m_oldSelection.GetCount() == 0))
-        {
-            // nothing changed, just leave
-            return;
-        }
-        
-        if (selections.GetCount() == listbox->m_oldSelection.GetCount())
-        {
-            bool changed = false;
-            size_t idx;
-            for (idx = 0; idx < selections.GetCount(); idx++)
-            {
-                if (selections[idx] != listbox->m_oldSelection[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 = listbox->m_oldSelection[0];
-            listbox->m_oldSelection = selections;
-            SendEvent( event, listbox, 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 (listbox->m_oldSelection.Index(item) == wxNOT_FOUND)
-            {
-                any_new_selected = true;
-                break;
-            }
-        }
-        
-        if (any_new_selected)
-        {
-            // indicate that this is a selection
-            event.SetExtraLong( 1 );
-            listbox->m_oldSelection = selections;
-            SendEvent( event, listbox, item );
-            return;
-        }
-        
-        // Now test if any new item is deselected
-        bool any_new_deselected = false;
-        for (idx = 0; idx < listbox->m_oldSelection.GetCount(); idx++)
-        {
-            item = listbox->m_oldSelection[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 );
-            listbox->m_oldSelection = selections;
-            SendEvent( event, listbox, item );
-            return;
-        }
-        
-        wxLogError( wxT("Wrong wxListBox selection") );
+        listbox->CalcAndSendEvent();
     }
     else
     {
+        wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() );
+        event.SetEventObject( listbox );
+
         int index = listbox->GetSelection();
         if (index == wxNOT_FOUND)
         {
@@ -588,7 +496,7 @@ void wxListBox::GtkEnableEvents()
     g_signal_handlers_unblock_by_func(selection,
                                 (gpointer) gtk_listitem_changed_callback, this);
                                 
-    GtkUpdateOldSelection();
+    UpdateOldSelections();
 }
 
 // ----------------------------------------------------------------------------
@@ -853,7 +761,7 @@ int wxListBox::GetSelections( wxArrayInt& aSelections ) const
 
     aSelections.Empty();
 
-        int i = 0;
+    int i = 0;
     GtkTreeIter iter;
     GtkTreeSelection* selection = gtk_tree_view_get_selection(m_treeview);
 
@@ -920,12 +828,6 @@ void wxListBox::DoSetSelection( int n, bool select )
     GtkEnableEvents();
 }
 
-void wxListBox::GtkUpdateOldSelection()
-{
-    if (HasFlag(wxLB_MULTIPLE) || HasFlag(wxLB_EXTENDED))
-        GetSelections( m_oldSelection );
-}
-
 void wxListBox::DoScrollToCell(int n, float alignY, float alignX)
 {
     wxCHECK_RET( m_treeview, wxT("invalid listbox") );