* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / DataList.cs
index 40af2d083de91c444be217c0678d39a82c0747f2..39aa0b005f2d436b440fc2e318013697da4e71ae 100644 (file)
@@ -133,14 +133,6 @@ namespace System.Web.UI.WebControls {
                [WebSysDescription ("")]
                [WebCategory ("Misc")]
                public virtual int EditItemIndex {
-#if NET_2_0
-                       get { return editIndex; }
-                       set {
-                               if (value < -1)
-                                       throw new ArgumentOutOfRangeException ("EditItemIndex", "< -1");
-                               editIndex = value;
-                       }
-#else
                        get {
                                object o = ViewState ["EditItemIndex"];
                                return (o == null) ? -1 : (int) o;
@@ -150,7 +142,6 @@ namespace System.Web.UI.WebControls {
                                        throw new ArgumentOutOfRangeException ("EditItemIndex", "< -1");
                                ViewState ["EditItemIndex"] = value;
                        }
-#endif
                }
 
                [DefaultValue (null)]
@@ -319,7 +310,12 @@ namespace System.Web.UI.WebControls {
                                object o = ViewState ["RepeatColumns"];
                                return (o == null) ? 0 : (int) o;
                        }
-                       set { ViewState ["RepeatColumns"] = value; }
+                       set { 
+                               if (value < 0)
+                                       throw new ArgumentOutOfRangeException ("value", "RepeatColumns value has to be 0 for 'not set' or > 0.");
+                               
+                               ViewState ["RepeatColumns"] = value; 
+                       }
                }
 
 #if ONLY_1_1
@@ -355,14 +351,6 @@ namespace System.Web.UI.WebControls {
                [WebSysDescription ("")]
                [WebCategory ("Layout")]
                public virtual int SelectedIndex {
-#if NET_2_0
-                       get { return selectedIndex; }
-                       set {
-                               if (value < -1)
-                                       throw new ArgumentOutOfRangeException ("SelectedIndex", "< -1");
-                               selectedIndex = value;
-                       }
-#else
                        get {
                                object o = ViewState ["SelectedIndex"];
                                return (o == null) ? -1 : (int) o;
@@ -372,7 +360,6 @@ namespace System.Web.UI.WebControls {
                                        throw new ArgumentOutOfRangeException ("SelectedIndex", "< -1");
                                ViewState ["SelectedIndex"] = value;
                        }
-#endif
                }
 
                [Browsable (false)]
@@ -512,7 +499,8 @@ namespace System.Web.UI.WebControls {
                void DoItem (int i, ListItemType t, object d, bool databind)
                {
                        DataListItem itm = CreateItem (i, t);
-                       itm.DataItem = d;
+                       if (databind)
+                               itm.DataItem = d;
                        DataListItemEventArgs e = new DataListItemEventArgs (itm);
                        InitializeItem (itm);
                        
@@ -523,20 +511,22 @@ namespace System.Web.UI.WebControls {
                        Controls.Add (itm);
                        if (i != -1)
                                ItemList.Add (itm);
+
                        OnItemCreated (e);
 
                        if (databind) {
                                itm.DataBind ();
                                OnItemDataBound (e);
+                               itm.DataItem = null;
                        }
                }
 
-               private void DoItemInLoop (int i, object d, bool databind)
+               private void DoItemInLoop (int i, object d, bool databind, ListItemType type)
                {
-                       if (i > 0 && SeparatorTemplate != null)
-                               DoItem (i - 1, ListItemType.Separator, null, databind);
+                       DoItem (i, type, d, databind);
+                       if (SeparatorTemplate != null)
+                               DoItem (i, ListItemType.Separator, null, databind);
 
-                       DoItem (i, i % 2 == 0 ? ListItemType.Item : ListItemType.AlternatingItem, d, databind);
                }
 
                protected override void CreateControlHierarchy (bool useDataSource)
@@ -544,10 +534,18 @@ namespace System.Web.UI.WebControls {
                        Controls.Clear();
 
                        IEnumerable ds = null;
+                       ArrayList keys = null;
 
                        if (useDataSource) {
                                idx = 0;
+#if NET_2_0
+                               if (IsBoundUsingDataSourceID)
+                                       ds = GetData();
+                               else
+#endif
                                ds = DataSourceResolver.ResolveDataSource (DataSource, DataMember);
+                               keys = DataKeysArray;
+                               keys.Clear ();
                        } else {
                                idx = (int) ViewState ["Items"];
                        }
@@ -559,14 +557,36 @@ namespace System.Web.UI.WebControls {
                                DoItem (-1, ListItemType.Header, null, useDataSource);
 
                        // items
+                       int selected_index = SelectedIndex;
+                       int edit_item_index = EditItemIndex;
+                       ListItemType type;
                        if (ds != null) {
+                               string key = DataKeyField;
                                foreach (object o in ds) {
-                                       DoItemInLoop (idx, o, useDataSource);
+                                       if (useDataSource && key != "")
+                                               keys.Add (DataBinder.GetPropertyValue (o, key));
+                                       type = ListItemType.Item;
+                                       if (idx == edit_item_index) 
+                                               type = ListItemType.EditItem;
+                                       else if (idx == selected_index) 
+                                               type = ListItemType.SelectedItem;
+                                       else if (idx % 2 != 0) 
+                                               type = ListItemType.AlternatingItem;
+
+                                       DoItemInLoop (idx, o, useDataSource, type);
                                        idx++;
                                }
                        } else {
                                for (int i = 0; i < idx; i++) {
-                                       DoItemInLoop (i, null, useDataSource);
+                                       type = ListItemType.Item;
+                                       if (idx == edit_item_index) 
+                                               type = ListItemType.EditItem;
+                                       else if (idx == selected_index) 
+                                               type = ListItemType.SelectedItem;
+                                       else if (idx % 2 != 0) 
+                                               type = ListItemType.AlternatingItem;
+
+                                       DoItemInLoop (i, null, useDataSource, type);
                                }
                        }
 
@@ -582,7 +602,9 @@ namespace System.Web.UI.WebControls {
                        // not kept (directly) in the DataList ViewState
                        return new TableStyle ();
 #else
-                       return new TableStyle (ViewState);
+                       TableStyle tableStyle = new TableStyle (ViewState);
+                       tableStyle.CellSpacing = 0;
+                       return tableStyle;
 #endif
                }
 
@@ -610,10 +632,10 @@ namespace System.Web.UI.WebControls {
                        case ListItemType.SelectedItem:
                        case ListItemType.EditItem:
                                int index = item.ItemIndex;
-                               if (SelectedIndex == index)
-                                       t = SelectedItemTemplate;
-                               else if (EditItemIndex == index)
+                               if ((EditItemIndex == index) && (EditItemTemplate != null))
                                        t = EditItemTemplate;
+                               else if ((SelectedIndex == index) && (SelectedItemTemplate != null))
+                                       t = SelectedItemTemplate;
                                else if (((index & 1) == 0) || (alternatingItemTemplate == null))
                                        t = ItemTemplate;
                                else
@@ -628,7 +650,11 @@ namespace System.Web.UI.WebControls {
                protected override void LoadViewState (object savedState)
                {
                        object[] state = (object[]) savedState;
+#if NET_2_0
+                       base.LoadViewState (state [8]);
+#else
                        base.LoadViewState (state [0]);
+#endif
                        if (state [1] != null)
                                ItemStyle.LoadViewState (state [1]);
                        if (state [2] != null)
@@ -644,46 +670,7 @@ namespace System.Web.UI.WebControls {
                        if (state [7] != null)
                                FooterStyle.LoadViewState (state [7]);
                }
-#if NET_2_0
-               protected internal override void LoadControlState (object savedState)
-               {
-                       // FIXME: what's in Triplet.First ?
-                       // ??? maybe a some space for base.LoadControlState ???
-                       if (savedState == null) {
-                               // reset to default values
-                               editIndex = -1;
-                               selectedIndex = -1;
-                       } else {
-                               Triplet t = (Triplet) savedState;
-                               if (t.Second == null) {
-                                       editIndex = -1;
-                               } else {
-                                       editIndex = (int) t.Second;
-                               }
-                               if (t.Third == null) {
-                                       selectedIndex = -1;
-                               } else {
-                                       selectedIndex = (int) t.Third;
-                               }
-                       }
-               }
 
-               protected internal override object SaveControlState ()
-               {
-                       bool e = (editIndex == -1);
-                       bool s = (selectedIndex == -1);
-                       if (e && s)
-                               return null;
-
-                       Triplet t = new Triplet ();
-                       if (!e)
-                               t.Second = editIndex;
-                       if (!s)
-                               t.Third = selectedIndex;
-                       
-                       return (object) t;
-               }
-#endif
                protected override bool OnBubbleEvent (object source, EventArgs e)
                {
                        DataListCommandEventArgs dlca = (e as DataListCommandEventArgs);
@@ -693,6 +680,7 @@ namespace System.Web.UI.WebControls {
                        string cn = dlca.CommandName;
                        CultureInfo inv = CultureInfo.InvariantCulture;
 
+                       OnItemCommand (dlca);
                        if (String.Compare (cn, CancelCommandName, true, inv) == 0) {
                                OnCancelCommand (dlca);
                                return true;
@@ -708,11 +696,7 @@ namespace System.Web.UI.WebControls {
                        } else if (String.Compare (cn, UpdateCommandName, true, inv) == 0) {
                                OnUpdateCommand (dlca);
                                return true;
-                       } else if (String.Compare (cn, "ITEM", true, inv) == 0) {
-                               OnItemCommand (dlca);
-                               return true;
                        }
-                                               
                        return false;
                }
 
@@ -772,8 +756,96 @@ namespace System.Web.UI.WebControls {
                                updateCommand (this, e);
                }
 
+               void ApplyControlStyle (Control ctrl, Style style)
+               {
+                       if (style == null || false == ctrl.HasControls ())
+                               return;
+
+                       foreach (Control c in ctrl.Controls) {
+                               if (c is Table) {
+                                       Table tbl = (Table) c;
+                                       foreach (TableRow row in tbl.Rows)
+                                               row.MergeStyle (style);
+                               }
+                       }
+               }
+
                protected override void PrepareControlHierarchy ()
                {
+                       if (!HasControls () || Controls.Count == 0)
+                               return; // No one called CreateControlHierarchy() with DataSource != null
+
+                       Style alt = null;
+                       foreach (DataListItem item in Controls) {
+                               switch (item.ItemType) {
+                               case ListItemType.Item:
+                                       item.MergeStyle (itemStyle);
+                                       ApplyControlStyle (item, itemStyle);
+                                       break;
+                               case ListItemType.AlternatingItem:
+                                       if (alt == null) {
+                                               if (alternatingItemStyle != null) {
+                                                       alt = new TableItemStyle ();
+                                                       alt.CopyFrom (itemStyle);
+                                                       alt.CopyFrom (alternatingItemStyle);
+                                               } else {
+                                                       alt = itemStyle;
+                                               }
+                                       }
+
+                                       item.MergeStyle (alt);
+                                       ApplyControlStyle (item, alt);
+                                       break;
+                               case ListItemType.EditItem:
+                                       if (editItemStyle != null) {
+                                               item.MergeStyle (editItemStyle);
+                                               ApplyControlStyle (item, editItemStyle);
+                                       } else {
+                                               item.MergeStyle (itemStyle);
+                                               ApplyControlStyle (item, itemStyle);
+                                       }
+                                       break;
+                               case ListItemType.Footer:
+                                       if (!ShowFooter) {
+                                               item.Visible = false;
+                                               break;
+                                       }
+                                       if (footerStyle != null) {
+                                               item.MergeStyle (footerStyle);
+                                               ApplyControlStyle (item, footerStyle);
+                                       }
+                                       break;
+                               case ListItemType.Header:
+                                       if (!ShowHeader) {
+                                               item.Visible = false;
+                                               break;
+                                       }
+                                       if (headerStyle != null) {
+                                               item.MergeStyle (headerStyle);
+                                               ApplyControlStyle (item, headerStyle);
+                                       }
+                                       break;
+                               case ListItemType.SelectedItem:
+                                       if (selectedItemStyle != null) {
+                                               item.MergeStyle (selectedItemStyle);
+                                               ApplyControlStyle (item, selectedItemStyle);
+                                       } else {
+                                               item.MergeStyle (itemStyle);
+                                               ApplyControlStyle (item, itemStyle);
+                                       }
+                                       break;
+                               case ListItemType.Separator:
+                                       if (separatorStyle != null) {
+                                               item.MergeStyle(separatorStyle);
+                                               ApplyControlStyle (item, separatorStyle);
+                                       }
+                                       else {
+                                               item.MergeStyle (itemStyle);
+                                               ApplyControlStyle (item, itemStyle);
+                                       }
+                                       break;
+                               }
+                       }
                }
 
 #if NET_2_0
@@ -783,10 +855,16 @@ namespace System.Web.UI.WebControls {
 #endif         
                override void RenderContents (HtmlTextWriter writer)
                {
+                       if (Items.Count == 0)
+                               return;                 
+
                        RepeatInfo ri = new RepeatInfo ();
                        ri.RepeatColumns = RepeatColumns;
                        ri.RepeatDirection = RepeatDirection;
                        ri.RepeatLayout = RepeatLayout;
+                       ri.CaptionAlign = CaptionAlign;
+                       ri.Caption = Caption;
+                       ri.UseAccessibleHeader = UseAccessibleHeader;
 /*
 // debugging stuff that I prefer to keep for a while
 Console.WriteLine ("RepeatColumns {0}", ri.RepeatColumns);
@@ -805,15 +883,15 @@ for (int i=0; i < Items.Count; i++) {
                        bool extract = ExtractTemplateRows;
                        if (extract) {
                                ri.OuterTableImplied = true;
-                               writer.AddAttribute (HtmlTextWriterAttribute.Id, ID);
+                               writer.AddAttribute (HtmlTextWriterAttribute.Id, ClientID);
                                if (ControlStyleCreated) {
                                        ControlStyle.AddAttributesToRender (writer);
                                }
                                writer.RenderBeginTag (HtmlTextWriterTag.Table);
-                               ri.RenderRepeater (writer, this, TableStyle, this);
+                               ri.RenderRepeater (writer, this, ControlStyle, this);
                                writer.RenderEndTag ();
                        } else {
-                               ri.RenderRepeater (writer, this, TableStyle, this);
+                               ri.RenderRepeater (writer, this, ControlStyle, this);
                        }
                }
 
@@ -941,43 +1019,39 @@ for (int i=0; i < Items.Count; i++) {
 
                Style IRepeatInfoUser.GetItemStyle (ListItemType itemType, int repeatIndex)
                {
+                       DataListItem item = null;
                        switch (itemType) {
                        case ListItemType.Header:
-                               if (repeatIndex >= Items.Count)
-                                       throw new ArgumentOutOfRangeException ("repeatIndex");
-                               return headerStyle;
                        case ListItemType.Footer:
-                               if (repeatIndex >= Items.Count)
-                                       throw new ArgumentOutOfRangeException ("repeatIndex");
-                               return footerStyle;
+                               if (repeatIndex >= 0 && (!HasControls () || repeatIndex >= Controls.Count))
+                                       throw new ArgumentOutOfRangeException ();
+
+                               item = FindFirstItem (itemType);
+                               break;
                        case ListItemType.Item:
                        case ListItemType.AlternatingItem:
                        case ListItemType.SelectedItem:
                        case ListItemType.EditItem:
-                               if (repeatIndex >= Items.Count)
-                                       throw new ArgumentOutOfRangeException ("repeatIndex");
+                               if (repeatIndex >= 0 && (!HasControls () || repeatIndex >= Controls.Count))
+                                       throw new ArgumentOutOfRangeException ();
 
-                               if (SelectedIndex == repeatIndex)
-                                       return selectedItemStyle;
-
-                               if (EditItemIndex == repeatIndex)
-                                       return editItemStyle;
-
-                               if (((repeatIndex & 1) == 0) || (alternatingItemStyle == null))
-                                       return itemStyle;
-
-                               // alternate style
-                               TableItemStyle alt = new TableItemStyle ();
-                               alt.CopyFrom (itemStyle);
-                               alt.CopyFrom (alternatingItemStyle);
-                               return alt;
+                               item = FindBestItem (repeatIndex);
+                               break;
                        case ListItemType.Separator:
-                               if (repeatIndex >= Items.Count)
-                                       throw new ArgumentOutOfRangeException ("repeatIndex");
-                               return separatorStyle;
+                               if (repeatIndex >= 0 && (!HasControls () || repeatIndex >= Controls.Count))
+                                       throw new ArgumentOutOfRangeException ();
+
+                               item = FindSpecificItem (itemType, repeatIndex);
+                               break;
                        default:
-                               return null;
+                               item = null;
+                               break;
                        }
+
+                       if (item == null || item.ControlStyleCreated == false)
+                               return null;
+
+                       return item.ControlStyle;
                }
 
                // Header and Footer don't have a "real" index (-1)