392 lines
18 KiB
C#
392 lines
18 KiB
C#
using System;
|
|
using System.Text;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Windows.Forms;
|
|
using DevComponents.DotNetBar.Ribbon;
|
|
|
|
namespace DevComponents.DotNetBar.Rendering
|
|
{
|
|
internal class Office2007CheckBoxItemPainter : CheckBoxItemPainter, IOffice2007Painter
|
|
{
|
|
#region Private Variables
|
|
|
|
#endregion
|
|
|
|
#region IOffice2007Painter
|
|
private Office2007ColorTable m_ColorTable = null;
|
|
|
|
/// <summary>
|
|
/// Gets or sets color table used by renderer.
|
|
/// </summary>
|
|
public Office2007ColorTable ColorTable
|
|
{
|
|
get { return m_ColorTable; }
|
|
set { m_ColorTable = value; }
|
|
}
|
|
#endregion
|
|
|
|
#region Internal Implementation
|
|
public override void Paint(CheckBoxItemRenderEventArgs e)
|
|
{
|
|
Graphics g = e.Graphics;
|
|
CheckBoxItem item = e.CheckBoxItem;
|
|
bool rtl = e.RightToLeft;
|
|
Font font = e.Font;
|
|
Office2007CheckBoxStateColorTable ct = this.GetCheckBoxStateColorTable(e);
|
|
bool standalone = e.ItemPaintArgs.ContainerControl is DevComponents.DotNetBar.Controls.CheckBoxX;
|
|
|
|
Rectangle checkBoxPosition = Rectangle.Empty;
|
|
Rectangle textRect = Rectangle.Empty;
|
|
eTextFormat tf = eTextFormat.Default;
|
|
if (!(e.ItemPaintArgs != null && e.ItemPaintArgs.ContainerControl is DevComponents.DotNetBar.Controls.CheckBoxX ||
|
|
(e.ItemPaintArgs != null && e.ItemPaintArgs.ContainerControl is ItemControl) ||
|
|
(e.ItemPaintArgs != null && e.ItemPaintArgs.ContainerControl is Bar) ||
|
|
(e.ItemPaintArgs != null && e.ItemPaintArgs.ContainerControl is MenuPanel)))
|
|
{
|
|
tf |= eTextFormat.NoPrefix;
|
|
}
|
|
|
|
Size checkSignSize = item.GetCheckSignSize();
|
|
|
|
float baselineOffsetPixels = g.DpiY / 72f * (font.SizeInPoints / font.FontFamily.GetEmHeight(font.Style) * font.FontFamily.GetCellAscent(font.Style)) + .5f;
|
|
//float fontDescentPixels = g.DpiY / 72f * (font.SizeInPoints / font.FontFamily.GetEmHeight(font.Style) * font.FontFamily.GetCellDescent(font.Style));
|
|
|
|
if (item.CheckBoxPosition == eCheckBoxPosition.Left && !rtl || item.CheckBoxPosition == eCheckBoxPosition.Right && rtl)
|
|
{
|
|
checkBoxPosition = new Rectangle(item.DisplayRectangle.X + (standalone ? 0 : item.CheckTextSpacing / 2),
|
|
item.DisplayRectangle.Y + (item.DisplayRectangle.Height - checkSignSize.Height) / 2,
|
|
checkSignSize.Width, checkSignSize.Height);
|
|
textRect = new Rectangle(checkBoxPosition.Right + item.CheckTextSpacing / 2, item.DisplayRectangle.Y,
|
|
item.DisplayRectangle.Right - (checkBoxPosition.Right + item.CheckTextSpacing / 2), item.DisplayRectangle.Height);
|
|
|
|
if (item.TextMarkupBody == null)
|
|
{
|
|
if (!(item.Text.Contains(Environment.NewLine) || item.IsTextMultiLine) && item.TextSize.Width <= textRect.Width)
|
|
textRect.Y = checkBoxPosition.Bottom - (int)baselineOffsetPixels - Dpi.Height(3);
|
|
else
|
|
tf |= eTextFormat.VerticalCenter | eTextFormat.WordBreak;
|
|
}
|
|
else
|
|
tf |= eTextFormat.VerticalCenter;
|
|
}
|
|
else if (item.CheckBoxPosition == eCheckBoxPosition.Right && !rtl || item.CheckBoxPosition == eCheckBoxPosition.Left && rtl)
|
|
{
|
|
checkBoxPosition = new Rectangle(item.DisplayRectangle.Right - (standalone ? 1 : item.CheckTextSpacing / 2) - checkSignSize.Width,
|
|
item.DisplayRectangle.Y + (item.DisplayRectangle.Height - checkSignSize.Height) / 2,
|
|
checkSignSize.Width, checkSignSize.Height);
|
|
textRect = new Rectangle(item.DisplayRectangle.X, item.DisplayRectangle.Y,
|
|
checkBoxPosition.X - (item.DisplayRectangle.X + item.CheckTextSpacing / 2), item.DisplayRectangle.Height);
|
|
|
|
if (item.TextMarkupBody == null)
|
|
{
|
|
if (!item.Text.Contains(Environment.NewLine) && item.TextSize.Width <= textRect.Width)
|
|
textRect.Y = checkBoxPosition.Bottom - (int)baselineOffsetPixels - Dpi.Height(3);
|
|
else
|
|
tf |= eTextFormat.VerticalCenter | eTextFormat.WordBreak;
|
|
}
|
|
else
|
|
tf |= eTextFormat.VerticalCenter;
|
|
|
|
tf |= eTextFormat.Right;
|
|
}
|
|
else if (item.CheckBoxPosition == eCheckBoxPosition.Top)
|
|
{
|
|
checkBoxPosition = new Rectangle(item.DisplayRectangle.X + (item.DisplayRectangle.Width - checkSignSize.Width) / 2,
|
|
item.DisplayRectangle.Y + item.VerticalPadding, checkSignSize.Width, checkSignSize.Height);
|
|
textRect = new Rectangle(item.DisplayRectangle.X, checkBoxPosition.Bottom,
|
|
item.DisplayRectangle.Width, item.DisplayRectangle.Bottom - checkBoxPosition.Bottom);
|
|
tf |= eTextFormat.VerticalCenter | eTextFormat.HorizontalCenter;
|
|
}
|
|
else if (item.CheckBoxPosition == eCheckBoxPosition.Bottom)
|
|
{
|
|
checkBoxPosition = new Rectangle(item.DisplayRectangle.X + (item.DisplayRectangle.Width - checkSignSize.Width) / 2,
|
|
item.DisplayRectangle.Bottom - item.VerticalPadding - checkSignSize.Height - 1, checkSignSize.Width, checkSignSize.Height);
|
|
textRect = new Rectangle(item.DisplayRectangle.X, item.DisplayRectangle.Y,
|
|
item.DisplayRectangle.Width, checkBoxPosition.Y - (item.DisplayRectangle.Y + item.VerticalPadding));
|
|
|
|
tf |= eTextFormat.VerticalCenter | eTextFormat.HorizontalCenter;
|
|
}
|
|
|
|
if (item.CheckState == CheckState.Unchecked && item.CheckBoxImageUnChecked != null)
|
|
g.DrawImage(item.CheckBoxImageUnChecked, checkBoxPosition);
|
|
else if (item.CheckState == CheckState.Checked && item.CheckBoxImageChecked != null)
|
|
g.DrawImage(item.CheckBoxImageChecked, checkBoxPosition);
|
|
else if (item.CheckState == CheckState.Indeterminate && item.CheckBoxImageIndeterminate != null)
|
|
g.DrawImage(item.CheckBoxImageIndeterminate, checkBoxPosition);
|
|
else
|
|
{
|
|
if (item.CheckBoxStyle == eCheckBoxStyle.CheckBox)
|
|
{
|
|
PaintCheckBox(g, checkBoxPosition, ct, item.CheckState);
|
|
}
|
|
else
|
|
{
|
|
PaintRadioButton(g, checkBoxPosition, ct, item.Checked);
|
|
}
|
|
}
|
|
|
|
Color textColor = ct.Text;
|
|
if (!item.TextColor.IsEmpty) textColor = item.TextColor;
|
|
if (item.Text != "" && !textRect.IsEmpty && !textColor.IsEmpty && item.Orientation != eOrientation.Vertical && item.TextVisible)
|
|
{
|
|
if (item.TextMarkupBody != null)
|
|
{
|
|
TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, textColor, rtl);
|
|
d.HotKeyPrefixVisible = !((tf & eTextFormat.HidePrefix) == eTextFormat.HidePrefix);
|
|
if ((tf & eTextFormat.VerticalCenter) == eTextFormat.VerticalCenter)
|
|
{
|
|
textRect.Y = item.TopInternal + (item.Bounds.Height - item.TextMarkupBody.Bounds.Height) / 2;
|
|
textRect.Height = item.TextMarkupBody.Bounds.Height;
|
|
}
|
|
else if ((tf & eTextFormat.Bottom) == eTextFormat.Bottom)
|
|
{
|
|
textRect.Y += (item.Bounds.Height - item.TextMarkupBody.Bounds.Height) + 1;
|
|
textRect.Height = item.TextMarkupBody.Bounds.Height;
|
|
}
|
|
|
|
item.TextMarkupBody.Bounds = textRect;
|
|
item.TextMarkupBody.Render(d);
|
|
}
|
|
else
|
|
{
|
|
#if FRAMEWORK20
|
|
if (e.ItemPaintArgs != null && e.ItemPaintArgs.GlassEnabled && item.Parent is CaptionItemContainer && !(e.ItemPaintArgs.ContainerControl is QatToolbar))
|
|
{
|
|
if (!e.ItemPaintArgs.CachedPaint)
|
|
Office2007RibbonControlPainter.PaintTextOnGlass(g, item.Text, font, textRect, TextDrawing.GetTextFormat(tf));
|
|
}
|
|
else
|
|
#endif
|
|
TextDrawing.DrawString(g, item.Text, font, textColor, textRect, tf);
|
|
}
|
|
}
|
|
|
|
if (item.Focused && item.DesignMode)
|
|
{
|
|
Rectangle r = item.DisplayRectangle;
|
|
r.Inflate(-1, -1);
|
|
DesignTime.DrawDesignTimeSelection(g, r, e.ColorScheme.ItemDesignTimeBorder);
|
|
}
|
|
}
|
|
|
|
public void PaintRadioButton(Graphics g, Rectangle checkBoxPosition, Office2007CheckBoxStateColorTable ct, bool isChecked)
|
|
{
|
|
Rectangle r = checkBoxPosition;
|
|
r.Inflate(-1, -1);
|
|
using (GraphicsPath path = new GraphicsPath())
|
|
{
|
|
path.AddEllipse(r);
|
|
DisplayHelp.FillPath(g, path, ct.CheckBackground);
|
|
}
|
|
using (Pen pen = new Pen(ct.CheckBorder, 1))
|
|
{
|
|
g.DrawEllipse(pen, checkBoxPosition);
|
|
}
|
|
// Draw inner border
|
|
checkBoxPosition.Inflate(-3, -3);
|
|
using (Pen pen = new Pen(ct.CheckInnerBorder, 1))
|
|
{
|
|
g.DrawEllipse(pen, checkBoxPosition);
|
|
}
|
|
|
|
if (!ct.CheckInnerBackground.IsEmpty)
|
|
{
|
|
if (ct.CheckInnerBackground.End.IsEmpty)
|
|
{
|
|
r = checkBoxPosition;
|
|
r.Inflate(-1, -1);
|
|
using (SolidBrush brush = new SolidBrush(ct.CheckInnerBackground.Start))
|
|
g.FillEllipse(brush, r);
|
|
}
|
|
else
|
|
{
|
|
// Draw gradient
|
|
Region old = g.Clip;
|
|
g.SetClip(checkBoxPosition, System.Drawing.Drawing2D.CombineMode.Replace);
|
|
|
|
using (GraphicsPath path = new GraphicsPath())
|
|
{
|
|
path.AddEllipse(checkBoxPosition);
|
|
|
|
using (PathGradientBrush brush = new PathGradientBrush(path))
|
|
{
|
|
brush.CenterColor = ct.CheckInnerBackground.Start;
|
|
brush.SurroundColors = new Color[] { ct.CheckInnerBackground.End };
|
|
brush.CenterPoint = new PointF(checkBoxPosition.X, checkBoxPosition.Y);
|
|
g.FillEllipse(brush, checkBoxPosition);
|
|
}
|
|
}
|
|
g.Clip = old;
|
|
}
|
|
}
|
|
|
|
if (isChecked && !ct.CheckSign.IsEmpty)
|
|
{
|
|
r = checkBoxPosition;
|
|
//r.Inflate(-1, -1);
|
|
using (GraphicsPath path = new GraphicsPath())
|
|
{
|
|
path.AddEllipse(r);
|
|
DisplayHelp.FillPath(g, path, ct.CheckSign);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void PaintCheckBox(Graphics g, Rectangle checkBoxPosition, Office2007CheckBoxStateColorTable ct, CheckState checkState)
|
|
{
|
|
Rectangle r = checkBoxPosition;
|
|
r.Inflate(-1, -1);
|
|
if (checkBoxPosition.Width < 5 || checkBoxPosition.Height < 5) return;
|
|
|
|
DisplayHelp.FillRectangle(g, r, ct.CheckBackground);
|
|
DisplayHelp.DrawRectangle(g, ct.CheckBorder, checkBoxPosition);
|
|
|
|
// Inside rectangle
|
|
checkBoxPosition.Inflate(-2, -2);
|
|
|
|
if (!ct.CheckInnerBackground.IsEmpty)
|
|
{
|
|
if (ct.CheckInnerBackground.End.IsEmpty)
|
|
{
|
|
r = checkBoxPosition;
|
|
r.Inflate(-1, -1);
|
|
DisplayHelp.FillRectangle(g, r, ct.CheckInnerBackground.Start);
|
|
}
|
|
else
|
|
{
|
|
// Draw gradient
|
|
Region old = g.Clip;
|
|
g.SetClip(checkBoxPosition, System.Drawing.Drawing2D.CombineMode.Intersect);
|
|
|
|
using (GraphicsPath path = new GraphicsPath())
|
|
{
|
|
path.AddRectangle(checkBoxPosition);
|
|
|
|
using (PathGradientBrush brush = new PathGradientBrush(path))
|
|
{
|
|
brush.CenterColor = ct.CheckInnerBackground.Start;
|
|
brush.SurroundColors = new Color[] { ct.CheckInnerBackground.End };
|
|
brush.CenterPoint = new PointF(checkBoxPosition.X, checkBoxPosition.Y);
|
|
g.FillRectangle(brush, checkBoxPosition);
|
|
}
|
|
}
|
|
g.Clip = old;
|
|
}
|
|
}
|
|
|
|
DisplayHelp.DrawRectangle(g, ct.CheckInnerBorder, checkBoxPosition);
|
|
|
|
if (checkState == CheckState.Indeterminate)
|
|
{
|
|
checkBoxPosition.Inflate(-2, -2);
|
|
SmoothingMode sm = g.SmoothingMode;
|
|
g.SmoothingMode = SmoothingMode.None;
|
|
DisplayHelp.FillRectangle(g, checkBoxPosition, ct.CheckSign);
|
|
g.SmoothingMode = sm;
|
|
}
|
|
else if (checkState == CheckState.Checked && !ct.CheckSign.IsEmpty)
|
|
{
|
|
using (GraphicsPath path = GetCheckSign(checkBoxPosition))
|
|
DisplayHelp.FillPath(g, path, ct.CheckSign);
|
|
}
|
|
}
|
|
|
|
private GraphicsPath GetCheckSign(Rectangle outterRect)
|
|
{
|
|
GraphicsPath path = new GraphicsPath();
|
|
|
|
Rectangle r = outterRect;
|
|
r.Inflate(-1, -1);
|
|
|
|
path.AddLine(r.X, r.Y + r.Height * .75f, r.X + r.Width * .3f, r.Bottom);
|
|
path.AddLine(r.X + r.Width * .4f, r.Bottom, r.Right, r.Y + r.Height * .05f);
|
|
path.AddLine(r.Right - r.Width * .3f, r.Y, r.X + r.Width * .25f, r.Y + r.Height * .75f);
|
|
path.AddLine(r.X + r.Width * .1f, r.Y + r.Height * .5f, r.X, r.Y + r.Height * .55f);
|
|
path.CloseAllFigures();
|
|
|
|
return path;
|
|
}
|
|
protected virtual Office2007CheckBoxColorTable GetColorTable(CheckBoxItem item, System.Windows.Forms.Control container)
|
|
{
|
|
if (container == null)
|
|
return m_ColorTable.CheckBoxItem;
|
|
|
|
Office2007ColorTable table = m_ColorTable;
|
|
|
|
string key = Office2007ColorTable.GetContextualKey(typeof(Office2007CheckBoxColorTable), container.GetType());
|
|
object st = null;
|
|
|
|
if (container is Bar)
|
|
{
|
|
if (table.ContextualTables.TryGetValue(key + "+" + ((Bar)container).BarType.ToString(), out st))
|
|
return (Office2007CheckBoxColorTable)st;
|
|
}
|
|
|
|
if (table.ContextualTables.TryGetValue(key, out st))
|
|
return (Office2007CheckBoxColorTable)st;
|
|
|
|
return m_ColorTable.CheckBoxItem;
|
|
}
|
|
private Office2007CheckBoxStateColorTable GetCheckBoxStateColorTable(CheckBoxItemRenderEventArgs e)
|
|
{
|
|
CheckBoxItem item = e.CheckBoxItem;
|
|
if (m_ColorTable != null && BarFunctions.IsOffice2007Style(e.CheckBoxItem.EffectiveStyle))
|
|
{
|
|
Office2007CheckBoxColorTable ct = GetColorTable(e.CheckBoxItem, e.ItemPaintArgs.ContainerControl); // m_ColorTable.CheckBoxItem;
|
|
if (!item.GetEnabled())
|
|
return ct.Disabled;
|
|
else if (item.IsMouseDown)
|
|
return ct.Pressed;
|
|
else if (item.IsMouseOver)
|
|
return ct.MouseOver;
|
|
return ct.Default;
|
|
}
|
|
else
|
|
{
|
|
ColorScheme cs = e.ColorScheme;
|
|
// Create color table based on the ColorScheme object...
|
|
Office2007CheckBoxStateColorTable ct = new Office2007CheckBoxStateColorTable();
|
|
if (!item.GetEnabled())
|
|
{
|
|
ct.CheckBackground = new LinearGradientColorTable(cs.MenuBackground, Color.Empty);
|
|
ct.CheckBorder = cs.ItemDisabledText;
|
|
ct.CheckInnerBorder = cs.ItemDisabledText;
|
|
ct.CheckInnerBackground = new LinearGradientColorTable();
|
|
ct.CheckSign = new LinearGradientColorTable(cs.ItemDisabledText, Color.Empty);
|
|
ct.Text = cs.ItemDisabledText;
|
|
}
|
|
else if (item.IsMouseDown)
|
|
{
|
|
ct.CheckBackground = new LinearGradientColorTable(cs.MenuBackground, Color.Empty);
|
|
ct.CheckBorder = cs.ItemPressedBorder;
|
|
ct.CheckInnerBorder = cs.ItemPressedBorder;
|
|
ct.CheckInnerBackground = new LinearGradientColorTable(cs.ItemPressedBackground, cs.ItemPressedBackground2);
|
|
ct.CheckSign = new LinearGradientColorTable(cs.ItemPressedText, Color.Empty);
|
|
ct.Text = cs.ItemPressedText;
|
|
}
|
|
else if (item.IsMouseOver)
|
|
{
|
|
ct.CheckBackground = new LinearGradientColorTable(cs.MenuBackground, Color.Empty);
|
|
ct.CheckBorder = cs.ItemHotBorder;
|
|
ct.CheckInnerBorder = cs.ItemHotBorder;
|
|
ct.CheckInnerBackground = new LinearGradientColorTable(cs.ItemHotBackground, cs.ItemHotBackground2);
|
|
ct.CheckSign = new LinearGradientColorTable(cs.ItemHotText, Color.Empty);
|
|
ct.Text = cs.ItemHotText;
|
|
}
|
|
else
|
|
{
|
|
ct.CheckBackground = new LinearGradientColorTable(cs.MenuBackground, Color.Empty);
|
|
ct.CheckBorder = cs.PanelBorder;
|
|
ct.CheckInnerBorder = ColorBlendFactory.SoftLight(cs.PanelBorder, Color.White);
|
|
ct.CheckInnerBackground = new LinearGradientColorTable(cs.MenuBackground, Color.Empty);
|
|
ct.CheckSign = new LinearGradientColorTable(cs.ItemText, Color.Empty);
|
|
ct.Text = cs.ItemText;
|
|
}
|
|
return ct;
|
|
}
|
|
}
|
|
#endregion
|
|
}
|
|
}
|