View Javadoc
1   package fr.ifremer.quadrige3.ui.swing.table;
2   
3   /*
4    * #%L
5    * Reef DB :: UI
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2014 - 2015 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU Affero General Public License as published by
13   * the Free Software Foundation, either version 3 of the License, or
14   * (at your option) any later version.
15   *
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   *
21   * You should have received a copy of the GNU Affero General Public License
22   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23   * #L%
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   * Override version of ColumnControlButton for a JXTable/JXTreeTable. All non hideable columns are not displayed in the popup
49   *
50   * @author Ludovic Pecquot <ludovic.pecquot@e-is.pro>
51   */
52  public class ColumnControlButton extends org.jdesktop.swingx.table.ColumnControlButton {
53  
54      /**
55       * <p>Constructor for ColumnControlButton.</p>
56       *
57       * @param table a {@link SwingTable} object.
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          // Add all other AdditionalTableActions
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                  // add the additional action with another key
87                  table.getActionMap().put(ColumnControlButton.COLUMN_CONTROL_MARKER + "z_additionalAction" + i, action);
88              }
89          }
90  
91          setActionGrouper(new GroupKeyActionGrouper());
92      }
93  
94      /**
95       * {@inheritDoc}
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      * {@inheritDoc}
109      */
110     @Override
111     protected void addVisibilityActionItems() {
112         final List<ColumnVisibilityAction> actions = new ArrayList<>(getColumnVisibilityActions());
113 
114         // Sort actions by name (= column label)
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         //Marker to support custom grouping of additional actions. (Issue #swingx-968)
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      * Delegate TableColumn with cleaner header value
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          * remove HTML tags from delegate table columns
162          * @return clean header value
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 //        @Override
195 //        public CompoundHighlighter getCompoundHighlighter() {
196 //            return delegate.getCompoundHighlighter();
197 //        }
198 //
199 //        @Override
200 //        public ChangeListener getHighlighterChangeListener() {
201 //            return delegate.getHighlighterChangeListener();
202 //        }
203 //
204 //        @Override
205 //        public ChangeListener createHighlighterChangeListener() {
206 //            return delegate.createHighlighterChangeListener();
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 //        @Override
305 //        public void copyFrom(TableColumnExt original) {
306 //            delegate.copyFrom(original);
307 //        }
308 
309 //        @Override
310 //        public void copyClientPropertiesFrom(TableColumnExt original) {
311 //            delegate.copyClientPropertiesFrom(original);
312 //        }
313 
314 //        @Override
315 //        public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
316 //            delegate.firePropertyChange(propertyName, oldValue, newValue);
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 //        @Override
430 //        @Deprecated
431 //        public void disableResizedPosting() {
432 //            delegate.disableResizedPosting();
433 //        }
434 //
435 //        @Override
436 //        @Deprecated
437 //        public void enableResizedPosting() {
438 //            delegate.enableResizedPosting();
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 //        @Override
457 //        public TableCellRenderer createDefaultHeaderRenderer() {
458 //            return delegate.createDefaultHeaderRenderer();
459 //        }
460     }
461 }