1 package fr.ifremer.allegro.obsdeb.ui.swing.util.treetable;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import com.google.common.collect.Lists;
26 import jaxx.runtime.swing.nav.treetable.NavTreeTableHelper;
27 import jaxx.runtime.swing.nav.treetable.NavTreeTableModel;
28 import org.apache.commons.collections4.CollectionUtils;
29 import org.jdesktop.swingx.JXTreeTable;
30
31 import javax.swing.*;
32 import java.util.Enumeration;
33 import java.util.List;
34
35
36
37
38
39
40
41
42
43
44 public abstract class AbstractObsdebTreeTableHelper<H extends AbstractObsdebTreeTableUIHandler,
45 NM extends AbstractObsdebNodeUIModel, TN extends AbstractObsdebTreeTableNode<NM, TN>, P extends AbstractObsdebTreeTableDataProvider<NM>>
46 extends NavTreeTableHelper<TN> {
47
48 protected final H handler;
49
50
51
52
53 protected final boolean createNewNode;
54
55 public AbstractObsdebTreeTableHelper(H handler, P dataProvider, boolean createNewNode) {
56 setDataProvider(dataProvider);
57 this.handler = handler;
58 this.createNewNode = createNewNode;
59 }
60
61 @Override
62 public P getDataProvider() {
63 return (P) super.getDataProvider();
64 }
65
66 public boolean isCreateNewNode() {
67 return createNewNode;
68 }
69
70 public NavTreeTableModel createModel(AbstractObsdebTreeTableModel delegate) {
71
72
73 TN root = getNewRootNode();
74
75 NavTreeTableModel model = createModel(root, delegate);
76
77
78 root.populateChilds(getBridge(), getDataProvider());
79
80 return model;
81 }
82
83 public AbstractObsdebTreeTableModel getTreeTableModel() {
84 return (AbstractObsdebTreeTableModel) getModel().getDelegate();
85 }
86
87
88
89
90
91
92 protected abstract TN getNewRootNode();
93
94
95
96
97
98
99 protected abstract TN getNewNode();
100
101 public void modelChanged() {
102
103
104 getRootNode().setAllowsChildren(false);
105 getRootNode().setAllowsChildren(true);
106
107
108 getDataProvider().prepareData();
109 getRootNode().populateNode(getBridge(), getDataProvider(), true);
110
111
112 getModel().getModelSupport().fireNewRoot();
113 getTreeTable().expandAll();
114
115
116
117 handler.onModelRowsChanged();
118 }
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138 public void flushModel() {
139 getDataProvider().flushData();
140 }
141
142 public void addNewNode() {
143
144 TN newNode = getNewNode();
145 insertNode(getRootNode(), newNode);
146 selectNode(newNode);
147 }
148
149 public void removeSelectedRows() {
150
151 List<TN> selectedNodes = getSelectedNodes();
152
153 if (CollectionUtils.isNotEmpty(selectedNodes)) {
154
155
156 for (TN node : selectedNodes) {
157
158 getDataProvider().removeRow(node.getUserObject());
159 removeNode(node);
160
161 }
162
163
164 flushModel();
165 modelChanged();
166
167 }
168 }
169
170 public void refreshRow(NM row) {
171
172 TN node = findNode(getRootNode(), row.getNodeId());
173 refreshNode(node, false);
174 }
175
176 public void refreshAll() {
177
178 refreshNode(getRootNode(), true);
179
180 }
181
182 public void duplicateSelectedNode() {
183 NM rowToDuplicate = getSelectedNode().getUserObject();
184 NM newRow = getDataProvider().getNewRow();
185
186 duplicateRow(newRow, rowToDuplicate);
187
188 flushModel();
189 modelChanged();
190 }
191
192
193
194
195
196
197 protected void duplicateRow(NM newRow, NM rowToDuplicate) {
198
199 }
200
201 public JXTreeTable getTreeTable() {
202 return getUI();
203 }
204
205 @Override
206 public TN getSelectedNode() {
207 return super.getSelectedNode();
208 }
209
210 @Override
211 public List<TN> getSelectedNodes() {
212
213 if (getTreeTable().getSelectionMode() == ListSelectionModel.SINGLE_SELECTION) {
214
215
216 return findSelectedNodeModels(getRootNode());
217 }
218
219
220 return super.getSelectedNodes();
221 }
222
223 private List<TN> findSelectedNodeModels(TN rootNode) {
224
225 List<TN> selectedNodes = Lists.newArrayList();
226
227 Enumeration<TN> e = rootNode.children();
228 while (e.hasMoreElements()) {
229 TN node = e.nextElement();
230 if (node.isSelected()) {
231 selectedNodes.add(node);
232 }
233 if (node.getChildCount() > 0) {
234 selectedNodes.addAll(findSelectedNodeModels(node));
235 }
236 }
237 return selectedNodes;
238 }
239
240 @Override
241 public TN findNode(TN node, String... ids) {
242 return super.findNode(node, ids);
243 }
244
245 }