New tests.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / TreeNodeCollection.cs
index 16005105dd5aa273327d3505f09f5df44ba84856..007fb1ef029e4f426ad89f082548df2a0de34c21 100644 (file)
@@ -142,7 +142,11 @@ namespace System.Windows.Forms {
                        }
 
                        SetupNode (node);
-
+#if NET_2_0
+                       // UIA Framework Event: Collection Changed
+                       if (tree_view != null)
+                               tree_view.OnUIACollectionChanged (owner, new CollectionChangeEventArgs (CollectionChangeAction.Add, node));
+#endif
                        return res;
                }
 
@@ -212,8 +216,6 @@ namespace System.Windows.Forms {
                        if (owner != null) {
                                tree_view = owner.TreeView;
                                if (tree_view != null) {
-                                       tree_view.highlighted_node = null;
-                                       tree_view.selected_node = null;
                                        tree_view.UpdateBelow (owner);
                                        tree_view.RecalculateVisibleOrder (owner);
                                        tree_view.UpdateScrollBars (false);
@@ -223,7 +225,7 @@ namespace System.Windows.Forms {
 
                public bool Contains (TreeNode node)
                {
-                       return (Array.BinarySearch (nodes, node) > 0);
+                       return Array.IndexOf (nodes, node, 0, count) != -1;
                }
 #if NET_2_0
                public virtual bool ContainsKey (string key)
@@ -351,6 +353,7 @@ namespace System.Windows.Forms {
                        TreeNode removed = nodes [index];
                        TreeNode prev = GetPrevNode (removed);
                        TreeNode new_selected = null;
+                       bool re_set_selected = false;
                        bool visible = removed.IsVisible;
 
                        TreeView tree_view = null;
@@ -361,13 +364,14 @@ namespace System.Windows.Forms {
                                tree_view.RecalculateVisibleOrder (prev);
 
                                if (removed == tree_view.SelectedNode) {
+                                       re_set_selected = true;
                                        OpenTreeNodeEnumerator oe = new OpenTreeNodeEnumerator (removed);
                                        if (oe.MoveNext () && oe.MoveNext ()) {
                                                new_selected = oe.CurrentNode;
                                        } else {
                                                oe = new OpenTreeNodeEnumerator (removed);
                                                oe.MovePrevious ();
-                                               new_selected = oe.CurrentNode;
+                                               new_selected = oe.CurrentNode == removed ? null : oe.CurrentNode;
                                        }
                                }
                        }
@@ -380,7 +384,7 @@ namespace System.Windows.Forms {
                        if (nodes.Length > OrigSize && nodes.Length > (count * 2))
                                Shrink ();
 
-                       if (tree_view != null && new_selected != null) {
+                       if (tree_view != null && re_set_selected) {
                                tree_view.SelectedNode = new_selected;
                        }
 
@@ -392,6 +396,11 @@ namespace System.Windows.Forms {
                                tree_view.UpdateScrollBars (false);
                                tree_view.UpdateBelow (parent);
                        }
+#if NET_2_0
+                       // UIA Framework Event: Collection Changed
+                       if (tree_view != null)
+                               tree_view.OnUIACollectionChanged (owner, new CollectionChangeEventArgs (CollectionChangeAction.Remove, removed));
+#endif
                }
 
 #if NET_2_0
@@ -425,7 +434,14 @@ namespace System.Windows.Forms {
                                tree_view = owner.TreeView;
 
                        if (tree_view != null) {
-                               TreeNode prev = GetPrevNode (node);
+                               bool sorted = false;
+                               if (tree_view.Sorted || tree_view.TreeViewNodeSorter != null) {
+                                       owner.Nodes.Sort (tree_view.TreeViewNodeSorter);
+                                       tree_view.sorted = sorted = true;
+                               }
+
+                               // We may need to invalidate this entire node collection if sorted.
+                               TreeNode prev = sorted ? owner : GetPrevNode (node);
 
                                if (tree_view.IsHandleCreated && node.ArePreviousNodesExpanded)
                                        tree_view.RecalculateVisibleOrder (prev);
@@ -434,9 +450,7 @@ namespace System.Windows.Forms {
                        }
 
                        if (owner != null && tree_view != null && (owner.IsExpanded || owner.IsRoot)) {
-                               // tree_view.UpdateBelow (owner);
-                               tree_view.UpdateNode (owner);
-                               tree_view.UpdateNode (node);
+                                tree_view.UpdateBelow (owner);
                        } else if (owner != null && tree_view != null) {
                                tree_view.UpdateBelow (owner);
                        }