-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathTreeViewMultiSelect.cs
85 lines (75 loc) · 2.57 KB
/
TreeViewMultiSelect.cs
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
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace XNALara
{
public class TreeViewMultiSelect : TreeView
{
private List<TreeNode> selectedNodes = new List<TreeNode>();
private bool isSelectionEnabled = false;
public TreeNode[] SelectedNodes {
get {
return selectedNodes.ToArray();
}
}
protected override void OnBeforeSelect(TreeViewCancelEventArgs e) {
if (!isSelectionEnabled) {
e.Cancel = true;
}
}
protected override void OnMouseDown(MouseEventArgs e) {
TreeNode selectedNode = this.GetNodeAt(e.X, e.Y);
SelectNode(selectedNode);
base.OnMouseDown(e);
}
private void SelectNode(TreeNode node) {
if (node == null) {
return;
}
switch (Control.ModifierKeys) {
default: // single-select
ClearSelection();
SetNodeSelected(node, true);
break;
case Keys.Control: // multi-select
SetNodeSelected(node, !selectedNodes.Contains(node));
break;
}
}
private void ClearSelection() {
for (int i = selectedNodes.Count - 1; i >= 0; i--) {
TreeNode node = selectedNodes[i];
selectedNodes.RemoveAt(i);
SetNodeSelected(node, false);
}
}
private void SetNodeSelected(TreeNode node, bool isSelected) {
if (isSelected) {
TreeViewCancelEventArgs e = new TreeViewCancelEventArgs(node, false, TreeViewAction.ByMouse);
base.OnBeforeSelect(e);
if (e.Cancel) {
return;
}
selectedNodes.Add(node);
isSelectionEnabled = true;
SelectedNode = node;
}
else {
selectedNodes.Remove(node);
isSelectionEnabled = false;
SelectedNode = null;
}
SetNodeColors(node, isSelected);
}
private void SetNodeColors(TreeNode node, bool isSelected) {
if (isSelected) {
node.ForeColor = SystemColors.HighlightText;
node.BackColor = SystemColors.Highlight;
}
else {
node.ForeColor = SystemColors.WindowText;
node.BackColor = SystemColors.Window;
}
}
}
}