public override void AfterPaint(Graphics g) { g.TranslateTransform(_grac.Doc.PrintableBounds.X, _grac.Doc.PrintableBounds.Y); // finally, mark the selected objects if (SingleSelectedObject is IGrippableObject) { IGrippableObject gripObject = (IGrippableObject)SingleSelectedObject; if (null != gripObject) { // first switch to the layer graphics context (from printable context) SingleSelectedHitTestObject.ParentLayer.GraphToLayerCoordinates(g); gripObject.ShowGrips(g); } } else if (m_SelectedObjects.Count > 0) { foreach (IHitTestObject graphObject in m_SelectedObjects) { g.DrawPath(Pens.Blue, graphObject.SelectionPath); } } base.AfterPaint(g); }
/// <summary> /// Handles the MouseDown event when the object pointer tool is selected /// </summary> /// <param name="e">The mouse event args</param> /// <remarks> /// The strategy to handle the mousedown event is as following: /// /// Have we clicked on already selected objects? /// if yes (we have clicked on already selected objects) and the shift or control key was pressed -> deselect the object and repaint /// if yes (we have clicked on already selected objects) and none shift nor control key was pressed-> activate the object moving mode /// if no (we have not clicked on already selected objects) and shift or control key was pressed -> search for the object and add it to the selected objects, then aktivate moving mode /// if no (we have not clicked on already selected objects) and no shift or control key pressed -> if a object was found add it to the selected objects and activate moving mode /// if no object was found clear the selection list, deactivate moving mode /// </remarks> public override void OnMouseDown(System.Windows.Forms.MouseEventArgs e) { base.OnMouseDown(e); if (e.Button != MouseButtons.Left) { return; // then there is nothing to do here } // first, if we have a mousedown without shift key and the // position has changed with respect to the last mousedown // we have to deselect all objects bool bControlKey = (Keys.Control == (Control.ModifierKeys & Keys.Control)); // Control pressed bool bShiftKey = (Keys.Shift == (Control.ModifierKeys & Keys.Shift)); PointF mouseXY = new PointF(e.X, e.Y); // Mouse pixel coordinates PointF graphXY = _grac.PixelToPrintableAreaCoordinates(mouseXY); // Graph area coordinates // if we have exacly one object selected, and the one object is grippable, // we hit test for the grip areas if (SingleSelectedObject is IGrippableObject) { IGrippableObject gripObject = (IGrippableObject)SingleSelectedObject; // first switch to the layer graphics context (from printable context) PointF layerCoord = SingleSelectedHitTestObject.ParentLayer.GraphToLayerCoordinates(graphXY); _grip.Handle = gripObject.GripHitTest(layerCoord); if (_grip.Handle != null) { _grip.Layer = SingleSelectedHitTestObject.ParentLayer.Number; _grip.Object = gripObject; return; // } } // have we clicked on one of the already selected objects IHitTestObject clickedSelectedObject = null; bool bClickedOnAlreadySelectedObjects = IsPixelPositionOnAlreadySelectedObject(mouseXY, out clickedSelectedObject); if (bClickedOnAlreadySelectedObjects) { if (bShiftKey || bControlKey) // if shift or control is pressed, remove the selection { m_SelectedObjects.Remove(clickedSelectedObject); _grac.RefreshGraph(); // repaint the graph } else // not shift or control pressed -> so activate the object moving mode { StartMovingObjects(mouseXY); } } // end if bClickedOnAlreadySelectedObjects else // not clicked on a already selected object { // search for a object first IHitTestObject clickedObject; int clickedLayerNumber = 0; _grac.FindGraphObjectAtPixelPosition(mouseXY, false, out clickedObject, out clickedLayerNumber); if (bShiftKey || bControlKey) // if shift or control are pressed, we add the object to the selection list and start moving mode { if (null != clickedObject) { m_SelectedObjects.Add(clickedObject); StartMovingObjects(mouseXY); _grac.RepaintGraphArea(); } } else // no shift or control key pressed { if (null != clickedObject) { ClearSelections(); m_SelectedObjects.Add(clickedObject); StartMovingObjects(mouseXY); _grac.RepaintGraphArea(); } else // if clicked to nothing { ClearSelections(); // clear the selection list } } // end else no shift or control } // end else (not cklicked on already selected object) } // end of function