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) ); } } }
// === 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); } } }
// ======================================== // 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 )); }
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); } } } }