/// <summary> /// Draw connection (i.e. line with triangle) to specific graphics object. /// </summary> /// <param name="windowPosition">Position of window described by graphics object in composition area.</param> /// <param name="g">Graphics where connection should be drawn.</param> public void Draw(Point windowPosition, CompositionManager.EEditorMode mode, Graphics g) { float startX = _providingModel.GetMidPoint().X; float startY = _providingModel.GetMidPoint().Y; float endX = _acceptingModel.GetMidPoint().X; float endY = _acceptingModel.GetMidPoint().Y; // calculate triangle point in area points and store them internally _trianglePoints = GetTrianglePoints(startX, startY, endX, endY); // recalculate trinagle points so they correspond to window and can be draw Point[] windowTrianglePoints = new Point[3]; for (int i = 0; i < 3; i++) { windowTrianglePoints[i].X = _trianglePoints[i].X - windowPosition.X; windowTrianglePoints[i].Y = _trianglePoints[i].Y - windowPosition.Y; } // modify start and end so they correspond to window startX -= windowPosition.X; startY -= windowPosition.Y; endX -= windowPosition.X; endY -= windowPosition.Y; Pen pen = linePen; Pen penTriangle = Pens.Red; Brush brush = Brushes.Blue; if (mode == CompositionManager.EEditorMode.RunButNotReloaded) { pen = linePenDisabled; brush = Brushes.LightGray; penTriangle = Pens.Gray; } g.DrawLine(pen, startX, startY, endX, endY); // we draw the triangle only the link is at least 10 pixels if (Math.Abs(startX - endX) + Math.Abs(startY - endY) > 10) { g.FillPolygon(brush, windowTrianglePoints, System.Drawing.Drawing2D.FillMode.Alternate); g.DrawPolygon(penTriangle, windowTrianglePoints); } }