using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using DevComponents.AdvTree.Display;
namespace DevComponents.AdvTree.Display
{
	/// 
	/// Represents the line connector display class.
	/// 
	public class LineConnectorDisplay:NodeConnectorDisplay
	{
		/// 
		/// Draws connector line between two nodes.
		/// 
		/// Connector context information.
		public override void DrawConnector(ConnectorRendererEventArgs info)
		{
			if(info.NodeConnector.LineColor.IsEmpty || info.NodeConnector.LineWidth<=0)
				return;
            Point pStart, pEnd;
            // FromNode is null when connector is rendered for the child node
            if (info.FromNode == null)
            {
                Rectangle cellBounds = NodeDisplay.GetNodeRectangle(eNodeRectanglePart.NodeContentBounds, info.ToNode, info.Offset);
                Rectangle expandBounds = NodeDisplay.GetNodeRectangle(eNodeRectanglePart.ExpandBounds, info.ToNode, info.Offset);
                pStart = new Point(cellBounds.X - 4, cellBounds.Y + cellBounds.Height / 2);
                pEnd = new Point(expandBounds.X + expandBounds.Width / 2, pStart.Y);
            }
            else
            {
                // FromNode is parent node, ToNode is last visible child node. Connector is vertical line from parent to last visible child
                Rectangle cellBounds = NodeDisplay.GetNodeRectangle(eNodeRectanglePart.NodeContentBounds, info.FromNode, info.Offset);
                Rectangle expandBounds = NodeDisplay.GetNodeRectangle(eNodeRectanglePart.ExpandBounds, info.ToNode, info.Offset);
                pStart = new Point(expandBounds.X + expandBounds.Width / 2, cellBounds.Bottom);
                pEnd = new Point(pStart.X, expandBounds.Y + expandBounds.Height / 2);
            }
            Graphics g = info.Graphics;
            using (Pen pen = GetLinePen(info))
            {
                SmoothingMode sm = g.SmoothingMode;
                if (pen.DashStyle != DashStyle.Solid)
                    g.SmoothingMode = SmoothingMode.Default;
                g.DrawLine(pen, pStart, pEnd);
                g.SmoothingMode = sm;
            }
		}
	}
}