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
This commit is contained in:
Vadim Zeitlin
2013-01-20 02:08:51 +00:00
parent d1c629ce8f
commit 421a5048b7
3 changed files with 25 additions and 1 deletions

View 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;
}