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.action.ActionFactory;
27 import fr.ifremer.quadrige3.ui.swing.table.renderer.NumberCellRenderer;
28 import org.jdesktop.swingx.renderer.DefaultTableRenderer;
29 import org.jdesktop.swingx.renderer.StringValue;
30 import org.jdesktop.swingx.table.TableColumnExt;
31
32 import javax.swing.JComponent;
33 import javax.swing.JLabel;
34 import javax.swing.JTable;
35 import javax.swing.SwingUtilities;
36 import javax.swing.table.TableColumn;
37 import java.awt.Component;
38 import java.util.concurrent.ThreadPoolExecutor;
39
40 import static org.nuiton.i18n.I18n.t;
41
42
43
44
45
46
47
48
49 public class RowNumberColumn<R extends AbstractRowUIModel<?, R>, T extends AbstractTableUIModel<?, R, T>>
50 extends TableColumnExt
51 implements FixedColumn {
52
53 private static final int DEFAULT_COLUMN_WIDTH = 50;
54
55 private final SwingTable table;
56
57
58
59
60
61
62 public SwingTable getTable() {
63 return table;
64 }
65
66
67
68
69
70
71 public RowNumberColumn(SwingTable table) {
72 super(table.getColumnCount(), DEFAULT_COLUMN_WIDTH);
73 this.table = table;
74 editable = false;
75 hideable = false;
76 sortable = false;
77 setResizable(false);
78
79 setHeaderValue(" ");
80
81 setCellRenderer(new RowNumberRenderer());
82
83
84 setIdentifier(new RowNumberColumnIdentifier<>());
85
86 }
87
88
89
90
91
92
93
94
95
96
97 @Override
98 public Integer getFixedPosition() {
99 return 0;
100 }
101
102 public static final class RowNumberColumnIdentifier<R extends AbstractRowUIModel<?, R>> extends ColumnIdentifier<R> {
103
104 protected RowNumberColumnIdentifier() {
105 super("internal_rowNumber",
106 null,
107 null,
108 Integer.class,
109 null,
110 false);
111 }
112
113 @Override
114 public Object getValue(R entry) {
115 return null;
116 }
117 }
118
119 private static class RowNumberRenderer extends NumberCellRenderer {
120
121 private ThreadPoolExecutor tableAdjustExecutor;
122 private int lastColumnWidth = DEFAULT_COLUMN_WIDTH;
123 private int cumulativeTargetWidth;
124
125 RowNumberRenderer() {
126 super(new DefaultTableRenderer((StringValue) value -> (value instanceof Integer) ? Integer.toString((Integer) value) : "", JLabel.RIGHT));
127
128 tableAdjustExecutor = ActionFactory.createSingleThreadExecutor(ActionFactory.ExecutionMode.LATEST);
129 }
130
131 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
132
133 Component component = super.getTableCellRendererComponent(table, row + 1, isSelected, hasFocus, row, column);
134 if (table == null || table.getTableHeader() == null)
135 return component;
136
137
138 table.getTableHeader().setToolTipText(t("quadrige3.table.rowCount", table.getRowCount()));
139
140
141 if (component instanceof JComponent) {
142 ((JComponent) component).setToolTipText(null);
143 }
144
145
146
147
148 return component;
149 }
150
151 private void adjustTable(JTable table, TableColumn column, int targetWidth) {
152
153 cumulativeTargetWidth = Math.max(cumulativeTargetWidth, Math.max(targetWidth + 5, DEFAULT_COLUMN_WIDTH));
154 if (cumulativeTargetWidth != lastColumnWidth) {
155
156 tableAdjustExecutor.execute(() -> {
157 column.setPreferredWidth(cumulativeTargetWidth);
158 lastColumnWidth = cumulativeTargetWidth;
159 cumulativeTargetWidth = 0;
160 table.setPreferredScrollableViewportSize(table.getPreferredSize());
161 SwingUtilities.invokeLater(table::repaint);
162 });
163 }
164
165 }
166 }
167
168 }