1 package fr.ifremer.reefdb.ui.swing.content.manage.referential.pmfm.local;
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.core.dao.referential.StatusCode;
27 import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
28 import fr.ifremer.reefdb.dao.technical.Daos;
29 import fr.ifremer.reefdb.dto.ReefDbBeans;
30 import fr.ifremer.reefdb.dto.referential.pmfm.PmfmDTO;
31 import fr.ifremer.reefdb.service.StatusFilter;
32 import fr.ifremer.reefdb.ui.swing.content.manage.referential.pmfm.menu.PmfmMenuUIModel;
33 import fr.ifremer.reefdb.ui.swing.content.manage.referential.pmfm.table.PmfmTableModel;
34 import fr.ifremer.reefdb.ui.swing.content.manage.referential.pmfm.table.PmfmTableRowModel;
35 import fr.ifremer.reefdb.ui.swing.util.table.AbstractReefDbTableModel;
36 import fr.ifremer.reefdb.ui.swing.util.table.AbstractReefDbTableUIHandler;
37 import fr.ifremer.reefdb.ui.swing.util.table.editor.AssociatedQualitativeValueCellEditor;
38 import fr.ifremer.reefdb.ui.swing.util.table.renderer.AssociatedQualitativeValueCellRenderer;
39 import org.apache.commons.collections4.CollectionUtils;
40 import org.apache.commons.logging.Log;
41 import org.apache.commons.logging.LogFactory;
42 import org.jdesktop.swingx.table.TableColumnExt;
43
44 import java.util.List;
45
46 import static org.nuiton.i18n.I18n.t;
47
48
49
50
51 public class PmfmsLocalUIHandler extends AbstractReefDbTableUIHandler<PmfmTableRowModel, PmfmsLocalUIModel, PmfmsLocalUI> {
52
53
54
55
56 private static final Log LOG = LogFactory.getLog(PmfmsLocalUIHandler.class);
57
58
59 @Override
60 public void beforeInit(final PmfmsLocalUI ui) {
61 super.beforeInit(ui);
62
63
64 final PmfmsLocalUIModel model = new PmfmsLocalUIModel();
65 ui.setContextValue(model);
66 }
67
68
69 @Override
70 public void afterInit(final PmfmsLocalUI ui) {
71 initUI(ui);
72
73
74 ui.getPmfmsLocalMenuUI().getHandler().enableContextFilter(false);
75
76
77 ui.getPmfmsLocalMenuUI().getHandler().forceLocal(true);
78
79
80 ui.getPmfmsLocalMenuUI().getNamePanel().setVisible(false);
81
82
83 ui.getPmfmsLocalMenuUI().getModel().addPropertyChangeListener(PmfmMenuUIModel.PROPERTY_RESULTS, evt -> getModel().setBeans((List<PmfmDTO>) evt.getNewValue()));
84
85
86 initTable();
87
88 getUI().getManageQuadrupletsLocalTableDeleteBouton().setEnabled(false);
89 getUI().getManageQuadrupletsLocalTableReplaceBouton().setEnabled(false);
90 }
91
92
93
94
95 private void initTable() {
96
97 TableColumnExt idCol = addColumn(PmfmTableModel.PMFM_ID);
98 idCol.setSortable(true);
99 idCol.setEditable(false);
100
101
102 final TableColumnExt parameterCol = addFilterableComboDataColumnToModel(
103 PmfmTableModel.PARAMETER,
104 getContext().getReferentialService().getParameters(StatusFilter.ACTIVE), false);
105 parameterCol.setSortable(true);
106
107
108 final TableColumnExt supportCol = addFilterableComboDataColumnToModel(
109 PmfmTableModel.SUPPORT,
110 getContext().getReferentialService().getMatrices(StatusFilter.ACTIVE), false);
111 supportCol.setSortable(true);
112
113
114 final TableColumnExt fractionCol = addFilterableComboDataColumnToModel(
115 PmfmTableModel.FRACTION,
116 getContext().getReferentialService().getFractions(StatusFilter.ACTIVE), false);
117 fractionCol.setSortable(true);
118
119
120 final TableColumnExt methodCol = addFilterableComboDataColumnToModel(
121 PmfmTableModel.METHOD,
122 getContext().getReferentialService().getMethods(StatusFilter.ACTIVE), false);
123 methodCol.setSortable(true);
124
125
126 final TableColumnExt unitCol = addFilterableComboDataColumnToModel(
127 PmfmTableModel.UNIT,
128 getContext().getReferentialService().getUnits(StatusFilter.ACTIVE),
129 false);
130 unitCol.setSortable(true);
131
132
133
134 addCommentColumn(PmfmTableModel.COMMENT);
135 TableColumnExt creationDateCol = addDatePickerColumnToModel(PmfmTableModel.CREATION_DATE, getConfig().getDateTimeFormat(), false);
136 fixColumnWidth(creationDateCol, 120);
137 TableColumnExt updateDateCol = addDatePickerColumnToModel(PmfmTableModel.UPDATE_DATE, getConfig().getDateTimeFormat(), false);
138 fixColumnWidth(updateDateCol, 120);
139
140
141
142 final TableColumnExt statusCol = addFilterableComboDataColumnToModel(
143 PmfmTableModel.STATUS,
144 getContext().getReferentialService().getStatus(StatusFilter.LOCAL), false);
145 statusCol.setSortable(true);
146 fixDefaultColumnWidth(statusCol);
147
148
149 final TableColumnExt associatedQualitativeValueCol = addColumn(
150 new AssociatedQualitativeValueCellEditor(getTable(), getUI(), true),
151 new AssociatedQualitativeValueCellRenderer(),
152 PmfmTableModel.QUALITATIVE_VALUES);
153 associatedQualitativeValueCol.setSortable(true);
154 fixColumnWidth(associatedQualitativeValueCol, 120);
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171 PmfmTableModel tableModel = new PmfmTableModel(getTable().getColumnModel());
172 getTable().setModel(tableModel);
173
174
175 addExportToCSVAction(t("reefdb.property.pmfms.local"), PmfmTableModel.QUALITATIVE_VALUES);
176
177
178 initTable(getTable());
179
180
181 idCol.setVisible(false);
182
183
184
185
186 creationDateCol.setVisible(false);
187 updateDateCol.setVisible(false);
188
189 getTable().setVisibleRowCount(5);
190 }
191
192
193 @Override
194 public AbstractReefDbTableModel<PmfmTableRowModel> getTableModel() {
195 return (PmfmTableModel) getTable().getModel();
196 }
197
198
199 @Override
200 public SwingTable getTable() {
201 return ui.getPmfmsLocalTable();
202 }
203
204
205 @Override
206 protected void onRowsAdded(List<PmfmTableRowModel> addedRows) {
207 super.onRowsAdded(addedRows);
208
209 if (addedRows.size() == 1) {
210 PmfmTableRowModel row = addedRows.get(0);
211
212 row.setStatus(Daos.getStatus(StatusCode.LOCAL_ENABLE));
213 setFocusOnCell(row);
214 }
215 }
216
217
218 @Override
219 protected void onRowModified(int rowIndex, PmfmTableRowModel row, String propertyName, Integer propertyIndex, Object oldValue, Object newValue) {
220 super.onRowModified(rowIndex, row, propertyName, propertyIndex, oldValue, newValue);
221 row.setDirty(true);
222 forceRevalidateModel();
223 }
224
225
226 @Override
227 protected boolean isRowValid(PmfmTableRowModel row) {
228 row.getErrors().clear();
229
230 return super.isRowValid(row) && isUnique(row);
231 }
232
233 private boolean isUnique(PmfmTableRowModel row) {
234
235 if (row.getParameter() != null && row.getMatrix() != null && row.getFraction() != null && row.getMethod() != null && row.getUnit() != null) {
236 boolean duplicateFound = false;
237
238
239 for (PmfmTableRowModel otherRow : getModel().getRows()) {
240 if (row == otherRow) continue;
241 if (row.getParameter().equals(otherRow.getParameter())
242 && row.getMatrix().equals(otherRow.getMatrix())
243 && row.getFraction().equals(otherRow.getFraction())
244 && row.getMethod().equals(otherRow.getMethod())
245 && row.getUnit().equals(otherRow.getUnit())) {
246
247 ReefDbBeans.addError(row,
248 t("reefdb.error.alreadyExists.referential",
249 t("reefdb.property.pmfm"), decorate(row), t("reefdb.property.referential.local")),
250 PmfmDTO.PROPERTY_PARAMETER,
251 PmfmDTO.PROPERTY_MATRIX,
252 PmfmDTO.PROPERTY_FRACTION,
253 PmfmDTO.PROPERTY_METHOD,
254 PmfmDTO.PROPERTY_UNIT);
255 duplicateFound = true;
256 break;
257 }
258 }
259
260 if (!duplicateFound) {
261
262 List<PmfmDTO> existingPmfms =
263 getContext().getReferentialService().searchPmfms(StatusFilter.ALL,
264 row.getParameter().getCode(),
265 row.getMatrix().getId(),
266 row.getFraction().getId(),
267 row.getMethod().getId(),
268 row.getUnit().getId(),
269 null, null);
270 if (CollectionUtils.isNotEmpty(existingPmfms)) {
271 for (PmfmDTO pmfm : existingPmfms) {
272 if (!pmfm.getId().equals(row.getId())
273 && row.getUnit().equals(pmfm.getUnit())) {
274
275 ReefDbBeans.addError(row,
276 t("reefdb.error.alreadyExists.referential",
277 t("reefdb.property.pmfm"), decorate(row),
278 ReefDbBeans.isLocalStatus(pmfm.getStatus()) ? t("reefdb.property.referential.local") : t("reefdb.property.referential.national")),
279 PmfmDTO.PROPERTY_PARAMETER,
280 PmfmDTO.PROPERTY_MATRIX,
281 PmfmDTO.PROPERTY_FRACTION,
282 PmfmDTO.PROPERTY_METHOD,
283 PmfmDTO.PROPERTY_UNIT);
284 break;
285 }
286 }
287 }
288 }
289 }
290
291 return row.getErrors().isEmpty();
292 }
293
294 }