Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
        }