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 org.jdesktop.swingx.table.TableColumnExt;
27
28 import javax.swing.*;
29 import javax.swing.table.TableCellRenderer;
30 import javax.swing.table.TableColumnModel;
31 import java.awt.Component;
32 import java.awt.Container;
33 import java.awt.Graphics;
34 import java.awt.event.MouseAdapter;
35 import java.awt.event.MouseEvent;
36 import java.util.List;
37
38 import static org.nuiton.i18n.I18n.n;
39
40
41
42
43
44
45
46 public class CheckTableColumn<R extends AbstractRowUIModel> extends TableColumnExt implements FixedColumn {
47
48 private final SwingTable table;
49 private boolean allSelected;
50 private boolean allEnabled;
51
52
53
54
55
56
57 public SwingTable getTable() {
58 return table;
59 }
60
61
62
63
64
65
66 public final AbstractTableUIModel getTableModel() {
67 return table.getTableModel().getTableUIModel();
68 }
69
70
71
72
73
74
75 public boolean isAllSelected() {
76 return allSelected;
77 }
78
79
80
81
82
83
84 public void setAllSelected(boolean allSelected) {
85 this.allSelected = allSelected;
86 }
87
88
89
90
91
92
93 public boolean isAllEnabled() {
94 return allEnabled;
95 }
96
97
98
99
100
101
102 public void setAllEnabled(boolean allEnabled) {
103 this.allEnabled = allEnabled;
104 }
105
106
107
108
109
110
111 public CheckTableColumn(SwingTable table) {
112 super(table.getColumnCount());
113 this.table = table;
114 editable = true;
115 hideable = false;
116 sortable = false;
117 allEnabled = true;
118 allSelected = false;
119
120 setWidth(41);
121 setMinWidth(width);
122 setMaxWidth(width);
123
124 setCellEditor(table.getDefaultEditor(Boolean.class));
125 setCellRenderer(table.getDefaultRenderer(Boolean.class));
126
127
128 setHeaderRenderer(new CheckAllHeaderRenderer(this));
129
130
131 setIdentifier(new CheckTableColumnIdentifier<>());
132 }
133
134
135
136
137 @Override
138 @SuppressWarnings("unchecked")
139 public ColumnIdentifier<R> getIdentifier() {
140 return (ColumnIdentifier<R>) super.getIdentifier();
141 }
142
143 @Override
144 public Integer getFixedPosition() {
145 return 1;
146 }
147
148 public static final class CheckTableColumnIdentifier<R extends AbstractRowUIModel> extends ColumnIdentifier<R> {
149
150
151
152
153 protected CheckTableColumnIdentifier() {
154 super(AbstractRowUIModel.PROPERTY_SELECTED,
155 null,
156 n("quadrige3.table.checkAllColumn.tip"),
157 Boolean.class,
158 null,
159 false);
160 }
161 }
162
163 private class CheckAllHeaderRenderer extends JCheckBox implements TableCellRenderer {
164
165 private final CheckTableColumn checkColumn;
166
167 @SuppressWarnings("unchecked")
168 private CheckAllHeaderRenderer(CheckTableColumn targetColumn) {
169 super((String) null);
170 this.checkColumn = targetColumn;
171
172 setOpaque(false);
173 setFont(checkColumn.getTable().getTableHeader().getFont());
174
175
176 checkColumn.getTable().getTableHeader().addMouseListener(new MouseAdapter() {
177
178 @Override
179 public void mouseClicked(MouseEvent e) {
180 SwingTable table = checkColumn.getTable();
181
182 if (!table.isEnabled() || !table.isEditable()) {
183 return;
184 }
185
186 TableColumnModel columnModel = table.getColumnModel();
187 int vci = columnModel.getColumnIndexAtX(e.getX());
188 if (table.getColumn(vci) == checkColumn) {
189 boolean allChecked = !isSelected();
190 checkColumn.setAllSelected(allChecked);
191 checkColumn.setAllEnabled(true);
192
193 if (checkColumn.getTableModel() != null && checkColumn.getTableModel().getRowCount() > 0) {
194 for (R row : (List<R>) checkColumn.getTableModel().getRows()) {
195 if (!row.isCalculated() ) {
196 row.selected = allChecked;
197 }
198 }
199
200
201 checkColumn.getTableModel().populateSelectedRows();
202
203 table.getTableHeader().repaint();
204 table.repaint();
205 }
206
207 }
208 }
209
210 });
211 }
212
213 @Override
214 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
215 if (table == null) {
216 return new JLabel();
217 }
218 TableCellRenderer r = table.getTableHeader().getDefaultRenderer();
219 JLabel l = (JLabel) r.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
220 if (table.getColumnModel().getColumn(column) == checkColumn) {
221
222 if (!table.isEnabled() || !checkColumn.getTable().isEditable() || table.getRowCount() == 0) checkColumn.setAllSelected(false);
223 setSelected(checkColumn.isAllSelected());
224 setEnabled(checkColumn.isAllEnabled());
225 l.setIcon(new ComponentIcon(this));
226 l.setHorizontalAlignment(SwingConstants.CENTER);
227 l.setVerticalAlignment(SwingConstants.TOP);
228 }
229 l.setText(null);
230 return l;
231 }
232
233 }
234
235 class ComponentIcon implements Icon {
236
237 private final JComponent cmp;
238
239 public ComponentIcon(JComponent cmp) {
240 this.cmp = cmp;
241 }
242
243 @Override
244 public int getIconWidth() {
245 return cmp.getPreferredSize().width;
246 }
247
248 @Override
249 public int getIconHeight() {
250 return cmp.getPreferredSize().height;
251 }
252
253 @Override
254 public void paintIcon(Component c, Graphics g, int x, int y) {
255 SwingUtilities.paintComponent(g, cmp, (Container) c, x, y, getIconWidth(), getIconHeight());
256 }
257 }
258
259 }