SourceCode/PROMS/DotNetBar Source Code/CheckBoxItem/Office2007CheckBoxItemPainter.cs

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