120 lines
6.2 KiB
C#
120 lines
6.2 KiB
C#
using System;
|
|
using System.Text;
|
|
using DevComponents.DotNetBar;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
|
|
namespace DevComponents.AdvTree.Display
|
|
{
|
|
internal class ColumnHeaderDisplay
|
|
{
|
|
internal void DrawColumnHeader(ColumnHeaderRendererEventArgs e, ElementStyleDisplayInfo di)
|
|
{
|
|
// Adjust the header bounds so the header is filled completely
|
|
if (e.Tree != null && e.Tree.CellHorizontalSpacing > 0 && !e.ColumnHeader.IsFirstVisible) {
|
|
Rectangle ob = di.Bounds;
|
|
di.Bounds = new Rectangle(ob.X - e.Tree.CellHorizontalSpacing, ob.Y, ob.Width + e.Tree.CellHorizontalSpacing, ob.Height);
|
|
ElementStyleDisplay.Paint(di);
|
|
di.Bounds = ob;
|
|
}
|
|
else
|
|
ElementStyleDisplay.Paint(di);
|
|
di.Bounds.Inflate(-1, -1);
|
|
if (di.Bounds.Width > 1 && di.Bounds.Height > 1)
|
|
{
|
|
if (e.ColumnHeader.IsFirstVisible)
|
|
{
|
|
Rectangle r = di.Bounds;
|
|
r.Width -= 3;
|
|
r.X += 3;
|
|
di.Bounds = r;
|
|
}
|
|
|
|
if (e.ColumnHeader.SortDirection != eSortDirection.None && !e.SortIndicatorColor.IsEmpty)
|
|
{
|
|
using (GraphicsPath sortShapePath = UIGraphics.GetTrianglePath(
|
|
new Point(di.Bounds.Right - 11, di.Bounds.Y + (di.Bounds.Height - 5) / 2), 9,
|
|
(e.ColumnHeader.SortDirection == eSortDirection.Ascending ? eTriangleDirection.Top : eTriangleDirection.Bottom)))
|
|
{
|
|
SmoothingMode sm = e.Graphics.SmoothingMode;
|
|
e.Graphics.SmoothingMode = SmoothingMode.Default;
|
|
using (SolidBrush brush = new SolidBrush(e.SortIndicatorColor))
|
|
e.Graphics.FillPath(brush, sortShapePath);
|
|
e.Graphics.SmoothingMode = sm;
|
|
}
|
|
di.Bounds.Width -= 12;
|
|
}
|
|
|
|
if (e.ColumnHeader.Image != null)
|
|
{
|
|
Image image = e.ColumnHeader.Image;
|
|
Rectangle r = di.Bounds;
|
|
if (e.ColumnHeader.ImageAlignment == eColumnImageAlignment.Left)
|
|
{
|
|
e.Graphics.DrawImage(image, r.X,
|
|
r.Y + (r.Height - image.Height) / 2, image.Width, image.Height);
|
|
r.X += image.Width + 2;
|
|
r.Width -= image.Width + 2;
|
|
|
|
}
|
|
else if (e.ColumnHeader.ImageAlignment == eColumnImageAlignment.Right)
|
|
{
|
|
e.Graphics.DrawImage(image, r.Right - image.Width,
|
|
r.Y + (r.Height - image.Height) / 2, image.Width, image.Height);
|
|
r.Width -= image.Width + 2;
|
|
}
|
|
di.Bounds = r;
|
|
}
|
|
|
|
ElementStyleDisplay.PaintText(di, e.ColumnHeader.Text, e.Tree.Font);
|
|
}
|
|
}
|
|
|
|
internal static void PaintColumnMoveMarker(Graphics g, AdvTree tree, int columnMoveMarkerIndex, ColumnHeaderCollection columns)
|
|
{
|
|
if (columnMoveMarkerIndex == -1) throw new ArgumentException("columnMoveMarkerIndex must be grater or equal than 0");
|
|
if (columns == null) throw new ArgumentNullException("columns");
|
|
|
|
Color lineColor = ColorScheme.GetColor("834DD5");
|
|
Color fillColor = ColorScheme.GetColor("CCCFF8");
|
|
Size markerSize = new Size(10, 14);
|
|
|
|
ColumnHeader header = null;
|
|
|
|
if (columnMoveMarkerIndex == columns.Count)
|
|
header = columns.LastVisibleColumn;
|
|
else
|
|
header = columns[columnMoveMarkerIndex];
|
|
Rectangle markerBounds = Rectangle.Empty;
|
|
if (columnMoveMarkerIndex == columns.Count)
|
|
markerBounds = new Rectangle(header.Bounds.Right - markerSize.Width, header.Bounds.Bottom - markerSize.Height, markerSize.Width, markerSize.Height);
|
|
else if (columns[columnMoveMarkerIndex] == columns.FirstVisibleColumn)
|
|
markerBounds = new Rectangle(header.Bounds.X, header.Bounds.Bottom - markerSize.Height, markerSize.Width, markerSize.Height);
|
|
else
|
|
markerBounds = new Rectangle(header.Bounds.X - markerSize.Width / 2 - tree.NodeLayout.GetCellLayout().LayoutSettings.CellHorizontalSpacing, header.Bounds.Bottom - markerSize.Height, markerSize.Width, markerSize.Height);
|
|
if (tree.AutoScrollPosition.X != 0)
|
|
markerBounds.Offset(tree.AutoScrollPosition.X, 0);
|
|
using (GraphicsPath path = CreateMarker(markerBounds))
|
|
{
|
|
using (SolidBrush brush = new SolidBrush(fillColor))
|
|
g.FillPath(brush, path);
|
|
using (Pen pen = new Pen(lineColor, 1))
|
|
g.DrawPath(pen, path);
|
|
}
|
|
}
|
|
private static GraphicsPath CreateMarker(Rectangle markerBounds)
|
|
{
|
|
markerBounds.Height--;
|
|
GraphicsPath path = new GraphicsPath();
|
|
path.AddLine(markerBounds.X + markerBounds.Width / 2, markerBounds.Bottom, markerBounds.X, markerBounds.Bottom - markerBounds.Width / 2);
|
|
path.AddLine(markerBounds.X, markerBounds.Bottom - markerBounds.Width / 2, markerBounds.X + markerBounds.Width / 3, markerBounds.Bottom - markerBounds.Width / 2);
|
|
path.AddLine(markerBounds.X + markerBounds.Width / 3, markerBounds.Bottom - markerBounds.Width / 2, markerBounds.X + markerBounds.Width / 3, markerBounds.Y);
|
|
path.AddLine(markerBounds.X + markerBounds.Width / 3, markerBounds.Y, markerBounds.Right - markerBounds.Width / 3, markerBounds.Y);
|
|
path.AddLine(markerBounds.Right - markerBounds.Width / 3, markerBounds.Y, markerBounds.Right - markerBounds.Width / 3, markerBounds.Bottom - markerBounds.Width / 2);
|
|
path.AddLine(markerBounds.Right - markerBounds.Width / 3, markerBounds.Bottom - markerBounds.Width / 2, markerBounds.Right, markerBounds.Bottom - markerBounds.Width / 2);
|
|
path.CloseAllFigures();
|
|
return path;
|
|
}
|
|
}
|
|
}
|