1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.tobago.model;
21
22 import javax.swing.tree.TreeNode;
23 import java.io.Serializable;
24 import java.util.ArrayList;
25 import java.util.Collections;
26 import java.util.HashSet;
27 import java.util.Set;
28
29
30
31
32
33
34 public class ExpandedState implements Serializable {
35
36 private int defaultExpandedLevels;
37 private Set<TreePath> expandedSet;
38 private Set<TreePath> collapsedSet;
39
40
41
42
43
44
45 public ExpandedState(final int defaultExpandedLevels) {
46 this.defaultExpandedLevels = defaultExpandedLevels;
47 this.expandedSet = new HashSet<>();
48 this.collapsedSet = new HashSet<>();
49 }
50
51
52
53
54
55
56
57 public boolean isExpanded(final TreeNode node) {
58 final TreePath path = new TreePath(node);
59 return isExpanded(path);
60 }
61
62
63
64
65
66
67
68 public boolean isExpanded(final TreePath path) {
69 if (expandedSet.contains(path)) {
70 return true;
71 }
72 if (collapsedSet.contains(path)) {
73 return false;
74 }
75 return path.getLength() < defaultExpandedLevels;
76 }
77
78
79
80
81
82
83 public void expand(final TreeNode node) {
84 expand(node, true);
85 }
86
87
88
89
90
91
92
93 public void expand(final TreeNode node, final boolean parents) {
94 final TreePath path = new TreePath(node);
95 expand(path, parents);
96 }
97
98
99
100
101
102
103 public void expand(final TreePath path) {
104 expand(path, true);
105 }
106
107
108
109
110
111
112
113 public void expand(final TreePath path, final boolean parents) {
114 if (path.getLength() >= defaultExpandedLevels) {
115 expandedSet.add(path);
116 } else {
117 collapsedSet.remove(path);
118 }
119 if (parents && !path.isRoot()) {
120 expand(path.getParent(), true);
121 }
122 }
123
124
125
126
127
128
129 public void expand(final int level) {
130 final ArrayList<TreePath> toRemove = new ArrayList<>();
131 if (level > defaultExpandedLevels) {
132 defaultExpandedLevels = level;
133 for (final TreePath treePath : expandedSet) {
134 if (treePath.getLength() < defaultExpandedLevels) {
135 toRemove.add(treePath);
136 }
137 }
138 expandedSet.removeAll(toRemove);
139 collapsedSet.clear();
140 } else {
141 for (final TreePath treePath : collapsedSet) {
142 if (treePath.getLength() < level) {
143 toRemove.add(treePath);
144 }
145 }
146 collapsedSet.removeAll(toRemove);
147 }
148 }
149
150
151
152
153 public void expandAll() {
154 defaultExpandedLevels = Integer.MAX_VALUE;
155 expandedSet.clear();
156 collapsedSet.clear();
157 }
158
159
160
161
162
163
164 public void collapse(final TreeNode node) {
165 final TreePath path = new TreePath(node);
166 collapse(path);
167 }
168
169
170
171
172
173
174 public void collapse(final TreePath path) {
175 if (path.getLength() < defaultExpandedLevels) {
176 collapsedSet.add(path);
177 } else {
178 expandedSet.remove(path);
179 }
180 }
181
182
183
184
185
186
187 public void collapse(final int level) {
188 int count = level;
189
190 count--;
191
192 final ArrayList<TreePath> toRemove = new ArrayList<>();
193 if (count < defaultExpandedLevels) {
194 defaultExpandedLevels = count;
195 for (final TreePath treePath : collapsedSet) {
196 if (treePath.getLength() >= defaultExpandedLevels) {
197 toRemove.add(treePath);
198 }
199 }
200 collapsedSet.removeAll(toRemove);
201 expandedSet.clear();
202 } else {
203 for (final TreePath treePath : expandedSet) {
204 if (treePath.getLength() >= count) {
205 toRemove.add(treePath);
206 }
207 }
208 expandedSet.removeAll(toRemove);
209 }
210 }
211
212
213
214
215 public void collapseAll() {
216 defaultExpandedLevels = 0;
217 expandedSet.clear();
218 collapsedSet.clear();
219 }
220
221
222
223
224 public void collapseAllButRoot() {
225 defaultExpandedLevels = 1;
226 expandedSet.clear();
227 collapsedSet.clear();
228 }
229
230
231
232
233
234 public void reset() {
235 expandedSet.clear();
236 collapsedSet.clear();
237 }
238
239
240
241
242 public Set<TreePath> getExpandedSet() {
243 return Collections.unmodifiableSet(expandedSet);
244 }
245
246
247
248
249 public Set<TreePath> getCollapsedSet() {
250 return Collections.unmodifiableSet(collapsedSet);
251 }
252 }