// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
//
-#if NET_2_0
using System;
using System.Web.UI;
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)
{
- child.Index = items.Add (child);
+ Add (child, true);
+ }
+
+ internal void Add (TreeNode child, bool updateParent)
+ {
+ int index = items.Add (child);
+
+ if (parent != null)
+ parent.HadChildrenBeforePopulating = true;
+
+ if (!updateParent)
+ return;
+
+ child.Index = index;
child.SetParent (parent);
child.Tree = tree;
if (marked) {
((IStateManager)child).TrackViewState ();
- child.SetDirty ();
- dirty = true;
+ SetDirty ();
}
}
((TreeNode)items[n]).Index = n;
if (marked) {
((IStateManager)child).TrackViewState ();
- child.SetDirty ();
- dirty = true;
+ SetDirty ();
}
}
}
}
items.Clear ();
- dirty = true;
+ if (marked) {
+ dirty = true;
+ }
}
- 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)
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;
- dirty = true;
+ value.Tree = null;
+ if (marked) {
+ SetDirty ();
+ }
}
public void RemoveAt (int index)
items.RemoveAt (index);
if (tree != null)
node.Tree = null;
- dirty = true;
+ if (marked) {
+ SetDirty ();
+ }
}
public int Count {
dirty = (bool)its [0];
- if (dirty)
+ if (dirty) {
items.Clear ();
- for (int n=1; n<its.Length; n++) {
- Pair pair = (Pair) its [n];
- int oi = (int) pair.First;
- TreeNode node;
- if (oi != -1)
- node = (TreeNode) items [oi];
- else
- node = new TreeNode ();
- if (dirty) Add (node);
- ((IStateManager)node).LoadViewState (pair.Second);
+ for (int n = 1; n < its.Length; n++) {
+ 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 = pair.Second;
+ if (ns != null)
+ ((IStateManager) item).LoadViewState (ns);
+ }
}
+ else {
+ for (int n = 1; n < its.Length; 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);
+ }
+ }
+
}
object IStateManager.SaveViewState ()
bool hasData = false;
if (dirty) {
- state = new object [items.Count + 1];
- state [0] = true;
- for (int n=0; n<items.Count; n++) {
- TreeNode node = items[n] as TreeNode;
- object ns = ((IStateManager)node).SaveViewState ();
- if (ns != null) hasData = true;
- state [n + 1] = new Pair (-1, ns);
+ if (items.Count > 0) {
+ hasData = true;
+ state = new object [items.Count + 1];
+ state [0] = true;
+ for (int n = 0; n < items.Count; n++) {
+ TreeNode node = items [n] as TreeNode;
+ object ns = ((IStateManager) node).SaveViewState ();
+ Type type = node.GetType ();
+ state [n + 1] = new Pair (type == typeof (TreeNode) ? null : type, ns);
+ }
}
} else {
ArrayList list = new ArrayList ();
}
}
-#endif