1319 lines
40 KiB
C#

#if FRAMEWORK20
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Windows.Forms;
using DevComponents.DotNetBar.Rendering;
namespace DevComponents.DotNetBar
{
public class SuperTabItemBaseDisplay : IDisposable
{
#region Private variables
private SuperTabItem _TabItem;
private Bitmap _CloseButtonBitmap;
private Bitmap _CloseButtonHotBitmap;
private Bitmap _CloseButtonPressedBitmap;
private Color _CloseMarkerColor;
private SuperTabItemColorTable _DefaultTabColorTable;
private SuperTabPanelColorTable _DefaultPanelColorTable;
private bool _CurrentlyAnimating;
private Image _AnimateImage;
#endregion
/// <summary>
/// Constructor
/// </summary>
/// <param name="tabItem">Associated SuperTabItem</param>
public SuperTabItemBaseDisplay(SuperTabItem tabItem)
{
_TabItem = tabItem;
SetDefaultColorTable();
}
#region Internal properties
/// <summary>
/// Gets or sets the default item ColorTable
/// </summary>
internal SuperTabItemColorTable DefaultItemColorTable
{
get { return (_DefaultTabColorTable); }
set { _DefaultTabColorTable = value; }
}
#region TabItem
internal SuperTabItem TabItem
{
get { return (_TabItem); }
}
#endregion
#region TabStripItem
internal SuperTabStripItem TabStripItem
{
get { return (_TabItem.TabStripItem); }
}
#endregion
#region TabDisplay
internal SuperTabStripBaseDisplay TabDisplay
{
get { return (_TabItem.TabStripItem.TabDisplay); }
}
#endregion
#endregion
#region Paint
/// <summary>
/// Paint processing
/// </summary>
/// <param name="p"></param>
public virtual void Paint(ItemPaintArgs p)
{
if (TabItem.Visible == true)
{
Graphics g = p.Graphics;
if (TabStripItem.OnPreRenderTabItem(TabItem, g) == false)
{
SuperTabItemStateColorTable colors = GetTabColorTable();
using (GraphicsPath path = TabItemPath())
{
DrawTabItemBackground(g, path, colors);
DrawTabContent(g, colors);
DrawTabBorder(g, path, colors);
TabStripItem.OnPostRenderTabItem(TabItem, g);
}
}
}
}
#endregion
#region GetContentRectangle
/// <summary>
/// Gets the default tab ContentRectangle
/// </summary>
/// <returns>Rectangle</returns>
internal virtual Rectangle ContentRectangle()
{
return (_TabItem.DisplayRectangle);
}
/// <summary>
/// Gets the tab ContentRectangle
/// </summary>
/// <returns>Rectangle</returns>
internal Rectangle GetContentRectangle()
{
Rectangle r = TabStripItem.OnGetTabItemContentRectangle(_TabItem);
return (r);
}
#endregion
#region TabItemPath
/// <summary>
/// Gets the tab path
/// </summary>
/// <returns>GraphicsPath</returns>
internal virtual GraphicsPath TabItemPath()
{
GraphicsPath path = TabStripItem.OnGetTabItemPath(_TabItem);
return (path);
}
#endregion
#region SetDefaultColorTable
/// <summary>
/// Sets the default color tables
/// </summary>
internal void SetDefaultColorTable()
{
_DefaultTabColorTable =
SuperTabStyleColorFactory.GetItemColorTable(TabItem.TabStyle, ColorFactory.Empty);
_DefaultPanelColorTable =
SuperTabStyleColorFactory.GetPanelColorTable(TabItem.TabStyle, ColorFactory.Empty);
}
#endregion
#region GetColorTable
/// <summary>
/// Gets the tab ColorTable
/// </summary>
/// <returns>ColorTable</returns>
internal virtual SuperTabItemStateColorTable GetTabColorTable()
{
eTabState tabState = GetTabState();
return (GetTabColorTable(tabState));
}
/// <summary>
/// Gets the tab state
/// </summary>
/// <returns>eTabState</returns>
private eTabState GetTabState()
{
if (TabItem.Enabled == false)
return (eTabState.Disabled);
if (TabItem == TabStripItem.HotTab)
return (TabItem.IsSelected ? eTabState.SelectedMouseOver : eTabState.MouseOver);
return (TabItem.IsSelected ? eTabState.Selected : eTabState.Default);
}
#region GetTabColorTable
internal virtual SuperTabItemStateColorTable GetTabColorTable(eTabState tabState)
{
SuperTabItemStateColorTable sct = GetTabColorTableEx(tabState);
if (sct.SelectionMarker.IsEmpty == true &&
(tabState == eTabState.Selected || tabState == eTabState.SelectedMouseOver))
{
using (SuperTabColorTable ct = TabDisplay.GetColorTable())
sct.SelectionMarker = ct.SelectionMarker;
}
return (sct);
}
internal SuperTabItemStateColorTable GetTabColorTableEx(eTabState tabState)
{
SuperTabItemStateColorTable sct = GetStateColorTable(tabState, _DefaultTabColorTable.Default);
SuperTabItemStateColorTable tct = GetStateColorTable(tabState, TabItem.TabColor.Default);
sct = (SuperTabItemStateColorTable)sct.Clone();
tct = (SuperTabItemStateColorTable)tct.Clone();
switch (TabItem.TabAlignment)
{
case eTabStripAlignment.Left:
ApplyTabColors(sct, GetStateColorTable(tabState, _DefaultTabColorTable.Left));
ApplyTabColors(tct, GetStateColorTable(tabState, TabItem.TabColor.Left));
break;
case eTabStripAlignment.Bottom:
ApplyTabColors(sct, GetStateColorTable(tabState, _DefaultTabColorTable.Bottom));
ApplyTabColors(tct, GetStateColorTable(tabState, TabItem.TabColor.Bottom));
break;
case eTabStripAlignment.Right:
ApplyTabColors(sct, GetStateColorTable(tabState, _DefaultTabColorTable.Right));
ApplyTabColors(tct, GetStateColorTable(tabState, TabItem.TabColor.Right));
break;
}
ApplyPredefinedColor(tabState, sct);
ApplyTabColors(sct, tct);
return (sct);
}
#endregion
#region GetStateColorTable
private SuperTabItemStateColorTable GetStateColorTable(
eTabState tabState, SuperTabColorStates cs)
{
switch (tabState)
{
case eTabState.MouseOver:
return (cs.MouseOver);
case eTabState.Selected:
return (cs.Selected);
case eTabState.SelectedMouseOver:
return (cs.SelectedMouseOver);
case eTabState.Disabled:
return (cs.Disabled);
default:
return (cs.Normal);
}
}
#endregion
#region ApplyPredefinedColor
internal virtual void ApplyPredefinedColor(eTabState tabState, SuperTabItemStateColorTable sct)
{
if (TabItem.PredefinedColor != eTabItemColor.Default)
{
SuperTabItemColorTable ct =
SuperTabStyleColorFactory.GetPredefinedTabColors(TabItem.PredefinedColor, ColorFactory.Empty);
SuperTabItemStateColorTable ict = ct.Default.Normal;
switch (tabState)
{
case eTabState.SelectedMouseOver:
ict = ct.Default.SelectedMouseOver;
break;
case eTabState.MouseOver:
ict = ct.Default.MouseOver;
break;
case eTabState.Selected:
ict = ct.Default.Selected;
break;
}
sct.Text = ict.Text;
sct.InnerBorder = ict.InnerBorder;
sct.OuterBorder = ict.OuterBorder;
sct.Background = ict.Background;
sct.CloseMarker = ict.CloseMarker;
sct.SelectionMarker = ict.SelectionMarker;
}
}
#endregion
#region ApplyTabColors
private void ApplyTabColors(
SuperTabItemStateColorTable sct, SuperTabItemStateColorTable tct)
{
if (tct.Background.IsEmpty == false)
{
if (tct.Background.IsEmpty == false)
{
if (tct.Background.Colors != null)
sct.Background.Colors = tct.Background.Colors;
if (tct.Background.Positions != null)
sct.Background.Positions = tct.Background.Positions;
if (tct.Background.AdaptiveGradient.HasValue)
sct.Background.AdaptiveGradient = tct.Background.AdaptiveGradient;
}
sct.Background.GradientAngle = tct.Background.GradientAngle;
}
if (tct.InnerBorder != Color.Empty)
sct.InnerBorder = tct.InnerBorder;
if (tct.OuterBorder != Color.Empty)
sct.OuterBorder = tct.OuterBorder;
if (tct.Text != Color.Empty)
sct.Text = tct.Text;
if (tct.CloseMarker != Color.Empty)
sct.CloseMarker = tct.CloseMarker;
if (tct.SelectionMarker != Color.Empty)
sct.SelectionMarker = tct.SelectionMarker;
}
#endregion
#endregion
#region GetPanelColorTable
/// <summary>
/// Gets the tab panel Color Table
/// </summary>
/// <returns>Color Table</returns>
internal virtual SuperTabPanelItemColorTable GetPanelColorTable()
{
SuperTabPanelItemColorTable sct =
(SuperTabPanelItemColorTable)_DefaultPanelColorTable.Default.Clone();
SuperTabControlPanel cp = TabItem.AttachedControl as SuperTabControlPanel;
if (cp != null)
{
SuperTabPanelItemColorTable tct =
(SuperTabPanelItemColorTable) cp.PanelColor.Default.Clone();
switch (TabItem.TabAlignment)
{
case eTabStripAlignment.Left:
ApplyPanelColors(sct, _DefaultPanelColorTable.Left);
ApplyPanelColors(tct, cp.PanelColor.Left);
break;
case eTabStripAlignment.Bottom:
ApplyPanelColors(sct, _DefaultPanelColorTable.Bottom);
ApplyPanelColors(tct, cp.PanelColor.Bottom);
break;
case eTabStripAlignment.Right:
ApplyPanelColors(sct, _DefaultPanelColorTable.Right);
ApplyPanelColors(tct, cp.PanelColor.Right);
break;
}
ApplyPredefinedColor(sct);
ApplyPanelColors(sct, tct);
}
return (sct);
}
#region ApplyPredefinedColor
internal virtual void ApplyPredefinedColor(SuperTabPanelItemColorTable pct)
{
if (TabItem.PredefinedColor != eTabItemColor.Default)
{
SuperTabPanelItemColorTable ct =
SuperTabStyleColorFactory.GetPredefinedPanelColors(TabItem.PredefinedColor, ColorFactory.Empty);
pct.InnerBorder = ct.InnerBorder;
pct.OuterBorder = ct.OuterBorder;
pct.Background = ct.Background;
}
}
#endregion
#region ApplyPanelColors
private void ApplyPanelColors(SuperTabPanelItemColorTable sct, SuperTabPanelItemColorTable tct)
{
if (tct.Background.IsEmpty == false)
{
if (tct.Background.Colors != null)
sct.Background.Colors = tct.Background.Colors;
if (tct.Background.Positions != null)
sct.Background.Positions = tct.Background.Positions;
if (tct.Background.AdaptiveGradient.HasValue)
sct.Background.AdaptiveGradient = tct.Background.AdaptiveGradient;
sct.Background.GradientAngle = tct.Background.GradientAngle;
}
if (tct.InnerBorder.IsEmpty == false)
sct.InnerBorder = tct.InnerBorder;
if (tct.OuterBorder.IsEmpty == false)
sct.OuterBorder = tct.OuterBorder;
}
#endregion
#endregion
#region DrawTabItemBackground
/// <summary>
/// Draws the tab background
/// </summary>
/// <param name="g">Graphics</param>
/// <param name="path">Tab path</param>
/// <param name="tabColors">StateColorTable</param>
protected virtual void DrawTabItemBackground(
Graphics g, GraphicsPath path, SuperTabItemStateColorTable tabColors)
{
Rectangle r = Rectangle.Round(path.GetBounds());
if (r.Width > 0 && r.Height > 0)
{
if (tabColors.Background.Colors != null)
{
if (tabColors.Background.Colors.Length == 1)
DrawTabItemSolidBackground(g, path, tabColors, r);
else
DrawTabItemGradientBackground(g, path, tabColors, r);
}
}
}
#region DrawTabItemSolidBackground
internal void DrawTabItemSolidBackground(
Graphics g, GraphicsPath path, SuperTabItemStateColorTable tabColors, Rectangle r)
{
using (Brush br = tabColors.Background.GetBrush(r))
{
if (br != null)
{
g.FillPath(br, path);
using (Pen pen = new Pen(tabColors.Background.Colors[0]))
{
int n = (_TabItem.IsSelected == true) ? 3 : 1;
for (int i = 0; i < n; i++)
{
switch (_TabItem.TabAlignment)
{
case eTabStripAlignment.Top:
g.DrawLine(pen, r.X, r.Bottom + i, r.Right, r.Bottom + i);
break;
case eTabStripAlignment.Left:
g.DrawLine(pen, r.Right + i, r.Top, r.Right + i, r.Bottom);
break;
case eTabStripAlignment.Bottom:
g.DrawLine(pen, r.X, r.Top - i, r.Right, r.Top - i);
break;
case eTabStripAlignment.Right:
g.DrawLine(pen, r.X - i, r.Top, r.X - i, r.Bottom);
break;
}
}
}
}
}
}
#endregion
#region DrawTabItemGradientBackground
internal void DrawTabItemGradientBackground(
Graphics g, GraphicsPath path, SuperTabItemStateColorTable tabColors, Rectangle r)
{
int angle = tabColors.Background.GradientAngle;
if (tabColors.Background.AdaptiveGradient != false)
{
switch (_TabItem.TabAlignment)
{
case eTabStripAlignment.Left:
angle -= 90;
break;
case eTabStripAlignment.Bottom:
angle += 180;
break;
case eTabStripAlignment.Right:
angle += 90;
break;
}
}
using (LinearGradientBrush lbr =
(LinearGradientBrush)tabColors.Background.GetBrush(r, angle))
{
if (lbr != null)
{
lbr.WrapMode = WrapMode.TileFlipXY;
g.FillPath(lbr, path);
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.None;
int n = (_TabItem.IsSelected == true) ? 3 : 1;
switch (_TabItem.TabAlignment)
{
case eTabStripAlignment.Top:
g.FillRectangle(lbr, r.X, r.Bottom, r.Width, n);
break;
case eTabStripAlignment.Left:
g.FillRectangle(lbr, r.Right, r.Top, n, r.Height);
break;
case eTabStripAlignment.Bottom:
g.FillRectangle(lbr, r.X, r.Top - n + 1, r.Width, n);
break;
case eTabStripAlignment.Right:
g.FillRectangle(lbr, r.X - n + 1, r.Top, n, r.Height);
break;
}
g.SmoothingMode = sm;
}
}
}
#endregion
#endregion
#region DrawTabBorder
/// <summary>
/// Draws the tab border
/// </summary>
/// <param name="g">Graphics</param>
/// <param name="path">Tab path</param>
/// <param name="ct">Color table</param>
protected virtual void DrawTabBorder(
Graphics g, GraphicsPath path, SuperTabItemStateColorTable ct)
{
if (ct.InnerBorder.IsEmpty == false)
{
using (Pen pen = new Pen(ct.InnerBorder, 2))
{
Region rgn = g.Clip;
g.SetClip(path);
g.DrawPath(pen, path);
g.DrawPath(pen, path);
g.DrawPath(pen, path);
g.DrawPath(pen, path);
g.Clip = rgn;
if (rgn != null) rgn.Dispose();
}
}
if (ct.OuterBorder.IsEmpty == false)
{
using (Pen pen = new Pen(ct.OuterBorder))
g.DrawPath(pen, path);
}
}
#endregion
#region DrawTabContent
/// <summary>
/// Draws the tab contents
/// </summary>
/// <param name="g">Graphics</param>
/// <param name="colors">State color table</param>
protected virtual void DrawTabContent(Graphics g, SuperTabItemStateColorTable colors)
{
// Draw image and text
if (DrawTabSymbol(g) == false)
DrawTabImage(g);
DrawTabText(g, colors);
// Draw the close button
if (TabStripItem.CloseButtonOnTabsVisible && TabItem.CloseButtonVisible)
{
if (TabStripItem.CloseButtonOnTabsAlwaysDisplayed == true || TabItem.IsMouseOver == true)
DrawCloseButton(g, colors);
}
}
#region DrawTabSymbol
private bool DrawTabSymbol(Graphics g)
{
if (string.IsNullOrEmpty(TabItem.SymbolRealized) == false)
{
Font font = Symbols.GetFont(TabItem.SymbolSize, TabItem.SymbolSet);
Color color = GetSymbolColor();
Region clip = g.Clip;
g.SetClip(TabItem.ContentRectangle, CombineMode.Intersect);
Rectangle r = SetTransform(g, TabItem.ImageBounds);
r.Height += 10;
if (TabItem.IsVertical == true)
{
if ((TabStripItem.TabAlignment == eTabStripAlignment.Right && TabStripItem.RotateVerticalText == false) ||
(TabStripItem.TabAlignment == eTabStripAlignment.Left && TabStripItem.RotateVerticalText == true))
{
r.X += TabStripItem.TabHorizontalSpacing;
}
}
TextDrawing.DrawStringLegacy(g, TabItem.SymbolRealized, font, color,
r, eTextFormat.Default | eTextFormat.HorizontalCenter);
ResetTransform(g);
g.Clip = clip;
return (true);
}
return (false);
}
#region GetSymbolColor
internal Color GetSymbolColor()
{
if (TabItem.SymbolColor.IsEmpty == false)
return (TabItem.SymbolColor);
eTabState state = GetTabState();
SuperTabItemStateColorTable sct = TabItem.GetTabColorTableEx(state);
return ((sct.Text.IsEmpty == false) ? sct.Text : SystemColors.ControlDark);
}
#endregion
#endregion
#region DrawTabImage
/// <summary>
/// Draws the tab image
/// </summary>
/// <param name="g">Graphics</param>
protected virtual void DrawTabImage(Graphics g)
{
CompositeImage image = TabItem.GetTabImage();
if (image != null)
{
if (_CurrentlyAnimating == true)
{
if (TabItem.CanAnimateImage == false)
StopImageAnimation();
}
if (TabItem.CanAnimateImage == true)
{
if (_CurrentlyAnimating == false)
StartImageAnimation(image.Image);
ImageAnimator.UpdateFrames();
}
Region clip = g.Clip;
g.SetClip(TabItem.ContentRectangle, CombineMode.Intersect);
Rectangle t = TabItem.ImageBounds;
if (TabItem.IsVertical == true)
{
int w = t.Width;
t.Width = t.Height;
t.Height = w;
}
Rectangle r = SetTransform(g, t);
image.DrawImage(g, r);
ResetTransform(g);
g.Clip = clip;
}
}
#region StartImageAnimation
internal void StartImageAnimation(Image image)
{
_CurrentlyAnimating = true;
_AnimateImage = image;
ImageAnimator.Animate(image, OnFrameChanged);
}
#endregion
#region StopImageAnimation
internal void StopImageAnimation()
{
if (_CurrentlyAnimating == true)
{
_CurrentlyAnimating = false;
ImageAnimator.StopAnimate(_AnimateImage, OnFrameChanged);
FrameDimension frameDimensions =
new FrameDimension(_AnimateImage.FrameDimensionsList[0]);
_AnimateImage.SelectActiveFrame(frameDimensions, 0);
}
}
#endregion
#region OnFrameChanged
private void OnFrameChanged(object o, EventArgs e)
{
if (_CurrentlyAnimating == true &&
TabItem.Visible == true && TabItem.Parent != null)
{
TabItem.Refresh();
}
else
{
_CurrentlyAnimating = false;
ImageAnimator.StopAnimate((Image)o, OnFrameChanged);
}
}
#endregion
#endregion
#region DrawTabText
/// <summary>
/// Draws the tab text
/// </summary>
/// <param name="g"></param>
/// <param name="colors"></param>
protected virtual void DrawTabText(Graphics g, SuperTabItemStateColorTable colors)
{
if (TabStripItem.DisplaySelectedTextOnly == false || TabItem.IsSelected == true)
{
Rectangle r = TabItem.TextBounds;
if (r.Height > 0 && r.Width > 0)
{
Font font = TabItem.GetTabFont();
if (TabItem.IsVertical == false)
{
if (TabItem.TextMarkupBody != null)
{
r = AlignText(r);
TextMarkup.MarkupDrawContext d =
new TextMarkup.MarkupDrawContext(g, font, colors.Text, TabItem.IsRightToLeft);
TabItem.TextMarkupBody.Arrange(new
Rectangle(r.Location, TabItem.TextMarkupBody.Bounds.Size), d);
RenderMarkup(g, r, d);
}
else
{
eTextFormat strFormat;
r = AlignText(r, out strFormat);
TextDrawing.DrawString(g, TabItem.Text, font, colors.Text, r, strFormat);
}
}
else
{
if (TabItem.TextMarkupBody != null)
{
Rectangle t = TabItem.TextMarkupBody.Bounds;
r = SetTransform(g, r);
r = AlignText(r);
TextMarkup.MarkupDrawContext d =
new TextMarkup.MarkupDrawContext(g, font, colors.Text, TabItem.IsRightToLeft);
TabItem.TextMarkupBody.Bounds = r;
RenderMarkup(g, r, d);
TabItem.TextMarkupBody.Bounds = t;
}
else
{
eTextFormat strFormat;
r = SetTransform(g, r);
r = AlignText(r, out strFormat);
TextDrawing.DrawStringLegacy(g, TabItem.Text, font, colors.Text, r, strFormat);
}
ResetTransform(g);
}
if (TabDisplay.ShowFocusRectangle == true)
{
if (IsFocused() == true)
ControlPaint.DrawFocusRectangle(g, GetFocusRectangle(GetContentRectangle()));
}
}
}
}
#region AlignText
private Rectangle AlignText(Rectangle r, out eTextFormat strFormat)
{
strFormat = eTextFormat.Default | eTextFormat.SingleLine |
eTextFormat.EndEllipsis | eTextFormat.VerticalCenter;
eItemAlignment alignment = TabItem.TextAlignment.HasValue ?
TabItem.TextAlignment.Value : TabItem.TabStripItem.TextAlignment;
switch (alignment)
{
case eItemAlignment.Center:
strFormat |= eTextFormat.HorizontalCenter;
if (TabItem.IsVertical == true)
{
int tabHorizontalSpacing = Dpi.Width(TabStripItem.TabHorizontalSpacing);
r.X -= tabHorizontalSpacing;
r.Width += tabHorizontalSpacing;
}
break;
case eItemAlignment.Far:
strFormat |= eTextFormat.Right;
if (TabItem.IsVertical == true)
{
r.X -= Dpi.Width3;
r.Width -= Dpi.Width3;
}
break;
}
return (r);
}
private Rectangle AlignText(Rectangle r)
{
if (r.Height > TabItem.TextMarkupBody.Bounds.Height)
r.Y += (r.Height - TabItem.TextMarkupBody.Bounds.Height) / 2;
if (r.Width > TabItem.TextMarkupBody.Bounds.Width)
{
eItemAlignment alignment = TabItem.TextAlignment.HasValue ?
TabItem.TextAlignment.Value : TabItem.TabStripItem.TextAlignment;
switch (alignment)
{
case eItemAlignment.Center:
r.X += (r.Width - TabItem.TextMarkupBody.Bounds.Width) / 2;
break;
case eItemAlignment.Far:
r.X += (r.Width - TabItem.TextMarkupBody.Bounds.Width);
break;
}
}
return (r);
}
#endregion
#region RenderMarkup
private void RenderMarkup(Graphics g,
Rectangle r, TextMarkup.MarkupDrawContext d)
{
Region oldClip = g.Clip;
Rectangle clipRect = r;
g.SetClip(clipRect, CombineMode.Replace);
TabItem.TextMarkupBody.Render(d);
g.Clip = oldClip;
}
#endregion
#region IsFocused
private bool IsFocused()
{
if (TabItem.IsSelected == true && TabItem.DesignMode == false)
return (TabItem.TabStrip.ContainsFocus);
return (false);
}
#endregion
#endregion
#region DrawCloseButton
/// <summary>
/// Draws the tab close button
/// </summary>
/// <param name="g">Graphics</param>
/// <param name="colors">State color table</param>
protected virtual void DrawCloseButton(Graphics g, SuperTabItemStateColorTable colors)
{
Rectangle r = TabItem.CloseButtonBounds;
if (TabItem.CloseButtonMouseOver == true || TabItem.CloseButtonPressed == true)
{
if (TabItem.CloseButtonMouseOver == true && TabItem.CloseButtonPressed == true)
{
if (TabStripItem.TabCloseButtonPressed != null)
g.DrawImageUnscaled(TabStripItem.TabCloseButtonPressed, r);
else
g.DrawImageUnscaled(GetCloseButtonPressedBitmap(g), r);
}
else
{
if (TabStripItem.TabCloseButtonHot != null)
g.DrawImageUnscaled(TabStripItem.TabCloseButtonHot, r);
else
g.DrawImageUnscaled(GetCloseButtonHotBitmap(g), r);
}
}
else
{
if (TabStripItem.TabCloseButtonNormal != null)
g.DrawImageUnscaled(TabStripItem.TabCloseButtonNormal, r);
else
g.DrawImageUnscaled(GetCloseButtonBitmap(g, colors), r);
}
}
#endregion
#endregion
#region SetTransform
/// <summary>
/// Sets the GraphicsTransform for the given alignment
/// and Horizontal text setting
/// </summary>
/// <param name="g">Graphics</param>
/// <param name="r">Rectangle to transform</param>
/// <returns>Transformed rectangle</returns>
private Rectangle SetTransform(Graphics g, Rectangle r)
{
if (TabItem.IsVertical == true)
{
if (TabDisplay.Alignment == eTabStripAlignment.Left)
{
if (TabStripItem.RotateVerticalText == true)
{
g.RotateTransform(90);
r = new Rectangle(r.Top, -r.Right, r.Height, r.Width);
}
else
{
g.RotateTransform(-90);
r = new Rectangle(-r.Bottom, r.X, r.Height, r.Width);
}
}
else
{
if (TabStripItem.RotateVerticalText == true)
{
g.RotateTransform(-90);
r = new Rectangle(-r.Bottom, r.X, r.Height, r.Width);
}
else
{
g.RotateTransform(90);
r = new Rectangle(r.Top, -r.Right, r.Height, r.Width);
}
}
}
return (r);
}
#endregion
#region ResetTransform
/// <summary>
/// Resets out transform
/// </summary>
/// <param name="g">Graphics</param>
private void ResetTransform(Graphics g)
{
if (TabItem.IsVertical == true)
g.ResetTransform();
}
#endregion
#region GetFocusRectangle
/// <summary>
/// Gets the focus rectangle
/// </summary>
/// <param name="rText"></param>
/// <returns></returns>
protected virtual Rectangle GetFocusRectangle(Rectangle rText)
{
rText.Inflate(-3, -3);
return (rText);
}
#endregion
#region GetCloseButtonBitmap
/// <summary>
/// Gets the tab close button bitmap
/// </summary>
/// <param name="g">Graphics</param>
/// <param name="colors">State color table</param>
/// <returns>Button bitmap</returns>
public Bitmap GetCloseButtonBitmap(Graphics g, SuperTabItemStateColorTable colors)
{
if (_CloseMarkerColor != colors.CloseMarker || _CloseButtonBitmap == null)
{
if (_CloseButtonBitmap != null)
_CloseButtonBitmap.Dispose();
_CloseButtonBitmap = CreateCloseButtonBitmap(g, colors);
_CloseMarkerColor = colors.CloseMarker;
}
return (_CloseButtonBitmap);
}
#endregion
#region CreateCloseButtonBitmap
/// <summary>
/// Creates the close button bitmap
/// </summary>
/// <param name="g">Graphics</param>
/// <param name="colors">State color table</param>
/// <returns>Close bitmap</returns>
public virtual Bitmap CreateCloseButtonBitmap(Graphics g, SuperTabItemStateColorTable colors)
{
Bitmap bmp = new Bitmap(16, 16, g);
using (Graphics gBmp = Graphics.FromImage(bmp))
{
gBmp.CompositingQuality = CompositingQuality.HighQuality;
gBmp.SmoothingMode = g.SmoothingMode;
using (Pen pen = new Pen(colors.CloseMarker))
{
gBmp.DrawLine(pen, new Point(4, 4), new Point(10, 9));
gBmp.DrawLine(pen, new Point(10, 4), new Point(4, 9));
}
}
return (bmp);
}
#endregion
#region GetCloseButtonHotBitmap
/// <summary>
/// Gets the hot close button bitmap
/// </summary>
/// <param name="g">Graphics</param>
/// <returns>Close bitmap</returns>
public Bitmap GetCloseButtonHotBitmap(Graphics g)
{
if (_CloseButtonHotBitmap == null)
_CloseButtonHotBitmap = CreateCloseButtonHotBitmap(g);
return (_CloseButtonHotBitmap);
}
#endregion
#region CreateCloseButtonHotBitmap
/// <summary>
/// Creates the hot button bitmap
/// </summary>
/// <param name="g">Graphics</param>
/// <returns>Close bitmap</returns>
public virtual Bitmap CreateCloseButtonHotBitmap(Graphics g)
{
Bitmap bmp = new Bitmap(16, 16, g);
using (Graphics gBmp = Graphics.FromImage(bmp))
{
gBmp.CompositingQuality = CompositingQuality.HighQuality;
gBmp.SmoothingMode = g.SmoothingMode;
Rectangle r = new Rectangle(0, 0, 15, 15);
using (GraphicsPath path = GetClosePath(r, 4))
{
using (LinearGradientBrush lbr = new
LinearGradientBrush(r, Color.White, Color.Pink, 90))
{
gBmp.FillPath(lbr, path);
}
r.Inflate(-1, -1);
using (GraphicsPath path2 = GetClosePath(r, 6))
{
using (LinearGradientBrush lbr = new
LinearGradientBrush(r, Color.Pink, Color.Crimson, 90))
{
gBmp.FillPath(lbr, path2);
}
}
using (Pen pen = new Pen(Color.White, 2))
{
gBmp.DrawLine(pen, new Point(4, 4), new Point(10, 10));
gBmp.DrawLine(pen, new Point(10, 4), new Point(4, 10));
}
gBmp.DrawPath(Pens.DarkRed, path);
}
}
return (bmp);
}
#endregion
#region GetCloseButtonPressedBitmap
/// <summary>
/// Gets the pressed close button bitmap
/// </summary>
/// <param name="g">Graphics</param>
/// <returns>Close bitmap</returns>
public Bitmap GetCloseButtonPressedBitmap(Graphics g)
{
if (_CloseButtonPressedBitmap == null)
_CloseButtonPressedBitmap = CreateCloseButtonPressedBitmap(g);
return (_CloseButtonPressedBitmap);
}
#endregion
#region CreateCloseButtonPressedBitmap
/// <summary>
/// Creates the pressed button bitmap
/// </summary>
/// <param name="g">Graphics</param>
/// <returns>Close bitmap</returns>
public virtual Bitmap CreateCloseButtonPressedBitmap(Graphics g)
{
Bitmap bmp = new Bitmap(16, 16, g);
using (Graphics gBmp = Graphics.FromImage(bmp))
{
gBmp.CompositingQuality = CompositingQuality.HighQuality;
gBmp.SmoothingMode = g.SmoothingMode;
Rectangle r = new Rectangle(0, 0, 15, 15);
using (GraphicsPath path = GetClosePath(r, 4))
{
using (LinearGradientBrush lbr = new
LinearGradientBrush(r, Color.LightGray, Color.Red, 90))
{
gBmp.FillPath(lbr, path);
}
r.Inflate(-1, -1);
using (GraphicsPath path2 = GetClosePath(r, 6))
{
using (LinearGradientBrush lbr = new
LinearGradientBrush(r, Color.Red, Color.Maroon, 90))
{
gBmp.FillPath(lbr, path2);
}
}
using (Pen pen = new Pen(Color.LightGray, 2))
{
gBmp.DrawLine(pen, new Point(4, 4), new Point(10, 10));
gBmp.DrawLine(pen, new Point(10, 4), new Point(4, 10));
}
gBmp.DrawPath(Pens.DarkRed, path);
}
}
return (bmp);
}
#endregion
#region GetClosePath
/// <summary>
/// Gets the close button path
/// </summary>
/// <param name="r">Close rectangle</param>
/// <param name="rad">Corner radius</param>
/// <returns></returns>
private GraphicsPath GetClosePath(Rectangle r, int rad)
{
GraphicsPath path = new GraphicsPath();
Rectangle ar = new
Rectangle(r.Right - rad, r.Bottom - rad, rad, rad);
path.AddArc(ar, 0, 90);
ar.X = r.X;
path.AddArc(ar, 90, 90);
ar.Y = r.Y;
path.AddArc(ar, 180, 90);
ar.X = r.Right - rad;
path.AddArc(ar, 270, 90);
path.CloseAllFigures();
return (path);
}
#endregion
#region Dispose
public void Dispose()
{
StopImageAnimation();
}
#endregion
}
}
#endif