public override void UpdateFeedback(IRequest request, IFigure feedback)
        {
            var req = request as CreateEdgeRequest;

            if (req == null)
            {
                return;
            }

            var edge = feedback as IEdge;

            _feedback = edge;

            edge.IsVisible = true;
            if (req.EdgeSourceEditor != null && req.EdgeSourceEditor == req.EdgeTargetEditor)
            {
                /// 同じ図形に両端をつなごうとしている場合はループする形にする
                var pts = EdgeUtil.GetLoopPoints(req.EdgeSourceEditor.Figure.Bounds);
                edge.SetEdgePoints(pts);
            }
            else
            {
                // todo: is CentralRouterで調べるのではなく,ClearBendPoints()が必要かどうかをIRouterに聞く
                if ((edge.Router == null || edge.Router is CentralRouter) && edge.EdgePointCount > 2)
                {
                    edge.ClearBendPoints();
                }
                if (req.EdgeSourceEditor == null)
                {
                    edge.SourceAnchor.Disconnect();
                    edge.SourceAnchor.Location = GetGridAdjustedPoint(req.StartPoint);
                }
                else
                {
                    var srcFigClone = req.EdgeSourceEditor.Figure.CloneFigure() as INode;
                    edge.SourceAnchor.Connect(srcFigClone);
                    edge.SourceAnchor.Location = edge.GetConnectionPoint(
                        edge.SourceAnchor, srcFigClone, GetGridAdjustedPoint(req.StartPoint)
                        );
                }

                if (req.EdgeTargetEditor == null)
                {
                    edge.TargetAnchor.Disconnect();
                    edge.TargetAnchor.Location = GetGridAdjustedPoint(req.EndPoint);
                }
                else
                {
                    var tgtFigClone = req.EdgeTargetEditor.Figure.CloneFigure() as INode;
                    edge.TargetAnchor.Connect(tgtFigClone);
                    edge.TargetAnchor.Location = edge.GetConnectionPoint(
                        edge.TargetAnchor, tgtFigClone, GetGridAdjustedPoint(req.EndPoint)
                        );
                }
            }
        }
Example #2
0
        // === AbstractConnection ==========
        protected override void OnConnectableChanged(ConnectableChangedEventArgs e)
        {
            base.OnConnectableChanged(e);

            if (e.OldValue != null)
            {
                e.OldValue.BoundsChanged -= HandleConnectableBoundsChanged;

                var oldNode = e.OldValue as INode;
                if (oldNode != null)
                {
                    oldNode.MaxSizeChanged -= HandleNodeMaxSizeChanged;
                }
            }
            if (e.NewValue != null)
            {
                e.NewValue.BoundsChanged += HandleConnectableBoundsChanged;

                var newNode = e.NewValue as INode;
                if (newNode != null)
                {
                    newNode.MaxSizeChanged += HandleNodeMaxSizeChanged;
                }
            }

            if (
                _router == null &&
                e.NewValue != null &&
                (
                    (e.Kind == ConnectionAnchorKind.Source && e.NewValue == Target) ||
                    (e.Kind == ConnectionAnchorKind.Target && e.NewValue == Source)
                )
                )
            {
                SetEdgePoints(EdgeUtil.GetLoopPoints(Source.Bounds));
            }

            if (_router != null && IsValidEdge)
            {
                using (DirtManager.BeginDirty()) {
                    _router.Route(this);
                }
            }
        }
Example #3
0
        // ========================================
        // field
        // ========================================

        // ========================================
        // constructor
        // ========================================

        // ========================================
        // property
        // ========================================

        // ========================================
        // method
        // ========================================
        public void Route(IEdge edge)
        {
            if (edge.Source == edge.Target)
            {
                if (edge.Source != null)
                {
                    /// 同じ図形に両端がつながっている場合はループ
                    var pts = EdgeUtil.GetLoopPoints(edge.Source.Bounds);
                    edge.SetEdgePoints(pts);
                }
                return;
            }

            if (edge.EdgePointCount == 2)
            {
                /// first,lastしか点がない

                if (edge.IsSourceConnected && edge.IsTargetConnected)
                {
                    /// Sourceの中心点とTargetの中心点を結ぶ

                    var src       = edge.Source as INode;
                    var tgt       = edge.Target as INode;
                    var srcCenter = RectUtil.GetCenter(src.Bounds);
                    var tgtCenter = RectUtil.GetCenter(tgt.Bounds);

                    var line = new Line(tgtCenter, srcCenter);
                    if (src.OuterFrame.IntersectsWith(line))
                    {
                        edge.First = src.OuterFrame.GetIntersectionPoint(line);
                    }
                    else
                    {
                        edge.First = srcCenter;
                    }

                    line = new Line(srcCenter, tgtCenter);
                    if (tgt.OuterFrame.IntersectsWith(line))
                    {
                        edge.Last = tgt.OuterFrame.GetIntersectionPoint(line);
                    }
                    else
                    {
                        edge.Last = tgtCenter;
                    }
                }
                else if (edge.IsSourceConnected)
                {
                    /// Sourceの中心点とLastを結ぶ

                    var src       = edge.Source as INode;
                    var srcCenter = RectUtil.GetCenter(src.Bounds);

                    var line = new Line(edge.Last, srcCenter);
                    if (src.OuterFrame.IntersectsWith(line))
                    {
                        edge.First = src.OuterFrame.GetIntersectionPoint(line);
                    }
                    else
                    {
                        edge.First = srcCenter;
                    }
                }
                else if (edge.IsTargetConnected)
                {
                    /// Targetの中心点とFirstを結ぶ

                    var tgt       = edge.Target as INode;
                    var tgtCenter = RectUtil.GetCenter(tgt.Bounds);

                    var line = new Line(edge.First, tgtCenter);
                    if (tgt.OuterFrame.IntersectsWith(line))
                    {
                        edge.Last = tgt.OuterFrame.GetIntersectionPoint(line);
                    }
                    else
                    {
                        edge.Last = tgtCenter;
                    }
                }
                else
                {
                    /// 何もしない
                }
            }
            else if (edge.EdgePointCount > 2)
            {
                if (edge.IsSourceConnected)
                {
                    /// SourceがつながっているのでFirstを調整

                    var src       = edge.Source as INode;
                    var srcCenter = RectUtil.GetCenter(src.Bounds);

                    var line = new Line(edge.FirstRef.Next.EdgePoint, srcCenter);
                    if (src.OuterFrame.IntersectsWith(line))
                    {
                        edge.First = src.OuterFrame.GetIntersectionPoint(line);
                    }
                    else
                    {
                        edge.First = srcCenter;
                    }
                }

                if (edge.IsTargetConnected)
                {
                    /// TargetがつながっているのでLastを調整

                    var tgt       = edge.Target as INode;
                    var tgtCenter = RectUtil.GetCenter(tgt.Bounds);

                    var line = new Line(edge.LastRef.Prev.EdgePoint, tgtCenter);
                    if (tgt.OuterFrame.IntersectsWith(line))
                    {
                        edge.Last = tgt.OuterFrame.GetIntersectionPoint(line);
                    }
                    else
                    {
                        edge.Last = tgtCenter;
                    }
                }
            }
        }
        public override ICommand CreateCommand(IRequest request)
        {
            var req = request as CreateEdgeRequest;

            if (req == null)
            {
                return(null);
            }

            var edgePoints = default(Point[]);

            if (req.EdgeSourceEditor != null && req.EdgeSourceEditor == req.EdgeTargetEditor)
            {
                /// 同じ図形に両端をつなごうとしている場合はループ
                edgePoints = EdgeUtil.GetLoopPoints(req.EdgeSourceEditor.Figure.Bounds);
            }
            else if (req.EdgeSourceEditor != null && req.EdgeSourceEditor.Figure.ContainsPoint(req.EndPoint))
            {
                /// StartもEndoも同じ図形だけどループにできない場合
                // todo: 実装
                return(null);
            }
            else
            {
                var edge = _feedback;
                edge.ClearBendPoints();

                if (req.EdgeSourceEditor == null)
                {
                    edge.SourceAnchor.Disconnect();
                    edge.SourceAnchor.Location = GetGridAdjustedPoint(req.StartPoint);
                }
                else
                {
                    var srcFigClone = req.EdgeSourceEditor.Figure.CloneFigure() as INode;
                    edge.SourceAnchor.Connect(srcFigClone);
                    edge.SourceAnchor.Location = edge.GetConnectionPoint(
                        edge.SourceAnchor, srcFigClone, GetGridAdjustedPoint(req.StartPoint)
                        );
                }

                if (req.EdgeTargetEditor == null)
                {
                    edge.TargetAnchor.Disconnect();
                    edge.TargetAnchor.Location = GetGridAdjustedPoint(req.EndPoint);
                }
                else
                {
                    var tgtFigClone = req.EdgeTargetEditor.Figure.CloneFigure() as INode;
                    edge.TargetAnchor.Connect(tgtFigClone);
                    edge.TargetAnchor.Location = edge.GetConnectionPoint(
                        edge.TargetAnchor, tgtFigClone, GetGridAdjustedPoint(req.EndPoint)
                        );
                }

                edgePoints    = new Point[2];
                edgePoints[0] = edge.SourceAnchor.Location;
                edgePoints[1] = edge.TargetAnchor.Location;
            }

            return(new CreateEdgeCommand(
                       _Host,
                       req.ModelFactory,
                       edgePoints,
                       req.EdgeSourceEditor,
                       req.EdgeTargetEditor
                       ));
        }
Example #5
0
        public override void UpdateFeedback(IRequest request, IFigure feedback)
        {
            var req          = request as ConnectRequest;
            var edgeFeedback = feedback as IEdge;

            if (req == null || edgeFeedback == null)
            {
                return;
            }

            var anchor = req.ConnectingAnchor;
            var edge   = req.ConnectingAnchor.Owner as IEdge;

            var srcClone = edge.Source == null? null: edge.Source.CloneFigure() as INode;
            var tgtClone = edge.Target == null? null: edge.Target.CloneFigure() as INode;

            if (srcClone != null)
            {
                edgeFeedback.Source = srcClone;
            }
            if (tgtClone != null)
            {
                edgeFeedback.Target = tgtClone;
            }

            if (req.IsDisconnect)
            {
                if (anchor.Kind == ConnectionAnchorKind.Source)
                {
                    edgeFeedback.SourceAnchor.Disconnect();
                    edgeFeedback.SourceAnchor.Location = GetGridAdjustedPoint(req.NewLocation);
                }
                else
                {
                    edgeFeedback.TargetAnchor.Disconnect();
                    edgeFeedback.TargetAnchor.Location = GetGridAdjustedPoint(req.NewLocation);
                }
            }
            else
            {
                edgeFeedback.ClearBendPoints();
                if (edge.BendPoints.Count() > 0)
                {
                    edgeFeedback.SetEdgePoints(edge.EdgePoints);
                }
                if (anchor.Kind == ConnectionAnchorKind.Source)
                {
                    if (edge.Target == req.NewConnectableEditor.Figure && edge.EdgePointCount == 2)
                    {
                        var pts = EdgeUtil.GetLoopPoints(edge.Target.Bounds);
                        edgeFeedback.SourceAnchor.Disconnect();
                        edgeFeedback.SetEdgePoints(pts);
                    }
                    else
                    {
                        var srcFig = req.NewConnectableEditor.Figure.CloneFigureOnly() as IConnectable;
                        edgeFeedback.SourceAnchor.Connect(srcFig);
                        edgeFeedback.SourceAnchor.Location = GetConnectionPoint(req);
                    }
                }
                else
                {
                    if (edge.Source == req.NewConnectableEditor.Figure && edge.EdgePointCount == 2)
                    {
                        var pts = EdgeUtil.GetLoopPoints(edge.Source.Bounds);
                        edgeFeedback.TargetAnchor.Disconnect();
                        edgeFeedback.SetEdgePoints(pts);
                    }
                    else
                    {
                        var tgtFig = req.NewConnectableEditor.Figure.CloneFigure() as IConnectable;
                        edgeFeedback.TargetAnchor.Connect(tgtFig);
                        edgeFeedback.TargetAnchor.Location = GetConnectionPoint(req);
                    }
                }
            }
        }