1 package fr.ifremer.dali.ui.swing.content.manage.program.pmfms;
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.dali.decorator.DecoratorService;
27 import fr.ifremer.dali.dto.DaliBeans;
28 import fr.ifremer.dali.dto.configuration.programStrategy.PmfmStrategyDTO;
29 import fr.ifremer.dali.dto.configuration.programStrategy.StrategyDTO;
30 import fr.ifremer.dali.dto.enums.FilterTypeValues;
31 import fr.ifremer.dali.dto.referential.pmfm.PmfmDTO;
32 import fr.ifremer.dali.ui.swing.content.manage.filter.select.SelectFilterUI;
33 import fr.ifremer.dali.ui.swing.content.manage.program.ProgramsUI;
34 import fr.ifremer.dali.ui.swing.content.manage.program.pmfms.edit.EditPmfmDialogUI;
35 import fr.ifremer.dali.ui.swing.content.manage.program.programs.ProgramsTableRowModel;
36 import fr.ifremer.dali.ui.swing.content.manage.program.strategies.StrategiesTableRowModel;
37 import fr.ifremer.dali.ui.swing.util.AbstractDaliBeanUIModel;
38 import fr.ifremer.dali.ui.swing.util.table.AbstractDaliTableModel;
39 import fr.ifremer.dali.ui.swing.util.table.AbstractDaliTableUIHandler;
40 import fr.ifremer.dali.ui.swing.util.table.editor.AssociatedQualitativeValueCellEditor;
41 import fr.ifremer.dali.ui.swing.util.table.renderer.AssociatedQualitativeValueCellRenderer;
42 import fr.ifremer.quadrige3.core.dao.technical.Assert;
43 import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
44 import jaxx.runtime.SwingUtil;
45 import org.apache.commons.logging.Log;
46 import org.apache.commons.logging.LogFactory;
47 import org.jdesktop.swingx.table.TableColumnExt;
48
49 import java.awt.Dimension;
50 import java.util.List;
51 import java.util.stream.Collectors;
52
53 import static org.nuiton.i18n.I18n.t;
54
55
56
57
58 public class PmfmsTableUIHandler extends AbstractDaliTableUIHandler<PmfmsTableRowModel, PmfmsTableUIModel, PmfmsTableUI> {
59
60
61
62
63 private static final Log LOG = LogFactory.getLog(PmfmsTableUIHandler.class);
64
65
66
67
68 public PmfmsTableUIHandler() {
69 super(PmfmsTableRowModel.PROPERTY_SURVEY,
70 PmfmsTableRowModel.PROPERTY_SAMPLING,
71 PmfmsTableRowModel.PROPERTY_GROUPING,
72 PmfmsTableRowModel.PROPERTY_UNIQUE);
73 }
74
75
76
77
78 @Override
79 protected String[] getRowPropertiesToIgnore() {
80 return new String[]{PmfmsTableRowModel.PROPERTY_ERRORS};
81 }
82
83
84
85
86 @Override
87 public AbstractDaliTableModel<PmfmsTableRowModel> getTableModel() {
88 return (PmfmsTableModel) getTable().getModel();
89 }
90
91
92
93
94 @Override
95 public SwingTable getTable() {
96 return getUI().getPmfmsTable();
97 }
98
99
100
101
102 @Override
103 public void beforeInit(final PmfmsTableUI ui) {
104 super.beforeInit(ui);
105
106
107 final PmfmsTableUIModel model = new PmfmsTableUIModel();
108 ui.setContextValue(model);
109 }
110
111
112
113
114 @Override
115 public void afterInit(PmfmsTableUI ui) {
116
117
118 initUI(ui);
119
120
121 initTable();
122 SwingUtil.setLayerUI(ui.getTableScrollPane(), ui.getTableBlockLayer());
123
124
125 initListeners();
126
127 }
128
129
130
131
132 @Override
133 protected void onRowModified(int rowIndex, PmfmsTableRowModel row, String propertyName, Integer propertyIndex, Object oldValue, Object newValue) {
134 saveToStrategy();
135 super.onRowModified(rowIndex, row, propertyName, propertyIndex, oldValue, newValue);
136 forceRevalidateModel();
137 }
138
139
140
141
142 @Override
143 protected boolean isRowValid(final PmfmsTableRowModel row) {
144 row.getErrors().clear();
145 return (!row.isEditable() || super.isRowValid(row)) && isLevelValid(row);
146 }
147
148 private boolean isLevelValid(PmfmsTableRowModel row) {
149 if (!row.isSurvey() && !row.isSampling()) {
150 DaliBeans.addError(row, t("dali.program.pmfm.surveyAndSamplingOperation.null"), PmfmsTableRowModel.PROPERTY_SURVEY, PmfmsTableRowModel.PROPERTY_SAMPLING);
151 }
152 return row.getErrors().isEmpty();
153 }
154
155
156
157
158
159
160
161 public void load(ProgramsTableRowModel selectedProgram, StrategiesTableRowModel selectedStrategy) {
162
163 getModel().setEditable(true);
164
165 getModel().setBeans(selectedStrategy.getPmfmStrategies());
166
167 getModel().getRows().forEach(row -> row.setEditable(selectedProgram.isEditable()));
168
169 recomputeRowsValidState();
170
171 getModel().setLoading(false);
172 getModel().setLoaded(true);
173 }
174
175
176
177
178 public void upPmfm() {
179
180 if (getModel().getSelectedRows().size() != 1) {
181 return;
182 }
183
184
185 final PmfmsTableRowModel psfmToUp = getModel().getSelectedRows().iterator().next();
186 int rowModelIndex = getTableModel().getRowIndex(psfmToUp);
187
188 if (rowModelIndex > 0) {
189
190 getTableModel().moveUp(psfmToUp);
191
192 int rowViewIndex = rowModelIndex - 1;
193 getTable().selectCell(rowViewIndex, null);
194
195 saveToStrategy();
196 getModel().setModify(true);
197 }
198
199 }
200
201
202
203
204 public void downPmfm() {
205
206 if (getModel().getSelectedRows().size() != 1) {
207 return;
208 }
209
210
211 final PmfmsTableRowModel pmfmToDown = getModel().getSelectedRows().iterator().next();
212 int rowModelIndex = getTableModel().getRowIndex(pmfmToDown);
213
214 if (rowModelIndex < getTableModel().getRowCount() - 1) {
215
216 getTableModel().moveDown(pmfmToDown);
217
218 int rowViewIndex = rowModelIndex + 1;
219 getTable().selectCell(rowViewIndex, null);
220
221 saveToStrategy();
222 getModel().setModify(true);
223 }
224
225 }
226
227
228
229
230 public void addPmfms() {
231
232 ProgramsTableRowModel program = getProgramsUI().getProgramsTableUI().getModel().getSingleSelectedRow();
233 StrategyDTO strategy = getProgramsUI().getStrategiesTableUI().getModel().getSingleSelectedRow();
234 Assert.notNull(program);
235 Assert.notNull(strategy);
236
237 final SelectFilterUI dialog = new SelectFilterUI(getContext(), FilterTypeValues.PMFM.getFilterTypeId());
238 dialog.setTitle(t("dali.program.pmfm.new.dialog.title"));
239 List<PmfmDTO> pmfms = getModel().getBeans().stream().map(PmfmStrategyDTO::getPmfm)
240 .sorted(getDecorator(PmfmDTO.class, DecoratorService.NAME_WITH_ID).getCurrentComparator())
241
242 .peek(pmfm -> pmfm.setReadOnly(true))
243 .collect(Collectors.toList());
244 dialog.getModel().setSelectedElements(pmfms);
245
246 openDialog(dialog, new Dimension(1024, 768));
247
248 if (dialog.getModel().isValid()) {
249
250 List<PmfmDTO> newPmfms = dialog.getModel().getSelectedElements().stream()
251 .map(element -> ((PmfmDTO) element))
252 .filter(newPmfm -> getModel().getBeans().stream().noneMatch(pmfmStrategy -> pmfmStrategy.getPmfm().equals(newPmfm)))
253 .collect(Collectors.toList());
254
255 if (!newPmfms.isEmpty()) {
256
257
258 strategy.addAllPmfmStrategies(newPmfms.stream().map(DaliBeans::pmfmToPmfmStrategy).collect(Collectors.toList()));
259
260
261 getModel().setBeans(strategy.getPmfmStrategies());
262 recomputeRowsValidState();
263 saveToStrategy();
264 getModel().setModify(true);
265 }
266 }
267 }
268
269
270
271
272
273
274 private ProgramsUI getProgramsUI() {
275 return getUI().getParentContainer(ProgramsUI.class);
276 }
277
278
279
280
281 public void editPmfm() {
282
283 ProgramsTableRowModel program = getProgramsUI().getProgramsTableUI().getModel().getSingleSelectedRow();
284 Assert.notNull(program);
285
286 final EditPmfmDialogUI dialogue = new EditPmfmDialogUI(getContext());
287 dialogue.getModel().setTableModel(getModel());
288
289 openDialog(dialogue, new Dimension(600, 250));
290
291 getTable().repaint();
292 }
293
294
295
296
297 private void initListeners() {
298
299
300 getModel().addPropertyChangeListener(PmfmsTableUIModel.PROPERTY_SELECTED_ROWS, evt -> {
301
302
303 if (getModel().getSelectedRows().size() == 1) {
304
305
306 final int index = getModel().getRows().indexOf(getModel().getSelectedRows().iterator().next());
307 if (index == 0) {
308
309
310 getModel().setUpAllowed(false);
311 getModel().setDownAllowed(true);
312
313 } else if (index == getModel().getBeans().size() - 1) {
314
315
316 getModel().setUpAllowed(true);
317 getModel().setDownAllowed(false);
318 } else {
319
320
321 getModel().setUpAllowed(true);
322 getModel().setDownAllowed(true);
323 }
324 } else {
325
326 getModel().setUpAllowed(false);
327 getModel().setDownAllowed(false);
328 }
329 });
330 }
331
332
333
334
335 private void saveToStrategy() {
336
337 if (getModel().isLoading()) return;
338
339
340 getModel().getParentModel().getStrategiesUIModel().fireSavePmfmStrategies();
341
342 getModel().getParentModel().getProgramsUIModel().fireSaveStrategies();
343
344
345 recomputeRowsValidState();
346 getModel().firePropertyChanged(AbstractDaliBeanUIModel.PROPERTY_MODIFY, null, true);
347
348 }
349
350
351
352
353 public void removePmfms() {
354 if (getModel().getSelectedRows().isEmpty()) {
355 LOG.warn("Aucun psfm de selectionne");
356 return;
357 }
358
359
360 if (askBeforeDelete(t("dali.program.pmfm.delete.titre"), t("dali.program.pmfm.delete.message"))) {
361
362
363 getModel().deleteSelectedRows();
364
365 saveToStrategy();
366
367 }
368
369 }
370
371
372
373
374 private void initTable() {
375
376
377 final SwingTable table = getTable();
378
379 final TableColumnExt pmfmIdCol = addColumn(PmfmsTableModel.PMFM_ID);
380 pmfmIdCol.setSortable(false);
381
382
383 final TableColumnExt pmfmNameCol = addColumn(PmfmsTableModel.PMFM_NAME);
384 pmfmNameCol.setSortable(false);
385
386
387 final TableColumnExt parameterCol = addColumn(
388 null,
389 newTableCellRender(
390 PmfmsTableModel.PARAMETER_CODE.getPropertyType(),
391 PmfmsTableModel.PARAMETER_CODE.getDecoratorName(),
392 DecoratorService.NAME
393 ),
394 PmfmsTableModel.PARAMETER_CODE);
395 parameterCol.setSortable(false);
396
397
398 final TableColumnExt matrixCol = addColumn(PmfmsTableModel.MATRIX);
399 matrixCol.setSortable(false);
400
401
402 final TableColumnExt fractionCol = addColumn(PmfmsTableModel.FRACTION);
403 fractionCol.setSortable(false);
404
405
406 final TableColumnExt methodCol = addColumn(PmfmsTableModel.METHOD);
407 methodCol.setSortable(false);
408
409
410 final TableColumnExt unitCol = addColumn(PmfmsTableModel.UNIT);
411 unitCol.setSortable(false);
412
413
414 final TableColumnExt surveyCol = addBooleanColumnToModel(
415 PmfmsTableModel.SURVEY,
416 table);
417 surveyCol.setSortable(false);
418
419
420 final TableColumnExt samplingCol = addBooleanColumnToModel(
421 PmfmsTableModel.SAMPLING,
422 table);
423 samplingCol.setSortable(false);
424
425
426 final TableColumnExt groupingCol = addBooleanColumnToModel(
427 PmfmsTableModel.GROUPING,
428 table);
429 groupingCol.setSortable(false);
430
431
432 final TableColumnExt uniqueCol = addBooleanColumnToModel(
433 PmfmsTableModel.UNIQUE,
434 table);
435 uniqueCol.setSortable(false);
436
437
438 final TableColumnExt associatedQualitativeValueCol = addColumn(
439 new AssociatedQualitativeValueCellEditor(getTable(), getUI(), true),
440 new AssociatedQualitativeValueCellRenderer(),
441 PmfmsTableModel.QUALITATIVE_VALUES);
442 associatedQualitativeValueCol.setSortable(true);
443 fixColumnWidth(associatedQualitativeValueCol, 120);
444
445
446 final PmfmsTableModel tableModel = new PmfmsTableModel(getTable().getColumnModel());
447 table.setModel(tableModel);
448
449
450 tableModel.setNoneEditableCols(PmfmsTableModel.PMFM_ID, PmfmsTableModel.PMFM_NAME, PmfmsTableModel.PARAMETER_CODE, PmfmsTableModel.MATRIX,
451 PmfmsTableModel.FRACTION, PmfmsTableModel.METHOD, PmfmsTableModel.UNIT);
452
453 pmfmNameCol.setHideable(false);
454 surveyCol.setHideable(false);
455 samplingCol.setHideable(false);
456 groupingCol.setHideable(false);
457 uniqueCol.setHideable(false);
458
459
460 initTable(table);
461
462 pmfmIdCol.setVisible(false);
463
464 table.setVisibleRowCount(4);
465 }
466 }