FLEX-26808 CAUSE: DataGrid.grid_mouseDownHandler() committed the selection before checking whether the user was likely to begin a drag operation.
SOLUTION: Following the pattern in the spark List component, we're committing the selection on MOUSE_DOWN only if the user has clicked on an item which isn't selected yet, or the grid is not dragEnabled, or we're not in row selection mode (i.e. either GridSelectionMode.SINGLE_ROW or GridSelectionMode.MULTIPLE_ROWS). But when it looks like the user might start a dragOperation, we're deferring the selection adjustment to the MOUSE_UP event (caught either in DataGrid.grid_mouseUpHandler() or in DataGrid.sandbox_mouseUpHandler() ). NOTES: -also removed some duplication between DataGrid.grid_mouseDownHandler() and DataGrid.removeMouseHandlersForDragStart(). -also corrected some asdocs @see references. Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/23f0bd47 Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/23f0bd47 Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/23f0bd47 Branch: refs/heads/develop Commit: 23f0bd47c7b9e50d8da8f5a9f78b26ed8529c141 Parents: e0fbd86 Author: Mihai Chira <mih...@apache.org> Authored: Tue Mar 22 14:08:11 2016 +0100 Committer: Mihai Chira <mih...@apache.org> Committed: Tue Mar 22 14:08:11 2016 +0100 ---------------------------------------------------------------------- .../spark/src/spark/components/DataGrid.as | 108 +++++++------------ 1 file changed, 40 insertions(+), 68 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/23f0bd47/frameworks/projects/spark/src/spark/components/DataGrid.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/spark/src/spark/components/DataGrid.as b/frameworks/projects/spark/src/spark/components/DataGrid.as index fb0676f..76cf418 100644 --- a/frameworks/projects/spark/src/spark/components/DataGrid.as +++ b/frameworks/projects/spark/src/spark/components/DataGrid.as @@ -5600,6 +5600,8 @@ public class DataGrid extends SkinnableContainerBase grid.hoverColumnIndex = event.columnIndex; updateHoverOnRollOver = true; } + + removeMouseHandlersForDragStart(event); } /** @@ -5620,40 +5622,15 @@ public class DataGrid extends SkinnableContainerBase if (rowIndex == -1 || isCellSelection && columnIndex == -1) return; - - if (event.ctrlKey) + if (dragEnabled && isRowSelectionMode() && selectionContainsIndex(rowIndex)) { - // ctrl-click toggles the selection and updates caret and anchor. - if (!toggleSelection(rowIndex, columnIndex)) - return; - - grid.anchorRowIndex = rowIndex; - grid.anchorColumnIndex = columnIndex; + pendingSelectionOnMouseUp = true; } else { - if (event.shiftKey) - { - // shift-click extends the selection and updates the caret. - if (grid.selectionMode == GridSelectionMode.MULTIPLE_ROWS || grid.selectionMode == GridSelectionMode.MULTIPLE_CELLS) - { - if (!extendSelection(rowIndex, columnIndex)) - return; - } - } - else - { - // click sets the selection and updates the caret and anchor positions. - setSelectionAnchorCaret(rowIndex, columnIndex); - } + adjustSelection(event, rowIndex, columnIndex); } - - if (dragEnabled && isRowSelectionMode() && selectionContainsIndex(rowIndex)) - { - pendingSelectionOnMouseUp = true; - } - // If selection is pending on mouse up then we have just moused down on // an item, part of an already commited selection. // However if we moused down on an item that's not currently selected, @@ -5667,14 +5644,14 @@ public class DataGrid extends SkinnableContainerBase mouseDownRowIndex = rowIndex; mouseDownColumnIndex = columnIndex; - var listenForDrag:Boolean = (dragEnabled && + var listenForDrag:Boolean = dragEnabled && getStyle("interactionMode") == InteractionMode.MOUSE && selectedIndices && - this.selectedIndices.indexOf(rowIndex) != -1); + this.selectedIndices.indexOf(rowIndex) != -1; // Handle any drag gestures that may have been started if (listenForDrag) { // Listen for GRID_MOUSE_DRAG. - // The user may have cliked on the item renderer close + // The user may have clicked on the item renderer close // to the edge of the list, and we still want to start a drag // operation if they move out of the list. grid.addEventListener(GridEvent.GRID_MOUSE_DRAG, grid_mouseDragHandler); @@ -5698,6 +5675,30 @@ public class DataGrid extends SkinnableContainerBase } + private function adjustSelection(event:MouseEvent, rowIndex:int, columnIndex:int):void + { + if (event.ctrlKey) + { + // ctrl-click toggles the selection and updates caret and anchor. + if (!toggleSelection(rowIndex, columnIndex)) + return; + + grid.anchorRowIndex = rowIndex; + grid.anchorColumnIndex = columnIndex; + } + else if (event.shiftKey) + { + // shift-click extends the selection and updates the caret. + if (grid.selectionMode == GridSelectionMode.MULTIPLE_ROWS || grid.selectionMode == GridSelectionMode.MULTIPLE_CELLS) + extendSelection(rowIndex, columnIndex); + } + else + { + // click sets the selection and updates the caret and anchor positions. + setSelectionAnchorCaret(rowIndex, columnIndex); + } + } + /** * @private * Redispatch the grid's "caretChange" event. @@ -6189,40 +6190,11 @@ public class DataGrid extends SkinnableContainerBase } } - private function removeMouseHandlersForDragStart(event:GridEvent):void + private function removeMouseHandlersForDragStart(event:MouseEvent):void { // If dragging failed, but we had a pending selection, commit it here if (pendingSelectionOnMouseUp && !DragManager.isDragging) - { - const rowIndex:int = mouseDownRowIndex; - const columnIndex:int = mouseDownColumnIndex; - - if (event.ctrlKey) - { - // ctrl-click toggles the selection and updates caret and anchor. - if (!toggleSelection(rowIndex, columnIndex)) - return; - - grid.anchorRowIndex = rowIndex; - grid.anchorColumnIndex = columnIndex; - } - else if (event.shiftKey) - { - // shift-click extends the selection and updates the caret. - if (grid.selectionMode == GridSelectionMode.MULTIPLE_ROWS || - grid.selectionMode == GridSelectionMode.MULTIPLE_CELLS) - { - if (!extendSelection(rowIndex, columnIndex)) - return; - } - } - else - { - // click sets the selection and updates the caret and anchor - // positions. - setSelectionAnchorCaret(rowIndex, columnIndex); - } - } + adjustSelection(event, mouseDownRowIndex, mouseDownColumnIndex); // Always clean up the flag, even if currently dragging. pendingSelectionOnMouseUp = false; @@ -6371,8 +6343,8 @@ public class DataGrid extends SkinnableContainerBase * * @param event The DragEvent object. * - * @see spark.layouts.LayoutBase#showDropIndicator - * @see spark.layouts.LayoutBase#hideDropIndicator + * @see spark.layouts.supportClasses.LayoutBase#showDropIndicator + * @see spark.layouts.supportClasses.LayoutBase#hideDropIndicator * * @langversion 3.0 * @playerversion Flash 11 @@ -6428,8 +6400,8 @@ public class DataGrid extends SkinnableContainerBase * * @param event The DragEvent object. * - * @see spark.layouts.LayoutBase#showDropIndicator - * @see spark.layouts.LayoutBase#hideDropIndicator + * @see spark.layouts.supportClasses.LayoutBase#showDropIndicator + * @see spark.layouts.supportClasses.LayoutBase#hideDropIndicator * * @langversion 3.0 * @playerversion Flash 11 @@ -6479,8 +6451,8 @@ public class DataGrid extends SkinnableContainerBase * * @param event The DragEvent object. * - * @see spark.layouts.LayoutBase#showDropIndicator - * @see spark.layouts.LayoutBase#hideDropIndicator + * @see spark.layouts.supportClasses.LayoutBase#showDropIndicator + * @see spark.layouts.supportClasses.LayoutBase#hideDropIndicator * * @langversion 3.0 * @playerversion Flash 11