1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.atlassian.theplugin.idea.ui.tree;
18
19 import javax.swing.tree.DefaultTreeModel;
20 import javax.swing.tree.TreeNode;
21 import java.util.ArrayList;
22 import java.util.Collections;
23 import java.util.List;
24
25 public class AtlassianTreeModel extends DefaultTreeModel {
26
27 public AtlassianTreeModel(AtlassianTreeNode root) {
28 super(root);
29 }
30
31
32
33
34
35 public AtlassianTreeModel getFilteredModel(Filter filter) {
36 AtlassianTreeNode root = getRoot();
37 AtlassianTreeNode newRoot = root.filter(filter);
38 if (newRoot == null) {
39 newRoot = AtlassianTreeNode.EMPTY_NODE;
40 }
41 return new AtlassianTreeModel(newRoot);
42 }
43
44 @Override
45 public AtlassianTreeNode getRoot() {
46 return (AtlassianTreeNode) super.getRoot();
47 }
48
49 public void insertNode(AtlassianTreeNode node, AtlassianTreeNode parent) {
50 List<AtlassianTreeNode> children = createChildrenList(parent);
51 removeAndSignal(parent, children);
52
53 children.add(node);
54 fillAndSignal(parent, children);
55
56 int[] idx = {parent.getIndex(node)};
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 private List<AtlassianTreeNode> createChildrenList(AtlassianTreeNode parent) {
94 List<AtlassianTreeNode> children = new ArrayList<AtlassianTreeNode>();
95 for (int i = 0; i < parent.getChildCount(); ++i) {
96 children.add(parent.getChildAt(i));
97 }
98 return children;
99 }
100
101 private void removeAndSignal(AtlassianTreeNode parent, List<AtlassianTreeNode> children) {
102 TreeNode[] nodes = new TreeNode[children.size()];
103 int[] indexes = new int[children.size()];
104 for (int i = 0; i < children.size(); ++i) {
105 indexes[i] = i;
106 }
107 children.toArray(nodes);
108 parent.removeAllChildren();
109 nodesWereRemoved(parent, indexes, nodes);
110 }
111
112 private void fillAndSignal(AtlassianTreeNode parent, List<AtlassianTreeNode> children) {
113 Collections.sort(children);
114 for (AtlassianTreeNode ch : children) {
115 parent.addNode(ch);
116 }
117
118 int[] indexes = new int[children.size()];
119 for (int i = 0; i < children.size(); ++i) {
120 indexes[i] = i;
121 }
122
123 nodesWereInserted(parent, indexes);
124 }
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140 }