private void OnCanvasMouseDown(object sender, MouseButtonEventArgs e) { var mp = e.GetPosition(TheCanvas); _mouseDownX = mp.X; if (e.ChangedButton == MouseButton.Left) { DimensionPoint <int> left; DimensionPoint <int> right; var found = _manager.TryFindDimensionPoint(_space.Dimensions[0], (float)_mouseDownX, out left, out right); _chosenEllipses.Clear(); foreach (FrameworkElement child in TheCanvas.Children) { var point = child.Tag as DimensionPoint <int>; if (point == null) { continue; } if (point == left) { ((Ellipse)child).Fill = found ? Brushes.Red : Brushes.Orange; _chosenEllipses.Add(((Ellipse)child)); } if (point == right) { ((Ellipse)child).Fill = found ? Brushes.Red : Brushes.Orchid; _chosenEllipses.Add(((Ellipse)child)); } if (_chosenEllipses.Count >= 2) { break; } } } Rectangle rect; if (TryFindSpacePointRectangle(mp, out rect)) { OnSpacePointMouseDown(rect, rect.Tag as SpacePoint <int>, e); } }
bool ISpaceManager.AddPoint <T>(Dimension <T> dimension, SpacePoint <T> sp, float position) { if (dimension == null || sp == null) { return(false); } MustBe.Null(sp.Dimensions[dimension.Index], () => "space point already has assigned the dimension with index=" + dimension.Index); if (dimension.HeadDimPoint == null) { var dp = new DimensionPoint <T>(dimension) { Position = position }; dp.HeadLink = dp.TailLink = new DimensionLink <T>(0, dp); dp.AddPoint(sp); dimension.HeadDimPoint = dimension.TailDimPoint = dp; dimension.Count = 1; return(true); } // try to find existing dimension point DimensionPoint <T> left; DimensionPoint <T> right; if (_spaceManager.TryFindDimensionPoint(dimension, position, out left, out right)) { // if found add the space point to it return(left.AddPoint(sp)); } // new head if (left == null) { AppendNewHead(dimension, sp, position); dimension.Count++; return(true); } // new tail if (right == null) { AppendNewTail(dimension, sp, position); dimension.Count++; return(true); } // new in between var newPoint = new DimensionPoint <T>(dimension) { Position = position }; newPoint.AddPoint(sp); var newLink = new DimensionLink <T>(0, newPoint); newPoint.HeadLink = newLink; newPoint.TailLink = newLink; left.HeadLink.AssignNext(newLink); newLink.AssignNext(right.HeadLink); // for fast movers do not normalize the tree if (!sp.IsFastMover) { _spaceManager.TryAddLevel(dimension); var toExtendUp = newLink.GetSiblingExtensionCandidate(); while (_spaceManager.TryExtendUp(toExtendUp, out toExtendUp)) { _spaceManager.TryAddLevel(dimension); } } dimension.Count++; return(true); }