/// <summary>
        /// Draws the limit line (if it contains at least 2 positions)
        /// </summary>
        /// <param name="display">The display to draw to</param>
        internal void Render(ISpatialDisplay display)
        {
            if (m_Limit==null || m_Limit.Count==0 || m_Mouse==null)
                return;

            // Draw dotted line from the last point on the limit line to the last known mouse position
            int lastIndex = m_Limit.Count-1;
            IPosition last = m_Limit[lastIndex];
            DottedStyle dottedLine = new DottedStyle(Color.Gray);
            dottedLine.Render(display, new IPosition[] { last, m_Mouse });

            // If we have two or more positions, draw an additional dotted line to the start of
            // the limit line.
            if (m_Limit.Count>=2)
                dottedLine.Render(display, new IPosition[] { m_Mouse, m_Limit[0] });

            // Draw the limit line
            if (m_Limit.Count>1)
                dottedLine.Render(display, m_Limit.ToArray());

            // Draw any limit line selection
            if (m_LimSel.Count>0)
            {
                HighlightStyle style = new HighlightStyle();
                style.ShowLineEndPoints = false;
                new SpatialSelection(m_LimSel).Render(display, style);
            }
        }
        /// <summary>
        /// Draws the current state of the edit
        /// </summary>
        internal void Draw()
        {
            Debug.Assert(m_Line!=null);
            ISpatialDisplay view = ActiveDisplay;

            // Figure out the positions for the ends of the parallel line (if any) ...

            // Assume we already know both terminals.
            IPosition start = m_Term1;
            IPosition end = m_Term2;

            // If either one is undefined, but a dialog for it is active,
            // try to get the terminal from there instead.
            if (m_TermDial1!=null && start==null)
                start = m_TermDial1.TerminalPosition;

            if (m_TermDial2!=null && end==null)
                end = m_TermDial2.TerminalPosition;

            // If they weren't actually defined, use the parallel points instead.
            if (start==null)
                start = m_Par1;

            if (end==null)
                end = m_Par2;

            // If those weren't defined either, try to calculate them now.
            if (end==null && Calculate())
            {
                start = m_Par1;
                end = m_Par2;
            }

            // Any offset point
            if (m_OffsetPoint!=null)
                m_OffsetPoint.Draw(view, Color.Green);

            // Everything else should draw in usual command-style colour.
            IDrawStyle style = EditingController.Current.Style(Color.Magenta);
            IDrawStyle dottedStyle = new DottedStyle();

            // If the reference line is a curve, get the curve info.
            ArcFeature arc = m_Line.GetArcBase();
            if (arc != null)
            {
                bool iscw = arc.IsClockwise;

                // Reverse the direction if necessary.
                if (m_IsReversed)
                    iscw = !iscw;

                // Draw the parallel line (the rest of the circle being dotted).
                if (start!=null)
                {
                    CircularArcGeometry parArc = new CircularArcGeometry(arc.Circle, start, end, iscw);
                    style.Render(view, parArc);

                    parArc.IsClockwise = !parArc.IsClockwise;
                    dottedStyle.Render(view, parArc);
                }
            }
            else
            {
                // PARALLEL IS STRAIGHT

                // If we've got something, figure out positions for dotted portion.
                if (start!=null)
                {
                    // What's the max length of a diagonal crossing the entire screen?
                    double maxdiag = this.MaxDiagonal;

                    // What's the bearing from the start to the end of the parallel?
                    double bearing = Geom.BearingInRadians(start, end);

                    // Project to a point before the start end of the parallel, as
                    // well as a point after the end.
                    IPosition before = Geom.Polar(start, bearing+Constants.PI, maxdiag);
                    IPosition after = Geom.Polar(end, bearing, maxdiag);

                    LineSegmentGeometry.Render(before, start, view, dottedStyle);
                    LineSegmentGeometry.Render(start, end, view, style);
                    LineSegmentGeometry.Render(end, after, view, dottedStyle);
                }
            }

            // Draw terminal positions (if defined).

            if (m_Term1!=null)
                style.Render(view, m_Term1);

            if (m_Term2!=null)
                style.Render(view, m_Term2);

            // The terminal lines.

            if (m_TermLine1!=null)
                m_TermLine1.Render(view, style);

            if (m_TermLine2!=null)
                m_TermLine2.Render(view, style);

            // Do the active dialog last so their stuff draws on top.
            if (m_ParDial!=null)
                m_ParDial.Draw();

            if (m_TermDial1!=null)
                m_TermDial1.Draw();

            if (m_TermDial2!=null)
                m_TermDial2.Draw();
        }