-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathTreeViewUtilities.cs
More file actions
108 lines (64 loc) · 3.15 KB
/
TreeViewUtilities.cs
File metadata and controls
108 lines (64 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace Gsemac.Forms {
public static class TreeViewUtilities {
// Public members
public static IEnumerable<TreeNode> GetVisibleNodes(TreeView treeView) {
return treeView.Nodes.Cast<TreeNode>()
.SelectMany(node => GetVisibleNodes(node));
}
public static void SetAlternatingNodeColorsEnabled(TreeView treeView, bool value) {
// When we set the back color of TreeNodes to a custom color, selection turns the node white, making it look like it's flickering.
// The following event handlers help to reduce the appearance of flicker.
if (value) {
treeView.AfterExpand += AlternatingNodeColorsAfterExpandEventHandler;
treeView.AfterCollapse += AlternatingNodeColorsAfterExpandEventHandler;
treeView.MouseDown += AlternatingNodeColorsMouseDownEventHandler;
treeView.MouseUp += AlternatingNodeColorsMouseUpEventHandler;
}
else {
treeView.AfterExpand -= AlternatingNodeColorsAfterExpandEventHandler;
treeView.AfterCollapse -= AlternatingNodeColorsAfterExpandEventHandler;
treeView.MouseDown -= AlternatingNodeColorsMouseDownEventHandler;
treeView.MouseUp -= AlternatingNodeColorsMouseUpEventHandler;
}
ApplyAlternatingNodeColors(treeView);
}
// Private members
private static IEnumerable<TreeNode> GetVisibleNodes(TreeNode node) {
if (node.Parent == null || node.Parent.IsExpanded)
yield return node;
foreach (TreeNode childNode in node.Nodes)
foreach (TreeNode visibleNode in GetVisibleNodes(childNode))
yield return visibleNode;
}
private static void ApplyAlternatingNodeColors(TreeView treeView) {
treeView.BeginUpdate();
bool even = true;
foreach (TreeNode node in GetVisibleNodes(treeView)) {
node.BackColor = even ? default : SystemColors.Control;
even = !even;
}
treeView.EndUpdate();
}
private static void AlternatingNodeColorsAfterExpandEventHandler(object sender, TreeViewEventArgs e) {
if (sender is TreeView treeView)
ApplyAlternatingNodeColors(treeView);
}
private static void AlternatingNodeColorsMouseDownEventHandler(object sender, MouseEventArgs e) {
if (sender is TreeView treeView) {
treeView.SelectedNode = null;
ApplyAlternatingNodeColors(treeView);
TreeViewHitTestInfo hitTestInfo = treeView.HitTest(e.Location);
if (hitTestInfo.Node != null)
hitTestInfo.Node.BackColor = default;
}
}
private static void AlternatingNodeColorsMouseUpEventHandler(object sender, MouseEventArgs e) {
if (sender is TreeView treeView)
ApplyAlternatingNodeColors(treeView);
}
}
}