172 lines
4.8 KiB
C#

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
namespace DevComponents.Tree.Display
{
/// <summary>
/// Represents cell display class.
/// </summary>
internal class CellDisplay
{
public CellDisplay()
{
}
public static void PaintCell(NodeCellRendererEventArgs ci)
{
if(ci.Cell.CheckBoxVisible)
CellDisplay.PaintCellCheckBox(ci);
if(!ci.Cell.Images.LargestImageSize.IsEmpty)
CellDisplay.PaintCellImage(ci);
CellDisplay.PaintText(ci);
}
public static void PaintCellCheckBox(NodeCellRendererEventArgs ci)
{
if(!ci.Cell.CheckBoxVisible)
return;
Rectangle r=ci.Cell.CheckBoxBoundsRelative;
r.Offset(ci.CellOffset);
System.Windows.Forms.ButtonState state=System.Windows.Forms.ButtonState.Normal;
if(ci.Cell.Checked)
state=System.Windows.Forms.ButtonState.Checked;
System.Windows.Forms.ControlPaint.DrawCheckBox(ci.Graphics,r,state);
}
public static void PaintCellImage(NodeCellRendererEventArgs ci)
{
if(ci.Cell.Images.LargestImageSize.IsEmpty)
return;
Rectangle r=ci.Cell.ImageBoundsRelative;
r.Offset(ci.CellOffset);
Image image = CellDisplay.GetCellImage(ci.Cell);
if(image!=null)
{
Size imageSize = Dpi.Size(image.Size);
ci.Graphics.DrawImage(image,r.X+(r.Width-imageSize.Width)/2,
r.Y+(r.Height-imageSize.Height)/2, imageSize.Width, imageSize.Height);
}
}
public static void PaintText(NodeCellRendererEventArgs ci)
{
Cell cell=ci.Cell;
if(cell.HostedControl==null && (cell.Text=="" || ci.Style.TextColor.IsEmpty) || cell.TextContentBounds.IsEmpty )
return;
Rectangle bounds=ci.Cell.TextContentBounds;
bounds.Offset(ci.CellOffset);
if(cell.HostedControl!=null)
{
// if(ci.Graphics.Transform!=null)
// {
// Point[] p=new Point[] {new Point(bounds.X, bounds.Y), new Point(bounds.Right, bounds.Bottom)};
// ci.Graphics.Transform.TransformPoints(p);
// bounds = new Rectangle(p[0].X, p[0].Y, p[1].X-p[0].X, p[1].Y-p[0].Y);
// }
// if(cell.HostedControl.Bounds!=bounds)
// {
// cell.IgnoreHostedControlSizeChange = true;
// cell.HostedControl.Bounds=bounds;
// cell.IgnoreHostedControlSizeChange = false;
// }
if(!cell.HostedControl.Visible)
cell.HostedControl.Visible = true;
return;
}
Font font=ci.Style.Font;
bounds.Inflate(1,1);
if (cell.TextMarkupBody == null)
TextDrawing.DrawString(ci.Graphics , cell.Text, font, ci.Style.TextColor, bounds, ci.Style.TextFormat);
else
{
TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(ci.Graphics, font, ci.Style.TextColor, false);
d.HotKeyPrefixVisible = !((ci.Style.TextFormat & eTextFormat.HidePrefix) == eTextFormat.HidePrefix);
Rectangle mr = new Rectangle(bounds.X, bounds.Y + (bounds.Height - cell.TextMarkupBody.Bounds.Height) / 2, cell.TextMarkupBody.Bounds.Width, cell.TextMarkupBody.Bounds.Height);
mr.Offset((bounds.Width - mr.Width) / 2, 0);
cell.TextMarkupBody.Bounds = mr;
cell.TextMarkupBody.Render(d);
}
}
private static Image GetCellImage(Cell cell)
{
Image img=cell.Images.Image;
if(img==null && cell.Images.ImageIndex>=0)
img=cell.Images.GetImageByIndex(cell.Images.ImageIndex);
if(cell.IsMouseOver && (cell.Images.ImageMouseOver!=null || cell.Images.ImageMouseOverIndex>=0))
{
if(cell.Images.ImageMouseOver!=null)
img=cell.Images.ImageMouseOver;
else
img=cell.Images.GetImageByIndex(cell.Images.ImageMouseOverIndex);
}
else if(cell.Parent.Expanded && (cell.Images.ImageExpanded!=null || cell.Images.ImageExpandedIndex>=0))
{
if(cell.Images.ImageExpanded!=null)
img=cell.Images.ImageExpanded;
else
img=cell.Images.GetImageByIndex(cell.Images.ImageExpandedIndex);
}
return img;
}
public static Font GetCellFont(TreeGX tree, Cell cell)
{
Font font=tree.Font;
ElementStyle style=null;
if(cell.StyleNormal!=null)
{
style=cell.StyleNormal;
}
else
{
if(tree.NodeStyle!=null)
style=tree.NodeStyle;
else
style=new ElementStyle();
if(tree.CellStyleDefault!=null)
style=tree.CellStyleDefault;
else
style=ElementStyle.GetDefaultCellStyle(style);
}
if(style!=null && style.Font!=null)
font=style.Font;
return font;
}
}
/// <summary>
/// Represents information neccessary to paint the cell on canvas.
/// </summary>
internal class CellDisplayInfo
{
public ElementStyle Style=null;
public System.Drawing.Graphics Graphics=null;
public Cell ContextCell=null;
public Point CellOffset=Point.Empty;
public CellDisplayInfo()
{
}
public CellDisplayInfo(ElementStyle style, System.Drawing.Graphics g, Cell cell, Point cellOffset)
{
this.Style=style;
this.Graphics=g;
this.ContextCell=cell;
this.CellOffset=cellOffset;
}
}
}