268 lines
9.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;
using DevComponents.DotNetBar.Rendering;
namespace DevComponents.DotNetBar.Controls
{
/// <summary>
/// Represents control which visually indicates current step in a sequence.
/// </summary>
[ToolboxItem(true)]
[ToolboxBitmap(typeof(StepIndicator), "Controls.StepIndicator.ico")]
public class StepIndicator : Control
{
#region Constructor
/// <summary>
/// Initializes a new instance of the StepIndicator class.
/// </summary>
public StepIndicator()
{
this.SetStyle(ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.Opaque |
ControlStyles.ResizeRedraw |
ControlStyles.DoubleBuffer |
ControlStyles.StandardDoubleClick | ControlStyles.StandardClick, true);
this.SetStyle(ControlStyles.Selectable, false);
}
#endregion
#region Implementation
protected override void OnPaint(PaintEventArgs e)
{
StepIndicatorColorTable colors = GetColors();
Color backColor = colors.BackgroundColor;
Color indicatorColor = colors.IndicatorColor;
Graphics g = e.Graphics;
Rectangle r = this.ClientRectangle;
using (SolidBrush brush = new SolidBrush(backColor))
g.FillRectangle(brush, r);
int currentStep = GetCurrentStep() - 1;
if (currentStep >= 0)
{
int stepCount = _StepCount;
Rectangle indicatorBounds;
if (_Orientation == eOrientation.Horizontal)
{
int indicatorWidth = (int)Math.Ceiling((double)r.Width / stepCount);
indicatorBounds = new Rectangle(r.X + indicatorWidth * currentStep, r.Y, indicatorWidth, r.Height);
}
else
{
int indicatorHeight = (int)Math.Ceiling((double)r.Height / stepCount);
indicatorBounds = new Rectangle(r.X, r.Y + indicatorHeight * currentStep, r.Width, indicatorHeight);
}
if (r.Width > 0 && r.Height > 0)
{
using (SolidBrush brush = new SolidBrush(indicatorColor))
g.FillRectangle(brush, indicatorBounds);
}
}
base.OnPaint(e);
}
private StepIndicatorColorTable GetColors()
{
if (!_IndicatorColor.IsEmpty && !_BackgroundColor.IsEmpty)
return new StepIndicatorColorTable(_BackgroundColor, _IndicatorColor);
if (GlobalManager.Renderer is Office2007Renderer)
{
return ((Office2007Renderer)GlobalManager.Renderer).ColorTable.StepIndicator;
}
else
return new StepIndicatorColorTable(Color.White, Color.MediumSeaGreen);
}
private int GetCurrentStep()
{
return Math.Max(0, Math.Min(_StepCount, _CurrentStep));
}
private int _StepCount = 10;
/// <summary>
/// Gets or sets the total number of steps that control will track. Default value is 10.
/// </summary>
[DefaultValue(10), Category("Behavior"), Description("Indicates total number of steps that control will track.")]
public int StepCount
{
get { return _StepCount; }
set
{
value = Math.Max(1, value);
if (value != _StepCount)
{
int oldValue = _StepCount;
_StepCount = value;
OnStepCountChanged(oldValue, value);
}
}
}
/// <summary>
/// Called when StepCount property has changed.
/// </summary>
/// <param name="oldValue">Old property value</param>
/// <param name="newValue">New property value</param>
protected virtual void OnStepCountChanged(int oldValue, int newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("StepCount"));
this.Invalidate();
}
private int _CurrentStep = 1;
/// <summary>
/// Gets or sets the current step in sequence. Current step should be less or equal than StepCount.
/// </summary>
[DefaultValue(1), Category("Behavior"), Description("Indicates current step in sequence..")]
public int CurrentStep
{
get { return _CurrentStep; }
set
{
if (value != _CurrentStep)
{
int oldValue = _CurrentStep;
_CurrentStep = value;
OnCurrentStepChanged(oldValue, value);
}
}
}
/// <summary>
/// Called when CurrentStep property has changed.
/// </summary>
/// <param name="oldValue">Old property value</param>
/// <param name="newValue">New property value</param>
protected virtual void OnCurrentStepChanged(int oldValue, int newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("CurrentStep"));
this.Invalidate();
}
private static readonly Color DefaultBackgroundColor = Color.Empty;
private Color _BackgroundColor = DefaultBackgroundColor;
/// <summary>
/// Gets or sets the background color of the control.
/// </summary>
[Category("Appearance"), Description("Indicates background color of control.")]
public Color BackgroundColor
{
get { return _BackgroundColor; }
set { _BackgroundColor = value; }
}
/// <summary>
/// Gets whether property should be serialized.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeBackgroundColor()
{
return _BackgroundColor != DefaultBackgroundColor;
}
/// <summary>
/// Resets property to its default value.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetBackgroundColor()
{
this.BackgroundColor = DefaultBackgroundColor;
}
private static readonly Color DefaultIndicatorColor = Color.Empty;
private Color _IndicatorColor = DefaultIndicatorColor;
/// <summary>
/// Gets or sets the color of the current step indicator.
/// </summary>
[Category("Appearance"), Description("Indicates color of current step indicator.")]
public Color IndicatorColor
{
get { return _IndicatorColor; }
set { _IndicatorColor = value; }
}
/// <summary>
/// Gets whether property should be serialized.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeIndicatorColor()
{
return _IndicatorColor != DefaultIndicatorColor;
}
/// <summary>
/// Resets property to its default value.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetIndicatorColor()
{
this.IndicatorColor = DefaultIndicatorColor;
}
private eOrientation _Orientation = eOrientation.Horizontal;
/// <summary>
/// Indicates the control orientation.
/// </summary>
[Category("Appearance"), DefaultValue(eOrientation.Horizontal), Description("Indicates the control orientation.")]
public eOrientation Orientation
{
get { return _Orientation; }
set
{
if (value != _Orientation)
{
eOrientation oldValue = _Orientation;
_Orientation = value;
OnOrientationChanged(oldValue, value);
}
}
}
/// <summary>
/// Called when Orientation property has changed.
/// </summary>
/// <param name="oldValue">Old property value</param>
/// <param name="newValue">New property value</param>
protected virtual void OnOrientationChanged(eOrientation oldValue, eOrientation newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("Orientation"));
this.Invalidate();
}
protected override Size DefaultSize
{
get
{
return new Size(400,4);
}
}
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]
public override System.Drawing.Color BackColor
{
get
{
return base.BackColor;
}
set
{
base.BackColor = value;
}
}
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]
public override System.Drawing.Color ForeColor
{
get
{
return base.ForeColor;
}
set
{
base.ForeColor = value;
}
}
#endregion
}
}