private void DrawSelfSignal(IDrawingCanvas drawingCanvas, SignalVisualElement signal)
        {
            // Actor line position
            double aX = GetCenterX(signal.ActorA) + signal.ActorA.OffsetX;

            // Left and right edges of self-signal line
            double x1 = aX;
            double x2 = x1 + s_selfSignalWidth;

            // Top and bottom of self-signal line
            double y1 = signal.OffsetY + s_signalMargin.Top;
            double y2 = signal.OffsetY + signal.TextBB.Height - s_signalMargin.Bottom;

            // Position of signal text
            double x = x2 + s_signalPadding.Left;
            double y = y1 + s_signalPadding.Top;

            // Draw the text so that its left edge is along the vertical segment of the self-signal
            signal.Text.TextAlignment = TextAlignment.Left;
            signal.Text.SetForegroundBrush(SignalForeground);
            drawingCanvas.DrawText(x, y, signal.Text);

            // Draw three lines, the last one with an arrow
            drawingCanvas.DrawLine(x1, y1, x2, y1, signal.LineType, SequenceArrowType.None);
            drawingCanvas.DrawLine(x2, y1, x2, y2, signal.LineType, SequenceArrowType.None);
            drawingCanvas.DrawLine(x2, y2, x1, y2, signal.LineType, signal.ArrowType);
        }
        private void DrawActors(IDrawingCanvas drawingCanvas)
        {
            if (m_actorVisualElements == null)
            {
                return;
            }

            foreach (var actor in m_actorVisualElements)
            {
                // Vertical line
                double x = GetCenterX(actor) + actor.OffsetX;
                drawingCanvas.DrawLine(
                    x, m_actorsHeight / 2,
                    x, m_annotationsBottom + m_actorsHeight / 2,
                    SequenceLineType.Solid,
                    SequenceArrowType.None
                    );

                // Top box
                DrawActor(drawingCanvas, actor, 0);

                // Bottom box
                DrawActor(drawingCanvas, actor, m_annotationsBottom);
            }
        }
        private void DrawSignal(IDrawingCanvas drawingCanvas, SignalVisualElement signal)
        {
            double aX = GetCenterX(signal.ActorA) + signal.ActorA.OffsetX;
            double bX = GetCenterX(signal.ActorB) + signal.ActorB.OffsetX;

            // Mid-point between actors
            double x = (bX + aX) / 2;
            double y = signal.OffsetY + s_signalMargin.Top + s_signalPadding.Top;

            // Draw the text in the middle of the signal
            signal.Text.TextAlignment = TextAlignment.Center;
            signal.Text.SetForegroundBrush(SignalForeground);
            drawingCanvas.DrawText(x, y, signal.Text);

            // Draw the line along the bottom of the signal
            y = signal.OffsetY + signal.TextBB.Height - s_signalMargin.Bottom;
            drawingCanvas.DrawLine(aX, y, bX, y, signal.LineType, signal.ArrowType);
        }