// // System.Web.UI.WebControls.Wizard // // Authors: // Lluis Sanchez Gual (lluis@novell.com) // // (C) 2005 Novell, Inc. (http://www.novell.com) // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if NET_2_0 using System; using System.Collections; using System.ComponentModel; namespace System.Web.UI.WebControls { [DefaultEventAttribute ("FinishButtonClick")] [BindableAttribute (false)] [DesignerAttribute ("System.Web.UI.Design.WebControls.WizardDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")] [ToolboxData ("<{0}:Wizard runat=\"server\"> ")] public class Wizard: CompositeControl { public static readonly string CancelCommandName = "Cancel"; public static readonly string MoveCompleteCommandName = "MoveComplete"; public static readonly string MoveNextCommandName = "MoveNext"; public static readonly string MovePreviousCommandName = "MovePrevious"; public static readonly string MoveToCommandName = "Move"; protected static readonly string CancelButtonID = "CancelButton"; protected static readonly string CustomFinishButtonID = "CustomFinishButton"; protected static readonly string CustomNextButtonID = "CustomNextButton"; protected static readonly string CustomPreviousButtonID = "CustomPreviousButton"; protected static readonly string DataListID = "SideBarList"; protected static readonly string FinishButtonID = "FinishButton"; protected static readonly string FinishPreviousButtonID = "FinishPreviousButton"; protected static readonly string SideBarButtonID = "SideBarButton"; protected static readonly string StartNextButtonID = "StartNextButton"; protected static readonly string StepNextButtonID = "StepNextButton"; protected static readonly string StepPreviousButtonID = "StepPreviousButton"; WizardStepCollection steps; // View state TableItemStyle stepStyle; TableItemStyle sideBarStyle; TableItemStyle headerStyle; TableItemStyle navigationStyle; Style sideBarButtonStyle; Style cancelButtonStyle; Style finishCompleteButtonStyle; Style finishPreviousButtonStyle; Style startNextButtonStyle; Style stepNextButtonStyle; Style stepPreviousButtonStyle; Style navigationButtonStyle; ITemplate finishNavigationTemplate; ITemplate startNavigationTemplate; ITemplate stepNavigationTemplate; ITemplate headerTemplate; ITemplate sideBarTemplate; // Control state int activeStepIndex = -1; bool inited = false; ArrayList history; Table wizardTable; WizardHeaderCell _headerCell; TableCell _navigationCell; StartNavigationContainer _startNavContainer; StepNavigationContainer _stepNavContainer; FinishNavigationContainer _finishNavContainer; MultiView multiView; DataList stepDatalist; ArrayList styles = new ArrayList (); Hashtable customNavigation; static readonly object ActiveStepChangedEvent = new object(); static readonly object CancelButtonClickEvent = new object(); static readonly object FinishButtonClickEvent = new object(); static readonly object NextButtonClickEvent = new object(); static readonly object PreviousButtonClickEvent = new object(); static readonly object SideBarButtonClickEvent = new object(); public event EventHandler ActiveStepChanged { add { Events.AddHandler (ActiveStepChangedEvent, value); } remove { Events.RemoveHandler (ActiveStepChangedEvent, value); } } public event EventHandler CancelButtonClick { add { Events.AddHandler (CancelButtonClickEvent, value); } remove { Events.RemoveHandler (CancelButtonClickEvent, value); } } public event WizardNavigationEventHandler FinishButtonClick { add { Events.AddHandler (FinishButtonClickEvent, value); } remove { Events.RemoveHandler (FinishButtonClickEvent, value); } } public event WizardNavigationEventHandler NextButtonClick { add { Events.AddHandler (NextButtonClickEvent, value); } remove { Events.RemoveHandler (NextButtonClickEvent, value); } } public event WizardNavigationEventHandler PreviousButtonClick { add { Events.AddHandler (PreviousButtonClickEvent, value); } remove { Events.RemoveHandler (PreviousButtonClickEvent, value); } } public event WizardNavigationEventHandler SideBarButtonClick { add { Events.AddHandler (SideBarButtonClickEvent, value); } remove { Events.RemoveHandler (SideBarButtonClickEvent, value); } } protected virtual void OnActiveStepChanged (object source, EventArgs e) { if (Events != null) { EventHandler eh = (EventHandler) Events [ActiveStepChangedEvent]; if (eh != null) eh (source, e); } } protected virtual void OnCancelButtonClick (EventArgs e) { if (Events != null) { EventHandler eh = (EventHandler) Events [CancelButtonClickEvent]; if (eh != null) eh (this, e); } } protected virtual void OnFinishButtonClick (WizardNavigationEventArgs e) { if (Events != null) { WizardNavigationEventHandler eh = (WizardNavigationEventHandler) Events [FinishButtonClickEvent]; if (eh != null) eh (this, e); } } protected virtual void OnNextButtonClick (WizardNavigationEventArgs e) { if (Events != null) { WizardNavigationEventHandler eh = (WizardNavigationEventHandler) Events [NextButtonClickEvent]; if (eh != null) eh (this, e); } } protected virtual void OnPreviousButtonClick (WizardNavigationEventArgs e) { if (Events != null) { WizardNavigationEventHandler eh = (WizardNavigationEventHandler) Events [PreviousButtonClickEvent]; if (eh != null) eh (this, e); } } protected virtual void OnSideBarButtonClick (WizardNavigationEventArgs e) { if (Events != null) { WizardNavigationEventHandler eh = (WizardNavigationEventHandler) Events [SideBarButtonClickEvent]; if (eh != null) eh (this, e); } } [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public WizardStepBase ActiveStep { get { if (ActiveStepIndex < -1 || ActiveStepIndex >= WizardSteps.Count) throw new InvalidOperationException ("ActiveStepIndex has an invalid value."); if (ActiveStepIndex == -1) return null; return WizardSteps [activeStepIndex]; } } [DefaultValueAttribute (-1)] [ThemeableAttribute (false)] public virtual int ActiveStepIndex { get { return activeStepIndex; } set { if (value < -1 || (value > WizardSteps.Count && (inited || WizardSteps.Count > 0))) throw new ArgumentOutOfRangeException ("The ActiveStepIndex must be less than WizardSteps.Count and at least -1"); if (inited && !AllowNavigationToStep (value)) return; if(activeStepIndex != value) { activeStepIndex = value; if (inited) { multiView.ActiveViewIndex = value; if (stepDatalist != null) { stepDatalist.SelectedIndex = value; stepDatalist.DataBind (); } OnActiveStepChanged (this, EventArgs.Empty); } } } } [UrlPropertyAttribute] [DefaultValueAttribute ("")] [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] public virtual string CancelButtonImageUrl { get { object v = ViewState ["CancelButtonImageUrl"]; return v != null ? (string)v : string.Empty; } set { ViewState ["CancelButtonImageUrl"] = value; } } [DefaultValueAttribute (null)] [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)] [NotifyParentPropertyAttribute (true)] [PersistenceModeAttribute (PersistenceMode.InnerProperty)] public Style CancelButtonStyle { get { if (cancelButtonStyle == null) { cancelButtonStyle = new Style (); if (IsTrackingViewState) ((IStateManager)cancelButtonStyle).TrackViewState (); } return cancelButtonStyle; } } [LocalizableAttribute (true)] public virtual string CancelButtonText { get { object v = ViewState ["CancelButtonText"]; return v != null ? (string)v : "Cancel"; } set { ViewState ["CancelButtonText"] = value; } } [DefaultValueAttribute (ButtonType.Button)] public virtual ButtonType CancelButtonType { get { object v = ViewState ["CancelButtonType"]; return v != null ? (ButtonType)v : ButtonType.Button; } set { ViewState ["CancelButtonType"] = value; } } [UrlPropertyAttribute] [EditorAttribute ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] [DefaultValueAttribute ("")] public virtual string CancelDestinationPageUrl { get { object v = ViewState ["CancelDestinationPageUrl"]; return v != null ? (string)v : string.Empty; } set { ViewState ["CancelDestinationPageUrl"] = value; } } [DefaultValueAttribute (0)] public virtual int CellPadding { get { if (ControlStyleCreated) return ((TableStyle) ControlStyle).CellPadding; return 0; } set { ((TableStyle) ControlStyle).CellPadding = value; } } [DefaultValueAttribute (0)] public virtual int CellSpacing { get { if (ControlStyleCreated) return ((TableStyle) ControlStyle).CellSpacing; return 0; } set { ((TableStyle) ControlStyle).CellSpacing = value; } } [DefaultValueAttribute (false)] [ThemeableAttribute (false)] public virtual bool DisplayCancelButton { get { object v = ViewState ["DisplayCancelButton"]; return v != null ? (bool) v : false; } set { ViewState ["DisplayCancelButton"] = value; } } [DefaultValueAttribute (true)] [ThemeableAttribute (false)] public virtual bool DisplaySideBar { get { object v = ViewState ["DisplaySideBar"]; return v != null ? (bool) v : true; } set { ViewState ["DisplaySideBar"] = value; UpdateViews (); } } [UrlPropertyAttribute] [DefaultValueAttribute ("")] [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] public virtual string FinishCompleteButtonImageUrl { get { object v = ViewState ["FinishCompleteButtonImageUrl"]; return v != null ? (string)v : string.Empty; } set { ViewState ["FinishCompleteButtonImageUrl"] = value; } } [DefaultValueAttribute (null)] [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)] [NotifyParentPropertyAttribute (true)] [PersistenceModeAttribute (PersistenceMode.InnerProperty)] public Style FinishCompleteButtonStyle { get { if (finishCompleteButtonStyle == null) { finishCompleteButtonStyle = new Style (); if (IsTrackingViewState) ((IStateManager)finishCompleteButtonStyle).TrackViewState (); } return finishCompleteButtonStyle; } } [LocalizableAttribute (true)] public virtual string FinishCompleteButtonText { get { object v = ViewState ["FinishCompleteButtonText"]; return v != null ? (string)v : "Finish"; } set { ViewState ["FinishCompleteButtonText"] = value; } } [DefaultValueAttribute (ButtonType.Button)] public virtual ButtonType FinishCompleteButtonType { get { object v = ViewState ["FinishCompleteButtonType"]; return v != null ? (ButtonType)v : ButtonType.Button; } set { ViewState ["FinishCompleteButtonType"] = value; } } [UrlPropertyAttribute] [EditorAttribute ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] [DefaultValueAttribute ("")] public virtual 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 virtual ITemplate FinishNavigationTemplate { get { return finishNavigationTemplate; } set { finishNavigationTemplate = value; UpdateViews (); } } [UrlPropertyAttribute] [DefaultValueAttribute ("")] [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] public virtual string FinishPreviousButtonImageUrl { get { object v = ViewState ["FinishPreviousButtonImageUrl"]; return v != null ? (string)v : string.Empty; } set { ViewState ["FinishPreviousButtonImageUrl"] = value; } } [DefaultValueAttribute (null)] [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)] [NotifyParentPropertyAttribute (true)] [PersistenceModeAttribute (PersistenceMode.InnerProperty)] public Style FinishPreviousButtonStyle { get { if (finishPreviousButtonStyle == null) { finishPreviousButtonStyle = new Style (); if (IsTrackingViewState) ((IStateManager)finishPreviousButtonStyle).TrackViewState (); } return finishPreviousButtonStyle; } } [LocalizableAttribute (true)] public virtual string FinishPreviousButtonText { get { object v = ViewState ["FinishPreviousButtonText"]; return v != null ? (string)v : "Previous"; } set { ViewState ["FinishPreviousButtonText"] = value; } } [DefaultValueAttribute (ButtonType.Button)] public virtual ButtonType FinishPreviousButtonType { get { object v = ViewState ["FinishPreviousButtonType"]; return v != null ? (ButtonType)v : ButtonType.Button; } set { ViewState ["FinishPreviousButtonType"] = value; } } [DefaultValueAttribute (null)] [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)] [NotifyParentPropertyAttribute (true)] [PersistenceModeAttribute (PersistenceMode.InnerProperty)] public TableItemStyle HeaderStyle { get { if (headerStyle == null) { headerStyle = new TableItemStyle (); if (IsTrackingViewState) ((IStateManager)headerStyle).TrackViewState (); } return headerStyle; } } [DefaultValue (null)] [TemplateContainer (typeof(Wizard), BindingDirection.OneWay)] [PersistenceMode (PersistenceMode.InnerProperty)] [Browsable (false)] public virtual ITemplate HeaderTemplate { get { return headerTemplate; } set { headerTemplate = value; UpdateViews (); } } [DefaultValueAttribute ("")] [LocalizableAttribute (true)] public virtual string HeaderText { get { object v = ViewState ["HeaderText"]; return v != null ? (string)v : string.Empty; } set { ViewState ["HeaderText"] = value; } } [DefaultValueAttribute (null)] [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)] [NotifyParentPropertyAttribute (true)] [PersistenceModeAttribute (PersistenceMode.InnerProperty)] public Style NavigationButtonStyle { get { if (navigationButtonStyle == null) { navigationButtonStyle = new Style (); if (IsTrackingViewState) ((IStateManager)navigationButtonStyle).TrackViewState (); } return navigationButtonStyle; } } [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)] [NotifyParentPropertyAttribute (true)] public TableItemStyle SideBarStyle { get { if (sideBarStyle == null) { sideBarStyle = new TableItemStyle (); if (IsTrackingViewState) ((IStateManager)sideBarStyle).TrackViewState (); } return sideBarStyle; } } [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)] [PersistenceModeAttribute (PersistenceMode.InnerProperty)] [DefaultValueAttribute (null)] [NotifyParentPropertyAttribute (true)] public Style SideBarButtonStyle { get { if (sideBarButtonStyle == null) { sideBarButtonStyle = new Style (); if (IsTrackingViewState) ((IStateManager)sideBarButtonStyle).TrackViewState (); } return sideBarButtonStyle; } } [DefaultValue (null)] [TemplateContainer (typeof(Wizard), BindingDirection.OneWay)] [PersistenceMode (PersistenceMode.InnerProperty)] [Browsable (false)] public virtual ITemplate SideBarTemplate { get { return sideBarTemplate; } set { sideBarTemplate = value; UpdateViews (); } } [Localizable (true)] public virtual string SkipLinkText { get { object v = ViewState ["SkipLinkText"]; return v != null ? (string) v : "Skip Navigation Links."; } set { ViewState ["SkipLinkText"] = value; } } [DefaultValue (null)] [TemplateContainer (typeof(Wizard), BindingDirection.OneWay)] [PersistenceMode (PersistenceMode.InnerProperty)] [Browsable (false)] public virtual ITemplate StartNavigationTemplate { get { return startNavigationTemplate; } set { startNavigationTemplate = value; UpdateViews (); } } [UrlPropertyAttribute] [DefaultValueAttribute ("")] [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] public virtual string StartNextButtonImageUrl { get { object v = ViewState ["StartNextButtonImageUrl"]; return v != null ? (string)v : string.Empty; } set { ViewState ["StartNextButtonImageUrl"] = value; } } [DefaultValueAttribute (null)] [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)] [NotifyParentPropertyAttribute (true)] [PersistenceModeAttribute (PersistenceMode.InnerProperty)] public Style StartNextButtonStyle { get { if (startNextButtonStyle == null) { startNextButtonStyle = new Style (); if (IsTrackingViewState) ((IStateManager)startNextButtonStyle).TrackViewState (); } return startNextButtonStyle; } } [LocalizableAttribute (true)] public virtual string StartNextButtonText { get { object v = ViewState ["StartNextButtonText"]; return v != null ? (string)v : "Next"; } set { ViewState ["StartNextButtonText"] = value; } } [DefaultValueAttribute (ButtonType.Button)] public virtual ButtonType StartNextButtonType { get { object v = ViewState ["StartNextButtonType"]; return v != null ? (ButtonType)v : ButtonType.Button; } set { ViewState ["StartNextButtonType"] = value; } } [DefaultValue (null)] [TemplateContainer (typeof(Wizard), BindingDirection.OneWay)] [PersistenceMode (PersistenceMode.InnerProperty)] [Browsable (false)] public virtual ITemplate StepNavigationTemplate { get { return stepNavigationTemplate; } set { stepNavigationTemplate = value; UpdateViews (); } } [UrlPropertyAttribute] [DefaultValueAttribute ("")] [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] public virtual string StepNextButtonImageUrl { get { object v = ViewState ["StepNextButtonImageUrl"]; return v != null ? (string)v : string.Empty; } set { ViewState ["StepNextButtonImageUrl"] = value; } } [DefaultValueAttribute (null)] [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)] [NotifyParentPropertyAttribute (true)] [PersistenceModeAttribute (PersistenceMode.InnerProperty)] public Style StepNextButtonStyle { get { if (stepNextButtonStyle == null) { stepNextButtonStyle = new Style (); if (IsTrackingViewState) ((IStateManager)stepNextButtonStyle).TrackViewState (); } return stepNextButtonStyle; } } [LocalizableAttribute (true)] public virtual string StepNextButtonText { get { object v = ViewState ["StepNextButtonText"]; return v != null ? (string)v : "Next"; } set { ViewState ["StepNextButtonText"] = value; } } [DefaultValueAttribute (ButtonType.Button)] public virtual ButtonType StepNextButtonType { get { object v = ViewState ["StepNextButtonType"]; return v != null ? (ButtonType)v : ButtonType.Button; } set { ViewState ["StepNextButtonType"] = value; } } [UrlPropertyAttribute] [DefaultValueAttribute ("")] [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] public virtual string StepPreviousButtonImageUrl { get { object v = ViewState ["StepPreviousButtonImageUrl"]; return v != null ? (string)v : string.Empty; } set { ViewState ["StepPreviousButtonImageUrl"] = value; } } [DefaultValueAttribute (null)] [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)] [NotifyParentPropertyAttribute (true)] [PersistenceModeAttribute (PersistenceMode.InnerProperty)] public Style StepPreviousButtonStyle { get { if (stepPreviousButtonStyle == null) { stepPreviousButtonStyle = new Style (); if (IsTrackingViewState) ((IStateManager)stepPreviousButtonStyle).TrackViewState (); } return stepPreviousButtonStyle; } } [LocalizableAttribute (true)] public virtual string StepPreviousButtonText { get { object v = ViewState ["StepPreviousButtonText"]; return v != null ? (string)v : "Previous"; } set { ViewState ["StepPreviousButtonText"] = value; } } [DefaultValueAttribute (ButtonType.Button)] public virtual ButtonType StepPreviousButtonType { get { object v = ViewState ["StepPreviousButtonType"]; return v != null ? (ButtonType)v : ButtonType.Button; } set { ViewState ["StepPreviousButtonType"] = value; } } [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)] [PersistenceModeAttribute (PersistenceMode.InnerProperty)] [DefaultValueAttribute (null)] [NotifyParentPropertyAttribute (true)] public TableItemStyle StepStyle { get { if (stepStyle == null) { stepStyle = new TableItemStyle (); if (IsTrackingViewState) ((IStateManager)stepStyle).TrackViewState (); } return stepStyle; } } [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)] [EditorAttribute ("System.Web.UI.Design.WebControls.WizardStepCollectionEditor," + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] [PersistenceModeAttribute (PersistenceMode.InnerProperty)] [ThemeableAttribute (false)] public virtual WizardStepCollection WizardSteps { get { if (steps == null) steps = new WizardStepCollection (this); return steps; } } protected virtual new HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Table; } } internal virtual ITemplate SideBarItemTemplate { get { return new SideBarButtonTemplate (this); } } public ICollection GetHistory () { if (history == null) history = new ArrayList (); return history; } public void MoveTo (WizardStepBase wizardStep) { if (wizardStep == null) throw new ArgumentNullException ("wizardStep"); int i = WizardSteps.IndexOf (wizardStep); if (i == -1) throw new ArgumentException ("The provided wizard step does not belong to this wizard."); ActiveStepIndex = i; } public WizardStepType GetStepType (WizardStepBase wizardStep, int index) { if (wizardStep.StepType == WizardStepType.Auto) { if ((index == WizardSteps.Count - 1) || (WizardSteps.Count > 1 && WizardSteps[WizardSteps.Count - 1].StepType == WizardStepType.Complete && index == WizardSteps.Count - 2)) return WizardStepType.Finish; else if (index == 0) return WizardStepType.Start; 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 internal override void OnInit (EventArgs e) { Page.RegisterRequiresControlState (this); base.OnInit (e); if (ActiveStepIndex == -1) ActiveStepIndex = 0; EnsureChildControls (); inited = true; } protected override ControlCollection CreateControlCollection () { ControlCollection col = new ControlCollection (this); col.SetReadonly (true); return col; } protected internal override void CreateChildControls () { CreateControlHierarchy (); } protected virtual void CreateControlHierarchy () { styles.Clear (); wizardTable = new ContainedTable (this); Table contentTable = wizardTable; if (DisplaySideBar) { contentTable = new Table (); contentTable.CellPadding = 0; contentTable.CellSpacing = 0; contentTable.Height = new Unit ("100%"); contentTable.Width = new Unit ("100%"); TableRow row = new TableRow (); TableCellNamingContainer sideBarCell = new TableCellNamingContainer (); sideBarCell.ID = "SideBarContainer"; sideBarCell.ControlStyle.Height = Unit.Percentage (100); CreateSideBar (sideBarCell); row.Cells.Add (sideBarCell); TableCell contentCell = new TableCell (); contentCell.Controls.Add (contentTable); contentCell.Height = new Unit ("100%"); row.Cells.Add (contentCell); wizardTable.Rows.Add (row); } AddHeaderRow (contentTable); TableRow viewRow = new TableRow (); TableCell viewCell = new TableCell (); customNavigation = null; multiView = new MultiView (); foreach (View v in WizardSteps) { if (v is TemplatedWizardStep) InstantiateTemplateStep ((TemplatedWizardStep) v); multiView.Views.Add (v); } multiView.ActiveViewIndex = ActiveStepIndex; RegisterApplyStyle (viewCell, StepStyle); viewCell.Controls.Add (multiView); viewRow.Cells.Add (viewCell); viewRow.Height = new Unit ("100%"); contentTable.Rows.Add (viewRow); TableRow buttonRow = new TableRow (); _navigationCell = new TableCell (); _navigationCell.HorizontalAlign = HorizontalAlign.Right; RegisterApplyStyle (_navigationCell, NavigationStyle); CreateButtonBar (_navigationCell); buttonRow.Cells.Add (_navigationCell); contentTable.Rows.Add (buttonRow); Controls.SetReadonly (false); Controls.Add (wizardTable); Controls.SetReadonly (true); } internal virtual void InstantiateTemplateStep(TemplatedWizardStep step) { BaseWizardContainer contentTemplateContainer = new BaseWizardContainer (); if (step.ContentTemplate != null) step.ContentTemplate.InstantiateIn (contentTemplateContainer.InnerCell); step.ContentTemplateContainer = contentTemplateContainer; step.Controls.Clear (); step.Controls.Add (contentTemplateContainer); BaseWizardNavigationContainer customNavigationTemplateContainer = new BaseWizardNavigationContainer (); if (step.CustomNavigationTemplate != null) { step.CustomNavigationTemplate.InstantiateIn (customNavigationTemplateContainer); RegisterCustomNavigation (step, customNavigationTemplateContainer); } step.CustomNavigationTemplateContainer = customNavigationTemplateContainer; } internal void RegisterCustomNavigation (TemplatedWizardStep step, BaseWizardNavigationContainer customNavigationTemplateContainer) { if (customNavigation == null) customNavigation = new Hashtable (); customNavigation [step] = customNavigationTemplateContainer; } void CreateButtonBar (TableCell buttonBarCell) { if(customNavigation!=null && customNavigation.Values.Count>0) { int i = 0; foreach (Control customNavigationTemplateContainer in customNavigation.Values) { customNavigationTemplateContainer.ID = "CustomNavContainer" + i++; buttonBarCell.Controls.Add (customNavigationTemplateContainer); } } // // StartNavContainer // _startNavContainer = new StartNavigationContainer (this); _startNavContainer.ID = "StartNavContainer"; if (startNavigationTemplate != null) { startNavigationTemplate.InstantiateIn (_startNavContainer); } else { TableRow row; AddNavButtonsTable (_startNavContainer, out row); AddButtonCell (row, CreateButtonSet (StartNextButtonID, MoveNextCommandName)); AddButtonCell (row, CreateButtonSet (CancelButtonID, CancelCommandName, false)); _startNavContainer.ConfirmDefaultTemplate (); } buttonBarCell.Controls.Add (_startNavContainer); // // StepNavContainer // _stepNavContainer = new StepNavigationContainer (this); _stepNavContainer.ID = "StepNavContainer"; if (stepNavigationTemplate != null) { stepNavigationTemplate.InstantiateIn (_stepNavContainer); } else { TableRow row; AddNavButtonsTable (_stepNavContainer, out row); AddButtonCell (row, CreateButtonSet (StepPreviousButtonID, MovePreviousCommandName, false)); AddButtonCell (row, CreateButtonSet (StepNextButtonID, MoveNextCommandName)); AddButtonCell (row, CreateButtonSet (CancelButtonID, CancelCommandName, false)); _stepNavContainer.ConfirmDefaultTemplate (); } buttonBarCell.Controls.Add (_stepNavContainer); // // StepNavContainer // _finishNavContainer = new FinishNavigationContainer (this); _finishNavContainer.ID = "FinishNavContainer"; if (finishNavigationTemplate != null) { finishNavigationTemplate.InstantiateIn (_finishNavContainer); } else { TableRow row; AddNavButtonsTable (_finishNavContainer, out row); AddButtonCell (row, CreateButtonSet (FinishPreviousButtonID, MovePreviousCommandName, false)); AddButtonCell (row, CreateButtonSet (FinishButtonID, MoveCompleteCommandName)); AddButtonCell (row, CreateButtonSet (CancelButtonID, CancelCommandName, false)); _finishNavContainer.ConfirmDefaultTemplate (); } buttonBarCell.Controls.Add (_finishNavContainer); } static void AddNavButtonsTable (BaseWizardNavigationContainer container, out TableRow row) { Table t = new Table (); t.CellPadding = 5; t.CellSpacing = 5; row = new TableRow (); t.Rows.Add (row); container.Controls.Add (t); } Control [] CreateButtonSet (string id, string command) { return CreateButtonSet (id, command, true, null); } Control [] CreateButtonSet (string id, string command, bool causesValidation) { return CreateButtonSet (id, command, causesValidation, null); } internal Control [] CreateButtonSet (string id, string command, bool causesValidation, string validationGroup) { return new Control [] { CreateButton ( id + ButtonType.Button, command, ButtonType.Button, causesValidation, validationGroup), CreateButton ( id + ButtonType.Image, command, ButtonType.Image, causesValidation, validationGroup), CreateButton ( id + ButtonType.Link, command, ButtonType.Link, causesValidation, validationGroup) }; } Control CreateButton (string id, string command, ButtonType type, bool causesValidation, string validationGroup) { WebControl b; switch (type) { case ButtonType.Button: b = CreateStandartButton (); break; case ButtonType.Image: b = CreateImageButton (null); break; case ButtonType.Link: b = CreateLinkButton (); break; default: throw new ArgumentOutOfRangeException ("type"); } b.ID = id; b.EnableTheming = false; ((IButtonControl) b).CommandName = command; ((IButtonControl) b).CausesValidation = causesValidation; if(!String.IsNullOrEmpty(validationGroup)) ((IButtonControl) b).ValidationGroup = validationGroup; RegisterApplyStyle (b, NavigationButtonStyle); return b; } WebControl CreateStandartButton () { Button btn = new Button (); return btn; } WebControl CreateImageButton (string imageUrl) { ImageButton img = new ImageButton (); img.ImageUrl = imageUrl; return img; } WebControl CreateLinkButton () { LinkButton link = new LinkButton (); return link; } void AddButtonCell (TableRow row, params Control[] controls) { TableCell cell = new TableCell (); cell.HorizontalAlign = HorizontalAlign.Right; for (int i = 0; i < controls.Length; i++) cell.Controls.Add (controls [i]); row.Cells.Add (cell); } void CreateSideBar (TableCell sideBarCell) { RegisterApplyStyle (sideBarCell, SideBarStyle); if (SkipLinkText != "") { System.Web.UI.HtmlControls.HtmlAnchor anchor = new System.Web.UI.HtmlControls.HtmlAnchor (); anchor.HRef = "#" + ClientID + "_SkipLink"; Image img = new Image (); ClientScriptManager csm = new ClientScriptManager (null); img.ImageUrl = csm.GetWebResourceUrl (typeof (SiteMapPath), "transparent.gif"); img.Attributes.Add ("height", "0"); img.Attributes.Add ("width", "0"); img.AlternateText = SkipLinkText; anchor.Controls.Add (img); sideBarCell.Controls.Add (anchor); } 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 + "'."); stepDatalist.ItemDataBound += new DataListItemEventHandler(StepDatalistItemDataBound); } else { stepDatalist = new DataList (); stepDatalist.ID = DataListID; stepDatalist.SelectedItemStyle.Font.Bold = true; stepDatalist.ItemTemplate = SideBarItemTemplate; sideBarCell.Controls.Add (stepDatalist); } if (SkipLinkText != "") { System.Web.UI.HtmlControls.HtmlAnchor anchor = new System.Web.UI.HtmlControls.HtmlAnchor (); anchor.ID = "SkipLink"; sideBarCell.Controls.Add (anchor); } stepDatalist.ItemCommand += new DataListCommandEventHandler (StepDatalistItemCommand); stepDatalist.CellSpacing = 0; stepDatalist.DataSource = WizardSteps; stepDatalist.SelectedIndex = ActiveStepIndex; stepDatalist.DataBind (); } void StepDatalistItemCommand (object sender, DataListCommandEventArgs e) { WizardNavigationEventArgs arg = new WizardNavigationEventArgs (ActiveStepIndex, Convert.ToInt32 (e.CommandArgument)); OnSideBarButtonClick (arg); if (!arg.Cancel) ActiveStepIndex = arg.NextStepIndex; } void StepDatalistItemDataBound (object sender, DataListItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.SelectedItem) { IButtonControl button = (IButtonControl) e.Item.FindControl (SideBarButtonID); if (button == null) throw new InvalidOperationException ("SideBarList control must contain an IButtonControl with ID " + SideBarButtonID + " in every item template, this maybe include ItemTemplate, EditItemTemplate, SelectedItemTemplate or AlternatingItemTemplate if they exist."); WizardStepBase step = (WizardStepBase) e.Item.DataItem; if (button is Button) ((Button) button).UseSubmitBehavior = false; button.CommandName = Wizard.MoveToCommandName; button.CommandArgument = WizardSteps.IndexOf (step).ToString (); button.Text = step.Name; if (step.StepType == WizardStepType.Complete && button is WebControl) ((WebControl) button).Enabled = false; } } void AddHeaderRow (Table table) { TableRow row = new TableRow (); _headerCell = new WizardHeaderCell (); _headerCell.ID = "HeaderContainer"; RegisterApplyStyle (_headerCell, HeaderStyle); if (headerTemplate != null) { headerTemplate.InstantiateIn (_headerCell); _headerCell.ConfirmInitState (); } row.Cells.Add (_headerCell); table.Rows.Add (row); } internal void RegisterApplyStyle (WebControl control, Style style) { styles.Add (new object [] { control, style }); } protected override Style CreateControlStyle () { TableStyle style = new TableStyle (); style.CellPadding = 0; style.CellSpacing = 0; return style; } protected override IDictionary GetDesignModeState () { throw new NotImplementedException (); } protected internal override void LoadControlState (object ob) { if (ob == null) return; object[] state = (object[]) ob; base.LoadControlState (state[0]); activeStepIndex = (int) state[1]; history = (ArrayList) state[2]; } protected internal override object SaveControlState () { if (GetHistory ().Count == 0 || (int) history [0] != ActiveStepIndex) history.Insert (0, ActiveStepIndex); object bstate = base.SaveControlState (); return new object[] { 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]); if (states [13] != null) ControlStyle.LoadViewState (states [13]); } protected override object SaveViewState () { object [] state = new object [14]; 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 (); if (ControlStyleCreated) state [13] = ControlStyle.SaveViewState (); for (int n=0; n 0) Context.Response.Redirect (CancelDestinationPageUrl); else OnCancelButtonClick (EventArgs.Empty); break; case "MoveComplete": int next = -1; for (int n=0; n 0) { Context.Response.Redirect (FinishDestinationPageUrl); return; } if (next != -1 && !navArgs.Cancel) ActiveStepIndex = next; break; case "MoveNext": if (ActiveStepIndex < WizardSteps.Count - 1) { WizardNavigationEventArgs args = new WizardNavigationEventArgs (ActiveStepIndex, ActiveStepIndex + 1); int curStep = ActiveStepIndex; OnNextButtonClick (args); if (!args.Cancel && curStep == activeStepIndex) ActiveStepIndex++; } break; case "MovePrevious": if (ActiveStepIndex > 0) { WizardNavigationEventArgs args = new WizardNavigationEventArgs (ActiveStepIndex, ActiveStepIndex - 1); int curStep = ActiveStepIndex; OnPreviousButtonClick (args); if (!args.Cancel) { if (curStep == activeStepIndex) ActiveStepIndex--; if (history != null && activeStepIndex < curStep) history.Remove (curStep); } } break; case "Move": int newb = int.Parse (commandArg); ActiveStepIndex = newb; break; } } internal void UpdateViews () { ChildControlsCreated = false; } protected internal override void Render (HtmlTextWriter writer) { PrepareControlHierarchy (); wizardTable.Render (writer); } void PrepareControlHierarchy () { // header if (!_headerCell.Initialized) { if (String.IsNullOrEmpty (HeaderText)) _headerCell.Parent.Visible = false; else _headerCell.Text = HeaderText; } if (ActiveStep.StepType == WizardStepType.Complete) _headerCell.Parent.Visible = false; // sidebar if (stepDatalist != null) { stepDatalist.SelectedIndex = ActiveStepIndex; stepDatalist.DataBind (); if (ActiveStep.StepType == WizardStepType.Complete) stepDatalist.NamingContainer.Visible = false; } // content TemplatedWizardStep templateStep = ActiveStep as TemplatedWizardStep; if (templateStep != null) { BaseWizardContainer contentContainer = templateStep.ContentTemplateContainer as BaseWizardContainer; if (contentContainer != null) contentContainer.PrepareControlHierarchy (); } // navigation if (customNavigation != null) { foreach (Control c in customNavigation.Values) c.Visible = false; } _startNavContainer.Visible = false; _stepNavContainer.Visible = false; _finishNavContainer.Visible = false; BaseWizardNavigationContainer currentNavContainer = GetCurrentNavContainer (); if (currentNavContainer == null) { _navigationCell.Parent.Visible = false; } else { currentNavContainer.Visible = true; currentNavContainer.PrepareControlHierarchy (); if (!currentNavContainer.Visible) _navigationCell.Parent.Visible = false; } foreach (object [] styleDef in styles) ((WebControl) styleDef [0]).ApplyStyle ((Style) styleDef [1]); } BaseWizardNavigationContainer GetCurrentNavContainer () { if (customNavigation != null && customNavigation [ActiveStep] != null) { return (BaseWizardNavigationContainer) customNavigation [ActiveStep]; } else { WizardStepType stepType = GetStepType (ActiveStep, ActiveStepIndex); switch (stepType) { case WizardStepType.Start: return _startNavContainer; case WizardStepType.Step: return _stepNavContainer; case WizardStepType.Finish: return _finishNavContainer; default: return null; } } } class TableCellNamingContainer : TableCell, INamingContainer, INonBindingContainer { public TableCellNamingContainer () { } } 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) { DataListItem c = (DataListItem) s; LinkButton b = (LinkButton) c.Controls[0]; b.ID = SideBarButtonID; b.CommandName = Wizard.MoveToCommandName; b.CommandArgument = wizard.WizardSteps.IndexOf (step).ToString (); b.Text = step.Name; if (step.StepType == WizardStepType.Complete) b.Enabled = false; } } } class WizardHeaderCell : TableCell, INamingContainer, INonBindingContainer { bool _initialized; public bool Initialized { get { return _initialized; } } public WizardHeaderCell () { } public void ConfirmInitState () { _initialized = true; } } internal abstract class DefaultNavigationContainer : BaseWizardNavigationContainer { bool _isDefault; Wizard _wizard; protected Wizard Wizard { get { return _wizard; } } protected DefaultNavigationContainer (Wizard wizard) { _wizard = wizard; } public override sealed void PrepareControlHierarchy () { if (_isDefault) UpdateState (); } protected abstract void UpdateState (); public void ConfirmDefaultTemplate () { _isDefault = true; } protected void UpdateNavButtonState (string id, string text, string image, Style style) { WebControl b = (WebControl) FindControl (id); foreach (Control c in b.Parent.Controls) c.Visible = b == c; ((IButtonControl) b).Text = text; ImageButton imgbtn = b as ImageButton; if (imgbtn != null) imgbtn.ImageUrl = image; b.ApplyStyle (style); } } sealed class StartNavigationContainer : DefaultNavigationContainer { public StartNavigationContainer (Wizard wizard) : base (wizard) { } protected override void UpdateState () { bool visible = false; // next if (Wizard.AllowNavigationToStep (Wizard.ActiveStepIndex + 1)) { visible = true; UpdateNavButtonState (Wizard.StartNextButtonID + Wizard.StartNextButtonType, Wizard.StartNextButtonText, Wizard.StartNextButtonImageUrl, Wizard.StartNextButtonStyle); } else { ((Table) Controls [0]).Rows [0].Cells [0].Visible = false; } // cancel if (Wizard.DisplayCancelButton) { visible = true; UpdateNavButtonState (Wizard.CancelButtonID + Wizard.CancelButtonType, Wizard.CancelButtonText, Wizard.CancelButtonImageUrl, Wizard.CancelButtonStyle); } else { ((Table) Controls [0]).Rows [0].Cells [1].Visible = false; } Visible = visible; } } sealed class StepNavigationContainer : DefaultNavigationContainer { public StepNavigationContainer (Wizard wizard) : base (wizard) { } protected override void UpdateState () { bool visible = false; // previous if (Wizard.AllowNavigationToStep (Wizard.ActiveStepIndex - 1)) { visible = true; UpdateNavButtonState (Wizard.StepPreviousButtonID + Wizard.StepPreviousButtonType, Wizard.StepPreviousButtonText, Wizard.StepPreviousButtonImageUrl, Wizard.StepPreviousButtonStyle); } else { ((Table) Controls [0]).Rows [0].Cells [0].Visible = false; } // next if (Wizard.AllowNavigationToStep (Wizard.ActiveStepIndex + 1)) { visible = true; UpdateNavButtonState (Wizard.StepNextButtonID + Wizard.StepNextButtonType, Wizard.StepNextButtonText, Wizard.StepNextButtonImageUrl, Wizard.StepNextButtonStyle); } else { ((Table) Controls [0]).Rows [0].Cells [1].Visible = false; } // cancel if (Wizard.DisplayCancelButton) { visible = true; UpdateNavButtonState (Wizard.CancelButtonID + Wizard.CancelButtonType, Wizard.CancelButtonText, Wizard.CancelButtonImageUrl, Wizard.CancelButtonStyle); } else { ((Table) Controls [0]).Rows [0].Cells [2].Visible = false; } Visible = visible; } } sealed class FinishNavigationContainer : DefaultNavigationContainer { public FinishNavigationContainer (Wizard wizard) : base (wizard) { } protected override void UpdateState () { // previous if (Wizard.AllowNavigationToStep (Wizard.ActiveStepIndex - 1)) { UpdateNavButtonState (Wizard.FinishPreviousButtonID + Wizard.FinishPreviousButtonType, Wizard.FinishPreviousButtonText, Wizard.FinishPreviousButtonImageUrl, Wizard.FinishPreviousButtonStyle); } else { ((Table) Controls [0]).Rows [0].Cells [0].Visible = false; } // finish UpdateNavButtonState (Wizard.FinishButtonID + Wizard.FinishCompleteButtonType, Wizard.FinishCompleteButtonText, Wizard.FinishCompleteButtonImageUrl, Wizard.FinishCompleteButtonStyle); // cancel if (Wizard.DisplayCancelButton) { UpdateNavButtonState (Wizard.CancelButtonID + Wizard.CancelButtonType, Wizard.CancelButtonText, Wizard.CancelButtonImageUrl, Wizard.CancelButtonStyle); } else { ((Table) Controls [0]).Rows [0].Cells [2].Visible = false; } } } internal class BaseWizardContainer : Table, INamingContainer, INonBindingContainer { public TableCell InnerCell { get { return Rows [0].Cells [0]; } } internal BaseWizardContainer () { InitTable (); } void InitTable () { TableRow row = new TableRow (); TableCell cell = new TableCell (); cell.ControlStyle.Width = Unit.Percentage (100); cell.ControlStyle.Height = Unit.Percentage (100); row.Cells.Add (cell); this.ControlStyle.Width = Unit.Percentage (100); this.ControlStyle.Height = Unit.Percentage (100); this.CellPadding = 0; this.CellSpacing = 0; this.Rows.Add (row); } public virtual void PrepareControlHierarchy () { } } internal class BaseWizardNavigationContainer : Control, INamingContainer, INonBindingContainer { internal BaseWizardNavigationContainer () { } public virtual void PrepareControlHierarchy () { } } internal abstract class DefaultContentContainer : BaseWizardContainer { bool _isDefault; Wizard _wizard; protected bool IsDefaultTemplate { get { return _isDefault; } } protected Wizard Wizard { get { return _wizard; } } protected DefaultContentContainer (Wizard wizard) { _wizard = wizard; } public override sealed void PrepareControlHierarchy () { if (_isDefault) UpdateState (); } protected abstract void UpdateState (); public void ConfirmDefaultTemplate () { _isDefault = true; } } } } #endif