private static Point GetOffsetPoint(ModelConnectorInfo connector, Rect rect) { Point offsetPoint = new Point(); switch (connector.Orientation) { case EnumConnectorOrientation.Left: offsetPoint = new Point(rect.Left, connector.Position.Y); break; case EnumConnectorOrientation.Top: offsetPoint = new Point(connector.Position.X, rect.Top); break; case EnumConnectorOrientation.Right: offsetPoint = new Point(rect.Right, connector.Position.Y); break; case EnumConnectorOrientation.Bottom: offsetPoint = new Point(connector.Position.X, rect.Bottom); break; default: break; } return(offsetPoint); }
private static Point GetNearestNeighborSource(ModelConnectorInfo source, Point endPoint, Rect rectSource, Rect rectSink, out bool flag) { Point n1, n2; // neighbors GetNeighborCorners(source.Orientation, rectSource, out n1, out n2); if (rectSink.Contains(n1)) { flag = false; return(n2); } if (rectSink.Contains(n2)) { flag = true; return(n1); } if ((Distance(n1, endPoint) <= Distance(n2, endPoint))) { flag = true; return(n1); } else { flag = false; return(n2); } }
private static void CheckPathEnd(ModelConnectorInfo source, ModelConnectorInfo sink, bool showLastLine, List <Point> linePoints) { if (showLastLine) { Point startPoint = new Point(0, 0); Point endPoint = new Point(0, 0); double marginPath = 15; switch (source.Orientation) { case EnumConnectorOrientation.Left: startPoint = new Point(source.Position.X - marginPath, source.Position.Y); break; case EnumConnectorOrientation.Top: startPoint = new Point(source.Position.X, source.Position.Y - marginPath); break; case EnumConnectorOrientation.Right: startPoint = new Point(source.Position.X + marginPath, source.Position.Y); break; case EnumConnectorOrientation.Bottom: startPoint = new Point(source.Position.X, source.Position.Y + marginPath); break; default: break; } switch (sink.Orientation) { case EnumConnectorOrientation.Left: endPoint = new Point(sink.Position.X - marginPath, sink.Position.Y); break; case EnumConnectorOrientation.Top: endPoint = new Point(sink.Position.X, sink.Position.Y - marginPath); break; case EnumConnectorOrientation.Right: endPoint = new Point(sink.Position.X + marginPath, sink.Position.Y); break; case EnumConnectorOrientation.Bottom: endPoint = new Point(sink.Position.X, sink.Position.Y + marginPath); break; default: break; } linePoints.Insert(0, startPoint); linePoints.Add(endPoint); } else { linePoints.Insert(0, source.Position); linePoints.Add(sink.Position); } }
private static Rect GetRectWithMargin(ModelConnectorInfo connectorThumb, double margin) { Rect rect = new Rect(connectorThumb.DesignerItemLeft, connectorThumb.DesignerItemTop, connectorThumb.DesignerItemSize.Width, connectorThumb.DesignerItemSize.Height); rect.Inflate(margin, margin); return(rect); }
internal ModelConnectorInfo GetInfo() { ModelConnectorInfo info = new ModelConnectorInfo(); info.DesignerItemLeft = ViewModelDesignerCanvas.GetLeft(this.ParentDesignerItem); info.DesignerItemTop = ViewModelDesignerCanvas.GetTop(this.ParentDesignerItem); info.DesignerItemSize = new Size(this.ParentDesignerItem.ActualWidth, this.ParentDesignerItem.ActualHeight); info.Orientation = this.Orientation; info.Position = this.Position; info.ToolTip = this.ToolTip.ToString(); return(info); }
protected override void OnMouseUp(MouseButtonEventArgs e) { if (HitConnector != null) { if (this.sourceConnector.Orientation.ToString() != "Top" && this.HitConnector.Orientation.ToString() == "Top" && this.sourceConnector.Connections.Count == 0) { ModelChildStateObject SinkconnObj = new ModelChildStateObject(); ModelParentStateObject SourceConnObj = new ModelParentStateObject(); DockPanel Sourcepnl = (DockPanel)this.sourceConnector.ParentDesignerItem.Content; DockPanel Sinkpnl = (DockPanel)this.HitConnector.ParentDesignerItem.Content; ModelConnectorInfo SourceConnInfo = this.sourceConnector.GetInfo(); //Bağlanılan state'in Child'ına atanır SinkconnObj.SourcePoint = this.sourceConnector.Position; SinkconnObj.SinkPoint = this.HitConnector.Position; SinkconnObj.ChildId = Sinkpnl.Uid; SinkconnObj.ChildType = Sinkpnl.Tag.ToString(); //bağlanan state'in Parent'ına atanır SourceConnObj.SourcePoint = this.sourceConnector.Position; SourceConnObj.SinkPoint = this.HitConnector.Position; SourceConnObj.ParentId = Sourcepnl.Uid; SourceConnObj.ParentType = Sourcepnl.Tag.ToString(); SourceConnObj.PropertyName = SourceConnInfo.ToolTip; // if (ArrangeProperties(SinkconnObj, SourceConnObj, Sourcepnl, Sinkpnl)) { ViewModelConnector sourceConnector = this.sourceConnector; ViewModelConnector sinkConnector = this.HitConnector; sourceConnector.DesignerItemName = Sourcepnl.Tag.ToString(); sourceConnector.Name = SourceConnInfo.ToolTip.ToString(); sinkConnector.DesignerItemName = Sinkpnl.Tag.ToString(); sinkConnector.Name = "Top"; ViewModelConnection newConnection = new ViewModelConnection(sourceConnector, sinkConnector); newConnection.SourceToolTip = SourceConnObj.PropertyName; newConnection.SourceDesignerItemId = Sourcepnl.Name; newConnection.SinkDesignerItemId = Sinkpnl.Name; Canvas.SetZIndex(newConnection, designerCanvas.Children.Count); this.designerCanvas.Children.Add(newConnection); } } else { MessageBox.Show("Bağlantıyı doğru şekilde yapınız.!"); } } if (HitDesignerItem != null) { this.HitDesignerItem.IsDragConnectionOver = false; } if (this.IsMouseCaptured) { this.ReleaseMouseCapture(); } AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this.designerCanvas); if (adornerLayer != null) { adornerLayer.Remove(this); } }
private static Point GetNearestVisibleNeighborSink(Point currentPoint, Point endPoint, ModelConnectorInfo sink, Rect rectSource, Rect rectSink) { Point s1, s2; // neighbors on sink side GetNeighborCorners(sink.Orientation, rectSink, out s1, out s2); bool flag1 = IsPointVisible(currentPoint, s1, new Rect[] { rectSource, rectSink }); bool flag2 = IsPointVisible(currentPoint, s2, new Rect[] { rectSource, rectSink }); if (flag1) // s1 visible { if (flag2) // s1 and s2 visible { if (rectSink.Contains(s1)) { return(s2); } if (rectSink.Contains(s2)) { return(s1); } if ((Distance(s1, endPoint) <= Distance(s2, endPoint))) { return(s1); } else { return(s2); } } else { return(s1); } } else // s1 not visible { if (flag2) // only s2 visible { return(s2); } else // s1 and s2 not visible { return(new Point(double.NaN, double.NaN)); } } }
internal static List <Point> GetConnectionLine(ModelConnectorInfo source, Point sinkPoint, EnumConnectorOrientation preferredOrientation) { List <Point> linePoints = new List <Point>(); Rect rectSource = GetRectWithMargin(source, 10); Point startPoint = GetOffsetPoint(source, rectSource); Point endPoint = sinkPoint; linePoints.Add(startPoint); Point currentPoint = startPoint; if (!rectSource.Contains(endPoint)) { while (true) { if (IsPointVisible(currentPoint, endPoint, new Rect[] { rectSource })) { linePoints.Add(endPoint); break; } bool sideFlag; Point n = GetNearestNeighborSource(source, endPoint, rectSource, out sideFlag); linePoints.Add(n); currentPoint = n; if (IsPointVisible(currentPoint, endPoint, new Rect[] { rectSource })) { linePoints.Add(endPoint); break; } else { Point n1, n2; GetOppositeCorners(source.Orientation, rectSource, out n1, out n2); if (sideFlag) { linePoints.Add(n1); } else { linePoints.Add(n2); } linePoints.Add(endPoint); break; } } } else { linePoints.Add(endPoint); } if (preferredOrientation != EnumConnectorOrientation.None) { linePoints = OptimizeLinePoints(linePoints, new Rect[] { rectSource }, source.Orientation, preferredOrientation); } else { linePoints = OptimizeLinePoints(linePoints, new Rect[] { rectSource }, source.Orientation, GetOpositeOrientation(source.Orientation)); } return(linePoints); }
internal static List <Point> GetConnectionLine(ModelConnectorInfo source, ModelConnectorInfo sink, bool showLastLine) { List <Point> linePoints = new List <Point>(); Rect rectSource = GetRectWithMargin(source, margin); Rect rectSink = GetRectWithMargin(sink, margin); Point startPoint = GetOffsetPoint(source, rectSource); Point endPoint = GetOffsetPoint(sink, rectSink); linePoints.Add(startPoint); Point currentPoint = startPoint; if (!rectSink.Contains(currentPoint) && !rectSource.Contains(endPoint)) { while (true) { #region source node if (IsPointVisible(currentPoint, endPoint, new Rect[] { rectSource, rectSink })) { linePoints.Add(endPoint); currentPoint = endPoint; break; } Point neighbour = GetNearestVisibleNeighborSink(currentPoint, endPoint, sink, rectSource, rectSink); if (!double.IsNaN(neighbour.X)) { linePoints.Add(neighbour); linePoints.Add(endPoint); currentPoint = endPoint; break; } if (currentPoint == startPoint) { bool flag; Point n = GetNearestNeighborSource(source, endPoint, rectSource, rectSink, out flag); linePoints.Add(n); currentPoint = n; if (!IsRectVisible(currentPoint, rectSink, new Rect[] { rectSource })) { Point n1, n2; GetOppositeCorners(source.Orientation, rectSource, out n1, out n2); if (flag) { linePoints.Add(n1); currentPoint = n1; } else { linePoints.Add(n2); currentPoint = n2; } if (!IsRectVisible(currentPoint, rectSink, new Rect[] { rectSource })) { if (flag) { linePoints.Add(n2); currentPoint = n2; } else { linePoints.Add(n1); currentPoint = n1; } } } } #endregion #region sink node else // from here on we jump to the sink node { Point n1, n2; // neighbour corner Point s1, s2; // opposite corner GetNeighborCorners(sink.Orientation, rectSink, out s1, out s2); GetOppositeCorners(sink.Orientation, rectSink, out n1, out n2); bool n1Visible = IsPointVisible(currentPoint, n1, new Rect[] { rectSource, rectSink }); bool n2Visible = IsPointVisible(currentPoint, n2, new Rect[] { rectSource, rectSink }); if (n1Visible && n2Visible) { if (rectSource.Contains(n1)) { linePoints.Add(n2); if (rectSource.Contains(s2)) { linePoints.Add(n1); linePoints.Add(s1); } else { linePoints.Add(s2); } linePoints.Add(endPoint); currentPoint = endPoint; break; } if (rectSource.Contains(n2)) { linePoints.Add(n1); if (rectSource.Contains(s1)) { linePoints.Add(n2); linePoints.Add(s2); } else { linePoints.Add(s1); } linePoints.Add(endPoint); currentPoint = endPoint; break; } if ((Distance(n1, endPoint) <= Distance(n2, endPoint))) { linePoints.Add(n1); if (rectSource.Contains(s1)) { linePoints.Add(n2); linePoints.Add(s2); } else { linePoints.Add(s1); } linePoints.Add(endPoint); currentPoint = endPoint; break; } else { linePoints.Add(n2); if (rectSource.Contains(s2)) { linePoints.Add(n1); linePoints.Add(s1); } else { linePoints.Add(s2); } linePoints.Add(endPoint); currentPoint = endPoint; break; } } else if (n1Visible) { linePoints.Add(n1); if (rectSource.Contains(s1)) { linePoints.Add(n2); linePoints.Add(s2); } else { linePoints.Add(s1); } linePoints.Add(endPoint); currentPoint = endPoint; break; } else { linePoints.Add(n2); if (rectSource.Contains(s2)) { linePoints.Add(n1); linePoints.Add(s1); } else { linePoints.Add(s2); } linePoints.Add(endPoint); currentPoint = endPoint; break; } } #endregion } } else { linePoints.Add(endPoint); } linePoints = OptimizeLinePoints(linePoints, new Rect[] { rectSource, rectSink }, source.Orientation, sink.Orientation); CheckPathEnd(source, sink, showLastLine, linePoints); return(linePoints); }