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
}
}