Enforce valid drag column/row index in DoGridDragResize()

Add an assert to this function checking that the index is valid before
using it with wxGridOperations::GetLineStartPos(), and actually avoid
calling the function when this is not the case to avoid assertion
failures when wxEVT_GRID_CELL_LEFT_CLICK is handled in user code.

Also add comments clarifying the preconditions for calling various
drag-related functions.

Closes #19218.
This commit is contained in:
Vadim Zeitlin
2021-07-03 16:31:15 +01:00
parent e70be8f82b
commit 5cac8a6918
2 changed files with 15 additions and 4 deletions

View File

@@ -4707,11 +4707,13 @@ bool wxGrid::DoGridDragEvent(wxMouseEvent& event,
return DoGridCellDrag(event, coords, isFirstDrag);
case WXGRID_CURSOR_RESIZE_ROW:
DoGridDragResize(event.GetPosition(), wxGridRowOperations(), gridWindow);
if ( m_dragRowOrCol != -1 )
DoGridDragResize(event.GetPosition(), wxGridRowOperations(), gridWindow);
break;
case WXGRID_CURSOR_RESIZE_COL:
DoGridDragResize(event.GetPosition(), wxGridColumnOperations(), gridWindow);
if ( m_dragRowOrCol != -1 )
DoGridDragResize(event.GetPosition(), wxGridColumnOperations(), gridWindow);
break;
default:
@@ -4864,12 +4866,14 @@ wxGrid::DoGridCellLeftUp(wxMouseEvent& event,
else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW )
{
ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL);
DoEndDragResizeRow(event, gridWindow);
if ( m_dragRowOrCol != -1 )
DoEndDragResizeRow(event, gridWindow);
}
else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_COL )
{
ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL);
DoEndDragResizeCol(event, gridWindow);
if ( m_dragRowOrCol != -1 )
DoEndDragResizeCol(event, gridWindow);
}
m_dragLastPos = -1;
@@ -5047,6 +5051,9 @@ void wxGrid::DoGridDragResize(const wxPoint& position,
const wxGridOperations& oper,
wxGridWindow* gridWindow)
{
wxCHECK_RET( m_dragRowOrCol != -1,
"shouldn't be called when not drag resizing" );
// Get the logical position from the physical one we're passed.
const wxPoint
logicalPos = CalcGridWindowUnscrolledPosition(position, gridWindow);