using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace DevComponents.DotNetBar
{
///
/// Represents a step item which is used to show single step in multi-step progress control.
///
[ToolboxItem(false), DefaultEvent("Click")]
public class StepItem : BaseItem
{
#region Constructor, Copy
///
/// Creates new instance of StepItem.
///
public StepItem() : this("", "") { }
///
/// Creates new instance of StepItem and assigns the name to it.
///
/// Item name.
public StepItem(string sItemName) : this(sItemName, "") { }
///
/// Creates new instance of StepItem and assigns the name and text to it.
///
/// Item name.
/// item text.
public StepItem(string sItemName, string ItemText)
: base(sItemName, ItemText)
{
//this.ClickRepeatInterval = 200;
this.MouseUpNotification = true;
//this.MouseDownCapture = true;
_Padding.PropertyChanged += PaddingPropertyChanged;
}
///
/// Returns copy of the item.
///
public override BaseItem Copy()
{
StepItem objCopy = new StepItem(m_Name);
this.CopyToItem(objCopy);
return objCopy;
}
///
/// Copies the StepItem specific properties to new instance of the item.
///
/// New StepItem instance.
internal void InternalCopyToItem(StepItem copy)
{
CopyToItem(copy);
}
///
/// Copies the StepItem specific properties to new instance of the item.
///
/// New StepItem instance.
protected override void CopyToItem(BaseItem copy)
{
StepItem c = copy as StepItem;
c.Symbol = _Symbol;
c.SymbolSet = _SymbolSet;
c.SymbolColor = _SymbolColor;
c.SymbolSize = _SymbolSize;
base.CopyToItem(c);
}
protected override void Dispose(bool disposing)
{
if (_ItemPath != null)
{
_ItemPath.Dispose();
_ItemPath = null;
}
base.Dispose(disposing);
}
#endregion
#region Internal Implementation
public override void Paint(ItemPaintArgs p)
{
Rendering.BaseRenderer renderer = p.Renderer;
if (renderer != null)
{
StepItemRendererEventArgs e = new StepItemRendererEventArgs(this, p.Graphics);
e.ItemPaintArgs = p;
renderer.DrawStepItem(e);
}
else
{
Rendering.StepItemPainter painter = PainterFactory.CreateStepItemPainter(this);
if (painter != null)
{
StepItemRendererEventArgs e = new StepItemRendererEventArgs(this, p.Graphics);
e.ItemPaintArgs = p;
painter.Paint(e);
}
}
if (this.DesignMode && this.Focused)
{
Rectangle r = Rectangle.Round(_ItemPath.GetBounds());
r.Inflate(-1, -1);
DesignTime.DrawDesignTimeSelection(p.Graphics, r, p.Colors.ItemDesignTimeBorder);
}
this.DrawInsertMarker(p.Graphics);
}
public override void RecalcSize()
{
Font font = GetFont(null);
Size size = Size.Empty;
Control objCtrl = this.ContainerControl as Control;
if (objCtrl == null || objCtrl.Disposing || objCtrl.IsDisposed)
return;
Graphics g = BarFunctions.CreateGraphics(objCtrl);
if (g == null) return;
try
{
if (!string.IsNullOrEmpty(_Symbol))
{
_ActualSymbolSize = GetSymbolSize(g);
size = _ActualSymbolSize;
}
else if (_Image != null)
{
size = _Image.Size;
}
if (!string.IsNullOrEmpty(this.Text))
{
Size textSize = ButtonItemLayout.MeasureItemText(this, g, 0, objCtrl.Font, eTextFormat.Default, objCtrl.RightToLeft == RightToLeft.Yes);
size.Width += textSize.Width;
size.Height = Math.Max(size.Height, textSize.Height);
if (_Image != null || !string.IsNullOrEmpty(_Symbol))
size.Width += Dpi.Width(_ImageTextSpacing);
}
else if (string.IsNullOrEmpty(_Symbol) && _Image == null)
size = new System.Drawing.Size(Dpi.Width16, Dpi.Height16);
size.Width += GetPointerSize();
if(!_IsFirst && !_IsLast)
size.Width += Dpi.Width(GetPointerSize());
size.Width += Dpi.Width(_Padding.Horizontal);
size.Height += Dpi.Height(_Padding.Vertical);
base.RecalcSize();
}
finally
{
g.Dispose();
}
if (!_MinimumSize.IsEmpty)
{
if (size.Width < _MinimumSize.Width) size.Width = _MinimumSize.Width;
if (size.Height < _MinimumSize.Height) size.Height = _MinimumSize.Height;
}
m_Rect.Size = size;
}
internal int GetPointerSize()
{
if (this.Parent is StepItemContainer)
return ((StepItemContainer)this.Parent).PointerSize;
return 10;
}
private Size GetSymbolSize(Graphics g)
{
Size symbolSize = Size.Empty;
if (g == null || string.IsNullOrEmpty(_Symbol)) return symbolSize;
Font symFont = Symbols.GetFont(this.SymbolSize, this.SymbolSet);
symbolSize = TextDrawing.MeasureString(g, "\uF00A", symFont); // Need to do this to get consistent size for the symbol since they are not all the same width we pick widest
int descent = (int)Math.Ceiling((symFont.FontFamily.GetCellDescent(symFont.Style) *
symFont.Size / symFont.FontFamily.GetEmHeight(symFont.Style)));
symbolSize.Height -= descent;
return symbolSize;
}
private Size _ActualSymbolSize = Size.Empty;
internal Size ActualSymbolSize
{
get
{
return _ActualSymbolSize;
}
}
///
/// Returns the Font object to be used for drawing the item text.
///
/// Font object.
private Font GetFont(ItemPaintArgs pa)
{
System.Drawing.Font font = null;
if (pa != null)
font = pa.Font;
if (font == null)
{
System.Windows.Forms.Control objCtrl = null;
if (pa != null)
objCtrl = pa.ContainerControl;
if (objCtrl == null)
objCtrl = this.ContainerControl as System.Windows.Forms.Control;
if (objCtrl != null && objCtrl.Font != null)
font = (Font)objCtrl.Font;
else
font = SystemFonts.DefaultFont; // (Font)System.Windows.Forms.SystemInformation.MenuFont;
}
return font;
}
private GraphicsPath _ItemPath = null;
///
/// Gets the render path of the item.
///
[Browsable(false)]
public GraphicsPath ItemPath
{
get { return _ItemPath; }
internal set
{
if (_ItemPath != null)
_ItemPath.Dispose();
_ItemPath = value;
}
}
private bool _IsFirst;
private int _Minimum = 0;
///
/// Gets or sets the minimum value of the range of the control.
///
[Browsable(true), Description("Gets or sets the minimum value of the range of the control."), Category("Behavior"), DefaultValue(0)]
public int Minimum
{
get { return _Minimum; }
set
{
if (value != _Minimum)
{
int oldValue = _Minimum;
_Minimum = value;
OnMinimumChanged(oldValue, value);
}
}
}
///
/// Called when Minimum property has changed.
///
/// Old property value
/// New property value
protected virtual void OnMinimumChanged(int oldValue, int newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("Minimum"));
this.OnAppearanceChanged();
this.Refresh();
}
private int _Maximum = 100;
[Browsable(true), Description("Gets or sets the maximum value of the range of the control."), Category("Behavior"), DefaultValue(100)]
public int Maximum
{
get { return _Maximum; }
set
{
if (value != _Maximum)
{
int oldValue = _Maximum;
_Maximum = value;
OnMaximumChanged(oldValue, value);
}
}
}
///
/// Called when Maximum property has changed.
///
/// Old property value
/// New property value
protected virtual void OnMaximumChanged(int oldValue, int newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("Maximum"));
this.OnAppearanceChanged();
this.Refresh();
}
private int _Value = 0;
[Browsable(true), Description("Gets or sets the current position of the progress bar."), Category("Behavior"), DefaultValue(0)]
public int Value
{
get { return _Value; }
set
{
if (value != _Value)
{
int oldValue = _Value;
_Value = value;
OnValueChanged(oldValue, value);
}
}
}
///
/// Called when Value property has changed.
///
/// Old property value
/// New property value
protected virtual void OnValueChanged(int oldValue, int newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("Value"));
this.OnAppearanceChanged();
this.Refresh();
}
private Color _SymbolColor = Color.Empty;
///
/// Gets or sets the color of the Symbol.
///
[Category("Appearance"), Description("Indicates color of the Symbol.")]
public Color SymbolColor
{
get { return _SymbolColor; }
set { _SymbolColor = value; this.Refresh(); }
}
///
/// Gets whether property should be serialized.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeSymbolColor()
{
return !_SymbolColor.IsEmpty;
}
///
/// Resets property to its default value.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetSymbolColor()
{
this.SymbolColor = Color.Empty;
}
///
/// Gets the realized symbol string.
///
[Browsable(false)]
public string SymbolRealized
{
get { return _SymbolRealized; }
}
private string _Symbol = "", _SymbolRealized = "";
///
/// Indicates the symbol displayed on face of the button instead of the image. Setting the symbol overrides the image setting.
///
[DefaultValue(""), Category("Appearance"), Description("Indicates the symbol displayed on face of the button instead of the image. Setting the symbol overrides the image setting.")]
[Editor("DevComponents.DotNetBar.Design.SymbolTypeEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor))]
public string Symbol
{
get { return _Symbol; }
set
{
if (value != _Symbol)
{
string oldValue = _Symbol;
_Symbol = value;
OnSymbolChanged(oldValue, value);
}
}
}
///
/// Called when Symbol property has changed.
///
/// Old property value
/// New property value
protected virtual void OnSymbolChanged(string oldValue, string newValue)
{
if (string.IsNullOrEmpty(newValue))
_SymbolRealized = "";
else
_SymbolRealized = Symbols.GetSymbol(newValue);
//OnPropertyChanged(new PropertyChangedEventArgs("Symbol"));
NeedRecalcSize = true;
OnAppearanceChanged();
this.Refresh();
}
private eSymbolSet _SymbolSet = eSymbolSet.Awesome;
///
/// Gets or sets the symbol set used to represent the Symbol.
///
[Browsable(false), DefaultValue(eSymbolSet.Awesome)]
public eSymbolSet SymbolSet
{
get { return _SymbolSet; }
set
{
if (_SymbolSet != value)
{
eSymbolSet oldValue = _SymbolSet;
_SymbolSet = value;
OnSymbolSetChanged(oldValue, value);
}
}
}
///
/// Called when SymbolSet property value changes.
///
/// Indciates old value
/// Indicates new value
protected virtual void OnSymbolSetChanged(eSymbolSet oldValue, eSymbolSet newValue)
{
NeedRecalcSize = true;
OnAppearanceChanged();
this.Refresh();
}
private float _SymbolSize = 13f;
///
/// Indicates the size of the symbol in points.
///
[DefaultValue(12f), Category("Appearance"), Description("Indicates the size of the symbol in points.")]
public float SymbolSize
{
get { return _SymbolSize; }
set
{
if (value != _SymbolSize)
{
float oldValue = _SymbolSize;
_SymbolSize = value;
OnSymbolSizeChanged(oldValue, value);
}
}
}
///
/// Called when SymbolSize property has changed.
///
/// Old property value
/// New property value
protected virtual void OnSymbolSizeChanged(float oldValue, float newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("SymbolSize"));
NeedRecalcSize = true;
OnAppearanceChanged();
this.Refresh();
}
private Image _Image = null;
///
/// Indicates the image that is displayed next to the item text label.
///
[DefaultValue(null), Category("Appearance"), Description("Indicates the image that is displayed next to the item text label.")]
public Image Image
{
get { return _Image; }
set
{
if (value != _Image)
{
Image oldValue = _Image;
_Image = value;
OnImageChanged(oldValue, value);
}
}
}
///
/// Called when Image property has changed.
///
/// Old property value
/// New property value
protected virtual void OnImageChanged(Image oldValue, Image newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("Image"));
NeedRecalcSize = true;
OnAppearanceChanged();
this.Refresh();
}
///
/// Gets or sets whether this is first item in StepControl.
///
internal bool IsFirst
{
get { return _IsFirst; }
set
{
_IsFirst = value;
}
}
private bool _IsLast = false;
///
/// Gets or sets whether this is laste item in StepControl.
///
internal bool IsLast
{
get { return _IsLast; }
set
{
_IsLast = value;
}
}
private Size _MinimumSize = Size.Empty;
///
/// Indicates minimum size of the item
///
[Category("Appearance"), Description("Indicates minimum size of the item")]
public Size MinimumSize
{
get { return _MinimumSize; }
set
{
if (value != _MinimumSize)
{
Size oldValue = _MinimumSize;
_MinimumSize = value;
OnMinimumSizeChanged(oldValue, value);
}
}
}
///
/// Called when MinimumSize property has changed.
///
/// Old property value
/// New property value
protected virtual void OnMinimumSizeChanged(Size oldValue, Size newValue)
{
// OnPropertyChanged(new PropertyChangedEventArgs("MinimumSize"));
NeedRecalcSize = true;
OnAppearanceChanged();
this.Refresh();
}
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeMinimumSize()
{
return !_MinimumSize.IsEmpty;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetMinimumSize()
{
this.Size = Size.Empty;
}
private bool _HotTracking = true;
///
/// Specifies whether item changes its appearance when mouse is moved over the item
///
[DefaultValue(true), Category("Behavior"), Description("Specifies whether item changes its appearance when mouse is moved over the item")]
public bool HotTracking
{
get { return _HotTracking; }
set
{
if (value != _HotTracking)
{
bool oldValue = _HotTracking;
_HotTracking = value;
OnHotTrackingChanged(oldValue, value);
}
}
}
///
/// Called when HotTracking property has changed.
///
/// Old property value
/// New property value
protected virtual void OnHotTrackingChanged(bool oldValue, bool newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("HotTracking"));
}
private bool _MouseOver = false, _MouseDown = false;
public override void InternalMouseEnter()
{
base.InternalMouseEnter();
if (!this.DesignMode)
{
_MouseOver = true;
if (this.GetEnabled() && _HotTracking)
this.Refresh();
}
}
public override void InternalMouseLeave()
{
base.InternalMouseLeave();
if (!this.DesignMode)
{
_MouseOver = false;
_MouseDown = false;
if (this.GetEnabled() && _HotTracking)
this.Refresh();
}
}
public override void InternalMouseDown(MouseEventArgs objArg)
{
base.InternalMouseDown(objArg);
if (objArg.Button == MouseButtons.Left && !this.DesignMode)
{
_MouseDown = true;
if (this.GetEnabled() && _HotTracking)
this.Refresh();
}
}
public override void InternalMouseUp(MouseEventArgs objArg)
{
base.InternalMouseUp(objArg);
if (_MouseDown && !this.DesignMode)
{
_MouseDown = false;
if (this.GetEnabled() && _HotTracking)
this.Refresh();
}
}
///
/// Gets whether mouse is over the item.
///
[Browsable(false)]
public bool IsMouseOver
{
get { return _MouseOver; }
internal set { _MouseOver = value; }
}
///
/// Gets whether left mouse button is pressed on the item.
///
[Browsable(false)]
public bool IsMouseDown
{
get { return _MouseDown; }
internal set { _MouseDown = value; }
}
private int _ImageTextSpacing = 4;
///
/// Indicates the spacing between image and text.
///
[DefaultValue(4), Category("Appearance"), Description("Indicates the spacing between image and text.")]
public int ImageTextSpacing
{
get { return _ImageTextSpacing; }
set
{
if (value != _ImageTextSpacing)
{
int oldValue = _ImageTextSpacing;
_ImageTextSpacing = value;
OnImageTextSpacingChanged(oldValue, value);
}
}
}
///
/// Called when ImageTextSpacing property has changed.
///
/// Old property value
/// New property value
protected virtual void OnImageTextSpacingChanged(int oldValue, int newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("ImageTextSpacing"));
NeedRecalcSize = true;
OnAppearanceChanged();
this.Refresh();
}
private const int DefaultPadding = 4;
private Padding _Padding = new Padding(DefaultPadding);
///
/// Gets or sets padding around content of the item.
///
[Browsable(true), Category("Appearance"), Description("Gets or sets padding around content of the item."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Padding Padding
{
get { return _Padding; }
}
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializePadding()
{
return _Padding.Bottom != DefaultPadding || _Padding.Top != DefaultPadding || _Padding.Left != DefaultPadding || _Padding.Right != DefaultPadding;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetPadding()
{
_Padding.All = DefaultPadding;
}
private void PaddingPropertyChanged(object sender, PropertyChangedEventArgs e)
{
NeedRecalcSize = true;
this.Refresh();
}
private Color[] _ProgressColors = null;
///
/// Indicates the array of colors that when set are used to draw the current progress, i.e. Value>Minimum
///
[DefaultValue(null), Category("Appearance"), Description("Indicates the array of colors that when set are used to draw the current progress, i.e. Value>Minimum"), TypeConverter(typeof(ArrayConverter))]
public Color[] ProgressColors
{
get
{
return _ProgressColors;
}
set
{
if (_ProgressColors != value)
{
_ProgressColors = value;
//OnPropertyChanged(new PropertyChangedEventArgs("Colors"));
this.Refresh();
}
}
}
private Color[] _BackColors = null;
///
/// Indicates the array of colors that when set are used to draw the background of the item.
///
[DefaultValue(null), Category("Appearance"), Description("Indicates the array of colors that when set are used to draw the background of the item."), TypeConverter(typeof(ArrayConverter))]
public Color[] BackColors
{
get
{
return _BackColors;
}
set
{
if (_BackColors != value)
{
_BackColors = value;
//OnPropertyChanged(new PropertyChangedEventArgs("Colors"));
this.Refresh();
}
}
}
private eButtonTextAlignment _TextAlignment = eButtonTextAlignment.Left;
///
/// Gets or sets the text alignment. Default value is left.
///
[Browsable(true), DefaultValue(eButtonTextAlignment.Left), Category("Appearance"), Description("Indicates text alignment.")]
public eButtonTextAlignment TextAlignment
{
get { return _TextAlignment; }
set
{
_TextAlignment = value;
this.Refresh();
}
}
///
/// Gets or sets the text associated with this item.
///
[System.ComponentModel.Browsable(true), DevCoBrowsable(true), Editor("DevComponents.DotNetBar.Design.TextMarkupUIEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor)), System.ComponentModel.Category("Appearance"), System.ComponentModel.Description("The text contained in the item."), System.ComponentModel.Localizable(true), System.ComponentModel.DefaultValue("")]
public override string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
}
}
private Color _TextColor = Color.Empty;
///
/// Gets or sets the color of the text.
///
[Category("Columns"), Description("Indicates color of text.")]
public Color TextColor
{
get { return _TextColor; }
set { _TextColor = value; this.Refresh(); }
}
///
/// Gets whether property should be serialized.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeTextColor()
{
return !_TextColor.IsEmpty;
}
///
/// Resets property to its default value.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetTextColor()
{
this.TextColor = Color.Empty;
}
#endregion
#region Markup Implementation
///
/// Gets whether item supports text markup. Default is false.
///
protected override bool IsMarkupSupported
{
get { return _EnableMarkup; }
}
private bool _EnableMarkup = true;
///
/// Gets or sets whether text-markup support is enabled for items Text property. Default value is true.
/// Set this property to false to display HTML or other markup in the item instead of it being parsed as text-markup.
///
[DefaultValue(true), Category("Appearance"), Description("Indicates whether text-markup support is enabled for items Text property.")]
public bool EnableMarkup
{
get { return _EnableMarkup; }
set
{
if (_EnableMarkup != value)
{
_EnableMarkup = value;
NeedRecalcSize = true;
OnTextChanged();
}
}
}
#endregion
}
}