1 package fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.ungrouped;
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.table.SwingTable;
27 import fr.ifremer.quadrige3.ui.swing.table.editor.ExtendedComboBoxCellEditor;
28 import fr.ifremer.reefdb.decorator.DecoratorService;
29 import fr.ifremer.reefdb.dto.ReefDbBeans;
30 import fr.ifremer.reefdb.dto.data.measurement.MeasurementDTO;
31 import fr.ifremer.reefdb.dto.data.survey.SurveyDTO;
32 import fr.ifremer.reefdb.dto.enums.FilterTypeValues;
33 import fr.ifremer.reefdb.dto.referential.DepartmentDTO;
34 import fr.ifremer.reefdb.service.ReefDbTechnicalException;
35 import fr.ifremer.reefdb.ui.swing.util.table.AbstractReefDbTableUIHandler;
36 import jaxx.runtime.SwingUtil;
37 import org.apache.commons.collections4.CollectionUtils;
38 import org.jdesktop.swingx.table.TableColumnExt;
39
40 import javax.swing.SwingUtilities;
41 import java.util.Optional;
42
43 import static org.nuiton.i18n.I18n.t;
44
45
46
47
48 public class SurveyMeasurementsUngroupedTableUIHandler
49 extends AbstractReefDbTableUIHandler<SurveyMeasurementsUngroupedRowModel, SurveyMeasurementsUngroupedTableUIModel, SurveyMeasurementsUngroupedTableUI> {
50
51 private static final int ROW_COUNT = 5;
52
53
54 private ExtendedComboBoxCellEditor<DepartmentDTO> departmentCellEditor;
55
56
57
58
59 public SurveyMeasurementsUngroupedTableUIHandler() {
60 super(SurveyMeasurementsUngroupedRowModel.PROPERTY_PMFMS);
61 }
62
63
64
65
66 @Override
67 public SurveyMeasurementsUngroupedTableModel getTableModel() {
68 return (SurveyMeasurementsUngroupedTableModel) getTable().getModel();
69 }
70
71
72
73
74 @Override
75 public void beforeInit(final SurveyMeasurementsUngroupedTableUI ui) {
76 super.beforeInit(ui);
77
78 ui.setContextValue(new SurveyMeasurementsUngroupedTableUIModel());
79 }
80
81
82
83
84 @Override
85 public void afterInit(final SurveyMeasurementsUngroupedTableUI ui) {
86
87
88 initUI(ui);
89 createDepartmentCellEditor();
90 updateDepartmentCellEditor(false);
91
92 initTable();
93 SwingUtil.setLayerUI(ui.getTableauHautScrollPane(), ui.getTableBlockLayer());
94
95
96 initListeners();
97
98 getTable().setVisibleRowCount(ROW_COUNT);
99 }
100
101 private void createDepartmentCellEditor() {
102
103 departmentCellEditor = newExtendedComboBoxCellEditor(null, DepartmentDTO.class, false);
104
105 departmentCellEditor.setAction("unfilter", "reefdb.common.unfilter", e -> {
106 if (!askBefore(t("reefdb.common.unfilter"), t("reefdb.common.unfilter.confirmation"))) {
107 return;
108 }
109
110 updateDepartmentCellEditor(true);
111 });
112
113 }
114
115 private void updateDepartmentCellEditor(boolean forceNoFilter) {
116
117 departmentCellEditor.getCombo().setActionEnabled(!forceNoFilter
118 && getContext().getDataContext().isContextFiltered(FilterTypeValues.DEPARTMENT));
119
120 departmentCellEditor.getCombo().setData(getContext().getObservationService().getAvailableDepartments(forceNoFilter));
121 }
122
123
124
125
126 private void initListeners() {
127
128 getModel().addPropertyChangeListener(SurveyMeasurementsUngroupedTableUIModel.PROPERTY_SURVEY, evt -> loadSurvey());
129
130 }
131
132
133
134
135 private void loadSurvey() {
136
137 SwingUtilities.invokeLater(() -> {
138
139
140 uninstallSaveTableStateListener();
141
142 addPmfmColumns(
143 getModel().getPmfms(),
144 SurveyDTO.PROPERTY_PMFMS,
145 DecoratorService.NAME_WITH_UNIT);
146
147 boolean notEmpty = CollectionUtils.isNotEmpty(getModel().getPmfms());
148
149
150 getTableModel().setReadOnly(!getModel().getSurvey().isEditable());
151
152 getModel().setRows(null);
153
154 if (notEmpty) {
155
156
157 SurveyMeasurementsUngroupedRowModel row = getModel().addNewRow(getModel().getSurvey());
158
159
160 Optional<MeasurementDTO> measurementFound = getModel().getSurvey().getMeasurements().stream().filter(measurement -> measurement.getAnalyst() != null).findFirst();
161 if (measurementFound.isPresent()) {
162 row.setAnalyst(measurementFound.get().getAnalyst());
163 } else {
164 row.setAnalyst(getContext().getProgramStrategyService().getAnalysisDepartmentOfAppliedStrategyBySurvey(
165 getModel().getSurvey(),
166 getModel().getPmfms()
167 ));
168 }
169
170 }
171
172 recomputeRowsValidState();
173
174
175 restoreTableState();
176
177
178
179
180 forceColumnVisible(SurveyMeasurementsUngroupedTableModel.ANALYST, notEmpty);
181
182
183 installSaveTableStateListener();
184
185 getModel().fireMeasurementsLoaded();
186 });
187 }
188
189
190
191
192 @Override
193 protected void onRowModified(int rowIndex, SurveyMeasurementsUngroupedRowModel row, String propertyName, Integer propertyIndex, Object oldValue, Object newValue) {
194
195
196 if (SurveyMeasurementsUngroupedRowModel.PROPERTY_PMFMS.equals(propertyName) && oldValue == newValue) {
197 return;
198 }
199
200 super.onRowModified(rowIndex, row, propertyName, propertyIndex, oldValue, newValue);
201
202 getModel().getSurvey().setDirty(true);
203
204 }
205
206 public void save() {
207
208 if (getModel().getRowCount() == 0)
209 return;
210
211 if (getModel().getRowCount() > 1)
212 throw new ReefDbTechnicalException("Should be only 1 row of survey ungrouped measurements");
213
214 SurveyMeasurementsUngroupedRowModel row = getModel().getRows().get(0);
215
216
217 row.getMeasurements().forEach(measurement -> measurement.setAnalyst(row.getAnalyst()));
218
219
220 getModel().getSurvey().setMeasurements(row.getMeasurements());
221
222 }
223
224
225
226
227 @Override
228 protected boolean isRowValid(SurveyMeasurementsUngroupedRowModel row) {
229 return super.isRowValid(row) && isMeasurementRowValid(row);
230 }
231
232 private boolean isMeasurementRowValid(SurveyMeasurementsUngroupedRowModel row) {
233
234 if (row.getAnalyst() == null && row.getMeasurements().stream().anyMatch(measurement -> !ReefDbBeans.isMeasurementEmpty(measurement))) {
235 ReefDbBeans.addError(row,
236 t("reefdb.validator.error.analyst.required"),
237 SurveyMeasurementsUngroupedRowModel.PROPERTY_ANALYST);
238 return false;
239 }
240 return true;
241 }
242
243
244
245
246 private void initTable() {
247
248
249 TableColumnExt analystColumn = addColumn(
250 departmentCellEditor,
251 newTableCellRender(SurveyMeasurementsUngroupedTableModel.ANALYST),
252 SurveyMeasurementsUngroupedTableModel.ANALYST
253 );
254 analystColumn.setMinWidth(100);
255
256
257 SurveyMeasurementsUngroupedTableModel tableModel = new SurveyMeasurementsUngroupedTableModel(getTable().getColumnModel());
258 tableModel.setNoneEditableCols();
259 getTable().setModel(tableModel);
260
261
262 initTable(getTable(), true);
263
264
265 addEditionPanelBorder();
266 }
267
268
269
270
271 @Override
272 public SwingTable getTable() {
273 return ui.getSurveyUngroupedMeasurementTable();
274 }
275 }