ChangeLog: Updated.
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / DataList.cs
index b4b5a4cbe42e070d9dc2ba0e23442e0201d3238b..b866896443b1925a01502730a52478c35dc69f83 100755 (executable)
-/**\r
- * Namespace: System.Web.UI.WebControls\r
- * Class:     DataList\r
- * \r
- * Author:  Gaurav Vaish\r
- * Maintainer: gvaish@iitk.ac.in\r
- * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
- * Implementation: yes\r
- * Status:  70%\r
- * \r
- * (C) Gaurav Vaish (2001)\r
- */\r
-\r
-using System;\r
-using System.Collections;\r
-using System.Web;\r
-using System.Web.UI;\r
-\r
-namespace System.Web.UI.WebControls\r
-{\r
-       public class DataList: BaseDataList, INamingContainer, IRepeatInfoUser\r
-       {\r
-               //\r
-               public const string CancelCommandName = "Cancel";\r
-               public const string DeleteCommandName = "Delete";\r
-               public const string EditCommandName   = "Edit";\r
-               public const string SelectCommandName = "Select";\r
-               public const string UpdateCommandName = "Update";\r
-\r
-               //TODO: From where will I update the values of the following ItemStyles?\r
-               private TableItemStyle alternatingItemStyle;\r
-               private TableItemStyle editItemStyle;\r
-               private TableItemStyle footerStyle;\r
-               private TableItemStyle headerStyle;\r
-               private TableItemStyle separatorStyle;\r
-\r
-               private ITemplate alternatingItemTemplate;\r
-               private ITemplate editItemTemplate;\r
-               private ITemplate footerTemplate;\r
-               private ITemplate headerTemplate;\r
-               private ITemplate separatorTemplate;\r
-\r
-               private int editItemIndex;\r
-               private bool extractTemplateRows;\r
-               \r
-               private ArrayList itemsArray;\r
-               \r
-               public DataList()\r
-               {\r
-                       alternatingItemStyle = new TableItemStyle();\r
-                       editItemStyle        = new TableItemStyle();\r
-                       footerStyle          = new TableItemStyle();\r
-                       headerStyle          = new TableItemStyle();\r
-\r
-                       alternatingItemTemplate = null;\r
-                       editItemTemplate        = null;\r
-                       footerTemplate          = null;\r
-                       headerTemplate          = null;\r
-                       separatorTemplate       = null;\r
-                       \r
-                       extractTemplateRows = false;\r
-                       \r
-                       itemsArray = null;\r
-               }\r
-               \r
-               public virtual TableItemStyle AlternatingItemStyle\r
-               {\r
-                       get\r
-                       {\r
-                               return alternatingItemStyle;\r
-                       }\r
-               }\r
-               \r
-               public virtual ITemplate AlternatingItemTemplate\r
-               {\r
-                       get\r
-                       {\r
-                               return alternatingItemTemplate;\r
-                       }\r
-                       set\r
-                       {\r
-                               alternatingItemTemplate = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual int EditItemIndex\r
-               {\r
-                       get\r
-                       {\r
-                               return editItemIndex;\r
-                       }\r
-                       set\r
-                       {\r
-                               editItemIndex = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual TableItemStyle EditItemStyle\r
-               {\r
-                       get\r
-                       {\r
-                               return editItemStyle;\r
-                       }\r
-                       set\r
-                       {\r
-                               editItemStyle = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual ITemplate EditItemTemplate\r
-               {\r
-                       get\r
-                       {\r
-                               return editItemTemplate;\r
-                       }\r
-                       set\r
-                       {\r
-                               editItemTemplate = value;\r
-                       }\r
-               }\r
-\r
-               public virtual bool ExtractTemplateRows\r
-               {\r
-                       get\r
-                       {\r
-                               return extractTemplateRows;\r
-                       }\r
-                       set\r
-                       {\r
-                               extractTemplateRows = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual TableItemStyle FooterStyle\r
-               {\r
-                       get\r
-                       {\r
-                               return footerStyle;\r
-                       }\r
-               }\r
-               \r
-               public virtual ITemplate FooterTemplate\r
-               {\r
-                       get\r
-                       {\r
-                               return footerTemplate;\r
-                       }\r
-                       set\r
-                       {\r
-                               footerTemplate = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual bool ShowHeader\r
-               {\r
-                       get\r
-                       {\r
-                               object o = ViewState["ShowHeader"];\r
-                               if(o!=null)\r
-                                       return (bool)o;\r
-                               return true;\r
-                       }\r
-                       set\r
-                       {\r
-                               ViewState["ShowHeader"] = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual bool ShowFooter\r
-               {\r
-                       get\r
-                       {\r
-                               object o = ViewState["ShowFooter"];\r
-                               if(o!=null)\r
-                                       return (bool)o;\r
-                               return true;\r
-                       }\r
-                       set\r
-                       {\r
-                               ViewState["ShowFooter"] = value;\r
-                       }\r
-               }\r
-               \r
-               private DataListItem GetItem(ListItemType itemType, int repeatIndex)\r
-               {\r
-                       throw new NotImplementedException();\r
-               }\r
-               \r
-               /// <summary>\r
-               /// Undocumented\r
-               /// </summary>\r
-               protected override void CreateControlHierarchy(bool create)\r
-               {\r
-                       throw new NotImplementedException();\r
-               }\r
-               \r
-               /// <summary>\r
-               /// Undocumented\r
-               /// </summary>\r
-               protected override void PrepareControlHierarchy()\r
-               {\r
-                       throw new NotImplementedException();\r
-               }\r
-               \r
-               bool IRepeatInfoUser.HasFooter\r
-               {\r
-                       get\r
-                       {\r
-                               return !(ShowFooter && footerTemplate!=null);\r
-                       }\r
-               }\r
-               \r
-               bool IRepeatInfoUser.HasHeader\r
-               {\r
-                       get\r
-                       {\r
-                               return !(ShowHeader && headerTemplate!=null);\r
-                       }\r
-               }\r
-               \r
-               bool IRepeatInfoUser.HasSeparators\r
-               {\r
-                       get\r
-                       {\r
-                               return (separatorTemplate!=null);\r
-                       }\r
-               }\r
-               \r
-               int IRepeatInfoUser.RepeatedItemCount\r
-               {\r
-                       get\r
-                       {\r
-                               if(itemsArray!=null)\r
-                                       return itemsArray.Count;\r
-                               return 0;\r
-                       }\r
-               }\r
-               \r
-               void IRepeatInfoUser.RenderItem(ListItemType itemType, int repeatIndex, RepeatInfo repeatInfo, HtmlTextWriter writer)\r
-               {\r
-                       DataListItem item = GetItem(itemType, repeatIndex);\r
-                       if(item!=null)\r
-                       {\r
-                               item.RenderItem(writer, extractTemplateRows, repeatInfo.RepeatLayout == RepeatLayout.Table);\r
-                       }\r
-               }\r
-               \r
-               Style IRepeatInfoUser.GetItemStyle(ListItemType itemType, int repeatIndex)\r
-               {\r
-                       if(GetItem(itemType, repeatIndex)!=null && ControlStyleCreated)\r
-                               return ControlStyle;\r
-                       return null;\r
-               }\r
-       }\r
-}\r
+//
+// System.Web.UI.WebControls.DataList.cs
+//
+// Authors:
+//   Gaurav Vaish (gvaish@iitk.ac.in)
+//   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
+//
+// (C) Gaurav Vaish (2002)
+// (C) 2003 Andreas Nahr
+//
+
+//
+// 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.
+//
+
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.ComponentModel.Design;
+using System.Web;
+using System.Web.UI;
+using System.Web.Util;
+
+namespace System.Web.UI.WebControls
+{
+       [Designer("System.Web.UI.Design.WebControls.DataListDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))]
+       [Editor ("System.Web.UI.Design.WebControls.DataListComponentEditor, " + Consts.AssemblySystem_Design, typeof (ComponentEditor))]
+       public class DataList: BaseDataList, INamingContainer, IRepeatInfoUser
+       {
+               public const string CancelCommandName = "Cancel";
+               public const string DeleteCommandName = "Delete";
+               public const string EditCommandName   = "Edit";
+               public const string SelectCommandName = "Select";
+               public const string UpdateCommandName = "Update";
+
+               static readonly object CancelCommandEvent = new object ();
+               static readonly object DeleteCommandEvent = new object ();
+               static readonly object EditCommandEvent   = new object ();
+               static readonly object ItemCommandEvent   = new object ();
+               static readonly object ItemCreatedEvent   = new object ();
+               static readonly object ItemDataBoundEvent = new object ();
+               static readonly object UpdateCommandEvent = new object ();
+
+               TableItemStyle alternatingItemStyle;
+               TableItemStyle editItemStyle;
+               TableItemStyle footerStyle;
+               TableItemStyle headerStyle;
+               TableItemStyle itemStyle;
+               TableItemStyle selectedItemStyle;
+               TableItemStyle separatorStyle;
+
+               ITemplate alternatingItemTemplate;
+               ITemplate editItemTemplate;
+               ITemplate footerTemplate;
+               ITemplate headerTemplate;
+               ITemplate itemTemplate;
+               ITemplate selectedItemTemplate;
+               ITemplate separatorTemplate;
+
+               ArrayList itemsArray;
+               DataListItemCollection items;
+
+               bool extractTemplateRows;
+
+               public DataList ()
+               {
+               }
+
+               [DefaultValue (null)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               [NotifyParentProperty (true)]
+               [WebCategory ("Style")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The style applied to alternating items.")]
+               public virtual TableItemStyle AlternatingItemStyle {
+                       get {
+                               if (alternatingItemStyle == null) {
+                                       alternatingItemStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               alternatingItemStyle.TrackViewState ();
+                               }
+
+                               return alternatingItemStyle;
+                       }
+               }
+
+               [Browsable (false)]
+               [DefaultValue (null)]
+               [TemplateContainer (typeof (DataListItem))]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The template used for alternating items.")]
+               public virtual ITemplate AlternatingItemTemplate {
+                       get { return alternatingItemTemplate; }
+                       set { alternatingItemTemplate = value; }
+               }
+
+               [DefaultValue (-1)]
+               [WebCategory ("Misc")]
+               [WebSysDescription ("The index of the item shown in edit mode.")]
+               public virtual int EditItemIndex {
+                       get {
+                               object o = ViewState ["EditItemIndex"];
+                               if (o != null)
+                                       return (int) o;
+
+                               return -1;
+                       }
+
+                       set {
+                               if (value < -1)
+                                        throw new ArgumentOutOfRangeException("value");
+                                
+                               ViewState ["EditItemIndex"] = value; 
+                       }
+               }
+
+               [DefaultValue (null)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               [NotifyParentProperty (true)]
+               [WebCategory ("Style")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The style applied to items in edit mode.")]
+               public virtual TableItemStyle EditItemStyle {
+                       get {
+                               if (editItemStyle == null) {
+                                       editItemStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               editItemStyle.TrackViewState ();
+                               }
+
+                               return editItemStyle;
+                       }
+               }
+
+               [Browsable (false)]
+               [DefaultValue (null)]
+               [TemplateContainer (typeof (DataListItem))]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The template used for items in edit mode.")]
+               public virtual ITemplate EditItemTemplate {
+                       get { return editItemTemplate; }
+                       set { editItemTemplate = value; }
+               }
+
+
+               [DefaultValue (false), WebCategory ("Misc")]
+               [WebSysDescription ("Extract rows in the template.")]
+               public virtual bool ExtractTemplateRows {
+                       get {
+                               object o = ViewState ["ExtractTemplateRows"];
+                               if (o != null)
+                                       return (bool) o;
+
+                               return false;
+                       }
+
+                       set { ViewState ["ExtractTemplateRows"] = value; }
+               }
+
+               [DefaultValue (null)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               [NotifyParentProperty (true)]
+               [WebCategory ("Style")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The style applied to the footer.")]
+               public virtual TableItemStyle FooterStyle {
+                       get {
+                               if (footerStyle == null) {
+                                       footerStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               footerStyle.TrackViewState ();
+                               }
+
+                               return footerStyle;
+                       }
+               }
+
+               [Browsable (false)]
+               [DefaultValue (null)]
+               [TemplateContainer (typeof (DataListItem))]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The template used for the footer.")]
+               public virtual ITemplate FooterTemplate {
+                       get { return footerTemplate; }
+                       set { footerTemplate = value; }
+               }
+
+               [DefaultValue (typeof (GridLines), "None")]
+               public override GridLines GridLines {
+                       get { return base.GridLines; }
+                       set { base.GridLines = value; }
+               }
+
+               [DefaultValue (null)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               [NotifyParentProperty (true)]
+               [WebCategory ("Style")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The style applied to the header.")]
+               public virtual TableItemStyle HeaderStyle {
+                       get {
+                               if (headerStyle == null) {
+                                       headerStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               headerStyle.TrackViewState ();
+                               }
+
+                               return headerStyle;
+                       }
+               }
+
+               [Browsable (false)]
+               [DefaultValue (null)]
+               [TemplateContainer (typeof (DataListItem))]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The template used for the header.")]
+               public virtual ITemplate HeaderTemplate {
+                       get { return headerTemplate; }
+                       set { headerTemplate = value; }
+               }
+
+               [Browsable (false)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               [WebSysDescription ("A colletion containing all items.")]
+               public virtual DataListItemCollection Items {
+                       get {
+                               if (items == null) {
+                                       if (itemsArray == null) {
+                                               EnsureChildControls ();
+                                               itemsArray = new ArrayList ();
+                                       }
+                                       items = new DataListItemCollection (itemsArray);
+                               }
+
+                               return items;
+                       }
+               }
+
+               [DefaultValue (null)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               [NotifyParentProperty (true)]
+               [WebCategory ("Style")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The style applied to items.")]
+               public virtual TableItemStyle ItemStyle {
+                       get {
+                               if (itemStyle == null) {
+                                       itemStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               itemStyle.TrackViewState ();
+                               }
+
+                               return itemStyle;
+                       }
+               }
+
+               [Browsable (false)]
+               [DefaultValue (null)]
+               [TemplateContainer (typeof (DataListItem))]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The template used for items.")]
+               public virtual ITemplate ItemTemplate {
+                       get { return itemTemplate; }
+                       set { itemTemplate = value; }
+               }
+
+
+               [DefaultValue (0), Bindable (true), WebCategory ("Layout")]
+               [WebSysDescription ("The number of columns that should be used.")]
+               public virtual int RepeatColumns {
+                       get {
+                               object o = ViewState ["RepeatColumns"];
+                               if (o != null)
+                                       return (int) o;
+
+                               return 0;
+                       }
+                       set {
+                               if (value < 0)
+                                       throw new ArgumentOutOfRangeException ("value", "RepeatColumns value has to be 0 for 'not set' or > 0.");
+
+                               ViewState ["RepeatColumns"] = value;
+                       }
+               }
+
+               [DefaultValue (typeof (RepeatDirection), "Vertical"), Bindable (true), WebCategory ("Layout")]
+               [WebSysDescription ("Which direction should be used when filling the columns.")]
+               public virtual RepeatDirection RepeatDirection {
+                       get {
+                               object o = ViewState ["RepeatDirection"];
+                               if (o != null)
+                                       return (RepeatDirection) o;
+
+                               return RepeatDirection.Vertical;
+                       }
+                       set {
+                               if (!Enum.IsDefined (typeof (RepeatDirection), value))
+                                       throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");
+
+                               ViewState ["RepeatDirection"] = value;
+                       }
+               }
+
+               [DefaultValue (typeof (RepeatLayout), "Table"), Bindable (true), WebCategory ("Layout")]
+               [WebSysDescription ("The type of layout - mechanism that is used.")]
+               public virtual RepeatLayout RepeatLayout {
+                       get {
+                               object o = ViewState ["RepeatLayout"];
+                               if (o != null)
+                                       return (RepeatLayout) o;
+
+                               return RepeatLayout.Table;
+                       }
+                       set {
+                               if (!Enum.IsDefined (typeof (RepeatLayout), value))
+                                       throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");
+
+                               ViewState ["RepeatLayout"] = value;
+                       }
+               }
+
+               [DefaultValue (-1), Bindable (true)]
+               [WebSysDescription ("The currently selected item index number.")]
+               public virtual int SelectedIndex {
+                       get {
+                               object o = ViewState ["SelectedIndex"];
+                               if (o != null)
+                                       return (int) o;
+
+                               return -1;
+                       }
+                       set {
+                               //FIXME: Looks like a bug in Microsoft's specs.
+                               // Exception is missing in document. I haven't tested the case
+                               // But I think exception should follow
+                               if (value < -1)
+                                       throw new ArgumentOutOfRangeException("value");
+
+                               int prevSel = SelectedIndex;
+                               ViewState ["SelectedIndex"] = value;
+                               DataListItem prevSelItem;
+                               ListItemType liType;
+
+                               if (itemsArray != null) {
+                                       if (prevSel >= 0 && prevSel < itemsArray.Count) {
+                                               prevSelItem = (DataListItem) itemsArray [prevSel];
+                                               if (prevSelItem.ItemType != ListItemType.EditItem) {
+                                                       liType = ((prevSel % 2) == 0 ? ListItemType.AlternatingItem :
+                                                                                      ListItemType.Item);
+
+                                                       prevSelItem.SetItemType (liType);
+                                               }
+                                       }
+
+                                       if (value >= 0 && value < itemsArray.Count) {
+                                               prevSelItem = (DataListItem) itemsArray [value];
+                                               if (prevSelItem.ItemType != ListItemType.EditItem) {
+                                                       prevSelItem.SetItemType (ListItemType.SelectedItem);
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               [Browsable (false)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               [WebSysDescription ("The currently selected item.")]
+               public virtual DataListItem SelectedItem {
+                       get {
+                               if (SelectedIndex == -1)
+                                       return null;
+
+                               return Items [SelectedIndex];
+                       }
+               }
+
+               [DefaultValue (null)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               [NotifyParentProperty (true)]
+               [WebCategory ("Style")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The style used for the currently selected item.")]
+               public virtual TableItemStyle SelectedItemStyle {
+                       get {
+                               if (selectedItemStyle == null) {
+                                       selectedItemStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               selectedItemStyle.TrackViewState ();
+                               }
+
+                               return selectedItemStyle;
+                       }
+               }
+
+               [Browsable (false)]
+               [DefaultValue (null)]
+               [TemplateContainer (typeof (DataListItem))]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The template used for currently selected items.")]
+               public virtual ITemplate SelectedItemTemplate {
+                       get { return selectedItemTemplate; }
+                       set { selectedItemTemplate = value; }
+               }
+
+               [DefaultValue (null)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               [NotifyParentProperty (true)]
+               [WebCategory ("Style")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The style applied to separators.")]
+               public virtual TableItemStyle SeparatorStyle {
+                       get {
+                               if (separatorStyle == null) {
+                                       separatorStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               separatorStyle.TrackViewState ();
+                               }
+
+                               return separatorStyle;
+                       }
+               }
+
+               [Browsable (false)]
+               [DefaultValue (null)]
+               [TemplateContainer (typeof (DataListItem))]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [WebSysDescription ("The template used for separators.")]
+               public virtual ITemplate SeparatorTemplate {
+                       get { return separatorTemplate; }
+                       set { separatorTemplate = value; }
+               }
+
+               [DefaultValue (true), Bindable (true), WebCategory ("Appearance")]
+               [WebSysDescription ("Display the header for the DataList.")]
+               public virtual bool ShowHeader {
+                       get {
+                               object o = ViewState ["ShowHeader"];
+                               if (o != null)
+                                       return (bool) o;
+
+                               return true;
+                       }
+                       set { ViewState ["ShowHeader"] = value; }
+               }
+
+               [DefaultValue (true), Bindable (true), WebCategory ("Appearance")]
+               [WebSysDescription ("Display the footer for the DataList.")]
+               public virtual bool ShowFooter {
+                       get {
+                               object o = ViewState ["ShowFooter"];
+                               if (o != null)
+                                       return (bool) o;
+
+                               return true;
+                       }
+                       set
+                       {
+                               ViewState["ShowFooter"] = value;
+                       }
+               }
+
+               [WebCategory ("Action")]
+               [WebSysDescription ("Raised when a cancel command is generated.")]
+               public event DataListCommandEventHandler CancelCommand {
+                       add { Events.AddHandler (CancelCommandEvent, value); }
+                       remove { Events.RemoveHandler (CancelCommandEvent, value); }
+               }
+
+               [WebCategory ("Action")]
+               [WebSysDescription ("Raised when a delete command is generated.")]
+               public event DataListCommandEventHandler DeleteCommand {
+                       add { Events.AddHandler (DeleteCommandEvent, value); }
+                       remove { Events.RemoveHandler (DeleteCommandEvent, value); }
+               }
+
+               [WebCategory ("Action")]
+               [WebSysDescription ("Raised when an edit command is generated.")]
+               public event DataListCommandEventHandler EditCommand {
+                       add { Events.AddHandler (EditCommandEvent, value); }
+                       remove { Events.RemoveHandler (EditCommandEvent, value); }
+               }
+
+               [WebCategory ("Action")]
+               [WebSysDescription ("Raised when an item command is generated.")]
+               public event DataListCommandEventHandler ItemCommand {
+                       add { Events.AddHandler (ItemCommandEvent, value); }
+                       remove { Events.RemoveHandler (ItemCommandEvent, value); }
+               }
+
+               [WebCategory ("Behavior")]
+               [WebSysDescription ("Raised when a new item is created.")]
+               public event DataListItemEventHandler ItemCreated {
+                       add { Events.AddHandler (ItemCreatedEvent, value); }
+                       remove { Events.RemoveHandler (ItemCreatedEvent, value); }
+               }
+
+               [WebCategory ("Behavior")]
+               [WebSysDescription ("Raised when a item gets data-bound.")]
+               public event DataListItemEventHandler ItemDataBound {
+                       add { Events.AddHandler (ItemDataBoundEvent, value); }
+                       remove { Events.RemoveHandler (ItemDataBoundEvent, value); }
+               }
+
+               [WebCategory ("Action")]
+               [WebSysDescription ("Raised when an update command is generated.")]
+               public event DataListCommandEventHandler UpdateCommand {
+                       add { Events.AddHandler (UpdateCommandEvent, value); }
+                       remove { Events.RemoveHandler (UpdateCommandEvent, value); }
+               }
+
+               protected override Style CreateControlStyle ()
+               {
+                       TableStyle retVal = new TableStyle (ViewState);
+                       retVal.CellSpacing = 0;
+                       return retVal;
+               }
+
+               protected override void LoadViewState (object savedState)
+               {
+                       if (savedState == null)
+                               return;
+
+                       object [] states = (object []) savedState;
+
+                       if (states [0] != null)
+                               base.LoadViewState (states [0]);
+                       if (states [1] != null)
+                               alternatingItemStyle.LoadViewState (states [1]);
+                       if (states [2] != null)
+                               editItemStyle.LoadViewState (states [2]);
+                       if (states [3] != null)
+                               footerStyle.LoadViewState (states [3]);
+                       if (states [4] != null)
+                               headerStyle.LoadViewState (states [4]);
+                       if (states [5] != null)
+                               itemStyle.LoadViewState (states [5]);
+                       if (states [6] != null)
+                               selectedItemStyle.LoadViewState (states [6]);
+                       if (states [7] != null)
+                               separatorStyle.LoadViewState (states [7]);
+               }
+
+               protected override object SaveViewState()
+               {
+                       object [] states = new object [8];
+                       states [0] = base.SaveViewState ();
+                       states [1] = (alternatingItemStyle == null ? null : alternatingItemStyle.SaveViewState ());
+                       states [2] = (editItemStyle == null        ? null : editItemStyle.SaveViewState ());
+                       states [3] = (footerStyle == null          ? null : footerStyle.SaveViewState ());
+                       states [4] = (headerStyle == null          ? null : headerStyle.SaveViewState ());
+                       states [5] = (itemStyle == null            ? null : itemStyle.SaveViewState ());
+                       states [6] = (selectedItemStyle == null    ? null : selectedItemStyle.SaveViewState ());
+                       states [7] = (separatorStyle == null       ? null : separatorStyle.SaveViewState ());
+                       return states;
+               }
+
+               protected override void TrackViewState ()
+               {
+                       base.TrackViewState ();
+                       if (alternatingItemStyle != null)
+                               alternatingItemStyle.TrackViewState ();
+                       if (editItemStyle != null)
+                               editItemStyle.TrackViewState ();
+                       if (footerStyle != null)
+                               footerStyle.TrackViewState ();
+                       if (headerStyle != null)
+                               headerStyle.TrackViewState ();
+                       if (itemStyle != null)
+                               itemStyle.TrackViewState ();
+                       if (selectedItemStyle != null)
+                               selectedItemStyle.TrackViewState ();
+                       if (separatorStyle != null)
+                               separatorStyle.TrackViewState ();
+               }
+
+               protected override bool OnBubbleEvent (object source, EventArgs e)
+               {
+                       if (!(e is DataListCommandEventArgs))
+                               return false;
+
+                       DataListCommandEventArgs args = (DataListCommandEventArgs) e;
+                       OnItemCommand (args);
+                       string cmdName = args.CommandName.ToLower ();
+
+                       if (cmdName == "cancel") {
+                               OnCancelCommand (args);
+                       } else if (cmdName == "delete") {
+                               OnDeleteCommand (args);
+                       } else if (cmdName == "edit") {
+                               OnEditCommand (args);
+                       } else if (cmdName == "select") {
+                               SelectedIndex = args.Item.ItemIndex;
+                               OnSelectedIndexChanged (EventArgs.Empty);
+                       } else if (cmdName == "update") {
+                               OnUpdateCommand (args);
+                       }
+
+                       return true;
+               }
+
+               void InvokeCommandEvent (DataListCommandEventArgs args, object key)
+               {
+                       DataListCommandEventHandler dlceh = (DataListCommandEventHandler) Events [key];
+                       if (dlceh != null)
+                               dlceh (this, args);
+               }
+               
+               void InvokeItemEvent (DataListItemEventArgs args, object key)
+               {
+                       DataListItemEventHandler dlieh = (DataListItemEventHandler) Events [key];
+                       if (dlieh != null)
+                               dlieh (this, args);
+               }
+               
+               protected virtual void OnCancelCommand (DataListCommandEventArgs e)
+               {
+                       InvokeCommandEvent (e, CancelCommandEvent);
+               }
+
+               protected virtual void OnDeleteCommand (DataListCommandEventArgs e)
+               {
+                       InvokeCommandEvent (e, DeleteCommandEvent);
+               }
+
+               protected virtual void OnEditCommand (DataListCommandEventArgs e)
+               {
+                       InvokeCommandEvent (e, EditCommandEvent);
+               }
+
+               protected virtual void OnItemCommand (DataListCommandEventArgs e)
+               {
+                       InvokeCommandEvent (e, ItemCommandEvent);
+               }
+
+               protected virtual void OnItemCreated (DataListItemEventArgs e)
+               {
+                       InvokeItemEvent (e, ItemCreatedEvent);
+               }
+
+               protected virtual void OnItemDataBound (DataListItemEventArgs e)
+               {
+                       InvokeItemEvent (e, ItemDataBoundEvent);
+               }
+
+               protected virtual void OnUpdateCommand (DataListCommandEventArgs e)
+               {
+                       InvokeCommandEvent (e, UpdateCommandEvent);
+               }
+
+               protected override void RenderContents (HtmlTextWriter writer)
+               {
+                       if (Controls.Count == 0)
+                               return;
+
+                       RepeatInfo repeater = new RepeatInfo ();
+                       Table templateTable = null;
+                       if (extractTemplateRows) {
+                               repeater.RepeatDirection = RepeatDirection.Vertical;
+                               repeater.RepeatLayout  = RepeatLayout.Flow;
+                               repeater.RepeatColumns = 1;
+                               repeater.OuterTableImplied = true;
+                               
+                               templateTable = new Table ();
+                               templateTable.ID = ClientID;
+                               templateTable.CopyBaseAttributes (this);
+                               templateTable.ApplyStyle (ControlStyle);
+                               templateTable.RenderBeginTag (writer);
+                       } else {
+                               repeater.RepeatDirection = RepeatDirection;
+                               repeater.RepeatLayout = RepeatLayout;
+                               repeater.RepeatColumns = RepeatColumns;
+                       }
+
+                       repeater.RenderRepeater (writer, this, ControlStyle, this);
+                       if (templateTable != null) {
+                               templateTable.RenderEndTag (writer);
+                       }
+               }
+
+               private DataListItem GetItem (ListItemType itemType, int repeatIndex)
+               {
+                       DataListItem retVal = null;
+                       switch (itemType) {
+                       case ListItemType.Header:
+                               retVal = (DataListItem) Controls [0];
+                               break;
+                       case ListItemType.Footer:
+                               retVal = (DataListItem) Controls [Controls.Count - 1];
+                               break;
+                       case ListItemType.Item:
+                               goto case ListItemType.EditItem;
+                       case ListItemType.AlternatingItem:
+                               goto case ListItemType.EditItem;
+                       case ListItemType.SelectedItem:
+                               goto case ListItemType.EditItem;
+                       case ListItemType.EditItem:
+                               retVal = (DataListItem) itemsArray [repeatIndex];
+                               break;
+                       case ListItemType.Separator:
+                               int index = 2 * repeatIndex + 1;
+                               if (headerTemplate != null)
+                                       index ++;
+                               retVal = (DataListItem) Controls [index];
+                               break;
+                       }
+                       return retVal;
+               }
+
+               /// <summary>
+               /// Undocumented
+               /// </summary>
+               protected override void CreateControlHierarchy (bool useDataSource)
+               {
+                       IEnumerable source = null;
+                       ArrayList dkeys = DataKeysArray;
+
+                       if (itemsArray != null) {
+                               itemsArray.Clear ();
+                       } else {
+                               itemsArray = new ArrayList ();
+                       }
+
+                       extractTemplateRows = ExtractTemplateRows;
+                       if (!useDataSource) {
+                               int count = (int) ViewState ["_!ItemCount"];
+                               if (count != -1) {
+                                       source = new DataSourceInternal (count);
+                                       itemsArray.Capacity = count;
+                               }
+                       } else {
+                               dkeys.Clear ();
+                               source = GetResolvedDataSource ();
+                               if (source is ICollection) {
+                                       dkeys.Capacity = ((ICollection) source).Count;
+                                       itemsArray.Capacity = ((ICollection) source).Count;
+                               }
+                       }
+
+                       int itemCount = 0;
+                       if (source != null) {
+                               int index = 0;
+                               int editIndex = EditItemIndex;
+                               int selIndex = SelectedIndex;
+                               string dataKey = DataKeyField;
+                               
+                               if (headerTemplate != null)
+                                       CreateItem (-1, ListItemType.Header, useDataSource, null);
+
+                               foreach (object current in source) {
+                                       if (useDataSource) {
+                                               try {
+                                                       dkeys.Add (DataBinder.GetPropertyValue (current, dataKey));
+                                               } catch {
+                                                       dkeys.Add (dkeys.Count);
+                                               }
+                                       }
+
+                                       ListItemType type = ListItemType.Item;
+                                       if (index == editIndex) {
+                                               type = ListItemType.EditItem;
+                                       } else if (index == selIndex) {
+                                               type = ListItemType.SelectedItem;
+                                       } else if ((index % 2) != 0) {
+                                               type = ListItemType.AlternatingItem;
+                                       }
+
+                                       itemsArray.Add (CreateItem (index, type, useDataSource, current));
+                                       if (separatorTemplate != null)
+                                               CreateItem (index, ListItemType.Separator, useDataSource, null);
+                                       itemCount++;
+                                       index++;
+                               }
+
+                               if (footerTemplate != null)
+                                       CreateItem (-1, ListItemType.Footer, useDataSource, null);
+                       }
+
+                       if (useDataSource)
+                               ViewState ["_!ItemCount"] = (source != null ? itemCount : -1);
+               }
+
+               /// <summary>
+               /// Undocumented
+               /// </summary>
+               protected virtual DataListItem CreateItem (int itemIndex, ListItemType itemType)
+               {
+                       return new DataListItem (itemIndex, itemType);
+               }
+
+               private DataListItem CreateItem (int itemIndex, ListItemType itemType, bool dataBind, object dataItem)
+               {
+                       DataListItem retVal = CreateItem (itemIndex, itemType);
+                       DataListItemEventArgs e = new DataListItemEventArgs (retVal);
+                       InitializeItem (retVal);
+                       if (dataBind)
+                               retVal.DataItem = dataItem;
+               
+                       OnItemCreated (e);
+                       Controls.Add (retVal);
+
+                       if (dataBind) {
+                               retVal.DataBind ();
+                               OnItemDataBound (e);
+                               retVal.DataItem = null;
+                       }
+
+                       return retVal;
+               }
+
+               /// <summary>
+               /// Undocumented
+               /// </summary>
+               protected override void PrepareControlHierarchy ()
+               {
+                       if (Controls.Count == 0)
+                               return;
+
+                       Style defaultStyle = null;
+                       Style rowStyle = null;
+
+                       if (alternatingItemStyle != null) {
+                               defaultStyle = new TableItemStyle ();
+                               defaultStyle.CopyFrom (itemStyle);
+                               defaultStyle.CopyFrom (alternatingItemStyle);
+                       } else {
+                               defaultStyle = itemStyle;
+                       }
+
+                       foreach (DataListItem current in Controls) {
+                               rowStyle = null;
+                               switch (current.ItemType) {
+                               case ListItemType.Header:
+                                       if (headerStyle != null)
+                                               rowStyle = headerStyle;
+                                       break;
+                               case ListItemType.Footer:
+                                       if (footerStyle != null)
+                                               rowStyle = footerStyle;
+                                       break;
+                               case ListItemType.Separator:
+                                       rowStyle = separatorStyle;
+                                       break;
+                               case ListItemType.Item:
+                                       rowStyle = itemStyle;
+                                       break;
+                               case ListItemType.AlternatingItem:
+                                       rowStyle = defaultStyle;
+                                       break;
+                               case ListItemType.SelectedItem:
+                                       rowStyle = new TableItemStyle ();
+                                       if ((current.ItemIndex % 2) == 0) {
+                                               rowStyle.CopyFrom (itemStyle);
+                                       } else {
+                                               rowStyle.CopyFrom (defaultStyle);
+                                       }
+                                       rowStyle.CopyFrom (selectedItemStyle);
+                                       break;
+                               case ListItemType.EditItem:
+                                       rowStyle = new TableItemStyle ();
+                                       if ((current.ItemIndex % 2) == 0) {
+                                               rowStyle.CopyFrom (itemStyle);
+                                       } else {
+                                               rowStyle.CopyFrom (defaultStyle);
+                                       }
+
+                                       if (current.ItemIndex == SelectedIndex)
+                                               rowStyle.CopyFrom (selectedItemStyle);
+
+                                       rowStyle.CopyFrom (editItemStyle);
+                                       break;
+                               }
+
+                               if (rowStyle == null)
+                                       continue;
+
+                               if (!extractTemplateRows) {
+                                       current.MergeStyle (rowStyle);
+                                       continue;
+                               }
+                               
+                               if (current.HasControls ()) {
+                                       int len = current.Controls.Count;
+                                       for (int i = 0 ; i < len ; i++) {
+                                               Control currentCtrl = current.Controls [i];
+                                               if (!(currentCtrl is Table))
+                                                       continue;
+
+                                               foreach (TableRow cRow in ((Table) currentCtrl).Rows)
+                                                       cRow.MergeStyle (rowStyle);
+                                       }
+                               }
+                       }
+               }
+
+               /// <summary>
+               /// Undocumented
+               /// </summary>
+               protected virtual void InitializeItem (DataListItem item)
+               {
+                       ListItemType type = item.ItemType;
+                       ITemplate template = itemTemplate;
+
+                       switch (type) {
+                       case ListItemType.Header:
+                               template = headerTemplate;
+                               break;
+                       case ListItemType.Footer:
+                               template = footerTemplate;
+                               break;
+                       case ListItemType.AlternatingItem:
+                               if (alternatingItemTemplate != null)
+                                       template = alternatingItemTemplate;
+                               break;
+                       case ListItemType.SelectedItem:
+                               if (selectedItemTemplate != null) {
+                                       template = selectedItemTemplate;
+                                       break;
+                               }
+
+                               if ((item.ItemIndex % 2) != 0)
+                                       goto case ListItemType.AlternatingItem;
+                               break;
+                       case ListItemType.EditItem:
+                               if (editItemTemplate != null) {
+                                       template = editItemTemplate;
+                                       break;
+                               }
+
+                               if (item.ItemIndex == SelectedIndex)
+                                       goto case ListItemType.SelectedItem;
+
+                               if ((item.ItemIndex % 2) != 0)
+                                       goto case ListItemType.AlternatingItem;
+                               break;
+                       case ListItemType.Separator:
+                               template = separatorTemplate;
+                               break;
+                       }
+
+                       if (template != null)
+                               template.InstantiateIn (item);
+               }
+
+               bool IRepeatInfoUser.HasFooter {
+                       get { return (ShowFooter && footerTemplate != null); }
+               }
+
+               bool IRepeatInfoUser.HasHeader {
+                       get { return (ShowHeader && headerTemplate != null); }
+               }
+
+               bool IRepeatInfoUser.HasSeparators {
+                       get { return (separatorTemplate != null); }
+               }
+
+               int IRepeatInfoUser.RepeatedItemCount {
+                       get {
+                               if (itemsArray != null)
+                                       return itemsArray.Count;
+
+                               return 0;
+                       }
+               }
+
+               void IRepeatInfoUser.RenderItem (ListItemType itemType,
+                                                int repeatIndex,
+                                                RepeatInfo repeatInfo,
+                                                HtmlTextWriter writer)
+               {
+                       DataListItem item = GetItem (itemType, repeatIndex);
+                       if (item != null)
+                               item.RenderItem (writer,
+                                                extractTemplateRows,
+                                                (repeatInfo.RepeatLayout == RepeatLayout.Table));
+               }
+
+               Style IRepeatInfoUser.GetItemStyle (ListItemType itemType, int repeatIndex)
+               {
+                       DataListItem item = GetItem (itemType, repeatIndex);
+                       if (item == null || !item.ControlStyleCreated)
+                               return null;
+
+                       return item.ControlStyle;
+               }
+       }
+}
+