View Javadoc
1   package fr.ifremer.reefdb.ui.swing.content.manage.referential.pmfm.local;
2   
3   /*
4    * #%L
5    * Reef DB :: UI
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2014 - 2015 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU Affero General Public License as published by
13   * the Free Software Foundation, either version 3 of the License, or
14   * (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU Affero General Public License
22   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23   * #L%
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   * Controlleur pour l administration des Quadruplets au niveau local
50   */
51  public class PmfmsLocalUIHandler extends AbstractReefDbTableUIHandler<PmfmTableRowModel, PmfmsLocalUIModel, PmfmsLocalUI> {
52  
53      /**
54       * Logger.
55       */
56      private static final Log LOG = LogFactory.getLog(PmfmsLocalUIHandler.class);
57  
58      /** {@inheritDoc} */
59      @Override
60      public void beforeInit(final PmfmsLocalUI ui) {
61          super.beforeInit(ui);
62  
63          // create model and register to the JAXX context
64          final PmfmsLocalUIModel model = new PmfmsLocalUIModel();
65          ui.setContextValue(model);
66      }
67  
68      /** {@inheritDoc} */
69      @Override
70      public void afterInit(final PmfmsLocalUI ui) {
71          initUI(ui);
72  
73          // hide context filter panel
74          ui.getPmfmsLocalMenuUI().getHandler().enableContextFilter(false);
75  
76          // force local
77          ui.getPmfmsLocalMenuUI().getHandler().forceLocal(true);
78  
79          // hide name panel
80          ui.getPmfmsLocalMenuUI().getNamePanel().setVisible(false);
81  
82          // listen to search results
83          ui.getPmfmsLocalMenuUI().getModel().addPropertyChangeListener(PmfmMenuUIModel.PROPERTY_RESULTS, evt -> getModel().setBeans((List<PmfmDTO>) evt.getNewValue()));
84  
85          // Initialisation du tableau
86          initTable();
87  
88          getUI().getManageQuadrupletsLocalTableDeleteBouton().setEnabled(false);
89          getUI().getManageQuadrupletsLocalTableReplaceBouton().setEnabled(false);
90      }
91  
92      /**
93       * Initialisation du tableau.
94       */
95      private void initTable() {
96  
97          TableColumnExt idCol = addColumn(PmfmTableModel.PMFM_ID);
98          idCol.setSortable(true);
99          idCol.setEditable(false);
100 
101         // parameter
102         final TableColumnExt parameterCol = addFilterableComboDataColumnToModel(
103                 PmfmTableModel.PARAMETER,
104                 getContext().getReferentialService().getParameters(StatusFilter.ACTIVE), false);
105         parameterCol.setSortable(true);
106 
107         // support
108         final TableColumnExt supportCol = addFilterableComboDataColumnToModel(
109                 PmfmTableModel.SUPPORT,
110                 getContext().getReferentialService().getMatrices(StatusFilter.ACTIVE), false);
111         supportCol.setSortable(true);
112 
113         // fraction
114         final TableColumnExt fractionCol = addFilterableComboDataColumnToModel(
115                 PmfmTableModel.FRACTION,
116                 getContext().getReferentialService().getFractions(StatusFilter.ACTIVE), false);
117         fractionCol.setSortable(true);
118 
119         // method
120         final TableColumnExt methodCol = addFilterableComboDataColumnToModel(
121                 PmfmTableModel.METHOD,
122                 getContext().getReferentialService().getMethods(StatusFilter.ACTIVE), false);
123         methodCol.setSortable(true);
124 
125         // unit
126         final TableColumnExt unitCol = addFilterableComboDataColumnToModel(
127                 PmfmTableModel.UNIT,
128                 getContext().getReferentialService().getUnits(StatusFilter.ACTIVE),
129                 false);
130         unitCol.setSortable(true);
131 
132 
133         // Comment, creation and update dates
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         // status
142         final TableColumnExt statusCol = addFilterableComboDataColumnToModel(
143                 PmfmTableModel.STATUS,
144                 getContext().getReferentialService().getStatus(StatusFilter.LOCAL), false);
145         statusCol.setSortable(true);
146         fixDefaultColumnWidth(statusCol);
147 
148         // Associated qualitative value
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 //        // threshold
157 //        final TableColumnExt stepCol = addColumn(columnModel, PmfmTableModel.THRESHOLD);
158 //        stepCol.setSortable(true);
159 //        stepCol.setEditable(true);
160 //
161 //        // max decimal number
162 //        final TableColumnExt maxDecimalNumberCol = addColumn(columnModel, PmfmTableModel.MAX_DECIMAL_NUMBER);
163 //        maxDecimalNumberCol.setSortable(true);
164 //        maxDecimalNumberCol.setEditable(true);
165 //
166 //        // significant digits number
167 //        final TableColumnExt significantDigitsNumberCol = addColumn(columnModel, PmfmTableModel.SIGNIFICANT_DIGITS_NUMBER);
168 //        significantDigitsNumberCol.setSortable(true);
169 //        significantDigitsNumberCol.setEditable(true);
170 
171         PmfmTableModel tableModel = new PmfmTableModel(getTable().getColumnModel());
172         getTable().setModel(tableModel);
173 
174         // Add extraction action
175         addExportToCSVAction(t("reefdb.property.pmfms.local"), PmfmTableModel.QUALITATIVE_VALUES);
176 
177         // Initialisation du tableau
178         initTable(getTable());
179 
180         // Les colonnes optionnelles sont invisibles
181         idCol.setVisible(false);
182 //        stepCol.setVisible(false);
183 //        maxDecimalNumberCol.setVisible(false);
184 //        significantDigitsNumberCol.setVisible(false);
185 
186         creationDateCol.setVisible(false);
187         updateDateCol.setVisible(false);
188 
189         getTable().setVisibleRowCount(5);
190     }
191 
192     /** {@inheritDoc} */
193     @Override
194     public AbstractReefDbTableModel<PmfmTableRowModel> getTableModel() {
195         return (PmfmTableModel) getTable().getModel();
196     }
197 
198     /** {@inheritDoc} */
199     @Override
200     public SwingTable getTable() {
201         return ui.getPmfmsLocalTable();
202     }
203 
204     /** {@inheritDoc} */
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             // Set default status
212             row.setStatus(Daos.getStatus(StatusCode.LOCAL_ENABLE));
213             setFocusOnCell(row);
214         }
215     }
216 
217     /** {@inheritDoc} */
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     /** {@inheritDoc} */
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             // check unicity in local table
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                     // duplicate found in table
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                 // check unicity in database
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                             // duplicate found in database
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 }