AirScout/AeroWizard/AeroWizard/StepWizardControl.cs

305 wiersze
9.4 KiB
C#

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace AeroWizard
{
/// <summary>
/// Wizard control that shows a step summary on the left of the wizard page area.
/// </summary>
[ProvideProperty("StepText", typeof(WizardPage))]
[ProvideProperty("StepTextIndentLevel", typeof(WizardPage))]
[ToolboxItem(true), ToolboxBitmap(typeof(StepWizardControl), "StepWizardControl.bmp")]
public class StepWizardControl : WizardControl, IExtenderProvider
{
private StepList list;
private Splitter splitter;
/// <summary>
/// Initializes a new instance of the <see cref="StepWizardControl"/> class.
/// </summary>
public StepWizardControl()
{
var ds = RightToLeft == System.Windows.Forms.RightToLeft.Yes ? DockStyle.Right : DockStyle.Left;
pageContainer.Controls.Add(splitter = new Splitter() { Dock = ds, BorderStyle = BorderStyle.FixedSingle, Width = 1, Name = "splitter" });
pageContainer.Controls.Add(list = new StepList() { Dock = ds, Name = "stepList" });
list.DrawItem += list_DrawItem;
list.MeasureItem += list_MeasureItem;
Pages.Reset += Pages_Reset;
}
/// <summary>
/// Occurs when a visual aspect of an owner-drawn StepList changes.
/// </summary>
[Category("Appearance")]
public event EventHandler<DrawStepListItemEventArgs> DrawStepListItem;
/// <summary>
/// Occurs when an owner-drawn StepList is created and the sizes of the list items are determined.
/// </summary>
[Category("Appearance")]
public event EventHandler<MeasureStepListItemEventArgs> MeasureStepListItem;
/// <summary>
/// Gets or sets a value indicating whether the StepWizardControl step list is drawn by the operating system or by code that you provide.
/// </summary>
/// <value>
/// <c>true</c> if the StepWizardControl step list is drawn by code that you provide; otherwise, <c>false</c>.
/// </value>
[DefaultValue(false), Category("Appearance"), Description("Indicates if step list items are drawn by owner.")]
public bool OwnerDrawStepList
{
get { return list.OwnerDraw; }
set { list.OwnerDraw = value; }
}
/// <summary>
/// Gets or sets the StepList font.
/// </summary>
/// <value>
/// The StepList font.
/// </value>
[Category("Appearance"), Description("Font for drawing StepList.")]
public Font StepListFont
{
get { return list.Font; }
set { list.Font = value; }
}
/// <summary>
/// Gets or sets the width of the step list.
/// </summary>
/// <value>
/// The width of the step list.
/// </value>
[DefaultValue(150), Category("Appearance"), Description("Determines width of step list on left.")]
public int StepListWidth
{
get { return list.Width; }
set { list.Width = value; }
}
/// <summary>
/// Gets the step text.
/// </summary>
/// <param name="page">The page.</param>
/// <returns>Step text for the specified wizard page.</returns>
[DefaultValue((string)null), Category("Appearance"), Description("Alternate text to provide to the StepList. Default value comes the Text property of the WizardPage.")]
public string GetStepText(WizardPage page) => list.GetStepText(page);
/// <summary>
/// Gets the step text indent level.
/// </summary>
/// <param name="page">The page.</param>
/// <returns>Step text indent level for the specified wizard page.</returns>
[DefaultValue(0), Category("Appearance"), Description("Indentation level for text provided to the StepList.")]
public int GetStepTextIndentLevel(WizardPage page) => list.GetStepTextIndentLevel(page);
/// <summary>
/// Specifies whether this object can provide its extender properties to the specified object.
/// </summary>
/// <param name="extendee">The <see cref="T:System.Object" /> to receive the extender properties.</param>
/// <returns>
/// true if this object can provide extender properties to the specified object; otherwise, false.
/// </returns>
bool IExtenderProvider.CanExtend(object extendee) => (extendee is WizardPage);
/// <summary>
/// Sets the step text.
/// </summary>
/// <param name="page">The page.</param>
/// <param name="value">The value.</param>
public void SetStepText(WizardPage page, string value)
{
list.SetStepText(page, value);
}
/// <summary>
/// Sets the step text indent level.
/// </summary>
/// <param name="page">The page.</param>
/// <param name="value">The indent level.</param>
public void SetStepTextIndentLevel(WizardPage page, int value)
{
list.SetStepTextIndentLevel(page, value);
}
/// <summary>
/// Raises the <see cref="E:AeroWizard.StepWizardControl.DrawStepListItem" /> event.
/// </summary>
/// <param name="e">The <see cref="DrawStepListItemEventArgs"/> instance containing the event data.</param>
protected virtual void OnDrawStepListItem(DrawStepListItemEventArgs e)
{
var h = DrawStepListItem;
if (h != null)
h(this, e);
}
/// <summary>
/// Raises the <see cref="E:AeroWizard.StepWizardControl.MeasureStepListItem" /> event.
/// </summary>
/// <param name="e">The <see cref="MeasureStepListItemEventArgs"/> instance containing the event data.</param>
protected virtual void OnMeasureStepListItem(MeasureStepListItemEventArgs e)
{
var h = MeasureStepListItem;
if (h != null)
h(this, e);
}
/// <summary>
/// Raises the <see cref="E:System.Windows.Forms.Control.RightToLeftChanged" /> event.
/// </summary>
/// <param name="e">An <see cref="T:System.EventArgs" /> that contains the event data.</param>
protected override void OnRightToLeftChanged(System.EventArgs e)
{
base.OnRightToLeftChanged(e);
var ds = RightToLeft == System.Windows.Forms.RightToLeft.Yes ? DockStyle.Right : DockStyle.Left;
if (pageContainer.Controls.Count > 1)
{
pageContainer.Controls["splitter"].Dock = ds;
pageContainer.Controls["stepList"].Dock = ds;
}
}
private void list_DrawItem(object sender, DrawStepListItemEventArgs e)
{
OnDrawStepListItem(e);
}
private void list_MeasureItem(object sender, MeasureStepListItemEventArgs e)
{
OnMeasureStepListItem(e);
}
void Pages_Reset(object sender, System.Collections.Generic.EventedList<WizardPage>.ListChangedEventArgs<WizardPage> e)
{
pageContainer.Controls.Add(splitter);
pageContainer.Controls.Add(list);
}
private void ResetStepListFont()
{
list.Font = Font;
}
private void ResetStepText(WizardPage page)
{
SetStepText(page, null);
}
private bool ShouldSerializeStepListFont() => Font != list.Font;
private bool ShouldSerializeStepText(WizardPage page) => (GetStepText(page) != page.Text);
}
/// <summary>
/// Provides data for the <see cref="E:AeroWizard.StepWizardControl.DrawStepListItem"/> event.
/// </summary>
public class DrawStepListItemEventArgs : EventArgs
{
internal DrawStepListItemEventArgs(Graphics graphics, Font font, Rectangle itemRect, WizardPage page, bool isSelected, bool isCompleted)
{
Graphics = graphics;
Font = font;
Bounds = itemRect;
Item = page;
Selected = isSelected;
Completed = isCompleted;
}
/// <summary>
/// Gets the size and location of the item to draw.
/// </summary>
/// <value>
/// A rectangle that represents the bounds of the item to draw.
/// </value>
public Rectangle Bounds { get; }
/// <summary>
/// Gets a value indicating whether this step has already been completed.
/// </summary>
/// <value>
/// <c>true</c> if completed; otherwise, <c>false</c>.
/// </value>
public bool Completed { get; }
/// <summary>
/// Gets the <see cref="Font"/> used to draw the item.
/// </summary>
/// <value>
/// The <see cref="Font"/> used to draw the item.
/// </value>
public Font Font { get; }
/// <summary>
/// Gets the <see cref="Graphics"/> used to draw the item.
/// </summary>
/// <value>
/// The <see cref="Graphics"/> used to draw the item.
/// </value>
public Graphics Graphics { get; }
/// <summary>
/// Gets the <see cref="WizardPage"/> to which this item refers.
/// </summary>
/// <value>
/// The <see cref="WizardPage"/> to which this item refers.
/// </value>
public WizardPage Item { get; }
/// <summary>
/// Gets a value indicating whether this item is the one currently selected.
/// </summary>
/// <value>
/// <c>true</c> if selected; otherwise, <c>false</c>.
/// </value>
public bool Selected { get; }
}
/// <summary>
/// Provides data for the <see cref="E:AeroWizard.StepWizardControl.MeasureStepListItem"/> event.
/// </summary>
public class MeasureStepListItemEventArgs : EventArgs
{
internal MeasureStepListItemEventArgs(Graphics graphics, Font font, WizardPage page, Size itemSize)
{
Graphics = graphics;
Font = font;
Item = page;
ItemSize = itemSize;
}
/// <summary>
/// Gets the <see cref="Font"/> used to draw the item.
/// </summary>
/// <value>
/// The <see cref="Font"/> used to draw the item.
/// </value>
public Font Font { get; }
/// <summary>
/// Gets the <see cref="Graphics"/> used to draw the item.
/// </summary>
/// <value>
/// The <see cref="Graphics"/> used to draw the item.
/// </value>
public Graphics Graphics { get; }
/// <summary>
/// Gets the <see cref="WizardPage"/> to which this item refers.
/// </summary>
/// <value>
/// The <see cref="WizardPage"/> to which this item refers.
/// </value>
public WizardPage Item { get; }
/// <summary>
/// Gets or sets the size of the item.
/// </summary>
/// <value>
/// The size of the item.
/// </value>
public Size ItemSize { get; set; }
}
}