Author: jackson
Date: 2005-04-14 16:16:40 -0400 (Thu, 14 Apr 2005)
New Revision: 43010

Modified:
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TreeNode.cs
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TreeView.cs
Log:
        * TreeView.cs: Add methods for setting the top and bottom visible
        nodes. TreeNode::EnsureVisible uses these methods.
        * TreeNode.cs: Implement EnsureVisible



Modified: trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog        
2005-04-14 20:09:00 UTC (rev 43009)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog        
2005-04-14 20:16:40 UTC (rev 43010)
@@ -1,3 +1,9 @@
+2005-04-14  Jackson Harper  <[EMAIL PROTECTED]>
+
+       * TreeView.cs: Add methods for setting the top and bottom visible
+       nodes. TreeNode::EnsureVisible uses these methods.
+       * TreeNode.cs: Implement EnsureVisible
+
 2005-04-13  Jordi Mas i Hernandez <[EMAIL PROTECTED]>
 
        * Form.cs: Pospone menu assignation if the window has not been created 
yet

Modified: trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TreeNode.cs
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TreeNode.cs      
2005-04-14 20:09:00 UTC (rev 43009)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TreeNode.cs      
2005-04-14 20:16:40 UTC (rev 43010)
@@ -380,6 +380,25 @@
                                TreeView.Refresh();
                }
 
+               public void EnsureVisible ()
+               {
+                       if (TreeView == null)
+                               return;
+
+                       TreeView.BeginUpdate ();
+
+                       if (this.Parent != null)
+                               ExpandParentRecursive (this.Parent);
+
+                       if (bounds.Y < 0) {
+                               TreeView.SetTop (this);
+                       } else if (bounds.Y > TreeView.ClientRectangle.Height) {
+                               TreeView.SetBottom (this);
+                       }
+                               
+                       TreeView.EndUpdate ();
+               }
+
                public int GetNodeCount (bool include_subtrees) {
                        if (!include_subtrees)
                                return Nodes.Count;
@@ -438,7 +457,6 @@
                {
                        if (is_expanded)
                                return;
-
                        bool cancel = false;
                        if (TreeView != null) {
                                TreeViewCancelEventArgs e = new 
TreeViewCancelEventArgs (this, false, TreeViewAction.Expand);
@@ -500,6 +518,13 @@
                        }
                }
 
+               private void ExpandParentRecursive (TreeNode node)
+               {
+                       node.Expand (true);
+                       if (node.Parent != null)
+                               ExpandParentRecursive (node.Parent);
+               }
+
                internal void CollapseAll ()
                {
                        CollapseRecursive (this);

Modified: trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TreeView.cs
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TreeView.cs      
2005-04-14 20:09:00 UTC (rev 43009)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TreeView.cs      
2005-04-14 20:16:40 UTC (rev 43010)
@@ -620,6 +620,32 @@
                        return node != null && node.Bounds.Left <= x && 
node.Bounds.Right >= x;
                }
 
+               internal void SetTop (TreeNode node)
+               {
+                       OpenTreeNodeEnumerator walk = new 
OpenTreeNodeEnumerator (root_node);
+                       int offset = 0;
+
+                       while (walk.CurrentNode != node && walk.MoveNext ())
+                               offset++;
+
+                       vbar.Value = offset;
+               }
+
+               internal void SetBottom (TreeNode node)
+               {
+                       int visible = ClientRectangle.Height / ItemHeight;
+
+                       OpenTreeNodeEnumerator walk = new 
OpenTreeNodeEnumerator (node);
+                       TreeNode top = null;
+
+                       visible--;
+                       while (visible-- > 0 && walk.MovePrevious ())
+                               top = walk.CurrentNode;
+
+                       if (top != null)
+                               SetTop (top);
+               }
+
                internal void UpdateBelow (TreeNode node)
                {
                        // We need to update the current node so the plus/minus 
block gets update too
@@ -987,24 +1013,36 @@
 
                private void VScrollBarValueChanged (object sender, EventArgs e)
                {
+                       SetVScrollPos (vbar.Value, null);
+               }
+
+               private void SetVScrollPos (int pos, TreeNode new_top)
+               {
+                       if (skipped_nodes == pos)
+                               return;
+
                        int old_skip = skipped_nodes;
-                       skipped_nodes = vbar.Value;
+                       skipped_nodes = pos;
                        int diff = old_skip - skipped_nodes;
 
-                        if (top_node == null)
-                                top_node = nodes [0];
+                       // Determine the new top node if we have to
+                       if (new_top == null) {
+                               if (top_node == null)
+                                       top_node = nodes [0];
 
-                       OpenTreeNodeEnumerator walk = new 
OpenTreeNodeEnumerator (TopNode);
-                       if (diff < 0) {
-                               for (int i = diff; i <= 0; i++)
-                                       walk.MoveNext ();
-                               top_node = walk.CurrentNode;
-                       } else {
-                               for (int i = 0; i <= diff; i++)
-                                       walk.MovePrevious ();
-                               top_node = walk.CurrentNode;
+                               OpenTreeNodeEnumerator walk = new 
OpenTreeNodeEnumerator (TopNode);
+                               if (diff < 0) {
+                                       for (int i = diff; i <= 0; i++)
+                                               walk.MoveNext ();
+                                       new_top = walk.CurrentNode;
+                               } else {
+                                       for (int i = 0; i <= diff; i++)
+                                               walk.MovePrevious ();
+                                       new_top = walk.CurrentNode;
+                               }
                        }
 
+                       top_node = new_top;
                        int y_move = diff * ItemHeight;
                        XplatUI.ScrollWindow (Handle, ViewportRectangle, 0, 
y_move, false);
                }

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to