1 package fr.ifremer.reefdb.ui.swing.content.manage.referential.taxon.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.decorator.DecoratorService;
30 import fr.ifremer.reefdb.dto.ReefDbBeanFactory;
31 import fr.ifremer.reefdb.dto.ReefDbBeans;
32 import fr.ifremer.reefdb.dto.configuration.filter.taxon.TaxonCriteriaDTO;
33 import fr.ifremer.reefdb.dto.referential.TaxonDTO;
34 import fr.ifremer.reefdb.ui.swing.content.manage.referential.taxon.menu.TaxonMenuUIModel;
35 import fr.ifremer.reefdb.ui.swing.content.manage.referential.taxon.table.TaxonTableModel;
36 import fr.ifremer.reefdb.ui.swing.content.manage.referential.taxon.table.TaxonTableRowModel;
37 import fr.ifremer.reefdb.ui.swing.util.table.AbstractReefDbTableModel;
38 import fr.ifremer.reefdb.ui.swing.util.table.AbstractReefDbTableUIHandler;
39 import org.apache.commons.collections4.CollectionUtils;
40 import org.apache.commons.lang3.StringUtils;
41 import org.apache.commons.logging.Log;
42 import org.apache.commons.logging.LogFactory;
43 import org.jdesktop.swingx.table.TableColumnExt;
44
45 import java.util.List;
46 import java.util.Objects;
47
48 import static org.nuiton.i18n.I18n.t;
49
50
51
52
53 public class TaxonsLocalUIHandler extends AbstractReefDbTableUIHandler<TaxonTableRowModel, TaxonsLocalUIModel, TaxonsLocalUI> {
54
55
56
57
58 private static final Log LOG = LogFactory.getLog(TaxonsLocalUIHandler.class);
59
60
61
62
63 @Override
64 public void beforeInit(final TaxonsLocalUI ui) {
65 super.beforeInit(ui);
66
67
68 final TaxonsLocalUIModel model = new TaxonsLocalUIModel();
69 ui.setContextValue(model);
70 }
71
72
73
74
75 @Override
76 public void afterInit(final TaxonsLocalUI ui) {
77 initUI(ui);
78
79
80 ui.getTaxonsLocalMenuUI().getHandler().enableContextFilter(false);
81
82
83 ui.getTaxonsLocalMenuUI().getHandler().forceLocal(true);
84
85 TaxonMenuUIModel localMenuModel = ui.getTaxonsLocalMenuUI().getModel();
86
87
88 localMenuModel.setFullProperties(true);
89
90
91 localMenuModel.addPropertyChangeListener(TaxonMenuUIModel.PROPERTY_RESULTS, evt -> getModel().setBeans((List<TaxonDTO>) evt.getNewValue()));
92
93
94 initTable();
95 }
96
97
98
99
100 private void initTable() {
101
102
103 TableColumnExt nameCol = addColumn(TaxonTableModel.NAME);
104 nameCol.setSortable(true);
105
106
107 List<TaxonDTO> taxons = getContext().getReferentialService().getTaxons(null);
108 getContext().getReferentialService().fillReferentTaxons(taxons);
109 addColumn(
110 newFilterableComboBoxCellEditor(taxons, TaxonDTO.class, DecoratorService.WITH_CITATION_AND_REFERENT, false),
111 newTableCellRender(TaxonDTO.class, null, DecoratorService.WITH_CITATION_AND_REFERENT),
112 TaxonTableModel.PARENT);
113
114
115 TableColumnExt levelCol = addFilterableComboDataColumnToModel(
116 TaxonTableModel.LEVEL,
117 getContext().getReferentialService().getTaxonomicLevels(),
118 false);
119
120
121 TableColumnExt commentCol = addCommentColumn(TaxonTableModel.COMMENT);
122 commentCol.setSortable(false);
123 TableColumnExt creationDateCol = addDatePickerColumnToModel(TaxonTableModel.CREATION_DATE, getConfig().getDateTimeFormat(), false);
124 fixColumnWidth(creationDateCol, 120);
125 TableColumnExt updateDateCol = addDatePickerColumnToModel(TaxonTableModel.UPDATE_DATE, getConfig().getDateTimeFormat(), false);
126 fixColumnWidth(updateDateCol, 120);
127
128
129 TableColumnExt citationCol = addFilterableComboDataColumnToModel(
130 TaxonTableModel.CITATION,
131 getContext().getReferentialService().getCitations(),
132 false);
133
134
135 TableColumnExt obsoleteCol = addBooleanColumnToModel(TaxonTableModel.OBSOLETE, getTable());
136 obsoleteCol.setSortable(false);
137
138 TaxonTableModel tableModel = new TaxonTableModel(getTable().getColumnModel(), true);
139 getTable().setModel(tableModel);
140
141
142 addExportToCSVAction(t("reefdb.property.taxons.local"));
143
144
145 initTable(getTable());
146
147
148 citationCol.setVisible(false);
149
150 creationDateCol.setVisible(false);
151 updateDateCol.setVisible(false);
152
153 getTable().setVisibleRowCount(5);
154 }
155
156
157
158
159 @Override
160 public AbstractReefDbTableModel<TaxonTableRowModel> getTableModel() {
161 return (TaxonTableModel) getTable().getModel();
162 }
163
164
165
166
167 @Override
168 public SwingTable getTable() {
169 return ui.getTaxonsLocalTable();
170 }
171
172
173
174
175 @Override
176 protected void onRowsAdded(List<TaxonTableRowModel> addedRows) {
177 super.onRowsAdded(addedRows);
178
179 if (addedRows.size() == 1) {
180 TaxonTableRowModel rowModel = addedRows.get(0);
181
182 rowModel.setStatus(Daos.getStatus(StatusCode.LOCAL_ENABLE));
183 setFocusOnCell(rowModel);
184 }
185 }
186
187
188
189
190 @Override
191 protected void onRowModified(int rowIndex, TaxonTableRowModel row, String propertyName, Integer propertyIndex, Object oldValue, Object newValue) {
192 super.onRowModified(rowIndex, row, propertyName, propertyIndex, oldValue, newValue);
193 row.setDirty(true);
194 forceRevalidateModel();
195 }
196
197
198
199
200 @Override
201 protected boolean isRowValid(TaxonTableRowModel row) {
202 row.getErrors().clear();
203 return super.isRowValid(row) && isUnique(row);
204 }
205
206 private boolean isUnique(TaxonTableRowModel row) {
207
208 if (StringUtils.isNotBlank(row.getName())) {
209 boolean duplicateFound = false;
210
211
212 for (TaxonTableRowModel otherRow : getModel().getRows()) {
213 if (row == otherRow) continue;
214 if (row.getName().equalsIgnoreCase(otherRow.getName())
215 && Objects.equals(row.getCitation(), otherRow.getCitation())) {
216
217 ReefDbBeans.addError(row,
218 t("reefdb.error.alreadyExists.referential",
219 t("reefdb.property.taxon"), decorate(row, DecoratorService.WITH_CITATION), t("reefdb.property.referential.local")),
220 TaxonDTO.PROPERTY_NAME,
221 TaxonDTO.PROPERTY_CITATION);
222 duplicateFound = true;
223 break;
224 }
225 }
226
227 if (!duplicateFound) {
228
229 TaxonCriteriaDTO taxonCriteria = ReefDbBeanFactory.newTaxonCriteriaDTO();
230 taxonCriteria.setName(row.getName());
231 taxonCriteria.setStrictName(true);
232 List<TaxonDTO> existingTaxons = getContext().getReferentialService().searchTaxons(taxonCriteria);
233 if (CollectionUtils.isNotEmpty(existingTaxons)) {
234 for (TaxonDTO taxon : existingTaxons) {
235 if (!taxon.getId().equals(row.getId())
236 && Objects.equals(row.getCitation(), taxon.getCitation())) {
237
238 ReefDbBeans.addError(row,
239 t("reefdb.error.alreadyExists.referential",
240 t("reefdb.property.pmfm"), decorate(row, DecoratorService.WITH_CITATION),
241 ReefDbBeans.isLocalStatus(taxon.getStatus()) ? t("reefdb.property.referential.local") : t("reefdb.property.referential.national")),
242 TaxonDTO.PROPERTY_NAME,
243 TaxonDTO.PROPERTY_CITATION);
244 break;
245 }
246 }
247 }
248 }
249 }
250
251 return row.getErrors().isEmpty();
252
253 }
254
255 }