1056 lines
40 KiB
C#

using System;
using System.Drawing;
using System.ComponentModel;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace DevComponents.DotNetBar
{
/// <summary>
/// Represents a progress bar item.
/// </summary>
[ToolboxItem(false), Designer("DevComponents.DotNetBar.Design.SimpleItemDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")]
public class ProgressBarItem : ImageItem, IPersonalizedMenuItem
{
// IPersonalizedMenuItem Implementation
private eMenuVisibility m_MenuVisibility = eMenuVisibility.VisibleAlways;
private bool m_RecentlyUsed = false;
private int m_Maximum = 100;
private int m_Minimum = 0;
private int m_Value = 0;
private int m_Step = 1;
private bool m_TextVisible = false;
public event EventHandler ValueChanged;
private int m_Width = 96;
private int m_Height = 0;
//private ItemStyle m_BackgroundStyle = new ItemStyle();
private ElementStyle m_BackgroundStyle = null;
private Color m_ChunkColor = Color.Empty;
private Color m_ChunkColor2 = Color.Empty;
private float m_ChunkGradientAngle = 0;
private eProgressItemType m_ProgressType = eProgressItemType.Standard;
private int m_MarqueeAnimationSpeed = 100;
private int m_MarqueeValue = 0;
private eProgressBarItemColor m_ColorTable = eProgressBarItemColor.Normal;
/// <summary>
/// Creates new instance of ProgressBarItem.
/// </summary>
public ProgressBarItem() : this("", "") { }
/// <summary>
/// Creates new instance of ProgressBarItem and assigns the name to it.
/// </summary>
/// <param name="sItemName">Item name.</param>
public ProgressBarItem(string sItemName) : this(sItemName, "") { }
/// <summary>
/// Creates new instance of ProgressBarItem and assigns the name and text to it.
/// </summary>
/// <param name="sItemName">Item name.</param>
/// <param name="ItemText">item text.</param>
public ProgressBarItem(string sItemName, string ItemText)
: base(sItemName, ItemText)
{
ResetBackgroundStyle();
}
/// <summary>
/// Returns copy of the item.
/// </summary>
public override BaseItem Copy()
{
ProgressBarItem objCopy = new ProgressBarItem(m_Name);
this.CopyToItem(objCopy);
return objCopy;
}
/// <summary>
/// Copies the ProgressBarItem specific properties to new instance of the item.
/// </summary>
/// <param name="copy">New ProgressBarItem instance.</param>
internal void InternalCopyToItem(ProgressBarItem copy)
{
CopyToItem(copy);
}
/// <summary>
/// Copies the ProgressBarItem specific properties to new instance of the item.
/// </summary>
/// <param name="copy">New ProgressBarItem instance.</param>
protected override void CopyToItem(BaseItem copy)
{
ProgressBarItem objCopy = copy as ProgressBarItem;
base.CopyToItem(objCopy);
objCopy.Minimum = this.Minimum;
objCopy.Maximum = this.Maximum;
objCopy.Step = this.Step;
objCopy.TextVisible = this.TextVisible;
objCopy.Width = this.Width;
objCopy.Style = this.Style;
objCopy.Value = this.Value;
objCopy.ChunkColor = ChunkColor;
objCopy.ChunkColor2 = ChunkColor2;
objCopy.ChunkGradientAngle = ChunkGradientAngle;
objCopy.ColorTable = ColorTable;
}
private Brush GetChunkBrush(Rectangle rect, ColorDescription cd)
{
if (cd.ChunkColor2.IsEmpty)
return new SolidBrush(cd.ChunkColor);
return DisplayHelp.CreateLinearGradientBrush(rect, cd.ChunkColor, cd.ChunkColor2, cd.ChunkGradientAngle);
}
/// <summary>
/// Overriden. Draws the item.
/// </summary>
/// <param name="g">Target Graphics object.</param>
public override void Paint(ItemPaintArgs pa)
{
const float chunkFraction = .65f;
const int chunkSpacing = 2;
if (this.SuspendLayout)
return;
if (this.IsThemed && PaintThemed(pa))
return;
ColorDescription cd = GetColorDescription();
cd.BackgroundStyle.SetColorScheme(pa.Colors);
Graphics g = pa.Graphics;
Font font = this.GetFont();
if (BarFunctions.IsOffice2007Style(this.EffectiveStyle))
{
Rendering.BaseRenderer renderer = pa.Renderer;
if (renderer != null)
{
renderer.DrawProgressBarItem(new ProgressBarItemRenderEventArgs(pa.Graphics, this, pa.Font, pa.RightToLeft));
}
}
else
{
Rectangle rect = m_Rect;
//rect.Inflate(-1, 0);
// Paint Background
ElementStyleDisplay.Paint(new ElementStyleDisplayInfo(cd.BackgroundStyle, g, rect));
// Paint progress
rect.Inflate(-ElementStyleLayout.HorizontalStyleWhiteSpace(cd.BackgroundStyle), -ElementStyleLayout.VerticalStyleWhiteSpace(cd.BackgroundStyle));
switch (this.EffectiveStyle)
{
case eDotNetBarStyle.OfficeXP:
{
Rectangle origRect = rect;
// Bar progress
int chunkWidth = (int)Math.Floor(rect.Height * chunkFraction);
if (chunkWidth <= 0)
chunkWidth = 2;
int chunk100 = (int)Math.Ceiling((double)rect.Width / (chunkWidth + chunkSpacing));
Region oldClip = g.Clip;
g.SetClip(rect, CombineMode.Intersect);
int chunkCount = (int)(chunk100 * ((float)(m_Value - m_Minimum) / (float)(m_Maximum - m_Minimum)));
int startX = rect.X;
if (m_ProgressType == eProgressItemType.Marquee)
{
chunkCount = 5;
startX += rect.Width * m_MarqueeValue / 100 - (int)(chunkWidth * chunkCount * .65);
}
using(Brush brush = GetChunkBrush(origRect, cd))
{
int x = startX;
for (int i = 0; i < chunkCount; i++)
{
g.FillRectangle(brush, x, rect.Y, chunkWidth, rect.Height);
x += (chunkWidth + chunkSpacing);
if (m_ProgressType == eProgressItemType.Marquee && x > rect.Right)
x = rect.X;
}
}
g.Clip = oldClip;
break;
}
case eDotNetBarStyle.Office2000:
{
// Simple Progress Bar
Region oldClip = g.Clip;
g.SetClip(rect, CombineMode.Intersect);
Rectangle origRect = rect;
if (m_ProgressType == eProgressItemType.Marquee)
{
rect.Width = (int)(rect.Width * .29);
rect.X += origRect.Width * m_MarqueeValue / 100 - (int)(rect.Width/2);
}
else
rect.Width = (int)(rect.Width * ((float)(m_Value - m_Minimum) / (float)(m_Maximum - m_Minimum)));
using(Brush brush = GetChunkBrush(origRect, cd))
{
g.FillRectangle(brush, rect);
if (m_ProgressType == eProgressItemType.Marquee && rect.Right > origRect.Right + 4)
{
rect = new Rectangle(origRect.X, origRect.Y, rect.Right - origRect.Right - 4, origRect.Height);
g.FillRectangle(brush, rect);
}
}
g.Clip = oldClip;
break;
}
case eDotNetBarStyle.Office2003:
case eDotNetBarStyle.VS2005:
{
// Bar progress
int chunkWidth = (int)Math.Floor(rect.Height * chunkFraction);
if (chunkWidth <= 0)
chunkWidth = 2;
int chunk100 = (int)Math.Ceiling((double)rect.Width / (chunkWidth + chunkSpacing));
Region oldClip = g.Clip;
g.SetClip(rect, CombineMode.Intersect);
int chunkCount = (int)(chunk100 * ((float)(m_Value - m_Minimum) / (float)(m_Maximum - m_Minimum)));
int startX = rect.X;
if (m_ProgressType == eProgressItemType.Marquee)
{
chunkCount = 5;
startX += rect.Width * m_MarqueeValue / 100 - (int)(chunkWidth * chunkCount * .65);
}
Brush brush = null;
if (cd.ChunkColor2.IsEmpty)
brush = new SolidBrush(cd.ChunkColor);
else
{
LinearGradientBrush lg = DisplayHelp.CreateLinearGradientBrush(new Rectangle(0, 0, chunkWidth, rect.Height), cd.ChunkColor, cd.ChunkColor2, cd.ChunkGradientAngle);
lg.SetBlendTriangularShape(.1f);
brush = lg;
}
try
{
int x = startX;
for (int i = 0; i < chunkCount; i++)
{
g.FillRectangle(brush, x, rect.Y, chunkWidth, rect.Height);
x += (chunkWidth + chunkSpacing);
if (m_ProgressType == eProgressItemType.Marquee && x > rect.Right)
x = rect.X;
}
}
finally
{
brush.Dispose();
}
g.Clip = oldClip;
break;
}
}
}
// Paint Text On Top
if (m_TextVisible)
ElementStyleDisplay.PaintText(new ElementStyleDisplayInfo(cd.BackgroundStyle, g, m_Rect), m_Text, font);
if (this.DesignMode && this.Focused)
{
Rectangle r = m_Rect;
r.Inflate(-1, -1);
DesignTime.DrawDesignTimeSelection(g, r, pa.Colors.ItemDesignTimeBorder);
}
}
private bool PaintThemed(ItemPaintArgs pa)
{
if (this.SuspendLayout)
return true;
if (m_NeedRecalcSize)
RecalcSize();
System.Drawing.Graphics g = pa.Graphics;
ThemeProgress theme = pa.ThemeProgress;
if (theme == null)
return false;
ThemeProgressParts part = ThemeProgressParts.Bar;
Rectangle r = m_Rect;
r.Inflate(-1, -1);
theme.DrawBackground(g, part, ThemeProgressStates.Normal, r);
part = ThemeProgressParts.Chunk;
r.Width = (int)(r.Width * ((float)(m_Value - m_Minimum) / (float)(m_Maximum - m_Minimum)));
if (r.Width > 5)
{
r.Inflate(-4, -4);
theme.DrawBackground(g, part, ThemeProgressStates.Normal, r);
}
if (this.DesignMode && this.Focused)
{
r = m_Rect;
r.Inflate(-1, -1);
DesignTime.DrawDesignTimeSelection(g, r, pa.Colors.ItemDesignTimeBorder);
}
return true;
}
protected virtual Font GetFont()
{
// TODO: Check performance implications of cloning the font all the time instead of
// getting the stored copy all the time
System.Windows.Forms.Control objCtrl = this.ContainerControl as System.Windows.Forms.Control;
if (objCtrl != null)
return (Font)objCtrl.Font;
return SystemFonts.DefaultFont; // (Font)System.Windows.Forms.SystemInformation.MenuFont;
}
/// <summary>
/// Overriden. Recalculates the size of the item.
/// </summary>
public override void RecalcSize()
{
if (this.SuspendLayout)
return;
int height = Dpi.Height(m_Height), width = Dpi.Width(m_Width);
if ((m_Width == 0 || m_Height == 0) && m_TextVisible)
{
// Auto-size item
System.Windows.Forms.Control objCtrl = this.ContainerControl as System.Windows.Forms.Control;
if (!IsHandleValid(objCtrl))
return;
Graphics g = BarFunctions.CreateGraphics(objCtrl);
try
{
ElementStyle backgroundStyle = GetBackgroundStyle();
// Measure string
Font objCurrentFont = GetFont();
Size objStringSize = Size.Empty;
eTextFormat objStringFormat = backgroundStyle.TextFormat;
if (m_Text != "")
{
objStringSize = TextDrawing.MeasureString(g, m_Text, objCurrentFont, 0, objStringFormat);
objStringSize.Width += 4;
}
else
{
objStringSize = TextDrawing.MeasureString(g, " ", objCurrentFont, 0, objStringFormat);
objStringSize.Width += 4;
}
if (backgroundStyle.Border != eStyleBorderType.None)
objStringSize.Width += 4;
objStringSize.Height += Dpi.Height6;
if (m_Width == 0)
width = (int)objStringSize.Width;
if (m_Height == 0)
height = (int)objStringSize.Height;
}
finally
{
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault;
g.SmoothingMode = SmoothingMode.Default;
g.Dispose();
}
}
else
{
if (m_Height == 0)
height = Dpi.Height(this.ImageSize.Height);
else
height = Dpi.Height(m_Height);
if (m_Width == 0)
width = Dpi.Width(96);
else
width = Dpi.Width(m_Width);
}
if (this.Orientation == eOrientation.Horizontal)
{
this.HeightInternal = height;
this.WidthInternal = width;
}
else
{
this.HeightInternal = width;
this.WidthInternal = height;
}
base.RecalcSize();
}
/// <summary>
/// Gets or sets the item background style.
/// </summary>
[Obsolete("BackgroundStyle property is replaced with the BackStyle property"), Browsable(false), Category("Style"), Description("Gets or sets the background style."), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ItemStyle BackgroundStyle
{
get { return null; }
set { }
}
/// <summary>
/// Specifies the background style of the item.
/// </summary>
[Browsable(true), DevCoBrowsable(true), Category("Style"), Description("Gets or sets bar background style."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ElementStyle BackStyle
{
get { return m_BackgroundStyle; }
set
{
if (value == null)
throw new InvalidOperationException("Null is not valid value for this property.");
m_BackgroundStyle = value;
}
}
/// <summary>
/// Resets style to default value. Used by windows forms designer.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetBackgroundStyle()
{
if(m_BackgroundStyle!=null)
m_BackgroundStyle.StyleChanged -= new EventHandler(this.VisualPropertyChanged);
m_BackgroundStyle = new ElementStyle();
m_BackgroundStyle.StyleChanged += new EventHandler(this.VisualPropertyChanged);
this.Refresh();
}
private void VisualPropertyChanged(object sender, EventArgs e)
{
this.OnAppearanceChanged();
}
private class ColorDescription
{
public ElementStyle BackgroundStyle = null;
public Color ChunkColor = Color.Empty;
public Color ChunkColor2 = Color.Empty;
public int ChunkGradientAngle = 0;
public ColorDescription() { }
public ColorDescription(ElementStyle style, Color chunkColor, Color chunkColor2, int chunkGradientAngle)
{
this.BackgroundStyle = style;
this.ChunkColor = chunkColor;
this.ChunkColor2 = chunkColor2;
this.ChunkGradientAngle = chunkGradientAngle;
}
}
private ColorDescription GetColorDescription()
{
ElementStyle style = null;
Color chunkColor = Color.Empty;
Color chunkColor2 = Color.Empty;
int chunkGradientAngle = (int)m_ChunkGradientAngle;
if (m_BackgroundStyle.Custom)
style = m_BackgroundStyle;
else
style = GetBackgroundStyle();
if (!m_ChunkColor.IsEmpty)
{
chunkColor = m_ChunkColor;
chunkColor2 = m_ChunkColor2;
}
else
{
switch (this.EffectiveStyle)
{
case eDotNetBarStyle.Office2000:
case eDotNetBarStyle.OfficeXP:
{
chunkColor = SystemColors.Highlight;
chunkColor2 = Color.Empty;
break;
}
default:
{
ColorScheme scheme = GetColorScheme();
chunkGradientAngle = 90;
chunkColor = scheme.ItemPressedBackground;
chunkColor2 = scheme.ItemPressedBackground2;
break;
}
}
}
if (this.Orientation == eOrientation.Vertical)
style.TextOrientation = eOrientation.Vertical;
else
style.TextOrientation = eOrientation.Horizontal;
return new ColorDescription(style, chunkColor, chunkColor2, chunkGradientAngle);
}
private ColorScheme GetColorScheme()
{
ColorScheme scheme = null;
Control cc = this.ContainerControl as Control;
if (cc is Bar)
scheme = ((Bar)cc).ColorScheme;
else if (cc is MenuPanel)
scheme = ((MenuPanel)cc).ColorScheme;
else if (cc is ItemControl)
scheme = ((ItemControl)cc).ColorScheme;
else if (cc is BaseItemControl)
scheme = ((BaseItemControl)cc).ColorScheme;
if (scheme == null)
scheme = new ColorScheme(this.EffectiveStyle);
return scheme;
}
private ElementStyle m_CachedStyle = null;
private ElementStyle GetBackgroundStyle()
{
if (m_CachedStyle != null)
return m_CachedStyle;
ElementStyle style = new ElementStyle();
if (this.EffectiveStyle == eDotNetBarStyle.Office2000 || this.EffectiveStyle == eDotNetBarStyle.OfficeXP)
{
style.Border = eStyleBorderType.Solid;
style.BorderWidth = 1;
style.BorderColor = SystemColors.ControlDark;
style.BackColor = SystemColors.Control;
style.TextColor = SystemColors.ControlText;
}
else if (this.EffectiveStyle == eDotNetBarStyle.Office2003 || this.EffectiveStyle == eDotNetBarStyle.VS2005 || BarFunctions.IsOffice2007Style(this.EffectiveStyle))
{
ColorScheme scheme = null;
if (this.ContainerControl is Bar)
scheme = ((Bar)this.ContainerControl).ColorScheme;
else if (this.ContainerControl is MenuPanel)
scheme = ((MenuPanel)this.ContainerControl).ColorScheme;
if (scheme == null)
scheme = new ColorScheme(this.EffectiveStyle);
style.Border = eStyleBorderType.Solid;
style.BorderWidth = 1;
style.BorderColorSchemePart = eColorSchemePart.BarDockedBorder;
style.BackColorSchemePart = eColorSchemePart.BarBackground;
style.BackColor2SchemePart = eColorSchemePart.BarBackground2;
style.BackColorGradientAngle = 90;
style.TextColorSchemePart = eColorSchemePart.ItemText;
}
style.TextLineAlignment = eStyleTextAlignment.Center;
style.TextAlignment = eStyleTextAlignment.Center;
m_CachedStyle = style;
return m_CachedStyle;
}
protected override void OnStyleChanged()
{
m_CachedStyle = null;
base.OnStyleChanged();
}
/// <summary>
/// Gets or sets the maximum value of the range of the control.
/// </summary>
[DevCoBrowsable(true), Browsable(true), Description("Gets or sets the maximum value of the range of the control."), Category("Behavior"), DefaultValue(100)]
public int Maximum
{
get
{
return m_Maximum;
}
set
{
m_Maximum = value;
this.Refresh();
OnAppearanceChanged();
}
}
/// <summary>
/// Gets or sets the minimum value of the range of the control.
/// </summary>
[DevCoBrowsable(true), Browsable(true), Description("Gets or sets the minimum value of the range of the control."), Category("Behavior"), DefaultValue(0)]
public int Minimum
{
get
{
return m_Minimum;
}
set
{
m_Minimum = value;
this.Refresh();
OnAppearanceChanged();
}
}
/// <summary>
/// Gets or sets the current position of the progress bar.
/// </summary>
[DevCoBrowsable(true), Browsable(true), Description("Gets or sets the current position of the progress bar."), Category("Behavior"), DefaultValue(0)]
public int Value
{
get { return m_Value; }
set
{
int oldValue = m_Value;
if (value < m_Minimum)
m_Value = m_Minimum;
else if (value > m_Maximum)
m_Value = m_Maximum;
else
m_Value = value;
if (ValueChanged != null)
ValueChanged(this, new EventArgs());
if (GetNeedVisualUpdate(oldValue, m_Value))
{
this.Refresh();
OnAppearanceChanged();
Control c = this.ContainerControl as Control;
if (c != null) c.Update();
}
}
}
private bool GetNeedVisualUpdate(int oldValue, int newValue)
{
int oldW = (int)(this.WidthInternal * ((float)oldValue / (m_Maximum - m_Minimum)));
int newW = (int)(this.WidthInternal * ((float)newValue / (m_Maximum - m_Minimum)));
return oldW != newW;
}
/// <summary>
/// Gets or sets the amount by which a call to the PerformStep method increases the current position of the progress bar.
/// </summary>
[DevCoBrowsable(true), Browsable(true), Description("Gets or sets the amount by which a call to the PerformStep method increases the current position of the progress bar."), Category("Behavior"), DefaultValue(1)]
public int Step
{
get
{
return m_Step;
}
set
{
m_Step = value;
}
}
/// <summary>
/// Advances the current position of the progress bar by the amount of the Step property.
/// </summary>
public void PerformStep()
{
this.Value += m_Step;
}
/// <summary>
/// Advances the current position of the progress bar by the specified amount.
/// </summary>
/// <param name="value">The amount by which to increment the progress bar's current position. </param>
public void Increment(int value)
{
this.Value += value;
}
/// <summary>
/// Gets or sets whether the text inside the progress bar is displayed.
/// </summary>
[DevCoBrowsable(true), Browsable(true), Description("Gets or sets whether the text inside the progress bar is displayed."), Category("Behavior"), DefaultValue(false)]
public bool TextVisible
{
get
{
return m_TextVisible;
}
set
{
m_TextVisible = value;
this.Refresh();
OnAppearanceChanged();
}
}
/// <summary>
/// Gets or sets the width of the item in pixels. 0 value indicates the auto-sizing item based on the text contained in it.
/// </summary>
[Browsable(true), DevCoBrowsable(true), DefaultValue(96), System.ComponentModel.Category("Layout"), System.ComponentModel.Description("Indicates the width of the label in pixels.")]
public int Width
{
get
{
return m_Width;
}
set
{
if (m_Width == value)
return;
m_Width = value;
NeedRecalcSize = true;
this.Refresh();
OnAppearanceChanged();
}
}
/// <summary>
/// Gets or sets the height of the label. 0 value indicates the auto-sizing item based on the text height.
/// </summary>
[System.ComponentModel.Browsable(true), DevCoBrowsable(true), System.ComponentModel.DefaultValue(0), System.ComponentModel.Category("Layout"), System.ComponentModel.Description("Indicates height of the label in pixels.")]
public int Height
{
get
{
return m_Height;
}
set
{
if (m_Height == value)
return;
m_Height = value;
NeedRecalcSize = true;
this.Refresh();
}
}
/// <summary>
/// Gets or sets the color of the progress chunk.
/// </summary>
[Browsable(true), DevCoBrowsable(true), Category("Appearance"), Description("Gets or sets the color of the progress chunk.")]
public Color ChunkColor
{
get
{
return m_ChunkColor;
}
set
{
m_ChunkColor = value;
OnAppearanceChanged();
this.Refresh();
}
}
/// <summary>
/// Gets whether ChunkColor property should be serialized.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeChunkColor()
{
return (!m_ChunkColor.IsEmpty);
}
/// <summary>
/// Resets the ChunkColor property to its default value.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetChunkColor()
{
m_ChunkColor = Color.Empty;
}
/// <summary>
/// Gets or sets the target gradient color of the progress chunk.
/// </summary>
[Browsable(true), DevCoBrowsable(true), Category("Appearance"), Description("Gets or sets the target gradient color of the progress chunk.")]
public Color ChunkColor2
{
get
{
return m_ChunkColor2;
}
set
{
m_ChunkColor2 = value;
OnAppearanceChanged();
this.Refresh();
}
}
/// <summary>
/// Gets whether ChunkColor property should be serialized.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeChunkColor2()
{
return (!m_ChunkColor2.IsEmpty);
}
/// <summary>
/// Resets the ChunkColor property to its default value.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetChunkColor2()
{
m_ChunkColor2 = Color.Empty;
}
/// <summary>
/// Gets or sets the gradient angle of the progress chunk.
/// </summary>
[Browsable(true), DevCoBrowsable(true), Category("Appearance"), Description("Gets or sets the gradient angle of the progress chunk."), DefaultValue(0)]
public float ChunkGradientAngle
{
get
{
return m_ChunkGradientAngle;
}
set
{
m_ChunkGradientAngle = value;
if (!m_ChunkColor2.IsEmpty)
this.Refresh();
OnAppearanceChanged();
}
}
/// <summary>
/// Overloaded. Deserializes the Item from the XmlElement.
/// </summary>
/// <param name="ItemXmlSource">Source XmlElement.</param>
public override void Deserialize(ItemSerializationContext context)
{
base.Deserialize(context);
System.Xml.XmlElement ItemXmlSource = context.ItemXmlElement;
m_Width = System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("width"));
m_Height = System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("height"));
m_Value = System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("value"));
m_Minimum = System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("min"));
m_Maximum = System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("max"));
m_TextVisible = System.Xml.XmlConvert.ToBoolean(ItemXmlSource.GetAttribute("textvisible"));
m_Step = System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("step"));
if (ItemXmlSource.HasAttribute("chunkcolor"))
m_ChunkColor = BarFunctions.ColorFromString(ItemXmlSource.GetAttribute("chunkcolor"));
if (ItemXmlSource.HasAttribute("chunkcolor2"))
m_ChunkColor2 = BarFunctions.ColorFromString(ItemXmlSource.GetAttribute("chunkcolor2"));
m_ChunkGradientAngle = System.Xml.XmlConvert.ToSingle(ItemXmlSource.GetAttribute("chunkga"));
foreach (System.Xml.XmlElement xmlElem in ItemXmlSource.ChildNodes)
{
switch (xmlElem.Name)
{
case "backstyle2":
{
ElementSerializer.Deserialize(m_BackgroundStyle, xmlElem);
break;
}
}
}
}
/// <summary>
/// Overloaded. Serializes the item and all sub-items into the XmlElement.
/// </summary>
/// <param name="ThisItem">XmlElement to serialize the item to.</param>
protected internal override void Serialize(ItemSerializationContext context)
{
base.Serialize(context);
System.Xml.XmlElement ThisItem = context.ItemXmlElement;
ThisItem.SetAttribute("width", System.Xml.XmlConvert.ToString(m_Width));
ThisItem.SetAttribute("height", System.Xml.XmlConvert.ToString(m_Height));
ThisItem.SetAttribute("value", System.Xml.XmlConvert.ToString(m_Value));
ThisItem.SetAttribute("min", System.Xml.XmlConvert.ToString(m_Minimum));
ThisItem.SetAttribute("max", System.Xml.XmlConvert.ToString(m_Maximum));
ThisItem.SetAttribute("textvisible", System.Xml.XmlConvert.ToString(m_TextVisible));
ThisItem.SetAttribute("step", System.Xml.XmlConvert.ToString(m_Step));
if (!m_ChunkColor.IsEmpty)
ThisItem.SetAttribute("chunkcolor", BarFunctions.ColorToString(m_ChunkColor));
if (!m_ChunkColor2.IsEmpty)
ThisItem.SetAttribute("chunkcolor2", BarFunctions.ColorToString(m_ChunkColor2));
ThisItem.SetAttribute("chunkga", System.Xml.XmlConvert.ToString(m_ChunkGradientAngle));
if (m_BackgroundStyle.Custom)
{
System.Xml.XmlElement style = ThisItem.OwnerDocument.CreateElement("backstyle2");
ThisItem.AppendChild(style);
ElementSerializer.Serialize(m_BackgroundStyle, style);
}
}
// IPersonalizedMenuItem Impementation
/// <summary>
/// Indicates item's visiblity when on pop-up menu.
/// </summary>
[System.ComponentModel.Browsable(true), DevCoBrowsable(true), System.ComponentModel.Category("Appearance"), System.ComponentModel.Description("Indicates item's visiblity when on pop-up menu.")]
public eMenuVisibility MenuVisibility
{
get
{
return m_MenuVisibility;
}
set
{
if (m_MenuVisibility != value)
{
m_MenuVisibility = value;
if (ShouldSyncProperties)
BarFunctions.SyncProperty(this, "MenuVisibility");
}
}
}
/// <summary>
/// Indicates whether item was recently used.
/// </summary>
[System.ComponentModel.Browsable(false)]
public bool RecentlyUsed
{
get
{
return m_RecentlyUsed;
}
set
{
if (m_RecentlyUsed != value)
{
m_RecentlyUsed = value;
if (ShouldSyncProperties)
BarFunctions.SyncProperty(this, "RecentlyUsed");
}
}
}
/// <summary>
/// Gets or sets the type of progress bar used to indicate progress. The Standard style displays the progress based on Minimum, Maximum and current Value.
/// The Marquee type is automatically moving progress bar that is used to indicate an ongoing operation for which the actual duration cannot be estimated.
/// </summary>
[Browsable(true), Category("Behavior"), DefaultValue(eProgressItemType.Standard), Description("Indicates type of progress bar used to indicate progress.")]
public eProgressItemType ProgressType
{
get { return m_ProgressType; }
set
{
m_ProgressType = value;
OnProgressTypeChanged();
}
}
protected override void OnDesignModeChanged()
{
if (this.DesignMode)
{
if (m_ProgressType == eProgressItemType.Marquee)
DisposeTimer();
}
base.OnDesignModeChanged();
}
private void OnProgressTypeChanged()
{
if (this.DesignMode) return;
DisposeTimer();
if (m_ProgressType == eProgressItemType.Marquee)
SetupTimer();
this.OnAppearanceChanged();
this.Refresh();
}
protected internal override void OnVisibleChanged(bool newValue)
{
base.OnVisibleChanged(newValue);
if (m_ProgressType == eProgressItemType.Marquee && m_MarqueeTimer!=null)
{
if (newValue)
m_MarqueeTimer.Start();
else
m_MarqueeTimer.Stop();
}
}
protected override void Dispose(bool disposing)
{
DisposeTimer();
base.Dispose(disposing);
}
private Timer m_MarqueeTimer = null;
private void DisposeTimer()
{
if (m_MarqueeTimer != null)
{
m_MarqueeTimer.Tick -= MarqueeTimer_Tick;
m_MarqueeTimer.Stop();
m_MarqueeTimer.Dispose();
m_MarqueeTimer = null;
}
}
private void SetupTimer()
{
if (m_MarqueeTimer != null) DisposeTimer();
m_MarqueeValue = 0;
if (m_MarqueeAnimationSpeed == 0) return;
m_MarqueeTimer = new Timer();
m_MarqueeTimer.Interval = m_MarqueeAnimationSpeed;
m_MarqueeTimer.Tick += MarqueeTimer_Tick;
if (this.Visible)
m_MarqueeTimer.Start();
}
private void MarqueeTimer_Tick(object sender, EventArgs e)
{
m_MarqueeValue+=5;
if (m_MarqueeValue > 100)
m_MarqueeValue = 0;
this.Refresh();
}
internal int MarqueeValue
{
get { return m_MarqueeValue; }
}
/// <summary>
/// Gets or sets the marquee animation speed in milliseconds.
/// </summary>
[Browsable(true), DefaultValue(100), Category("Behavior"), Description("Indicates marquee animation speed in milliseconds.")]
public int MarqueeAnimationSpeed
{
get { return m_MarqueeAnimationSpeed; }
set
{
m_MarqueeAnimationSpeed = value;
OnProgressTypeChanged();
}
}
/// <summary>
/// Gets or sets the predefined color state table for progress bar. Color specified applies to items with Office 2007 style only. It does not have
/// any effect on other styles. You can use ColorTable to indicate the state of the operation that Progress Bar is tracking. Default value is eProgressBarItemColor.Normal.
/// </summary>
[Browsable(true), DevCoBrowsable(false), DefaultValue(eProgressBarItemColor.Normal), Category("Appearance"), Description("Indicates predefined color of item when Office 2007 style is used.")]
public eProgressBarItemColor ColorTable
{
get { return m_ColorTable; }
set
{
if (m_ColorTable != value)
{
m_ColorTable = value;
this.Refresh();
}
}
}
}
}