2
0
Эх сурвалжийг харах

2005-05-13 Lluis Sanchez Gual <[email protected]>

	* WizardStepBase.cs:
	* WizardStep.cs: Added missing attributes.
	* Wizard.cs: Implemented missing methods and properties. It can now
	be considered feature complete.


svn path=/trunk/mcs/; revision=44499
Lluis Sanchez 20 жил өмнө
parent
commit
19054caffc

+ 7 - 0
mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog

@@ -1,3 +1,10 @@
+2005-05-13  Lluis Sanchez Gual <[email protected]>
+
+	* WizardStepBase.cs:
+	* WizardStep.cs: Added missing attributes.
+	* Wizard.cs: Implemented missing methods and properties. It can now
+	be considered feature complete.
+
 2005-05-10 Gonzalo Paniagua Javier <[email protected]>
 
 	* DataGrid.cs: cleanup in AutoCreateColumns. Don't throw at the end of

+ 394 - 32
mcs/class/System.Web/System.Web.UI.WebControls/Wizard.cs

@@ -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);
+				}
+			}
+		}
 	}
 }
 

+ 1 - 1
mcs/class/System.Web/System.Web.UI.WebControls/WizardStep.cs

@@ -35,7 +35,7 @@ using System.ComponentModel;
 
 namespace System.Web.UI.WebControls
 {
-//	[ControlBuilderAttribute (typeof(WizardStepControlBuilder))]
+	[ControlBuilderAttribute (typeof(WizardStepControlBuilder))]
 	[ToolboxItemAttribute ("")]
 	[BindableAttribute (false)]
 	public sealed class WizardStep: WizardStepBase 

+ 11 - 1
mcs/class/System.Web/System.Web.UI.WebControls/WizardStepBase.cs

@@ -35,13 +35,16 @@ using System.ComponentModel;
 
 namespace System.Web.UI.WebControls
 {
-//	[ControlBuilderAttribute (typeof(WizardStepControlBuilder))]
+	[ControlBuilderAttribute (typeof(WizardStepControlBuilder))]
 	[BindableAttribute (false)]
 	[ToolboxItemAttribute ("")]
 	public abstract class WizardStepBase: View
 	{
 		Wizard wizard;
 		
+	    [DefaultValueAttribute (true)]
+	    [ThemeableAttribute (false)]
+	    [FilterableAttribute (false)]
 		public virtual bool AllowReturn {
 			get {
 				object v = ViewState ["AllowReturn"];
@@ -52,6 +55,8 @@ namespace System.Web.UI.WebControls
 			}
 		}
 		
+	    [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+	    [BrowsableAttribute (false)]
 		public string Name {
 			get {
 				if (Title.Length > 0) return Title;
@@ -60,6 +65,7 @@ namespace System.Web.UI.WebControls
 			}
 		}
 		
+	    [DefaultValueAttribute (WizardStepType.Auto)]
 		public virtual WizardStepType StepType {
 			get {
 				object v = ViewState ["StepType"];
@@ -70,6 +76,8 @@ namespace System.Web.UI.WebControls
 			}
 		}
 		
+	    [DefaultValueAttribute ("")]
+	    [LocalizableAttribute (true)]
 		public virtual string Title {
 			get {
 				object v = ViewState ["Title"];
@@ -80,6 +88,8 @@ namespace System.Web.UI.WebControls
 			}
 		}
 		
+	    [EditorBrowsableAttribute (EditorBrowsableState.Advanced)]
+	    [BrowsableAttribute (false)]
 		public Wizard Wizard {
 			get { return wizard; }
 		}

+ 40 - 0
mcs/class/System.Web/System.Web.UI.WebControls/WizardStepControlBuilder.cs

@@ -0,0 +1,40 @@
+//
+// System.Web.UI.WebControls.WizardStepControlBuilder
+//
+// Authors:
+//  Lluis Sanchez Gual ([email protected])
+//
+// (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
+
+namespace System.Web.UI.WebControls
+{
+	public sealed class WizardStepControlBuilder: ControlBuilder
+	{
+	} 
+}
+
+#endif