         
     }
     
+    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.

     *
     *  @param event The DragEvent object.
     * 
     *  @see spark.layouts.LayoutBase#showDropIndicator
     *  @see spark.layouts.LayoutBase#hideDropIndicator
     *  
     *  @langversion 3.0
     *  @playerversion Flash 11

        }
    }
    
    private function removeMouseHandlersForDragStart(event:MouseEvent):void
    {
        // If dragging failed, but we had a pending selection, commit it here
        if (pendingSelectionOnMouseUp && !DragManager.isDragging)
            adjustSelection(event, mouseDownRowIndex, mouseDownColumnIndex);
        
        // Always clean up the flag, even if currently dragging.
        pendingSelectionOnMouseUp = false;
