]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix bug with dragging non-draggable columns in wxMSW wxHeaderCtrl.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 20 Jan 2013 02:08:51 +0000 (02:08 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 20 Jan 2013 02:08:51 +0000 (02:08 +0000)
Properly ignore HDN_BEGINDRAG events for the columns without wxCOL_REORDERABLE
flag. This fixes dragging non-draggable columns in wxDataViewCtrl under MSW.

Closes #14940.

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

docs/changes.txt
include/wx/msw/headerctrl.h
src/msw/headerctrl.cpp

index f851eebc0578e91cf9e13ac50108570da5028166..47d27b629b3358300a987517b90a7f26faf8bf62 100644 (file)
@@ -602,6 +602,7 @@ All (GUI):
 - Add "rect" paramerer to wxRichToolTip::ShowFor() (John Roberts).
 - Add wxListCtrl::EnableAlternateRowColours() (troelsk).
 - Fix wrong tab order in wxAuiNotebook after dragging (Mark Barber).
+- Fix bug in generic wxDataViewCtrl column dragging (jobuz).
 
 wxGTK:
 
index bf925b0650d3266ba6ad046e2c52d4abd99a50ea..b1086b709954706a7c7a89471141757f6d223dde 100644 (file)
@@ -127,6 +127,9 @@ private:
     // the offset of the window used to emulate scrolling it
     int m_scrollOffset;
 
+    // actual column we are dragging or -1 if not dragging anything
+    int m_colBeingDragged;
+
     wxDECLARE_NO_COPY_CLASS(wxHeaderCtrl);
 };
 
index b68b51ee1afc35ccb93171188bd405a1fa922f02..6a5a417acc82e08dd34affb60a443edfd7c9c868 100644 (file)
@@ -64,6 +64,7 @@ void wxHeaderCtrl::Init()
     m_numColumns = 0;
     m_imageList = NULL;
     m_scrollOffset = 0;
+    m_colBeingDragged = -1;
 }
 
 bool wxHeaderCtrl::Create(wxWindow *parent,
@@ -525,6 +526,9 @@ bool wxHeaderCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
         case HDN_ITEMCLICK:
         case HDN_ITEMDBLCLICK:
             evtType = GetClickEventType(code == HDN_ITEMDBLCLICK, nmhdr->iButton);
+
+            // We're not dragging any more.
+            m_colBeingDragged = -1;
             break;
 
             // although we should get the notifications about the right clicks
@@ -622,8 +626,18 @@ bool wxHeaderCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
             if ( nmhdr->iItem == -1 )
                 break;
 
+            // If we are dragging a column that is not draggable and the mouse
+            // is moved over a different column then we get the column number from
+            // the column under the mouse. This results in an unexpected behaviour
+            // if this column is draggable. To prevent this remember the column we
+            // are dragging for the complete drag and drop cycle.
+            if ( m_colBeingDragged == -1 )
+            {
+                m_colBeingDragged = idx;
+            }
+
             // column must have the appropriate flag to be draggable
-            if ( !GetColumn(idx).IsReorderable() )
+            if ( !GetColumn(m_colBeingDragged).IsReorderable() )
             {
                 veto = true;
                 break;
@@ -644,10 +658,16 @@ bool wxHeaderCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
             order = MSWFromNativeOrder(order);
 
             evtType = wxEVT_COMMAND_HEADER_END_REORDER;
+
+            // We (successfully) ended dragging the column.
+            m_colBeingDragged = -1;
             break;
 
         case NM_RELEASEDCAPTURE:
             evtType = wxEVT_COMMAND_HEADER_DRAGGING_CANCELLED;
+
+            // Dragging the column was cancelled.
+            m_colBeingDragged = -1;
             break;
     }