211 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System.Drawing;
 | 
						|
using System.Drawing.Drawing2D;
 | 
						|
using DevComponents.DotNetBar.SuperGrid.Style;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar.SuperGrid
 | 
						|
{
 | 
						|
    ///<summary>
 | 
						|
    /// TreeDisplay
 | 
						|
    ///</summary>
 | 
						|
    public class TreeDisplay
 | 
						|
    {
 | 
						|
        #region RenderLines
 | 
						|
 | 
						|
        ///<summary>
 | 
						|
        /// RenderTreeLines
 | 
						|
        ///</summary>
 | 
						|
        ///<param name="g"></param>
 | 
						|
        ///<param name="panel"></param>
 | 
						|
        ///<param name="bounds"></param>
 | 
						|
        ///<param name="item"></param>
 | 
						|
        ///<param name="indentLevel"></param>
 | 
						|
        ///<param name="indentAmount"></param>
 | 
						|
        ///<param name="width"></param>
 | 
						|
        ///<param name="hasButton"></param>
 | 
						|
        static public void RenderLines(Graphics g, GridPanel panel, Rectangle bounds,
 | 
						|
            GridContainer item, int indentLevel, int indentAmount, int width, bool hasButton)
 | 
						|
        {
 | 
						|
            if (panel.NewFullIndex <= 1)
 | 
						|
                return;
 | 
						|
 | 
						|
            Rectangle r = bounds;
 | 
						|
 | 
						|
            SmoothingMode sm = g.SmoothingMode;
 | 
						|
            g.SmoothingMode = SmoothingMode.None;
 | 
						|
 | 
						|
            GridPanelVisualStyle style = panel.GetEffectiveStyle();
 | 
						|
 | 
						|
            if (style.TreeLinePattern == LinePattern.Dot)
 | 
						|
            {
 | 
						|
                if (r.Y % 2 == 0)
 | 
						|
                {
 | 
						|
                    r.Y++;
 | 
						|
 | 
						|
                    if (r.Height % 2 != 0)
 | 
						|
                        r.Height--;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            GetLineBounds(bounds, ref r, indentLevel, indentAmount, width);
 | 
						|
 | 
						|
            using (Pen pen = new Pen(style.TreeLineColor, Dpi.Width1))
 | 
						|
            {
 | 
						|
                pen.DashStyle = (DashStyle)style.TreeLinePattern;
 | 
						|
 | 
						|
                Rectangle t = Rectangle.Empty;
 | 
						|
                int n = 0;
 | 
						|
 | 
						|
                if (item is GridPanel)
 | 
						|
                {
 | 
						|
                    t = item.BoundsRelative;
 | 
						|
 | 
						|
                    t.X -= item.HScrollOffset;
 | 
						|
                    t.Y -= item.VScrollOffset;
 | 
						|
 | 
						|
                    if (item.HasCheckBox == true)
 | 
						|
                        n = Dpi.Width(panel.CheckBoxSize.Width);
 | 
						|
                }
 | 
						|
 | 
						|
                if (r.Width > 0)
 | 
						|
                    DrawDash(g, item, style, pen, r, t, n, hasButton);
 | 
						|
 | 
						|
                int rowIndex = item.GridIndex;
 | 
						|
 | 
						|
                GridContainer tRow = item;
 | 
						|
                GridContainer nRow = tRow.GetNextItem();
 | 
						|
 | 
						|
                while (tRow != null)
 | 
						|
                {
 | 
						|
                    int tIndex = (nRow != null) ? nRow.GridIndex : -1;
 | 
						|
 | 
						|
                    if (r.Width > 0)
 | 
						|
                    {
 | 
						|
                        if (t.IsEmpty || r.Right <= t.Left)
 | 
						|
                        {
 | 
						|
                            if (tIndex > rowIndex)
 | 
						|
                            {
 | 
						|
                                if (rowIndex == 0 && item.Parent is GridPanel)
 | 
						|
                                    DrawLower(g, style, pen, r);
 | 
						|
                                else
 | 
						|
                                    DrawFull(g, pen, r);
 | 
						|
                            }
 | 
						|
                            else
 | 
						|
                            {
 | 
						|
                                if (item == tRow && (indentLevel > 0 || rowIndex > 0))
 | 
						|
                                    DrawUpper(g, pen, r);
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
 | 
						|
                    tRow = tRow.Parent as GridRow;
 | 
						|
 | 
						|
                    if (tRow != null)
 | 
						|
                        nRow = tRow.GetNextItem();
 | 
						|
 | 
						|
                    GetLineBounds(bounds, ref r, --indentLevel, indentAmount, width);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            g.SmoothingMode = sm;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetLineBounds
 | 
						|
 | 
						|
        static private void GetLineBounds(
 | 
						|
            Rectangle bounds, ref Rectangle r, int indentLevel, int indentAmount, int width)
 | 
						|
        {
 | 
						|
            r.X = bounds.X + indentAmount * indentLevel;
 | 
						|
            r.Width = width;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DrawDash
 | 
						|
 | 
						|
        static void DrawDash(Graphics g, GridContainer item, GridPanelVisualStyle style,
 | 
						|
            Pen pen, Rectangle r, Rectangle t, int n, bool hasButton)
 | 
						|
        {
 | 
						|
            int x = r.X + r.Width / 2 + 1;
 | 
						|
            int y = r.Y + r.Height / 2;
 | 
						|
 | 
						|
            GridPanel ppanel = item.GetParentPanel();
 | 
						|
 | 
						|
            if (ppanel.CheckBoxes == true && item.ShowCheckBox == false)
 | 
						|
            {
 | 
						|
                r.Width += Dpi.Width(ppanel.CheckBoxSize.Width);
 | 
						|
 | 
						|
                if (item is GridPanel)
 | 
						|
                    r.Width += Dpi.Width4;
 | 
						|
            }
 | 
						|
 | 
						|
            if (t.Width > 0 && r.Right > t.Left - n)
 | 
						|
                r.Width -= r.Right - (t.Left - n);
 | 
						|
            
 | 
						|
            if (r.Width > 0)
 | 
						|
            {
 | 
						|
                if (style.TreeLinePattern == LinePattern.Dot)
 | 
						|
                {
 | 
						|
                    x++;
 | 
						|
 | 
						|
                    if (hasButton == false)
 | 
						|
                    {
 | 
						|
                        if (y % 2 == 0)
 | 
						|
                            y--;
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        y -= 2;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                g.DrawLine(pen, x, y, r.Right, y);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DrawUpper
 | 
						|
 | 
						|
        static void DrawUpper(Graphics g, Pen pen, Rectangle r)
 | 
						|
        {
 | 
						|
            int x = r.X + r.Width / 2;
 | 
						|
 | 
						|
            g.DrawLine(pen, x, r.Y, x, r.Y + r.Height / 2);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DrawLower
 | 
						|
 | 
						|
        static void DrawLower(Graphics g,
 | 
						|
            GridPanelVisualStyle style, Pen pen, Rectangle r)
 | 
						|
        {
 | 
						|
            int x = r.X + r.Width / 2;
 | 
						|
            int y = r.Y + r.Height / 2;
 | 
						|
 | 
						|
            if (style.TreeLinePattern == LinePattern.Dot)
 | 
						|
            {
 | 
						|
                if (y % 2 == 0)
 | 
						|
                    y--;
 | 
						|
            }
 | 
						|
 | 
						|
            g.DrawLine(pen, x, y, x, r.Bottom);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DrawFull
 | 
						|
 | 
						|
        static void DrawFull(Graphics g, Pen pen, Rectangle r)
 | 
						|
        {
 | 
						|
            g.DrawLine(pen,
 | 
						|
                       r.X + r.Width / 2, r.Y,
 | 
						|
                       r.X + r.Width / 2, r.Bottom);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |