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