Merge pull request #4453 from lambdageek/bug-49721
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / TreeNodeCollection.cs
index f412d5339197eb1ca6aa2d928e747212810a5abf..177cd5d73e8137a109884fc17e6d410a597b3d45 100644 (file)
@@ -28,7 +28,6 @@
 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
 //
 
-#if NET_2_0
 
 using System;
 using System.Web.UI;
@@ -66,8 +65,8 @@ namespace System.Web.UI.WebControls
                                node.Tree = tree;
                }
                
-               public TreeNode this [int i] {
-                       get { return (TreeNode) items [i]; }
+               public TreeNode this [int index] {
+                       get { return (TreeNode) items [index]; }
                }
                
                public void Add (TreeNode child)
@@ -78,6 +77,9 @@ namespace System.Web.UI.WebControls
                internal void Add (TreeNode child, bool updateParent)
                {
                        int index = items.Add (child);
+
+                       if (parent != null)
+                               parent.HadChildrenBeforePopulating = true;
                        
                        if (!updateParent)
                                return;
@@ -125,9 +127,9 @@ namespace System.Web.UI.WebControls
                        }
                }
                
-               public bool Contains (TreeNode child)
+               public bool Contains (TreeNode c)
                {
-                       return items.Contains (child);
+                       return items.Contains (c);
                }
                
                public void CopyTo (TreeNode[] nodeArray, int index)
@@ -140,18 +142,18 @@ namespace System.Web.UI.WebControls
                        return items.GetEnumerator ();
                }
                
-               public int IndexOf (TreeNode node)
+               public int IndexOf (TreeNode value)
                {
-                       return items.IndexOf (node);
+                       return items.IndexOf (value);
                }
                
-               public void Remove (TreeNode node)
+               public void Remove (TreeNode value)
                {
-                       int i = IndexOf (node);
+                       int i = IndexOf (value);
                        if (i == -1) return;
                        items.RemoveAt (i);
                        if (tree != null)
-                               node.Tree = null;
+                               value.Tree = null;
                        if (marked) {
                                SetDirty ();
                        }
@@ -196,16 +198,29 @@ namespace System.Web.UI.WebControls
                                items.Clear ();
 
                                for (int n = 1; n < its.Length; n++) {
-                                       TreeNode item = new TreeNode ();
+                                       var pair = its [n] as Pair;
+                                       if (pair == null)
+                                               throw new InvalidOperationException ("Broken view state (item " + n + ")");
+                                       
+                                       TreeNode item;
+                                       Type type = pair.First as Type;
+
+                                       if (type == null)
+                                               item = new TreeNode ();
+                                       else
+                                               item = Activator.CreateInstance (pair.First as Type) as TreeNode;
                                        Add (item);
-                                       object ns = its [n];
+                                       object ns = pair.Second;
                                        if (ns != null)
                                                ((IStateManager) item).LoadViewState (ns);
                                }
                        }
                        else {
                                for (int n = 1; n < its.Length; n++) {
-                                       Pair pair = (Pair) its [n];
+                                       var pair = its [n] as Pair;
+                                       if (pair  == null)
+                                               throw new InvalidOperationException ("Broken view state " + n + ")");
+                                       
                                        int oi = (int) pair.First;
                                        TreeNode node = (TreeNode) items [oi];
                                        ((IStateManager) node).LoadViewState (pair.Second);
@@ -227,7 +242,8 @@ namespace System.Web.UI.WebControls
                                        for (int n = 0; n < items.Count; n++) {
                                                TreeNode node = items [n] as TreeNode;
                                                object ns = ((IStateManager) node).SaveViewState ();
-                                               state [n + 1] = ns;
+                                               Type type = node.GetType ();
+                                               state [n + 1] = new Pair (type == typeof (TreeNode) ? null : type, ns);
                                        }
                                }
                        } else {
@@ -266,4 +282,3 @@ namespace System.Web.UI.WebControls
        }
 }
 
-#endif