// Purpose: implementation of wxHeaderCtrl for wxMSW
// Author: Vadim Zeitlin
// Created: 2008-12-01
-// RCS-ID: $Id$
// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
m_numColumns = 0;
m_imageList = NULL;
m_scrollOffset = 0;
+ m_colBeingDragged = -1;
}
bool wxHeaderCtrl::Create(wxWindow *parent,
// notice that we need to store the string we use the pointer to until we
// pass it to the control
hdi.mask |= HDI_TEXT;
- wxWxCharBuffer buf = col.GetTitle().wx_str();
+ wxWxCharBuffer buf = col.GetTitle().t_str();
hdi.pszText = buf.data();
hdi.cchTextMax = wxStrlen(buf);
switch ( button )
{
case 0:
- evtType = dblclk ? wxEVT_COMMAND_HEADER_DCLICK
- : wxEVT_COMMAND_HEADER_CLICK;
+ evtType = dblclk ? wxEVT_HEADER_DCLICK
+ : wxEVT_HEADER_CLICK;
break;
case 1:
- evtType = dblclk ? wxEVT_COMMAND_HEADER_RIGHT_DCLICK
- : wxEVT_COMMAND_HEADER_RIGHT_CLICK;
+ evtType = dblclk ? wxEVT_HEADER_RIGHT_DCLICK
+ : wxEVT_HEADER_RIGHT_CLICK;
break;
case 2:
- evtType = dblclk ? wxEVT_COMMAND_HEADER_MIDDLE_DCLICK
- : wxEVT_COMMAND_HEADER_MIDDLE_CLICK;
+ evtType = dblclk ? wxEVT_HEADER_MIDDLE_DCLICK
+ : wxEVT_HEADER_MIDDLE_CLICK;
break;
default:
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
break;
case HDN_DIVIDERDBLCLICK:
- evtType = wxEVT_COMMAND_HEADER_SEPARATOR_DCLICK;
+ evtType = wxEVT_HEADER_SEPARATOR_DCLICK;
break;
break;
}
- evtType = wxEVT_COMMAND_HEADER_BEGIN_RESIZE;
+ evtType = wxEVT_HEADER_BEGIN_RESIZE;
// fall through
case HDN_ENDTRACKA:
if ( evtType == wxEVT_NULL )
{
- evtType = wxEVT_COMMAND_HEADER_END_RESIZE;
+ evtType = wxEVT_HEADER_END_RESIZE;
// don't generate events with invalid width
const int minWidth = GetColumn(idx).GetMinWidth();
}
break;
+ // The control is not supposed to send HDN_TRACK when using
+ // HDS_FULLDRAG (which we do use) but apparently some versions of
+ // comctl32.dll still do it, see #13506, so catch both messages
+ // just in case we are dealing with one of these buggy versions.
+ case HDN_TRACK:
case HDN_ITEMCHANGING:
if ( nmhdr->pitem && (nmhdr->pitem->mask & HDI_WIDTH) )
{
// generate the resizing event from here as we don't seem
// to be getting HDN_TRACK events at all, at least with
// comctl32.dll v6
- evtType = wxEVT_COMMAND_HEADER_RESIZING;
+ evtType = wxEVT_HEADER_RESIZING;
}
}
break;
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;
}
- evtType = wxEVT_COMMAND_HEADER_BEGIN_REORDER;
+ evtType = wxEVT_HEADER_BEGIN_REORDER;
break;
case HDN_ENDDRAG:
order = MSWFromNativeOrder(order);
- evtType = wxEVT_COMMAND_HEADER_END_REORDER;
+ evtType = wxEVT_HEADER_END_REORDER;
+
+ // We (successfully) ended dragging the column.
+ m_colBeingDragged = -1;
break;
case NM_RELEASEDCAPTURE:
- evtType = wxEVT_COMMAND_HEADER_DRAGGING_CANCELLED;
+ evtType = wxEVT_HEADER_DRAGGING_CANCELLED;
+
+ // Dragging the column was cancelled.
+ m_colBeingDragged = -1;
break;
}
// special post-processing for HDN_ENDDRAG: we need to update the
// internal column indices array if this is allowed to go ahead as
// the native control is going to reorder its columns now
- if ( evtType == wxEVT_COMMAND_HEADER_END_REORDER )
+ if ( evtType == wxEVT_HEADER_END_REORDER )
MoveColumnInOrderArray(m_colIndices, idx, order);
if ( processed )