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