|
|
@@ -36,6 +36,9 @@ using System.ComponentModel;
|
|
|
|
|
|
namespace System.Web.UI.WebControls
|
|
|
{
|
|
|
+ [DefaultEventAttribute ("FinishButtonClick")]
|
|
|
+ [BindableAttribute (false)]
|
|
|
+ [DesignerAttribute ("System.Web.UI.Design.WebControls.WizardDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.ComponentModel.Design.IDesigner")]
|
|
|
public class Wizard: CompositeControl
|
|
|
{
|
|
|
public static readonly string CancelCommandName = "Cancel";
|
|
|
@@ -63,6 +66,7 @@ namespace System.Web.UI.WebControls
|
|
|
TableItemStyle stepStyle;
|
|
|
TableItemStyle sideBarStyle;
|
|
|
TableItemStyle headerStyle;
|
|
|
+ TableItemStyle navigationStyle;
|
|
|
Style sideBarButtonStyle;
|
|
|
|
|
|
Style cancelButtonStyle;
|
|
|
@@ -74,15 +78,21 @@ namespace System.Web.UI.WebControls
|
|
|
Style navigationButtonStyle;
|
|
|
|
|
|
ITemplate finishNavigationTemplate;
|
|
|
+ ITemplate startNavigationTemplate;
|
|
|
+ ITemplate stepNavigationTemplate;
|
|
|
+ ITemplate headerTemplate;
|
|
|
+ ITemplate sideBarTemplate;
|
|
|
|
|
|
// Control state
|
|
|
|
|
|
int activeStepIndex;
|
|
|
-
|
|
|
+ ArrayList history;
|
|
|
|
|
|
Table wizardTable;
|
|
|
MultiView multiView;
|
|
|
+ DataList stepDatalist;
|
|
|
ArrayList styles = new ArrayList ();
|
|
|
+ SideBarButtonTemplate sideBarItemTemplate;
|
|
|
|
|
|
private static readonly object ActiveStepChangedEvent = new object();
|
|
|
private static readonly object CancelButtonClickEvent = new object();
|
|
|
@@ -91,6 +101,11 @@ namespace System.Web.UI.WebControls
|
|
|
private static readonly object PreviousButtonClickEvent = new object();
|
|
|
private static readonly object SideBarButtonClickEvent = new object();
|
|
|
|
|
|
+ public Wizard ()
|
|
|
+ {
|
|
|
+ sideBarItemTemplate = new SideBarButtonTemplate (this);
|
|
|
+ }
|
|
|
+
|
|
|
public event EventHandler ActiveStepChanged {
|
|
|
add { Events.AddHandler (ActiveStepChangedEvent, value); }
|
|
|
remove { Events.RemoveHandler (ActiveStepChangedEvent, value); }
|
|
|
@@ -169,6 +184,8 @@ namespace System.Web.UI.WebControls
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
|
|
|
+ [BrowsableAttribute (false)]
|
|
|
public WizardStepBase ActiveStep {
|
|
|
get {
|
|
|
if (activeStepIndex < -1 || activeStepIndex >= steps.Count)
|
|
|
@@ -178,12 +195,22 @@ namespace System.Web.UI.WebControls
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [DefaultValueAttribute (-1)]
|
|
|
+ [ThemeableAttribute (false)]
|
|
|
public int ActiveStepIndex {
|
|
|
- get { return activeStepIndex; }
|
|
|
+ get {
|
|
|
+ return activeStepIndex;
|
|
|
+ }
|
|
|
set {
|
|
|
+ if (!AllowNavigationToStep (value))
|
|
|
+ return;
|
|
|
+ if (activeStepIndex != value) {
|
|
|
+ if (history == null) history = new ArrayList ();
|
|
|
+ history.Insert (0, activeStepIndex);
|
|
|
+ }
|
|
|
activeStepIndex = value;
|
|
|
UpdateControls ();
|
|
|
- OnActiveStepChanged (this, EventArgs.Empty);
|
|
|
+ OnActiveStepChanged (this, EventArgs.Empty);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -240,6 +267,43 @@ namespace System.Web.UI.WebControls
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [UrlPropertyAttribute]
|
|
|
+ [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
|
|
|
+ [DefaultValueAttribute ("")]
|
|
|
+ public string CancelDestinationPageUrl {
|
|
|
+ get {
|
|
|
+ object v = ViewState ["CancelDestinationPageUrl"];
|
|
|
+ return v != null ? (string)v : string.Empty;
|
|
|
+ }
|
|
|
+ set {
|
|
|
+ ViewState ["CancelDestinationPageUrl"] = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [DefaultValueAttribute (0)]
|
|
|
+ public int CellPadding {
|
|
|
+ get {
|
|
|
+ object v = ViewState ["CellPadding"];
|
|
|
+ return v != null ? (int)v : 0;
|
|
|
+ }
|
|
|
+ set {
|
|
|
+ ViewState ["CellPadding"] = value;
|
|
|
+ UpdateControls ();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [DefaultValueAttribute (0)]
|
|
|
+ public int CellSpacing {
|
|
|
+ get {
|
|
|
+ object v = ViewState ["CellSpacing"];
|
|
|
+ return v != null ? (int)v : 0;
|
|
|
+ }
|
|
|
+ set {
|
|
|
+ ViewState ["CellSpacing"] = value;
|
|
|
+ UpdateControls ();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
[DefaultValueAttribute (false)]
|
|
|
[ThemeableAttribute (false)]
|
|
|
public virtual bool DisplayCancelButton {
|
|
|
@@ -319,6 +383,28 @@ namespace System.Web.UI.WebControls
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [UrlPropertyAttribute]
|
|
|
+ [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
|
|
|
+ [DefaultValueAttribute ("")]
|
|
|
+ public string FinishDestinationPageUrl {
|
|
|
+ get {
|
|
|
+ object v = ViewState ["FinishDestinationPageUrl"];
|
|
|
+ return v != null ? (string)v : string.Empty;
|
|
|
+ }
|
|
|
+ set {
|
|
|
+ ViewState ["FinishDestinationPageUrl"] = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [DefaultValue (null)]
|
|
|
+ [TemplateContainer (typeof(Wizard), BindingDirection.OneWay)]
|
|
|
+ [PersistenceMode (PersistenceMode.InnerProperty)]
|
|
|
+ [Browsable (false)]
|
|
|
+ public ITemplate FinishNavigationTemplate {
|
|
|
+ get { return finishNavigationTemplate; }
|
|
|
+ set { finishNavigationTemplate = value; UpdateControls (); }
|
|
|
+ }
|
|
|
+
|
|
|
[UrlPropertyAttribute]
|
|
|
[DefaultValueAttribute ("")]
|
|
|
[EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
|
|
|
@@ -387,6 +473,15 @@ namespace System.Web.UI.WebControls
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [DefaultValue (null)]
|
|
|
+ [TemplateContainer (typeof(Wizard), BindingDirection.OneWay)]
|
|
|
+ [PersistenceMode (PersistenceMode.InnerProperty)]
|
|
|
+ [Browsable (false)]
|
|
|
+ public ITemplate HeaderTemplate {
|
|
|
+ get { return headerTemplate; }
|
|
|
+ set { headerTemplate = value; UpdateControls (); }
|
|
|
+ }
|
|
|
+
|
|
|
[DefaultValueAttribute ("")]
|
|
|
[LocalizableAttribute (true)]
|
|
|
public string HeaderText {
|
|
|
@@ -415,6 +510,21 @@ namespace System.Web.UI.WebControls
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [DefaultValueAttribute (null)]
|
|
|
+ [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)]
|
|
|
+ [NotifyParentPropertyAttribute (true)]
|
|
|
+ [PersistenceModeAttribute (PersistenceMode.InnerProperty)]
|
|
|
+ public TableItemStyle NavigationStyle {
|
|
|
+ get {
|
|
|
+ if (navigationStyle == null) {
|
|
|
+ navigationStyle = new TableItemStyle ();
|
|
|
+ if (IsTrackingViewState)
|
|
|
+ ((IStateManager)navigationStyle).TrackViewState ();
|
|
|
+ }
|
|
|
+ return navigationStyle;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
[DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)]
|
|
|
[PersistenceModeAttribute (PersistenceMode.InnerProperty)]
|
|
|
[DefaultValueAttribute (null)]
|
|
|
@@ -445,6 +555,24 @@ namespace System.Web.UI.WebControls
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [DefaultValue (null)]
|
|
|
+ [TemplateContainer (typeof(Wizard), BindingDirection.OneWay)]
|
|
|
+ [PersistenceMode (PersistenceMode.InnerProperty)]
|
|
|
+ [Browsable (false)]
|
|
|
+ public ITemplate SideBarTemplate {
|
|
|
+ get { return sideBarTemplate; }
|
|
|
+ set { sideBarTemplate = value; UpdateControls (); }
|
|
|
+ }
|
|
|
+
|
|
|
+ [DefaultValue (null)]
|
|
|
+ [TemplateContainer (typeof(Wizard), BindingDirection.OneWay)]
|
|
|
+ [PersistenceMode (PersistenceMode.InnerProperty)]
|
|
|
+ [Browsable (false)]
|
|
|
+ public ITemplate StartNavigationTemplate {
|
|
|
+ get { return startNavigationTemplate; }
|
|
|
+ set { startNavigationTemplate = value; UpdateControls (); }
|
|
|
+ }
|
|
|
+
|
|
|
[UrlPropertyAttribute]
|
|
|
[DefaultValueAttribute ("")]
|
|
|
[EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
|
|
|
@@ -498,6 +626,15 @@ namespace System.Web.UI.WebControls
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [DefaultValue (null)]
|
|
|
+ [TemplateContainer (typeof(Wizard), BindingDirection.OneWay)]
|
|
|
+ [PersistenceMode (PersistenceMode.InnerProperty)]
|
|
|
+ [Browsable (false)]
|
|
|
+ public ITemplate StepNavigationTemplate {
|
|
|
+ get { return stepNavigationTemplate; }
|
|
|
+ set { stepNavigationTemplate = value; UpdateControls (); }
|
|
|
+ }
|
|
|
+
|
|
|
[UrlPropertyAttribute]
|
|
|
[DefaultValueAttribute ("")]
|
|
|
[EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
|
|
|
@@ -619,6 +756,10 @@ namespace System.Web.UI.WebControls
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)]
|
|
|
+ [EditorAttribute ("System.Web.UI.Design.WebControls.WizardStepCollectionEditor,System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
|
|
|
+ [PersistenceModeAttribute (PersistenceMode.InnerProperty)]
|
|
|
+ [ThemeableAttribute (false)]
|
|
|
public WizardStepCollection WizardSteps {
|
|
|
get {
|
|
|
if (steps == null)
|
|
|
@@ -627,7 +768,13 @@ namespace System.Web.UI.WebControls
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void MoveTo (WizardStep wizardStep)
|
|
|
+ public ICollection GetHistory ()
|
|
|
+ {
|
|
|
+ if (history == null) history = new ArrayList ();
|
|
|
+ return history;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void MoveTo (WizardStepBase wizardStep)
|
|
|
{
|
|
|
if (wizardStep == null) throw new ArgumentNullException ("wizardStep");
|
|
|
|
|
|
@@ -637,12 +784,41 @@ namespace System.Web.UI.WebControls
|
|
|
ActiveStepIndex = i;
|
|
|
}
|
|
|
|
|
|
+ public WizardStepType GetStepType (WizardStepBase wizardStep, int index)
|
|
|
+ {
|
|
|
+ if (wizardStep.StepType == WizardStepType.Auto) {
|
|
|
+ if (index == 0)
|
|
|
+ return WizardStepType.Start;
|
|
|
+ else if (index == WizardSteps.Count - 1)
|
|
|
+ return WizardStepType.Finish;
|
|
|
+ else
|
|
|
+ return WizardStepType.Step;
|
|
|
+ } else
|
|
|
+ return wizardStep.StepType;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ protected virtual bool AllowNavigationToStep (int index)
|
|
|
+ {
|
|
|
+ if (index < 0 || index >= WizardSteps.Count) return false;
|
|
|
+ if (history == null) return true;
|
|
|
+ if (!history.Contains (index)) return true;
|
|
|
+ return WizardSteps [index].AllowReturn;
|
|
|
+ }
|
|
|
+
|
|
|
protected override void OnInit (EventArgs e)
|
|
|
{
|
|
|
Page.RegisterRequiresControlState (this);
|
|
|
base.OnInit (e);
|
|
|
}
|
|
|
|
|
|
+ protected override ControlCollection CreateControlCollection ()
|
|
|
+ {
|
|
|
+ ControlCollection col = new ControlCollection (this);
|
|
|
+ col.SetReadonly (true);
|
|
|
+ return col;
|
|
|
+ }
|
|
|
+
|
|
|
protected override void CreateChildControls ()
|
|
|
{
|
|
|
CreateControlHierarchy ();
|
|
|
@@ -653,6 +829,8 @@ namespace System.Web.UI.WebControls
|
|
|
styles.Clear ();
|
|
|
|
|
|
wizardTable = new Table ();
|
|
|
+ wizardTable.CellPadding = CellPadding;
|
|
|
+ wizardTable.CellSpacing = CellSpacing;
|
|
|
|
|
|
AddHeaderRow (wizardTable);
|
|
|
|
|
|
@@ -670,6 +848,7 @@ namespace System.Web.UI.WebControls
|
|
|
RegisterApplyStyle (viewCell, StepStyle);
|
|
|
viewCell.Controls.Add (multiView);
|
|
|
|
|
|
+ viewCell.Height = new Unit ("100%");
|
|
|
viewRow.Cells.Add (viewCell);
|
|
|
wizardTable.Rows.Add (viewRow);
|
|
|
|
|
|
@@ -681,9 +860,13 @@ namespace System.Web.UI.WebControls
|
|
|
|
|
|
if (DisplaySideBar && ActiveStep.StepType != WizardStepType.Complete) {
|
|
|
Table contentTable = wizardTable;
|
|
|
+ contentTable.Height = new Unit ("100%");
|
|
|
+
|
|
|
wizardTable = new Table ();
|
|
|
+ wizardTable.CellPadding = CellPadding;
|
|
|
+ wizardTable.CellSpacing = CellSpacing;
|
|
|
TableRow row = new TableRow ();
|
|
|
-
|
|
|
+
|
|
|
TableCell sideBarCell = new TableCell ();
|
|
|
CreateSideBar (sideBarCell);
|
|
|
row.Cells.Add (sideBarCell);
|
|
|
@@ -695,40 +878,51 @@ namespace System.Web.UI.WebControls
|
|
|
wizardTable.Rows.Add (row);
|
|
|
}
|
|
|
|
|
|
+ Controls.SetReadonly (false);
|
|
|
Controls.Add (wizardTable);
|
|
|
+ Controls.SetReadonly (true);
|
|
|
}
|
|
|
|
|
|
void CreateButtonBar (TableCell buttonBarCell)
|
|
|
{
|
|
|
Table t = new Table ();
|
|
|
TableRow row = new TableRow ();
|
|
|
+ RegisterApplyStyle (buttonBarCell, NavigationStyle);
|
|
|
|
|
|
- if (DisplayCancelButton)
|
|
|
- AddButtonCell (row, CreateButton (CancelButtonID, CancelCommandName, CancelButtonType, CancelButtonText, CancelButtonImageUrl, CancelButtonStyle));
|
|
|
-
|
|
|
- WizardStepType stepType;
|
|
|
-
|
|
|
- if (ActiveStep.StepType == WizardStepType.Auto) {
|
|
|
- if (ActiveStepIndex == 0)
|
|
|
- stepType = WizardStepType.Start;
|
|
|
- else if (ActiveStepIndex == WizardSteps.Count - 1)
|
|
|
- stepType = WizardStepType.Finish;
|
|
|
- else
|
|
|
- stepType = WizardStepType.Step;
|
|
|
- } else
|
|
|
- stepType = ActiveStep.StepType;
|
|
|
-
|
|
|
+ WizardStepType stepType = GetStepType (ActiveStep, ActiveStepIndex);
|
|
|
switch (stepType) {
|
|
|
case WizardStepType.Start:
|
|
|
- AddButtonCell (row, CreateButton (StartNextButtonID, MoveNextCommandName, StartNextButtonType, StartNextButtonText, StartNextButtonImageUrl, StartNextButtonStyle));
|
|
|
+ if (startNavigationTemplate != null) {
|
|
|
+ AddTemplateCell (row, startNavigationTemplate, StartNextButtonID, CancelButtonID);
|
|
|
+ } else {
|
|
|
+ if (DisplayCancelButton)
|
|
|
+ AddButtonCell (row, CreateButton (CancelButtonID, CancelCommandName, CancelButtonType, CancelButtonText, CancelButtonImageUrl, CancelButtonStyle));
|
|
|
+ if (AllowNavigationToStep (ActiveStepIndex + 1))
|
|
|
+ AddButtonCell (row, CreateButton (StartNextButtonID, MoveNextCommandName, StartNextButtonType, StartNextButtonText, StartNextButtonImageUrl, StartNextButtonStyle));
|
|
|
+ }
|
|
|
break;
|
|
|
case WizardStepType.Step:
|
|
|
- AddButtonCell (row, CreateButton (StepPreviousButtonID, MovePreviousCommandName, StepPreviousButtonType, StepPreviousButtonText, StepPreviousButtonImageUrl, StepPreviousButtonStyle));
|
|
|
- AddButtonCell (row, CreateButton (StepNextButtonID, MoveNextCommandName, StepNextButtonType, StepNextButtonText, StepNextButtonImageUrl, StepNextButtonStyle));
|
|
|
+ if (stepNavigationTemplate != null) {
|
|
|
+ AddTemplateCell (row, stepNavigationTemplate, StepPreviousButtonID, StepNextButtonID, CancelButtonID);
|
|
|
+ } else {
|
|
|
+ if (DisplayCancelButton)
|
|
|
+ AddButtonCell (row, CreateButton (CancelButtonID, CancelCommandName, CancelButtonType, CancelButtonText, CancelButtonImageUrl, CancelButtonStyle));
|
|
|
+ if (AllowNavigationToStep (ActiveStepIndex - 1))
|
|
|
+ AddButtonCell (row, CreateButton (StepPreviousButtonID, MovePreviousCommandName, StepPreviousButtonType, StepPreviousButtonText, StepPreviousButtonImageUrl, StepPreviousButtonStyle));
|
|
|
+ if (AllowNavigationToStep (ActiveStepIndex + 1))
|
|
|
+ AddButtonCell (row, CreateButton (StepNextButtonID, MoveNextCommandName, StepNextButtonType, StepNextButtonText, StepNextButtonImageUrl, StepNextButtonStyle));
|
|
|
+ }
|
|
|
break;
|
|
|
case WizardStepType.Finish:
|
|
|
- AddButtonCell (row, CreateButton (FinishPreviousButtonID, MovePreviousCommandName, FinishPreviousButtonType, FinishPreviousButtonText, FinishPreviousButtonImageUrl, FinishPreviousButtonStyle));
|
|
|
- AddButtonCell (row, CreateButton (FinishButtonID, MoveCompleteCommandName, FinishCompleteButtonType, FinishCompleteButtonText, FinishCompleteButtonImageUrl, FinishCompleteButtonStyle));
|
|
|
+ if (finishNavigationTemplate != null) {
|
|
|
+ AddTemplateCell (row, finishNavigationTemplate, FinishPreviousButtonID, FinishButtonID, CancelButtonID);
|
|
|
+ } else {
|
|
|
+ if (DisplayCancelButton)
|
|
|
+ AddButtonCell (row, CreateButton (CancelButtonID, CancelCommandName, CancelButtonType, CancelButtonText, CancelButtonImageUrl, CancelButtonStyle));
|
|
|
+ if (AllowNavigationToStep (ActiveStepIndex - 1))
|
|
|
+ AddButtonCell (row, CreateButton (FinishPreviousButtonID, MovePreviousCommandName, FinishPreviousButtonType, FinishPreviousButtonText, FinishPreviousButtonImageUrl, FinishPreviousButtonStyle));
|
|
|
+ AddButtonCell (row, CreateButton (FinishButtonID, MoveCompleteCommandName, FinishCompleteButtonType, FinishCompleteButtonText, FinishCompleteButtonImageUrl, FinishCompleteButtonStyle));
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
t.Rows.Add (row);
|
|
|
@@ -745,6 +939,19 @@ namespace System.Web.UI.WebControls
|
|
|
return b;
|
|
|
}
|
|
|
|
|
|
+ void AddTemplateCell (TableRow row, ITemplate template, params string[] buttonIds)
|
|
|
+ {
|
|
|
+ TableCell cell = new TableCell ();
|
|
|
+ template.InstantiateIn (cell);
|
|
|
+
|
|
|
+ foreach (string id in buttonIds) {
|
|
|
+ IButtonControl b = cell.FindControl (id) as IButtonControl;
|
|
|
+ if (b != null) RegisterCommandEvents (b);
|
|
|
+ }
|
|
|
+
|
|
|
+ row.Cells.Add (cell);
|
|
|
+ }
|
|
|
+
|
|
|
void AddButtonCell (TableRow row, Control control)
|
|
|
{
|
|
|
TableCell cell = new TableCell ();
|
|
|
@@ -755,22 +962,39 @@ namespace System.Web.UI.WebControls
|
|
|
void CreateSideBar (TableCell sideBarCell)
|
|
|
{
|
|
|
RegisterApplyStyle (sideBarCell, SideBarStyle);
|
|
|
- sideBarCell.Text = "Side bar";
|
|
|
+
|
|
|
+ if (sideBarTemplate != null) {
|
|
|
+ sideBarTemplate.InstantiateIn (sideBarCell);
|
|
|
+ stepDatalist = sideBarCell.FindControl (DataListID) as DataList;
|
|
|
+ if (stepDatalist == null)
|
|
|
+ throw new InvalidOperationException ("The side bar template must contain a DataList control with id '" + DataListID + "'.");
|
|
|
+ } else {
|
|
|
+ stepDatalist = new DataList ();
|
|
|
+ stepDatalist.ID = DataListID;
|
|
|
+ sideBarCell.Controls.Add (stepDatalist);
|
|
|
+ }
|
|
|
+
|
|
|
+ stepDatalist.DataSource = WizardSteps;
|
|
|
+ stepDatalist.ItemTemplate = sideBarItemTemplate;
|
|
|
+ stepDatalist.DataBind ();
|
|
|
}
|
|
|
|
|
|
void AddHeaderRow (Table table)
|
|
|
{
|
|
|
- if (HeaderText.Length != 0) {
|
|
|
+ if (HeaderText.Length != 0 || headerTemplate != null) {
|
|
|
TableRow row = new TableRow ();
|
|
|
TableCell cell = new TableCell ();
|
|
|
RegisterApplyStyle (cell, HeaderStyle);
|
|
|
- cell.Text = HeaderText;
|
|
|
+ if (headerTemplate != null)
|
|
|
+ headerTemplate.InstantiateIn (cell);
|
|
|
+ else
|
|
|
+ cell.Text = HeaderText;
|
|
|
row.Cells.Add (cell);
|
|
|
table.Rows.Add (row);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- void RegisterApplyStyle (WebControl control, Style style)
|
|
|
+ internal void RegisterApplyStyle (WebControl control, Style style)
|
|
|
{
|
|
|
styles.Add (new object[] { control, style });
|
|
|
}
|
|
|
@@ -786,15 +1010,109 @@ namespace System.Web.UI.WebControls
|
|
|
object[] state = (object[]) ob;
|
|
|
base.LoadControlState (state[0]);
|
|
|
activeStepIndex = (int) state[1];
|
|
|
+ history = (ArrayList) state[2];
|
|
|
}
|
|
|
|
|
|
protected internal override object SaveControlState ()
|
|
|
{
|
|
|
object bstate = base.SaveControlState ();
|
|
|
return new object[] {
|
|
|
- bstate, activeStepIndex
|
|
|
+ bstate, activeStepIndex, history
|
|
|
};
|
|
|
}
|
|
|
+
|
|
|
+ protected override void LoadViewState (object savedState)
|
|
|
+ {
|
|
|
+ if (savedState == null) {
|
|
|
+ base.LoadViewState (null);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ object[] states = (object[]) savedState;
|
|
|
+ base.LoadViewState (states [0]);
|
|
|
+
|
|
|
+ if (states[1] != null) ((IStateManager)StepStyle).LoadViewState (states[1]);
|
|
|
+ if (states[2] != null) ((IStateManager)SideBarStyle).LoadViewState (states[2]);
|
|
|
+ if (states[3] != null) ((IStateManager)HeaderStyle).LoadViewState (states[3]);
|
|
|
+ if (states[4] != null) ((IStateManager)NavigationStyle).LoadViewState (states[4]);
|
|
|
+ if (states[5] != null) ((IStateManager)SideBarButtonStyle).LoadViewState (states[5]);
|
|
|
+ if (states[6] != null) ((IStateManager)CancelButtonStyle).LoadViewState (states[6]);
|
|
|
+ if (states[7] != null) ((IStateManager)FinishCompleteButtonStyle).LoadViewState (states[7]);
|
|
|
+ if (states[8] != null) ((IStateManager)FinishPreviousButtonStyle).LoadViewState (states[8]);
|
|
|
+ if (states[9] != null) ((IStateManager)StartNextButtonStyle).LoadViewState (states[9]);
|
|
|
+ if (states[10] != null) ((IStateManager)StepNextButtonStyle).LoadViewState (states[10]);
|
|
|
+ if (states[11] != null) ((IStateManager)StepPreviousButtonStyle).LoadViewState (states[11]);
|
|
|
+ if (states[12] != null) ((IStateManager)NavigationButtonStyle).LoadViewState (states[12]);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected override object SaveViewState ()
|
|
|
+ {
|
|
|
+ object[] state = new object [13];
|
|
|
+ state [0] = base.SaveViewState ();
|
|
|
+
|
|
|
+ if (stepStyle != null) state [1] = ((IStateManager)stepStyle).SaveViewState ();
|
|
|
+ if (sideBarStyle != null) state [2] = ((IStateManager)sideBarStyle).SaveViewState ();
|
|
|
+ if (headerStyle != null) state [3] = ((IStateManager)headerStyle).SaveViewState ();
|
|
|
+ if (navigationStyle != null) state [4] = ((IStateManager)navigationStyle).SaveViewState ();
|
|
|
+ if (sideBarButtonStyle != null) state [5] = ((IStateManager)sideBarButtonStyle).SaveViewState ();
|
|
|
+ if (cancelButtonStyle != null) state [6] = ((IStateManager)cancelButtonStyle).SaveViewState ();
|
|
|
+ if (finishCompleteButtonStyle != null) state [7] = ((IStateManager)finishCompleteButtonStyle).SaveViewState ();
|
|
|
+ if (finishPreviousButtonStyle != null) state [8] = ((IStateManager)finishPreviousButtonStyle).SaveViewState ();
|
|
|
+ if (startNextButtonStyle != null) state [9] = ((IStateManager)startNextButtonStyle).SaveViewState ();
|
|
|
+ if (stepNextButtonStyle != null) state [10] = ((IStateManager)stepNextButtonStyle).SaveViewState ();
|
|
|
+ if (stepPreviousButtonStyle != null) state [11] = ((IStateManager)stepPreviousButtonStyle).SaveViewState ();
|
|
|
+ if (navigationButtonStyle != null) state [12] = ((IStateManager)navigationButtonStyle).SaveViewState ();
|
|
|
+
|
|
|
+ for (int n=0; n<state.Length; n++)
|
|
|
+ if (state [n] != null) return state;
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ protected override void TrackViewState ()
|
|
|
+ {
|
|
|
+ base.TrackViewState();
|
|
|
+ if (stepStyle != null) ((IStateManager)stepStyle).TrackViewState();
|
|
|
+ if (sideBarStyle != null) ((IStateManager)sideBarStyle).TrackViewState();
|
|
|
+ if (headerStyle != null) ((IStateManager)headerStyle).TrackViewState();
|
|
|
+ if (navigationStyle != null) ((IStateManager)navigationStyle).TrackViewState();
|
|
|
+ if (sideBarButtonStyle != null) ((IStateManager)sideBarButtonStyle).TrackViewState();
|
|
|
+ if (cancelButtonStyle != null) ((IStateManager)cancelButtonStyle).TrackViewState();
|
|
|
+ if (finishCompleteButtonStyle != null) ((IStateManager)finishCompleteButtonStyle).TrackViewState();
|
|
|
+ if (finishPreviousButtonStyle != null) ((IStateManager)finishPreviousButtonStyle).TrackViewState();
|
|
|
+ if (startNextButtonStyle != null) ((IStateManager)startNextButtonStyle).TrackViewState();
|
|
|
+ if (stepNextButtonStyle != null) ((IStateManager)stepNextButtonStyle).TrackViewState();
|
|
|
+ if (stepPreviousButtonStyle != null) ((IStateManager)stepPreviousButtonStyle).TrackViewState();
|
|
|
+ if (navigationButtonStyle != null) ((IStateManager)navigationButtonStyle).TrackViewState();
|
|
|
+ }
|
|
|
+
|
|
|
+ protected internal void RegisterCommandEvents (IButtonControl button)
|
|
|
+ {
|
|
|
+ button.Command += ProcessCommand;
|
|
|
+ }
|
|
|
+
|
|
|
+ void ProcessCommand (object sender, CommandEventArgs args)
|
|
|
+ {
|
|
|
+ Control c = sender as Control;
|
|
|
+ if (c != null) {
|
|
|
+ switch (c.ID) {
|
|
|
+ case "CancelButton":
|
|
|
+ ProcessEvent ("Cancel", null);
|
|
|
+ return;
|
|
|
+ case "FinishButton":
|
|
|
+ ProcessEvent ("MoveComplete", null);
|
|
|
+ return;
|
|
|
+ case "StepPreviousButton":
|
|
|
+ case "FinishPreviousButton":
|
|
|
+ ProcessEvent ("MovePrevious", null);
|
|
|
+ return;
|
|
|
+ case "StartNextButton":
|
|
|
+ case "StepNextButton":
|
|
|
+ ProcessEvent ("MoveNext", null);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ProcessEvent (args.CommandName, args.CommandArgument as string);
|
|
|
+ }
|
|
|
|
|
|
protected override bool OnBubbleEvent (object source, EventArgs e)
|
|
|
{
|
|
|
@@ -809,10 +1127,18 @@ namespace System.Web.UI.WebControls
|
|
|
{
|
|
|
switch (commandName) {
|
|
|
case "Cancel":
|
|
|
- OnCancelButtonClick (EventArgs.Empty);
|
|
|
+ if (CancelDestinationPageUrl.Length > 0)
|
|
|
+ Context.Response.Redirect (CancelDestinationPageUrl);
|
|
|
+ else
|
|
|
+ OnCancelButtonClick (EventArgs.Empty);
|
|
|
break;
|
|
|
|
|
|
case "MoveComplete":
|
|
|
+ if (FinishDestinationPageUrl.Length > 0) {
|
|
|
+ Context.Response.Redirect (FinishDestinationPageUrl);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
int next = -1;
|
|
|
for (int n=0; n<WizardSteps.Count; n++) {
|
|
|
if (WizardSteps [n].StepType == WizardStepType.Complete) {
|
|
|
@@ -872,7 +1198,43 @@ namespace System.Web.UI.WebControls
|
|
|
((WebControl)styleDef[0]).ApplyStyle ((Style)styleDef[1]);
|
|
|
|
|
|
wizardTable.Render (writer);
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
+ class SideBarButtonTemplate: ITemplate
|
|
|
+ {
|
|
|
+ Wizard wizard;
|
|
|
+
|
|
|
+ public SideBarButtonTemplate (Wizard wizard)
|
|
|
+ {
|
|
|
+ this.wizard = wizard;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void InstantiateIn (Control control)
|
|
|
+ {
|
|
|
+ LinkButton b = new LinkButton ();
|
|
|
+ wizard.RegisterApplyStyle (b, wizard.SideBarButtonStyle);
|
|
|
+ control.Controls.Add (b);
|
|
|
+ control.DataBinding += Bound;
|
|
|
+ }
|
|
|
+
|
|
|
+ void Bound (object s, EventArgs args)
|
|
|
+ {
|
|
|
+ WizardStepBase step = DataBinder.GetDataItem (s) as WizardStepBase;
|
|
|
+ if (step != null) {
|
|
|
+ Control c = (Control)s;
|
|
|
+ LinkButton b = (LinkButton) c.Controls[0];
|
|
|
+ b.ID = SideBarButtonID;
|
|
|
+ b.CommandName = Wizard.MoveToCommandName;
|
|
|
+ b.CommandArgument = wizard.WizardSteps.IndexOf (step).ToString ();
|
|
|
+ b.Text = step.Title;
|
|
|
+ if (step.StepType == WizardStepType.Complete)
|
|
|
+ b.Enabled = false;
|
|
|
+ if (step == wizard.ActiveStep)
|
|
|
+ b.Font.Bold = true;
|
|
|
+ wizard.RegisterCommandEvents (b);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|