From 421a5048b7c66157266d6c55f9b0c84537ce34cb Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 20 Jan 2013 02:08:51 +0000 Subject: [PATCH] Fix bug with dragging non-draggable columns in wxMSW wxHeaderCtrl. 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 | 1 + include/wx/msw/headerctrl.h | 3 +++ src/msw/headerctrl.cpp | 22 +++++++++++++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/changes.txt b/docs/changes.txt index f851eebc05..47d27b629b 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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: diff --git a/include/wx/msw/headerctrl.h b/include/wx/msw/headerctrl.h index bf925b0650..b1086b7099 100644 --- a/include/wx/msw/headerctrl.h +++ b/include/wx/msw/headerctrl.h @@ -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); }; diff --git a/src/msw/headerctrl.cpp b/src/msw/headerctrl.cpp index b68b51ee1a..6a5a417acc 100644 --- a/src/msw/headerctrl.cpp +++ b/src/msw/headerctrl.cpp @@ -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; } -- 2.45.2