Browse Source

* TreeNode.cs: Don't cache the tree_view or index anymore, now
that nodes can be moved from tree to tree easily this just causes
all sorts of problems.
* TreeNodeCollection: Don't need to give treenodes an index and
treeview anymore when they are added, these are computed on the
fly. Also make sure to remove a node before its added.


svn path=/trunk/mcs/; revision=52522

Jackson Harper 20 years ago
parent
commit
d46aedeb9c

+ 21 - 18
mcs/class/Managed.Windows.Forms/System.Windows.Forms/TreeNode.cs

@@ -36,7 +36,6 @@ namespace System.Windows.Forms {
 		#region Fields
 		private TreeView tree_view;
 		internal TreeNode parent;
-		private int index;
 
 		private string text;
 		private int image_index = -1;
@@ -259,6 +258,7 @@ namespace System.Windows.Forms {
 			get {
 				if (parent == null)
 					return null;
+				int index = Index;
 				if (parent.Nodes.Count > index + 1)
 					return parent.Nodes [index + 1];
 				return null;
@@ -305,6 +305,7 @@ namespace System.Windows.Forms {
 
 		public TreeNode Parent {
 			get {
+				TreeView tree_view = TreeView;
 				if (tree_view != null && tree_view.root_node == parent)
 					return null;
 				return parent;
@@ -315,7 +316,8 @@ namespace System.Windows.Forms {
 			get {
 				if (parent == null)
 					return null;
-				if (index == 0 || index > parent.Nodes.Count)
+				int index = Index;
+				if (index <= 0 || index > parent.Nodes.Count)
 					return null;
 				return parent.Nodes [index - 1];
 			}
@@ -370,17 +372,19 @@ namespace System.Windows.Forms {
 				TreeNode walk = parent;
 				while (walk != null) {
 					if (walk.TreeView != null)
-						tree_view = walk.TreeView;
+						break;
 					walk = walk.parent;
 				}
-				return tree_view;
+				if (walk == null)
+					return null;
+				return walk.TreeView;
 			}
 		}
 
                 public IntPtr Handle {
 			get {
 				// MS throws a NullReferenceException if the TreeView isn't set...
-				if (handle == IntPtr.Zero)
+				if (handle == IntPtr.Zero && TreeView != null)
 					handle = TreeView.CreateNodeHandle ();
 				return handle;
 			}
@@ -450,7 +454,8 @@ namespace System.Windows.Forms {
 		public void Remove () {
 			if (parent == null)
 				return;
-			parent.Nodes.RemoveAt (Index);
+			int index = Index;
+			parent.Nodes.RemoveAt (index);
 		}
 
 		public void Toggle () {
@@ -470,6 +475,7 @@ namespace System.Windows.Forms {
 
 		internal bool IsRoot {
 			get {
+				TreeView tree_view = TreeView;
 				if (tree_view == null)
 					return false;
 				if (tree_view.root_node == this)
@@ -484,14 +490,18 @@ namespace System.Windows.Forms {
 				return false;
 
 			if (parent.BuildFullPath (path))
-				path.Append (tree_view.PathSeparator);
+				path.Append (TreeView.PathSeparator);
 
 			path.Append (text);
 			return true;
 		}
 
 		public int Index {
-			get { return index; }
+			get {
+				if (parent == null)
+					return -1;
+				return parent.Nodes.IndexOf (this);
+			}
 		}
 
 		private void Expand (bool byInternal)
@@ -519,7 +529,7 @@ namespace System.Windows.Forms {
 			if (!is_expanded)
 				return;
 
-			if (tree_view != null && tree_view.root_node == this)
+			if (IsRoot)
 				return;
 
 			bool cancel = false;
@@ -631,16 +641,9 @@ namespace System.Windows.Forms {
 			bounds.Y = y;
 		}
 
-		internal void SetAddedData (TreeView tree_view, TreeNode parent, int index)
+		internal void SetParent (TreeNode parent)
 		{
-			this.tree_view = tree_view;
 			this.parent = parent;
-			this.index = index;
-		}
-
-		internal void SetIndex (int index)
-		{
-			this.index = index;
 		}
 
 		private bool IsInClippingRect
@@ -648,7 +651,7 @@ namespace System.Windows.Forms {
 			get {
 				if (TreeView == null)
 					return false;
-				if (bounds.Y < 0 && bounds.Y > tree_view.ClientRectangle.Height)
+				if (bounds.Y < 0 && bounds.Y > TreeView.ClientRectangle.Height)
 					return false;
 				return true;
 			}

+ 13 - 19
mcs/class/Managed.Windows.Forms/System.Windows.Forms/TreeNodeCollection.cs

@@ -35,7 +35,7 @@ namespace System.Windows.Forms {
 
 		private static readonly int OrigSize = 50;
 
-		private TreeNode owner;
+		public TreeNode owner;
 		private int count;
 		private TreeNode [] nodes;
 
@@ -81,7 +81,7 @@ namespace System.Windows.Forms {
 				if (index < 0 || index >= Count)
 					throw new ArgumentOutOfRangeException ("index");
 				TreeNode node = (TreeNode) value;
-				SetData (node);
+				node.parent = owner;
 				nodes [index] = node;
 			}
 		}
@@ -95,7 +95,7 @@ namespace System.Windows.Forms {
 			set {
 				if (index < 0 || index >= Count)
 					throw new ArgumentOutOfRangeException ("index");
-				SetData (value);
+				value.parent = owner;
 				nodes [index] = value;
 			}
 		}
@@ -112,9 +112,12 @@ namespace System.Windows.Forms {
 			if (node == null)
 				throw new ArgumentNullException("node");
 
+			// Remove it from any old parents
+			node.Remove ();
+
 			if (owner != null && owner.TreeView != null && owner.TreeView.Sorted)
 				return AddSorted (node);
-			SetData (node);
+			node.parent = owner;
 			if (count >= nodes.Length)
 				Grow ();
 			nodes [count++] = node;
@@ -168,7 +171,7 @@ namespace System.Windows.Forms {
 
 		public virtual void Insert (int index, TreeNode node)
 		{
-			SetData (node);
+			node.parent = owner;
 
 			if (count >= nodes.Length)
 				Grow ();
@@ -188,12 +191,15 @@ namespace System.Windows.Forms {
 		public virtual void RemoveAt (int index)
 		{
 			TreeNode removed = nodes [index];
+			TreeNode parent = removed.parent;
+			removed.parent = null;
+
 			Array.Copy (nodes, index + 1, nodes, index, count - index);
 			count--;
 			if (nodes.Length > OrigSize && nodes.Length > (count * 2))
 				Shrink ();
 			if (owner.TreeView != null)
-				owner.TreeView.UpdateNode (removed);
+				owner.TreeView.UpdateBelow (parent);
 		}
 
 		int IList.Add (object node)
@@ -246,12 +252,11 @@ namespace System.Windows.Forms {
 			// Move the nodes up and adjust their indices
 			for (int i = count - 1; i >= pos; i--) {
 				nodes [i + 1] = nodes [i];
-				nodes [i + 1].SetIndex (i + 1);
 			}
 			count++;
 			nodes [pos] = node;
 
-			SetData (node, pos);
+			node.parent = owner;
 			return count;
 		}
 
@@ -261,21 +266,10 @@ namespace System.Windows.Forms {
 			Array.Sort (nodes, 0, count, new TreeNodeComparer (Application.CurrentCulture.CompareInfo));
 
 			for (int i = 0; i < count; i++) {
-				nodes [i].SetIndex (i);
 				nodes [i].Nodes.Sort ();
 			}
 		}
 
-		private void SetData (TreeNode node)
-		{
-			SetData (node, count);
-		}
-
-		private void SetData (TreeNode node, int pos)
-		{
-			node.SetAddedData ((owner != null ? owner.TreeView : null), owner, pos);
-		}
-
 		private void Grow ()
 		{
 			TreeNode [] nn = new TreeNode [nodes.Length + 50];