private void DrawConnectors(DiagramShapeControlBase parentShape, Graphics g, Pen pen, Brush brush, DiagramLayoutDirection direction, DiagramConnectorType connectorType) { if (parentShape.Expanded) { Point startPoint = new Point(); Point endPoint = new Point(); if (showExpanders) { startPoint.X = parentShape.expander.Left + parentShape.expander.Width / 2; startPoint.Y = parentShape.expander.Top + parentShape.expander.Height / 2; } else { if (direction == DiagramLayoutDirection.Vertical) { startPoint.X = parentShape.Left + parentShape.Width / 2; startPoint.Y = parentShape.Bottom; } else if (direction == DiagramLayoutDirection.Horizontal) { startPoint.Y = parentShape.Top + parentShape.Height / 2; startPoint.X = parentShape.Right; } } foreach (DiagramShapeControlBase shape in parentShape.childShapes) { if (direction == DiagramLayoutDirection.Vertical) { endPoint.Y = shape.Top; endPoint.X = shape.Left + (shape.Width / 2); } else if (direction == DiagramLayoutDirection.Horizontal) { endPoint.Y = shape.Top + (shape.Height / 2); endPoint.X = shape.Left; } switch (connectorType) { case DiagramConnectorType.Standard: g.DrawLine(pen, startPoint, endPoint); break; case DiagramConnectorType.Bezier: Point pt1 = Point.Empty; Point pt2 = Point.Empty; if (direction == DiagramLayoutDirection.Vertical) { pt1 = new Point(startPoint.X, startPoint.Y + 20); pt2 = new Point(endPoint.X, endPoint.Y - 20); } else if (direction == DiagramLayoutDirection.Horizontal) { pt1 = new Point(startPoint.X + 20, startPoint.Y); pt2 = new Point(endPoint.X - 20, endPoint.Y); } g.DrawBezier(pen, startPoint, pt1, pt2, endPoint); break; } // Draw arrows if (drawArrows) { Point anglePoint = new Point(endPoint.X - startPoint.X, endPoint.Y - startPoint.Y); float angle = (float)(Math.Atan2(anglePoint.Y, anglePoint.X) * (180.0 / Math.PI)); if (connectorType == DiagramConnectorType.Bezier) { if (direction == DiagramLayoutDirection.Horizontal) angle *= 0.5f; else angle = 90.0f + (angle - 90.0f) * 0.5f; } g.TranslateTransform(endPoint.X, endPoint.Y); g.RotateTransform(angle); g.FillPath(brush, arrowPath); g.ResetTransform(); } DrawConnectors(shape, g, pen, brush, direction, connectorType); } } }
private void DrawConnectors(DiagramShapeControlBase parentShape, Graphics g, Pen pen, Brush brush, DiagramLayoutDirection direction, DiagramConnectorType connectorType) { if (parentShape.Expanded) { Point startPoint = new Point(); Point endPoint = new Point(); if (showExpanders) { startPoint.X = parentShape.expander.Left + parentShape.expander.Width / 2; startPoint.Y = parentShape.expander.Top + parentShape.expander.Height / 2; } else { if (direction == DiagramLayoutDirection.Vertical) { startPoint.X = parentShape.Left + parentShape.Width / 2; startPoint.Y = parentShape.Bottom; } else if (direction == DiagramLayoutDirection.Horizontal) { startPoint.Y = parentShape.Top + parentShape.Height / 2; startPoint.X = parentShape.Right; } } foreach (DiagramShapeControlBase shape in parentShape.childShapes) { if (direction == DiagramLayoutDirection.Vertical) { endPoint.Y = shape.Top; endPoint.X = shape.Left + (shape.Width / 2); } else if (direction == DiagramLayoutDirection.Horizontal) { endPoint.Y = shape.Top + (shape.Height / 2); endPoint.X = shape.Left; } switch (connectorType) { case DiagramConnectorType.Standard: g.DrawLine(pen, startPoint, endPoint); break; case DiagramConnectorType.Bezier: Point pt1 = Point.Empty; Point pt2 = Point.Empty; if (direction == DiagramLayoutDirection.Vertical) { pt1 = new Point(startPoint.X, startPoint.Y + 20); pt2 = new Point(endPoint.X, endPoint.Y - 20); } else if (direction == DiagramLayoutDirection.Horizontal) { pt1 = new Point(startPoint.X + 20, startPoint.Y); pt2 = new Point(endPoint.X - 20, endPoint.Y); } g.DrawBezier(pen, startPoint, pt1, pt2, endPoint); break; } // Draw arrows if (drawArrows) { Point anglePoint = new Point(endPoint.X - startPoint.X, endPoint.Y - startPoint.Y); float angle = (float)(Math.Atan2(anglePoint.Y, anglePoint.X) * (180.0 / Math.PI)); if (connectorType == DiagramConnectorType.Bezier) { if (direction == DiagramLayoutDirection.Horizontal) { angle *= 0.5f; } else { angle = 90.0f + (angle - 90.0f) * 0.5f; } } g.TranslateTransform(endPoint.X, endPoint.Y); g.RotateTransform(angle); g.FillPath(brush, arrowPath); g.ResetTransform(); } DrawConnectors(shape, g, pen, brush, direction, connectorType); } } }