]> git.saurik.com Git - wxWidgets.git/commitdiff
Refactor listbox event sending code to avoid duplication.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 5 Jun 2010 22:57:53 +0000 (22:57 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 5 Jun 2010 22:57:53 +0000 (22:57 +0000)
wxMSW wxListBox implementation contained the same code as the private
LBSendEvent() function in lboxcmn.cpp, so make this function a (protected)
member of wxListBoxBase and reuse it instead.

Also change its and CalcAndSendEvent() return type to bool to be able to
return whether the event was processed or not.

As the result of this refactoring, the "is selected" flag is now set correctly
for the selection events under MSW (it was always off before).

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64496 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

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

index cc15c6764e46ed44470f7a158bc5549ce5f6af2c..cd4c0fa6f824476dc8360759fe42960bb69509bf 100644 (file)
@@ -96,10 +96,13 @@ public:
     int HitTest(int x, int y) const { return DoListHitTest(wxPoint(x, y)); }
 
 
-    // For generating events in multiple and extended mode
+    // For generating events in multiple and extended mode: compare the current
+    // selections with the previously recorded ones (in m_oldSelections) and
+    // send the appropriate event if they differ, otherwise just return false.
+    bool CalcAndSendEvent();
+
     wxArrayInt m_oldSelections;
     void UpdateOldSelections();
-    void CalcAndSendEvent();
 
 protected:
     virtual void DoSetFirstItem(int n) = 0;
@@ -110,6 +113,11 @@ protected:
     virtual int DoListHitTest(const wxPoint& WXUNUSED(point)) const
         { return wxNOT_FOUND; }
 
+    // Send a listbox (de)selection or double click event.
+    //
+    // Returns true if the event was processed.
+    bool SendEvent(wxEventType evtType, int item, bool selected);
+
 private:
     wxDECLARE_NO_COPY_CLASS(wxListBoxBase);
 };
index a9beae01cc920b6d8621a7be449755c9b6a99c12..f7d4fb91a8f7a91766c50765147b6bc93feccb7a 100644 (file)
@@ -90,29 +90,33 @@ void wxListBoxBase::UpdateOldSelections()
         GetSelections( m_oldSelections );
 }
 
-static void LBSendEvent( wxCommandEvent &event, wxListBoxBase *listbox, int item )
+bool wxListBoxBase::SendEvent(wxEventType evtType, int item, bool selected)
 {
-    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 );
+    wxCommandEvent event(evtType, GetId());
+    event.SetEventObject(this);
+
+    event.SetInt(item);
+    event.SetString(GetString(item));
+    event.SetExtraLong(selected);
+
+    if ( HasClientObjectData() )
+        event.SetClientObject(GetClientObject(item));
+    else if ( HasClientUntypedData() )
+        event.SetClientData(GetClientData(item));
+
+    return HandleWindowEvent(event);
 }
 
-void wxListBoxBase::CalcAndSendEvent()
+bool wxListBoxBase::CalcAndSendEvent()
 {
-    wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, GetId());
-    event.SetEventObject( this );
-
     wxArrayInt selections;
     GetSelections(selections);
+    bool selected = true;
 
     if ( selections.empty() && m_oldSelections.empty() )
     {
         // nothing changed, just leave
-        return;
+        return false;
     }
 
     const size_t countSel = selections.size(),
@@ -131,14 +135,13 @@ void wxListBoxBase::CalcAndSendEvent()
 
         // nothing changed, just leave
         if ( !changed )
-           return;
+           return false;
     }
 
     int item = wxNOT_FOUND;
     if ( selections.empty() )
     {
-        // indicate that this is a deselection
-        event.SetExtraLong(0);
+        selected = false;
         item = m_oldSelections[0];
     }
     else // we [still] have some selections
@@ -155,14 +158,9 @@ void wxListBoxBase::CalcAndSendEvent()
             }
         }
 
-        if ( any_new_selected )
-        {
-            // indicate that this is a selection
-            event.SetExtraLong(1);
-        }
-        else // no new items selected
+        if ( !any_new_selected )
         {
-            // Now test if any new item is deselected
+            // No new items selected, now test if any new item is deselected
             bool any_new_deselected = false;
             for ( size_t idx = 0; idx < countSelOld; idx++ )
             {
@@ -177,7 +175,7 @@ void wxListBoxBase::CalcAndSendEvent()
             if ( any_new_deselected )
             {
                 // indicate that this is a selection
-                event.SetExtraLong(0);
+                selected = false;
             }
             else
             {
@@ -191,7 +189,7 @@ void wxListBoxBase::CalcAndSendEvent()
 
     m_oldSelections = selections;
 
-    LBSendEvent(event, this, item);
+    return SendEvent(wxEVT_COMMAND_LISTBOX_SELECTED, item, selected);
 }
 
 // ----------------------------------------------------------------------------
index d36f5ab109782dbbae02df8e7f6a7a33bb3e9c7e..8d2d266c7270f1aa7c6401b1c90fe0471bd2bd48 100644 (file)
@@ -647,16 +647,13 @@ wxSize wxListBox::DoGetBestClientSize() const
 
 bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
 {
-    if ((param == LBN_SELCHANGE) && HasMultipleSelection())
-    {
-        CalcAndSendEvent();
-        return true;
-    }
-
     wxEventType evtType;
     int n;
     if ( param == LBN_SELCHANGE )
     {
+        if ( HasMultipleSelection() )
+            return CalcAndSendEvent();
+
         evtType = wxEVT_COMMAND_LISTBOX_SELECTED;
         n = SendMessage(GetHwnd(), LB_GETCARETINDEX, 0, 0);
 
@@ -673,22 +670,8 @@ bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
         return false;
     }
 
-    // retrieve the affected item
-    if ( n == wxNOT_FOUND )
-        return false;
-
-    wxCommandEvent event(evtType, m_windowId);
-    event.SetEventObject(this);
-
-    if ( HasClientObjectData() )
-        event.SetClientObject( GetClientObject(n) );
-    else if ( HasClientUntypedData() )
-        event.SetClientData( GetClientData(n) );
-
-    event.SetString(GetString(n));
-    event.SetInt(n);
-
-    return HandleWindowEvent(event);
+    // only send an event if we have a valid item
+    return n != wxNOT_FOUND && SendEvent(evtType, n, true /* selection */);
 }
 
 // ----------------------------------------------------------------------------