View Javadoc
1   package fr.ifremer.dali.ui.swing.content.manage.program.pmfms;
2   
3   /*
4    * #%L
5    * Dali :: 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.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   * Controleur pour la zone des PSFM.
57   */
58  public class PmfmsTableUIHandler extends AbstractDaliTableUIHandler<PmfmsTableRowModel, PmfmsTableUIModel, PmfmsTableUI> {
59  
60      /**
61       * Logger.
62       */
63      private static final Log LOG = LogFactory.getLog(PmfmsTableUIHandler.class);
64  
65      /**
66       * <p>Constructor for PmfmsTableUIHandler.</p>
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       * {@inheritDoc}
77       */
78      @Override
79      protected String[] getRowPropertiesToIgnore() {
80          return new String[]{PmfmsTableRowModel.PROPERTY_ERRORS};
81      }
82  
83      /**
84       * {@inheritDoc}
85       */
86      @Override
87      public AbstractDaliTableModel<PmfmsTableRowModel> getTableModel() {
88          return (PmfmsTableModel) getTable().getModel();
89      }
90  
91      /**
92       * {@inheritDoc}
93       */
94      @Override
95      public SwingTable getTable() {
96          return getUI().getPmfmsTable();
97      }
98  
99      /**
100      * {@inheritDoc}
101      */
102     @Override
103     public void beforeInit(final PmfmsTableUI ui) {
104         super.beforeInit(ui);
105 
106         // create model and register to the JAXX context
107         final PmfmsTableUIModel model = new PmfmsTableUIModel();
108         ui.setContextValue(model);
109     }
110 
111     /**
112      * {@inheritDoc}
113      */
114     @Override
115     public void afterInit(PmfmsTableUI ui) {
116 
117         // Initialiser l UI
118         initUI(ui);
119 
120         // Initialiser le tableau
121         initTable();
122         SwingUtil.setLayerUI(ui.getTableScrollPane(), ui.getTableBlockLayer());
123 
124         // Initialiser les listeners
125         initListeners();
126 
127     }
128 
129     /**
130      * {@inheritDoc}
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      * {@inheritDoc}
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      * <p>load.</p>
157      *
158      * @param selectedProgram  a {@link fr.ifremer.dali.ui.swing.content.manage.program.programs.ProgramsTableRowModel} object.
159      * @param selectedStrategy a {@link fr.ifremer.dali.ui.swing.content.manage.program.strategies.StrategiesTableRowModel} object.
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      * Monter un psfm.
177      */
178     public void upPmfm() {
179 
180         if (getModel().getSelectedRows().size() != 1) {
181             return;
182         }
183 
184         // Le psfm selectionne
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; //getTable().convertRowIndexToView(rowModelIndex);
193             getTable().selectCell(rowViewIndex, null);
194 
195             saveToStrategy();
196             getModel().setModify(true);
197         }
198 
199     }
200 
201     /**
202      * Descendre un psfm.
203      */
204     public void downPmfm() {
205 
206         if (getModel().getSelectedRows().size() != 1) {
207             return;
208         }
209 
210         // Le psfm selectionne
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; // getTable().convertRowIndexToView(rowModelIndex);
219             getTable().selectCell(rowViewIndex, null);
220 
221             saveToStrategy();
222             getModel().setModify(true);
223         }
224 
225     }
226 
227     /**
228      * <p>addPmfms.</p>
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                 // set existing referential as read only to 'fix' these beans on double list
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                 // Add new ones
258                 strategy.addAllPmfmStrategies(newPmfms.stream().map(DaliBeans::pmfmToPmfmStrategy).collect(Collectors.toList()));
259 
260                 // re-affect lines
261                 getModel().setBeans(strategy.getPmfmStrategies());
262                 recomputeRowsValidState();
263                 saveToStrategy();
264                 getModel().setModify(true);
265             }
266         }
267     }
268 
269     /**
270      * <p>getProgramsUI.</p>
271      *
272      * @return a {@link fr.ifremer.dali.ui.swing.content.manage.program.ProgramsUI} object.
273      */
274     private ProgramsUI getProgramsUI() {
275         return getUI().getParentContainer(ProgramsUI.class);
276     }
277 
278     /**
279      * <p>editPmfm.</p>
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      * Initialisation des listeners.
296      */
297     private void initListeners() {
298 
299         // Listener sur le tableau
300         getModel().addPropertyChangeListener(PmfmsTableUIModel.PROPERTY_SELECTED_ROWS, evt -> {
301 
302             // Si un seul element a ete selectionne
303             if (getModel().getSelectedRows().size() == 1) {
304 
305                 // Recuperation de l index du psfm selectionne
306                 final int index = getModel().getRows().indexOf(getModel().getSelectedRows().iterator().next());
307                 if (index == 0) {
308 
309                     // Premier element : ne peut etre monte
310                     getModel().setUpAllowed(false);
311                     getModel().setDownAllowed(true);
312 
313                 } else if (index == getModel().getBeans().size() - 1) {
314 
315                     // Dernier element : ne peut etre descendu
316                     getModel().setUpAllowed(true);
317                     getModel().setDownAllowed(false);
318                 } else {
319 
320                     // Bouton active
321                     getModel().setUpAllowed(true);
322                     getModel().setDownAllowed(true);
323                 }
324             } else {
325                 // disable all
326                 getModel().setUpAllowed(false);
327                 getModel().setDownAllowed(false);
328             }
329         });
330     }
331 
332     /**
333      * <p>saveToStrategy.</p>
334      */
335     private void saveToStrategy() {
336 
337         if (getModel().isLoading()) return;
338 
339         // save modifications on master object
340         getModel().getParentModel().getStrategiesUIModel().fireSavePmfmStrategies();
341         // save modification on master object
342         getModel().getParentModel().getProgramsUIModel().fireSaveStrategies();
343 
344         // force modify state
345         recomputeRowsValidState();
346         getModel().firePropertyChanged(AbstractDaliBeanUIModel.PROPERTY_MODIFY, null, true);
347 
348     }
349 
350     /**
351      * <p>removePmfms.</p>
352      */
353     public void removePmfms() {
354         if (getModel().getSelectedRows().isEmpty()) {
355             LOG.warn("Aucun psfm de selectionne");
356             return;
357         }
358 
359         // Demande de confirmation avant la suppression
360         if (askBeforeDelete(t("dali.program.pmfm.delete.titre"), t("dali.program.pmfm.delete.message"))) {
361 
362             // Suppression des lignes
363             getModel().deleteSelectedRows();
364 
365             saveToStrategy();
366 
367         }
368 
369     }
370 
371     /**
372      * Initialisation de le tableau.
373      */
374     private void initTable() {
375 
376         // La table des prelevements
377         final SwingTable table = getTable();
378 
379         final TableColumnExt pmfmIdCol = addColumn(PmfmsTableModel.PMFM_ID);
380         pmfmIdCol.setSortable(false);
381 
382         // Colonne libelle psfm
383         final TableColumnExt pmfmNameCol = addColumn(PmfmsTableModel.PMFM_NAME);
384         pmfmNameCol.setSortable(false);
385 
386         // Colonne code parametre
387         final TableColumnExt parameterCol = addColumn(
388                 null,
389                 newTableCellRender(
390                         PmfmsTableModel.PARAMETER_CODE.getPropertyType(),
391                         PmfmsTableModel.PARAMETER_CODE.getDecoratorName(),
392                         DecoratorService.NAME // Transcribed name as tooltip (Mantis #47110)
393                 ),
394                 PmfmsTableModel.PARAMETER_CODE);
395         parameterCol.setSortable(false);
396 
397         // Colonne support
398         final TableColumnExt matrixCol = addColumn(PmfmsTableModel.MATRIX);
399         matrixCol.setSortable(false);
400 
401         // Colonne fraction
402         final TableColumnExt fractionCol = addColumn(PmfmsTableModel.FRACTION);
403         fractionCol.setSortable(false);
404 
405         // Colonne methode
406         final TableColumnExt methodCol = addColumn(PmfmsTableModel.METHOD);
407         methodCol.setSortable(false);
408 
409         // Colonne unite
410         final TableColumnExt unitCol = addColumn(PmfmsTableModel.UNIT);
411         unitCol.setSortable(false);
412 
413         // Colonne passage
414         final TableColumnExt surveyCol = addBooleanColumnToModel(
415                 PmfmsTableModel.SURVEY,
416                 table);
417         surveyCol.setSortable(false);
418 
419         // Colonne prelevement
420         final TableColumnExt samplingCol = addBooleanColumnToModel(
421                 PmfmsTableModel.SAMPLING,
422                 table);
423         samplingCol.setSortable(false);
424 
425         // Colonne regroupement
426         final TableColumnExt groupingCol = addBooleanColumnToModel(
427                 PmfmsTableModel.GROUPING,
428                 table);
429         groupingCol.setSortable(false);
430 
431         // Colonne unicite
432         final TableColumnExt uniqueCol = addBooleanColumnToModel(
433                 PmfmsTableModel.UNIQUE,
434                 table);
435         uniqueCol.setSortable(false);
436 
437         // Associated qualitative value
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         // Modele de la table
446         final PmfmsTableModel tableModel = new PmfmsTableModel(getTable().getColumnModel());
447         table.setModel(tableModel);
448 
449         // Set non editable col (do not use table.setEditable(false) because it make non editable the selection check box col non usable)
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         // Initialisation de la table
460         initTable(table);
461 
462         pmfmIdCol.setVisible(false);
463         // Number rows visible
464         table.setVisibleRowCount(4);
465     }
466 }