187 lines
7.9 KiB
C#
187 lines
7.9 KiB
C#
using System;
|
|
using System.Text;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using DevComponents.DotNetBar.Rendering;
|
|
|
|
namespace DevComponents.DotNetBar
|
|
{
|
|
internal class Office2007ItemContainerPainter : ItemContainerPainter, IOffice2007Painter
|
|
{
|
|
#region IOffice2007Painter
|
|
private Office2007ColorTable m_ColorTable = null; //new Office2007ColorTable();
|
|
/// <summary>
|
|
/// Gets or sets color table used by renderer.
|
|
/// </summary>
|
|
public Office2007ColorTable ColorTable
|
|
{
|
|
get { return m_ColorTable; }
|
|
set { m_ColorTable = value; }
|
|
}
|
|
#endregion
|
|
|
|
#region PaintBackground
|
|
public override void PaintBackground(ItemContainerRendererEventArgs e)
|
|
{
|
|
if (!BarFunctions.IsOffice2007Style(e.ItemContainer.EffectiveStyle))
|
|
return;
|
|
|
|
ItemContainer container = e.ItemContainer;
|
|
Office2007ItemGroupColorTable gt = m_ColorTable.ItemGroup;
|
|
|
|
if (container.SubItems.Count == 0 && (container.WidthInternal <= 0 || container.HeightInternal <= 0) || gt == null)
|
|
return;
|
|
|
|
Rectangle bounds = container.DisplayRectangle;
|
|
|
|
if (!container.BeginGroup || container.IsOnMenu && !(container.Parent is ItemContainer))
|
|
{
|
|
if (container.BackgroundStyle.Class == ElementStyleClassKeys.Office2007StatusBarBackground2Key && e.ItemPaintArgs != null &&
|
|
e.ItemPaintArgs.ContainerControl is Bar && ((Bar)e.ItemPaintArgs.ContainerControl).BarType == eBarType.StatusBar)
|
|
{
|
|
bounds.Y = 1;
|
|
if (!m_ColorTable.Bar.StatusBarTopBorderLight.IsEmpty) bounds.Y++;
|
|
bounds.Height = e.ItemPaintArgs.ContainerControl.Height - 1;
|
|
if (container.Parent.SubItems.IndexOf(container) == container.Parent.SubItems.Count - 1)
|
|
{
|
|
if (e.ItemPaintArgs.RightToLeft)
|
|
{
|
|
bounds.Width += bounds.X;
|
|
bounds.X = 0;
|
|
}
|
|
else
|
|
{
|
|
bounds.Width += e.ItemPaintArgs.ContainerControl.Width - bounds.Right;
|
|
}
|
|
}
|
|
}
|
|
Region oldClip = e.Graphics.Clip;
|
|
e.Graphics.SetClip(bounds);
|
|
ElementStyleDisplay.Paint(new ElementStyleDisplayInfo(container.BackgroundStyle, e.Graphics, bounds));
|
|
e.Graphics.Clip = oldClip;
|
|
if (oldClip != null) oldClip.Dispose();
|
|
return;
|
|
}
|
|
|
|
bounds.Width -= container.BackgroundStyle.MarginHorizontal;
|
|
bounds.Height -= container.BackgroundStyle.MarginVertical;
|
|
bounds.X += container.BackgroundStyle.MarginLeft;
|
|
bounds.Y += container.BackgroundStyle.MarginTop;
|
|
//bounds.Width--;
|
|
//bounds.Height--;
|
|
|
|
Graphics g = e.Graphics;
|
|
int cornerSize = 2;
|
|
|
|
|
|
//GraphicsPath path = DisplayHelp.GetRoundedRectanglePath(bounds, 2);
|
|
|
|
//using (SolidBrush brush = new SolidBrush(ColorScheme.GetColor("FEFFFF")))
|
|
// g.FillPath(brush, path);
|
|
|
|
// Draw border
|
|
if (gt.OuterBorder != null && !gt.OuterBorder.IsEmpty)
|
|
DisplayHelp.DrawRoundGradientRectangle(g, bounds, gt.OuterBorder, 1, cornerSize);
|
|
|
|
if (gt.InnerBorder != null && !gt.InnerBorder.IsEmpty)
|
|
{
|
|
bounds.Inflate(-1, -1);
|
|
DisplayHelp.DrawRoundGradientRectangle(g, bounds, gt.InnerBorder, 1, cornerSize);
|
|
}
|
|
|
|
float topPart = .4f;
|
|
|
|
Rectangle r = bounds;
|
|
r.Inflate(-1, -1);
|
|
|
|
SmoothingMode sm = g.SmoothingMode;
|
|
g.SmoothingMode = SmoothingMode.Default;
|
|
if(gt.TopBackground!=null && !gt.TopBackground.IsEmpty)
|
|
DisplayHelp.FillRectangle(g, r, gt.TopBackground);
|
|
int topHeight = (int)(r.Height * topPart);
|
|
r.Height -= topHeight;
|
|
r.Y += topHeight;
|
|
|
|
if (gt.BottomBackground != null && !gt.BottomBackground.IsEmpty)
|
|
DisplayHelp.FillRectangle(g, r, gt.BottomBackground);
|
|
g.SmoothingMode = sm;
|
|
bool isVertical = container.LayoutOrientation == eOrientation.Vertical;
|
|
using (Pen penLight = new Pen(gt.ItemGroupDividerLight, 1))
|
|
{
|
|
using (Pen penDark = new Pen(gt.ItemGroupDividerDark))
|
|
{
|
|
int c = container.SubItems.Count - 1;
|
|
for (int i = 0; i <= c; i++)
|
|
{
|
|
BaseItem item = container.SubItems[i];
|
|
if (!item.Visible || item.DisplayRectangle.Right == container.DisplayRectangle.Right || i == c)
|
|
continue;
|
|
if (isVertical)
|
|
{
|
|
g.DrawLine(penDark, container.DisplayRectangle.X + 1, item.DisplayRectangle.Bottom - 1, container.DisplayRectangle.Right - 1, item.DisplayRectangle.Bottom - 1);
|
|
g.DrawLine(penLight, container.DisplayRectangle.X + 1, item.DisplayRectangle.Bottom, container.DisplayRectangle.Right, item.DisplayRectangle.Bottom);
|
|
}
|
|
else
|
|
{
|
|
g.DrawLine(penDark, item.DisplayRectangle.Right - 1, item.DisplayRectangle.Y + 1, item.DisplayRectangle.Right - 1, item.DisplayRectangle.Bottom - 2);
|
|
g.DrawLine(penLight, item.DisplayRectangle.Right, item.DisplayRectangle.Y + 1, item.DisplayRectangle.Right, item.DisplayRectangle.Bottom - 2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//path.Dispose();
|
|
}
|
|
#endregion
|
|
|
|
#region Paint Separator
|
|
public override void PaintItemSeparator(ItemContainerSeparatorRendererEventArgs e)
|
|
{
|
|
if (e.Item is ItemContainer)
|
|
return;
|
|
|
|
Graphics g = e.Graphics;
|
|
BaseItem item = e.Item;
|
|
Size imageSize = Size.Empty;
|
|
if (item is ImageItem)
|
|
imageSize = ((ImageItem)item).ImageSize;
|
|
|
|
ItemContainer container = e.ItemContainer;
|
|
Color color1 = m_ColorTable.LegacyColors.ItemSeparator;
|
|
Color color2 = m_ColorTable.LegacyColors.ItemSeparatorShade;
|
|
|
|
Point start = Point.Empty, end = Point.Empty;
|
|
Point start2 = Point.Empty, end2 = Point.Empty;
|
|
|
|
if (container.LayoutOrientation == eOrientation.Horizontal)
|
|
{
|
|
start = new Point(item.DisplayRectangle.X - 2, item.DisplayRectangle.Y + 3);
|
|
end = new Point(start.X, item.DisplayRectangle.Bottom - 4);
|
|
start2 = new Point(start.X + 1, start.Y);
|
|
end2 = new Point(end.X + 1, end.Y);
|
|
}
|
|
else
|
|
{
|
|
if (item.IsOnMenu)
|
|
{
|
|
start = new Point(item.DisplayRectangle.X + imageSize.Width, item.DisplayRectangle.Y - 2);
|
|
end = new Point(item.DisplayRectangle.Right-1, start.Y);
|
|
start2 = new Point(start.X, start.Y + 1);
|
|
end2 = new Point(end.X, end.Y + 1);
|
|
}
|
|
else
|
|
{
|
|
start = new Point(item.DisplayRectangle.X + 3, item.DisplayRectangle.Y - 2);
|
|
end = new Point(item.DisplayRectangle.Right - 4, start.Y);
|
|
start2 = new Point(start.X, start.Y + 1);
|
|
end2 = new Point(end.X, end.Y + 1);
|
|
}
|
|
}
|
|
|
|
DisplayHelp.DrawLine(g, start, end, color1, 1);
|
|
DisplayHelp.DrawLine(g, start2, end2, color2, 1);
|
|
}
|
|
#endregion
|
|
}
|
|
}
|