internal void CollapseBelow (TreeNode node, int count_to_next) { if (update_stack > 0) { update_needed = true; return; } Rectangle below = new Rectangle (0, node.Bounds.Bottom, ViewportRectangle.Width, ViewportRectangle.Height - node.Bounds.Bottom); int amount = count_to_next * ActualItemHeight; if (amount > 0) XplatUI.ScrollWindow (Handle, below, 0, -amount, false); if (show_plus_minus) { Invalidate (new Rectangle (0, node.GetY (), Width, ActualItemHeight)); } }
private void DrawTreeNode (TreeNode node, Graphics dc, Rectangle clip) { int child_count = node.nodes.Count; int y = node.GetY (); int middle = y + (ActualItemHeight / 2); if (full_row_select && !show_lines) { Rectangle r = new Rectangle (1, y, ViewportRectangle.Width - 2, ActualItemHeight); DrawSelectionAndFocus (node, dc, r); } if (draw_mode == TreeViewDrawMode.Normal || draw_mode == TreeViewDrawMode.OwnerDrawText) { if ((show_root_lines || node.Parent != null) && show_plus_minus && child_count > 0) ThemeEngine.Current.TreeViewDrawNodePlusMinus (this, node, dc, node.GetLinesX () - Indent + 5, middle); if (checkboxes && state_image_list == null) DrawNodeCheckBox (node, dc, CheckBoxLeft (node) - 3, middle); if (checkboxes && state_image_list != null) DrawNodeState (node, dc, CheckBoxLeft (node) - 3, y); if (!checkboxes && node.StateImage != null) dc.DrawImage (node.StateImage, new Rectangle (CheckBoxLeft (node) - 3, y, 16, 16)); if (show_lines) DrawNodeLines (node, dc, clip, dash, node.GetLinesX (), y, middle); if (ImageList != null) DrawNodeImage (node, dc, clip, node.GetImageX (), y); } if (draw_mode != TreeViewDrawMode.Normal) { dc.FillRectangle (Brushes.White, node.Bounds); TreeNodeStates tree_node_state = TreeNodeStates.Default;; if (node.IsSelected) tree_node_state = TreeNodeStates.Selected; if (node.Checked) tree_node_state |= TreeNodeStates.Checked; if (node == focused_node) tree_node_state |= TreeNodeStates.Focused; Rectangle node_bounds = node.Bounds; if (draw_mode == TreeViewDrawMode.OwnerDrawText) { node_bounds.X += 3; node_bounds.Y += 1; } else { node_bounds.X = 0; node_bounds.Width = Width; } DrawTreeNodeEventArgs e = new DrawTreeNodeEventArgs (dc, node, node_bounds, tree_node_state); OnDrawNode (e); if (!e.DrawDefault) return; } if (!node.IsEditing) DrawStaticNode (node, dc); }
internal void ExpandBelow (TreeNode node, int count_to_next) { if (update_stack > 0) { update_needed = true; return; } // If node Bottom is less than 0, the node is above and not visible, // and we need to scroll the entire viewport int node_bottom = node.Bounds.Bottom >= 0 ? node.Bounds.Bottom : 0; Rectangle below = new Rectangle (0, node_bottom, ViewportRectangle.Width, ViewportRectangle.Height - node_bottom); int amount = count_to_next * ActualItemHeight; if (amount > 0) XplatUI.ScrollWindow (Handle, below, 0, amount, false); if (show_plus_minus) { Invalidate (new Rectangle (0, node.GetY (), Width, ActualItemHeight)); } }
public override void TreeViewDrawNodePlusMinus (TreeView treeView, TreeNode node, Graphics dc, int x, int middle) { int height = treeView.ActualItemHeight - 2; dc.FillRectangle (ResPool.GetSolidBrush (treeView.BackColor), (x + 4) - (height / 2), node.GetY() + 1, height, height); dc.DrawRectangle (SystemPens.ControlDarkDark, x, middle - 4, 8, 8); if (node.IsExpanded) { dc.DrawLine (SystemPens.ControlDarkDark, x + 2, middle, x + 6, middle); } else { dc.DrawLine (SystemPens.ControlDarkDark, x + 2, middle, x + 6, middle); dc.DrawLine (SystemPens.ControlDarkDark, x + 4, middle - 2, x + 4, middle + 2); } }