public override void MouseDown(object sender, MouseButtonEventArgs e) { #if !SILVERLIGHT if (e.ClickCount == 2) { Drawing.CoordinateSystem.ZoomExtend(); return; } #endif offsetFromFigureLeftTopCorner = Coordinates(e, false, false, false); oldCoordinates = offsetFromFigureLeftTopCorner; coordinatesOnMouseDown = offsetFromFigureLeftTopCorner; startedMoving = false; moving = new List <IMovable>(); IEnumerable <IFigure> roots = null; bool isLocked = false; found = Drawing.Figures.HitTest(offsetFromFigureLeftTopCorner); IMovable oneMovable = found as IMovable; if (oneMovable != null && (found.Locked || oneMovable.AllowMove())) { if (found.Locked) { isLocked = true; } else if (oneMovable.AllowMove()) { if (oneMovable is IPoint) { // when we drag a point, we want it to snap to the cursor // so that the point center is directly under the tip of the mouse offsetFromFigureLeftTopCorner = new Point(); oldCoordinates = oneMovable.Coordinates; } else { // however when we drag other stuff (such as text labels) // we want the mouse to always touch the part of the draggable // where it first touched during MouseDown // we don't want the draggable to "snap" to the cursor like points do offsetFromFigureLeftTopCorner = offsetFromFigureLeftTopCorner.Minus(oneMovable.Coordinates); } roots = DependencyAlgorithms.FindRoots(f => f.Dependents, found); if (roots.All(root => (!root.Locked))) { moving.Add(oneMovable); roots = found.AsEnumerable(); } else { isLocked = true; } } } else if (found != null) { if (!found.Locked) { roots = DependencyAlgorithms.FindRoots(f => f.Dependencies, found); if (roots.All(root => root is IMovable)) { if (roots.All(root => ((IMovable)root).AllowMove())) { moving.AddRange(roots.OfType <IMovable>()); } else { isLocked = true; } } } else { isLocked = true; } } if (roots != null) { toRecalculate = DependencyAlgorithms.FindDescendants(f => f.Dependents, roots); toRecalculate.Reverse(); } else { toRecalculate = null; } if (moving.IsEmpty() && !isLocked && !Drawing.CoordinateGrid.Locked) { moving.Add(Drawing.CoordinateSystem); //var allFigures = Drawing.Figures.GetAllFiguresRecursive(); //roots = DependencyAlgorithms.FindRoots(f => f.Dependencies, allFigures); //moving.AddRange(roots.OfType<IMovable>()); //roots = null; toRecalculate = null; // Figures; } }