private TreeNode GetPrevNode(TreeNode node) { OpenTreeNodeEnumerator one = new OpenTreeNodeEnumerator(node); if (one.MovePrevious() && one.MovePrevious()) { return(one.CurrentNode); } return(null); }
private void RemoveAt(int index, bool update) { TreeNode removed = nodes [index]; TreeNode prev = GetPrevNode(removed); TreeNode new_selected = null; bool re_set_selected = false; bool visible = removed.IsVisible; TreeView tree_view = TreeView; if (tree_view != null) { tree_view.RecalculateVisibleOrder(prev); if (removed == tree_view.SelectedNode) { if (removed.IsExpanded) { removed.Collapse(); // Fix Xamarin Bugzilla 5010. } 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 == removed ? null : oe.CurrentNode; } } } Array.Copy(nodes, index + 1, nodes, index, count - index - 1); count--; nodes[count] = null; if (nodes.Length > OrigSize && nodes.Length > (count * 2)) { Shrink(); } if (tree_view != null && re_set_selected) { tree_view.SelectedNode = new_selected; } TreeNode parent = removed.parent; removed.parent = null; if (update && tree_view != null && visible) { tree_view.RecalculateVisibleOrder(prev); tree_view.UpdateScrollBars(false); tree_view.UpdateBelow(parent); } OnUIACollectionChanged(CollectionChangeAction.Remove, removed); }
protected override void OnKeyDown (KeyEventArgs e) { OpenTreeNodeEnumerator ne; switch (e.KeyData & Keys.KeyCode) { case Keys.Add: if (selected_node != null && selected_node.IsExpanded) selected_node.Expand (); break; case Keys.Subtract: if (selected_node != null && selected_node.IsExpanded) selected_node.Collapse (); break; case Keys.Left: if (selected_node != null) { if (selected_node.IsExpanded && selected_node.Nodes.Count > 0) selected_node.Collapse (); else { TreeNode parent = selected_node.Parent; if (parent != null) { selection_action = TreeViewAction.ByKeyboard; SelectedNode = parent; } } } break; case Keys.Right: if (selected_node != null) { if (!selected_node.IsExpanded) selected_node.Expand (); else { TreeNode child = selected_node.FirstNode; if (child != null) SelectedNode = child; } } break; case Keys.Up: if (selected_node != null) { ne = new OpenTreeNodeEnumerator (selected_node); if (ne.MovePrevious () && ne.MovePrevious ()) { selection_action = TreeViewAction.ByKeyboard; SelectedNode = ne.CurrentNode; } } break; case Keys.Down: if (selected_node != null) { ne = new OpenTreeNodeEnumerator (selected_node); if (ne.MoveNext () && ne.MoveNext ()) { selection_action = TreeViewAction.ByKeyboard; SelectedNode = ne.CurrentNode; } } break; case Keys.Home: if (root_node.Nodes.Count > 0) { ne = new OpenTreeNodeEnumerator (root_node.Nodes [0]); if (ne.MoveNext ()) { selection_action = TreeViewAction.ByKeyboard; SelectedNode = ne.CurrentNode; } } break; case Keys.End: if (root_node.Nodes.Count > 0) { ne = new OpenTreeNodeEnumerator (root_node.Nodes [0]); while (ne.MoveNext ()) { } selection_action = TreeViewAction.ByKeyboard; SelectedNode = ne.CurrentNode; } break; case Keys.PageDown: if (selected_node != null) { ne = new OpenTreeNodeEnumerator (selected_node); int move = VisibleCount; for (int i = 0; i < move && ne.MoveNext (); i++) { } selection_action = TreeViewAction.ByKeyboard; SelectedNode = ne.CurrentNode; } break; case Keys.PageUp: if (selected_node != null) { ne = new OpenTreeNodeEnumerator (selected_node); int move = VisibleCount; for (int i = 0; i < move && ne.MovePrevious (); i++) { } selection_action = TreeViewAction.ByKeyboard; SelectedNode = ne.CurrentNode; } break; case Keys.Multiply: if (selected_node != null) selected_node.ExpandAll (); break; } base.OnKeyDown (e); if (!e.Handled && checkboxes && selected_node != null && (e.KeyData & Keys.KeyCode) == Keys.Space) { selected_node.check_reason = TreeViewAction.ByKeyboard; selected_node.Checked = !selected_node.Checked; e.Handled = true; } }
internal void SetBottom (TreeNode node) { if (!vbar.is_visible) return; OpenTreeNodeEnumerator walk = new OpenTreeNodeEnumerator (node); int bottom = ViewportRectangle.Bottom; int offset = 0; while (walk.MovePrevious ()) { if (walk.CurrentNode.Bounds.Bottom <= bottom) break; offset++; } int nv = vbar.Value + offset; if (vbar.Value + offset < vbar.Maximum) { SetVScrollValue (nv); } else { #if DEBUG Console.Error.WriteLine ("setting bottom to value greater then maximum ({0}, {1})", nv, vbar.Maximum); #endif } }
private void RemoveAt(int index, bool update) { 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; if (owner != null) { tree_view = owner.TreeView; } if (tree_view != null) { 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 == removed ? null : oe.CurrentNode; } } } Array.Copy(nodes, index + 1, nodes, index, count - index - 1); count--; nodes[count] = null; if (nodes.Length > OrigSize && nodes.Length > (count * 2)) { Shrink(); } if (tree_view != null && re_set_selected) { tree_view.SelectedNode = new_selected; } TreeNode parent = removed.parent; removed.parent = null; if (update && tree_view != null && visible) { tree_view.RecalculateVisibleOrder(prev); 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 }
private TreeNode GetPrevNode (TreeNode node) { OpenTreeNodeEnumerator one = new OpenTreeNodeEnumerator (node); if (one.MovePrevious () && one.MovePrevious ()) return one.CurrentNode; return null; }
private void RemoveAt (int index, bool update) { 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; if (owner != null) tree_view = owner.TreeView; if (tree_view != null) { 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 == removed ? null : oe.CurrentNode; } } } Array.Copy (nodes, index + 1, nodes, index, count - index - 1); count--; nodes[count] = null; if (nodes.Length > OrigSize && nodes.Length > (count * 2)) Shrink (); if (tree_view != null && re_set_selected) { tree_view.SelectedNode = new_selected; } TreeNode parent = removed.parent; removed.parent = null; if (update && tree_view != null && visible) { tree_view.RecalculateVisibleOrder (prev); 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 }