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