1 package fr.ifremer.quadrige3.ui.swing.table;
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 import fr.ifremer.quadrige3.ui.swing.ApplicationUIUtil;
27 import fr.ifremer.quadrige3.ui.swing.table.action.AdditionalTableActions;
28 import org.apache.commons.lang3.ObjectUtils;
29 import org.jdesktop.swingx.action.AbstractActionExt;
30 import org.jdesktop.swingx.decorator.Highlighter;
31 import org.jdesktop.swingx.table.ColumnControlPopup.ActionGrouper;
32 import org.jdesktop.swingx.table.TableColumnExt;
33
34 import javax.swing.Action;
35 import javax.swing.table.TableCellEditor;
36 import javax.swing.table.TableCellRenderer;
37 import javax.swing.table.TableColumn;
38 import java.awt.event.ActionEvent;
39 import java.beans.PropertyChangeListener;
40 import java.util.ArrayList;
41 import java.util.Comparator;
42 import java.util.List;
43 import java.util.Optional;
44
45 import static org.nuiton.i18n.I18n.t;
46
47
48
49
50
51
52 public class ColumnControlButton extends org.jdesktop.swingx.table.ColumnControlButton {
53
54
55
56
57
58
59 ColumnControlButton(SwingTable table) {
60 super(table);
61
62 AbstractActionExt showAllColumnAction = new AbstractActionExt(t("quadrige3.table.showAllColumn")) {
63
64 @Override
65 public void actionPerformed(ActionEvent e) {
66
67 for (ColumnVisibilityAction action : getColumnVisibilityActions()) {
68 action.setSelected(true);
69 }
70
71 }
72 };
73
74 showAllColumnAction.putValue(GroupKeyActionGrouper.GROUP_KEY, 0);
75 table.getActionMap().put(ColumnControlButton.COLUMN_CONTROL_MARKER + "showAllColumn", showAllColumnAction);
76
77
78 Action additionalActions = table.getActionMap().get(AdditionalTableActions.ACTION_NAME);
79 if (additionalActions instanceof AdditionalTableActions) {
80 List<Action> actions = ((AdditionalTableActions) additionalActions).getActions();
81 for (int i = 0; i < actions.size(); i++) {
82 Action action = actions.get(i);
83 action.putValue(GroupKeyActionGrouper.GROUP_KEY,
84 Optional.ofNullable(action.getValue(AdditionalTableActions.ACTION_TARGET_GROUP))
85 .orElse(AdditionalTableActions.DEFAULT_ACTION_TARGET_GROUP));
86
87 table.getActionMap().put(ColumnControlButton.COLUMN_CONTROL_MARKER + "z_additionalAction" + i, action);
88 }
89 }
90
91 setActionGrouper(new GroupKeyActionGrouper());
92 }
93
94
95
96
97 @Override
98 protected ColumnVisibilityAction createColumnVisibilityAction(TableColumn column) {
99 if (!(column instanceof TableColumnExt)) return null;
100 TableColumnExt columnExt = (TableColumnExt) column;
101 if (!columnExt.isHideable() || columnExt instanceof HiddenColumn) {
102 return null;
103 }
104 return super.createColumnVisibilityAction(new DelegateTableColumnExt(columnExt));
105 }
106
107
108
109
110 @Override
111 protected void addVisibilityActionItems() {
112 final List<ColumnVisibilityAction> actions = new ArrayList<>(getColumnVisibilityActions());
113
114
115 actions.sort((o1, o2) -> ObjectUtils.compare(o1.getName(), o2.getName()));
116 getColumnControlPopup().addVisibilityActionItems(actions);
117 }
118
119 public static class GroupKeyActionGrouper implements ActionGrouper {
120
121
122 static final String GROUP_KEY = "customActionGroup";
123
124 @Override
125 public <A extends Action> List<List<A>> group(List<A> actions) {
126 List<List<A>> result = new ArrayList<>();
127 List<Object> keys = new ArrayList<>();
128 List<A> noKey = new ArrayList<>();
129 for (A action : actions) {
130 Object groupKey = action.getValue(GROUP_KEY);
131 if (groupKey != null) {
132 int index = keys.indexOf(groupKey);
133 if (index < 0) {
134 keys.add(groupKey);
135 index = keys.size() - 1;
136 result.add(new ArrayList<>());
137 }
138 result.get(index).add(action);
139 } else {
140 noKey.add(action);
141 }
142
143 }
144 result.add(0, noKey);
145 return result;
146 }
147 }
148
149
150
151
152 private class DelegateTableColumnExt extends TableColumnExt {
153
154 private final TableColumnExt delegate;
155
156 DelegateTableColumnExt(TableColumnExt delegate) {
157 this.delegate = delegate;
158 }
159
160
161
162
163
164 @Override
165 public Object getHeaderValue() {
166 Object headerValue = delegate.getHeaderValue();
167 if (headerValue instanceof String) {
168 String header = (String) headerValue;
169 return ApplicationUIUtil.removeHtmlTags(header);
170 }
171 return headerValue;
172 }
173
174 @Override
175 public void setHighlighters(Highlighter... highlighters) {
176 delegate.setHighlighters(highlighters);
177 }
178
179 @Override
180 public Highlighter[] getHighlighters() {
181 return delegate.getHighlighters();
182 }
183
184 @Override
185 public void addHighlighter(Highlighter highlighter) {
186 delegate.addHighlighter(highlighter);
187 }
188
189 @Override
190 public void removeHighlighter(Highlighter highlighter) {
191 delegate.removeHighlighter(highlighter);
192 }
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209 @Override
210 public boolean getResizable() {
211 return delegate.getResizable();
212 }
213
214 @Override
215 public void setEditable(boolean editable) {
216 delegate.setEditable(editable);
217 }
218
219 @Override
220 public boolean isEditable() {
221 return delegate.isEditable();
222 }
223
224 @Override
225 public void setPrototypeValue(Object value) {
226 delegate.setPrototypeValue(value);
227 }
228
229 @Override
230 public Object getPrototypeValue() {
231 return delegate.getPrototypeValue();
232 }
233
234 @Override
235 public void setComparator(Comparator<?> comparator) {
236 delegate.setComparator(comparator);
237 }
238
239 @Override
240 public Comparator<?> getComparator() {
241 return delegate.getComparator();
242 }
243
244 @Override
245 public void setSortable(boolean sortable) {
246 delegate.setSortable(sortable);
247 }
248
249 @Override
250 public boolean isSortable() {
251 return delegate.isSortable();
252 }
253
254 @Override
255 public void setToolTipText(String toolTipText) {
256 delegate.setToolTipText(toolTipText);
257 }
258
259 @Override
260 public String getToolTipText() {
261 return delegate.getToolTipText();
262 }
263
264 @Override
265 public void setTitle(String title) {
266 delegate.setTitle(title);
267 }
268
269 @Override
270 public String getTitle() {
271 return delegate.getTitle();
272 }
273
274 @Override
275 public void setVisible(boolean visible) {
276 delegate.setVisible(visible);
277 }
278
279 @Override
280 public boolean isVisible() {
281 return delegate.isVisible();
282 }
283
284 @Override
285 public void setHideable(boolean hideable) {
286 delegate.setHideable(hideable);
287 }
288
289 @Override
290 public boolean isHideable() {
291 return delegate.isHideable();
292 }
293
294 @Override
295 public void putClientProperty(Object key, Object value) {
296 delegate.putClientProperty(key, value);
297 }
298
299 @Override
300 public Object getClientProperty(Object key) {
301 return delegate.getClientProperty(key);
302 }
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319 @Override
320 public void updateUI() {
321 delegate.updateUI();
322 }
323
324 @Override
325 public void setModelIndex(int modelIndex) {
326 delegate.setModelIndex(modelIndex);
327 }
328
329 @Override
330 public int getModelIndex() {
331 return delegate.getModelIndex();
332 }
333
334 @Override
335 public void setIdentifier(Object identifier) {
336 delegate.setIdentifier(identifier);
337 }
338
339 @Override
340 public Object getIdentifier() {
341 return delegate.getIdentifier();
342 }
343
344 @Override
345 public void setHeaderValue(Object headerValue) {
346 delegate.setHeaderValue(headerValue);
347 }
348
349 @Override
350 public void setHeaderRenderer(TableCellRenderer headerRenderer) {
351 delegate.setHeaderRenderer(headerRenderer);
352 }
353
354 @Override
355 public TableCellRenderer getHeaderRenderer() {
356 return delegate.getHeaderRenderer();
357 }
358
359 @Override
360 public void setCellRenderer(TableCellRenderer cellRenderer) {
361 delegate.setCellRenderer(cellRenderer);
362 }
363
364 @Override
365 public TableCellRenderer getCellRenderer() {
366 return delegate.getCellRenderer();
367 }
368
369 @Override
370 public void setCellEditor(TableCellEditor cellEditor) {
371 delegate.setCellEditor(cellEditor);
372 }
373
374 @Override
375 public TableCellEditor getCellEditor() {
376 return delegate.getCellEditor();
377 }
378
379 @Override
380 public void setWidth(int width) {
381 delegate.setWidth(width);
382 }
383
384 @Override
385 public int getWidth() {
386 return delegate.getWidth();
387 }
388
389 @Override
390 public void setPreferredWidth(int preferredWidth) {
391 delegate.setPreferredWidth(preferredWidth);
392 }
393
394 @Override
395 public int getPreferredWidth() {
396 return delegate.getPreferredWidth();
397 }
398
399 @Override
400 public void setMinWidth(int minWidth) {
401 delegate.setMinWidth(minWidth);
402 }
403
404 @Override
405 public int getMinWidth() {
406 return delegate.getMinWidth();
407 }
408
409 @Override
410 public void setMaxWidth(int maxWidth) {
411 delegate.setMaxWidth(maxWidth);
412 }
413
414 @Override
415 public int getMaxWidth() {
416 return delegate.getMaxWidth();
417 }
418
419 @Override
420 public void setResizable(boolean isResizable) {
421 delegate.setResizable(isResizable);
422 }
423
424 @Override
425 public void sizeWidthToFit() {
426 delegate.sizeWidthToFit();
427 }
428
429
430
431
432
433
434
435
436
437
438
439
440
441 @Override
442 public void addPropertyChangeListener(PropertyChangeListener listener) {
443 delegate.addPropertyChangeListener(listener);
444 }
445
446 @Override
447 public void removePropertyChangeListener(PropertyChangeListener listener) {
448 delegate.removePropertyChangeListener(listener);
449 }
450
451 @Override
452 public PropertyChangeListener[] getPropertyChangeListeners() {
453 return delegate.getPropertyChangeListeners();
454 }
455
456
457
458
459
460 }
461 }