View Javadoc
1   package fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.ungrouped;
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.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   * Controleur pour le tableau du haut (Psfm) pour l onglet des mesures de l'observation.
47   */
48  public class SurveyMeasurementsUngroupedTableUIHandler
49          extends AbstractReefDbTableUIHandler<SurveyMeasurementsUngroupedRowModel, SurveyMeasurementsUngroupedTableUIModel, SurveyMeasurementsUngroupedTableUI> {
50  
51      private static final int ROW_COUNT = 5;
52  
53      // editor for analyst column
54      private ExtendedComboBoxCellEditor<DepartmentDTO> departmentCellEditor;
55  
56      /**
57       * <p>Constructor for SurveyMeasurementsUngroupedTableUIHandler.</p>
58       */
59      public SurveyMeasurementsUngroupedTableUIHandler() {
60          super(SurveyMeasurementsUngroupedRowModel.PROPERTY_PMFMS);
61      }
62  
63      /**
64       * {@inheritDoc}
65       */
66      @Override
67      public SurveyMeasurementsUngroupedTableModel getTableModel() {
68          return (SurveyMeasurementsUngroupedTableModel) getTable().getModel();
69      }
70  
71      /**
72       * {@inheritDoc}
73       */
74      @Override
75      public void beforeInit(final SurveyMeasurementsUngroupedTableUI ui) {
76          super.beforeInit(ui);
77          // create model and register to the JAXX context
78          ui.setContextValue(new SurveyMeasurementsUngroupedTableUIModel());
79      }
80  
81      /**
82       * {@inheritDoc}
83       */
84      @Override
85      public void afterInit(final SurveyMeasurementsUngroupedTableUI ui) {
86  
87          // Initialiser l UI
88          initUI(ui);
89          createDepartmentCellEditor();
90          updateDepartmentCellEditor(false);
91  
92          initTable();
93          SwingUtil.setLayerUI(ui.getTableauHautScrollPane(), ui.getTableBlockLayer());
94  
95          // Initialiser listeners
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             // unfilter location
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      * Initialiser les listeners
125      */
126     private void initListeners() {
127 
128         getModel().addPropertyChangeListener(SurveyMeasurementsUngroupedTableUIModel.PROPERTY_SURVEY, evt -> loadSurvey());
129 
130     }
131 
132     /**
133      * Load survey.
134      */
135     private void loadSurvey() {
136 
137         SwingUtilities.invokeLater(() -> {
138 
139             // Uninstall save state listener
140             uninstallSaveTableStateListener();
141 
142             addPmfmColumns(
143                     getModel().getPmfms(),
144                     SurveyDTO.PROPERTY_PMFMS,
145                     DecoratorService.NAME_WITH_UNIT); // insert at the end
146 
147             boolean notEmpty = CollectionUtils.isNotEmpty(getModel().getPmfms());
148 
149             // tell the table model is editable or not
150             getTableModel().setReadOnly(!getModel().getSurvey().isEditable());
151 
152             getModel().setRows(null);
153 
154             if (notEmpty) {
155 
156                 // affect row
157                 SurveyMeasurementsUngroupedRowModel row = getModel().addNewRow(getModel().getSurvey());
158 
159                 // set analyst from first non null measurement
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             // restore table from swing session
175             restoreTableState();
176 
177             // hide analyst if no pmfm
178 //            forceColumnVisibleAtLastPosition(SurveyMeasurementsUngroupedTableModel.ANALYST, notEmpty);
179             // Don't force position (Mantis #49537)
180             forceColumnVisible(SurveyMeasurementsUngroupedTableModel.ANALYST, notEmpty);
181 
182             // Install save state listener
183             installSaveTableStateListener();
184 
185             getModel().fireMeasurementsLoaded();
186         });
187     }
188 
189     /**
190      * {@inheritDoc}
191      */
192     @Override
193     protected void onRowModified(int rowIndex, SurveyMeasurementsUngroupedRowModel row, String propertyName, Integer propertyIndex, Object oldValue, Object newValue) {
194 
195         // no need to tell the table is modified if no pmfms (measurement) changes
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         // update all measurements
217         row.getMeasurements().forEach(measurement -> measurement.setAnalyst(row.getAnalyst()));
218 
219         // save modifications to parent model
220         getModel().getSurvey().setMeasurements(row.getMeasurements());
221 
222     }
223 
224     /**
225      * {@inheritDoc}
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      * Initialisation du tableau.
245      */
246     private void initTable() {
247 
248         // Add analyst column (Mantis #42619)
249         TableColumnExt analystColumn = addColumn(
250                 departmentCellEditor,
251                 newTableCellRender(SurveyMeasurementsUngroupedTableModel.ANALYST),
252                 SurveyMeasurementsUngroupedTableModel.ANALYST
253         );
254         analystColumn.setMinWidth(100);
255 
256         // Modele de la table
257         SurveyMeasurementsUngroupedTableModel tableModel = new SurveyMeasurementsUngroupedTableModel(getTable().getColumnModel());
258         tableModel.setNoneEditableCols();
259         getTable().setModel(tableModel);
260 
261         // Initialisation de la table
262         initTable(getTable(), true);
263 
264         // border
265         addEditionPanelBorder();
266     }
267 
268     /**
269      * {@inheritDoc}
270      */
271     @Override
272     public SwingTable getTable() {
273         return ui.getSurveyUngroupedMeasurementTable();
274     }
275 }