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
27 import org.jdesktop.swingx.JXTable;
28
29 import javax.swing.ListSelectionModel;
30 import javax.swing.RowFilter;
31 import javax.swing.event.RowSorterEvent;
32 import javax.swing.table.JTableHeader;
33 import javax.swing.table.TableColumnModel;
34 import javax.swing.table.TableModel;
35 import java.util.Vector;
36
37
38
39
40
41
42
43
44 public class SwingTable extends JXTable {
45
46 private boolean sorting = false;
47 public static String PROPERTY_SORTING = "sorting";
48 public static String PROPERTY_SORTED = "sorted";
49 public static String PROPERTY_ROW_FILTER = "rowFilter";
50
51
52
53
54 public SwingTable() {
55 super();
56 init();
57 }
58
59
60
61
62
63
64 public SwingTable(TableModel dm) {
65 super(dm);
66 init();
67 }
68
69
70
71
72
73
74
75 public SwingTable(TableModel dm, TableColumnModel cm) {
76 super(dm, cm);
77 init();
78 }
79
80
81
82
83
84
85
86
87 public SwingTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) {
88 super(dm, cm, sm);
89 init();
90 }
91
92
93
94
95
96
97
98 public SwingTable(int numRows, int numColumns) {
99 super(numRows, numColumns);
100 init();
101 }
102
103
104
105
106
107
108
109 public SwingTable(Vector<?> rowData, Vector<?> columnNames) {
110 super(rowData, columnNames);
111 init();
112 }
113
114
115
116
117
118
119
120 public SwingTable(Object[][] rowData, Object[] columnNames) {
121 super(rowData, columnNames);
122 init();
123 }
124
125 protected void init() {
126 setAutoCreateColumnsFromModel(false);
127 setAutoCreateRowSorter(false);
128 setRowSorter(null);
129 }
130
131
132 @Override
133 protected JTableHeader createDefaultTableHeader() {
134 return new SwingTableHeader(columnModel);
135 }
136
137
138 @Override
139 public SwingTableHeader getTableHeader() {
140 return (SwingTableHeader) super.getTableHeader();
141 }
142
143 public AbstractTableModel getTableModel() {
144 return (AbstractTableModel) getModel();
145 }
146
147 @Override
148 public SwingTableColumnModel getColumnModel() {
149 return (SwingTableColumnModel) super.getColumnModel();
150 }
151
152 @Override
153 protected TableColumnModel createDefaultColumnModel() {
154 return new SwingTableColumnModel();
155 }
156
157
158 @Override
159 public void setSortable(boolean sortable) {
160 super.setSortable(sortable);
161 if (hasSortController()) {
162 getSortController().setSortable(sortable);
163 }
164 }
165
166 @Override
167 public void sorterChanged(RowSorterEvent e) {
168 setSorting(true);
169 super.sorterChanged(e);
170 setSorting(false);
171 firePropertyChange(PROPERTY_SORTED, false, true);
172 }
173
174 private void setSorting(boolean sorting) {
175 boolean oldValue = this.sorting;
176 this.sorting = sorting;
177 firePropertyChange(PROPERTY_SORTING, oldValue, sorting);
178 }
179
180 public boolean isSorting() {
181 return sorting;
182 }
183
184 @Override
185 public <R extends TableModel> void setRowFilter(RowFilter<? super R, ? super Integer> filter) {
186 RowFilter oldValue = getRowFilter();
187 super.setRowFilter(filter);
188 firePropertyChange(PROPERTY_ROW_FILTER, oldValue, filter);
189 }
190
191 public void selectCell(Integer rowIndex, Integer colIndex) {
192
193 int row = rowIndex != null ? rowIndex : getSelectedRow();
194 row = row != -1 ? row : 0;
195 int col = colIndex != null ? colIndex : getSelectedColumn();
196 col = col != -1 ? col : 0;
197
198
199 if (row >= 0 && row < getRowCount()) {
200 setRowSelectionInterval(row, row);
201 }
202
203 if (col >= 0 && col < getColumnCount()) {
204 setColumnSelectionInterval(col, col);
205 }
206 scrollCellToVisible(row, col);
207 }
208
209 }