View Javadoc
1   package fr.ifremer.dali.ui.swing.content.manage.rule.pmfm;
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.control.ControlRuleDTO;
29  import fr.ifremer.dali.dto.configuration.control.RulePmfmDTO;
30  import fr.ifremer.dali.dto.enums.ControlFunctionValues;
31  import fr.ifremer.dali.dto.enums.FilterTypeValues;
32  import fr.ifremer.dali.dto.referential.pmfm.PmfmDTO;
33  import fr.ifremer.dali.ui.swing.content.manage.filter.select.SelectFilterUI;
34  import fr.ifremer.dali.ui.swing.util.AbstractDaliBeanUIModel;
35  import fr.ifremer.dali.ui.swing.util.table.AbstractDaliTableModel;
36  import fr.ifremer.dali.ui.swing.util.table.AbstractDaliTableUIHandler;
37  import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
38  import org.jdesktop.swingx.table.TableColumnExt;
39  
40  import java.awt.Dimension;
41  import java.util.List;
42  import java.util.stream.Collectors;
43  
44  import static org.nuiton.i18n.I18n.t;
45  
46  /**
47   * Controller pour le tableau des PSFM.
48   */
49  public class ControlPmfmTableUIHandler extends
50          AbstractDaliTableUIHandler<ControlPmfmRowModel, ControlPmfmTableUIModel, ControlPmfmTableUI> {
51  
52      /**
53       * {@inheritDoc}
54       */
55      @Override
56      public void beforeInit(final ControlPmfmTableUI ui) {
57          super.beforeInit(ui);
58  
59          // create model and register to the JAXX context
60          final ControlPmfmTableUIModel model = new ControlPmfmTableUIModel();
61          ui.setContextValue(model);
62      }
63  
64      /**
65       * {@inheritDoc}
66       */
67      @Override
68      public void afterInit(final ControlPmfmTableUI ui) {
69  
70          // Initialisation de l ecran
71          initUI(ui);
72  
73          // Initialisation du tableau
74          initTable();
75      }
76  
77      /**
78       * Initialisation du tableau.
79       */
80      private void initTable() {
81  
82          // Le tableau
83          final SwingTable table = getTable();
84  
85          // pmfm id
86          TableColumnExt idCol = addColumn(ControlPmfmTableModel.PMFM_ID);
87          idCol.setSortable(true);
88          idCol.setEditable(false);
89  
90          // Libelle
91          TableColumnExt nameCol = addColumn(ControlPmfmTableModel.NAME);
92          nameCol.setSortable(true);
93          nameCol.setEditable(false);
94  
95          // parametre
96          final TableColumnExt parameterCol = addColumn(
97                  null,
98                  newTableCellRender(
99                          ControlPmfmTableModel.PARAMETER.getPropertyType(),
100                         ControlPmfmTableModel.PARAMETER.getDecoratorName(),
101                         DecoratorService.NAME // Transcribed name as tooltip (Mantis #47110)
102                 ),
103                 ControlPmfmTableModel.PARAMETER);
104         parameterCol.setSortable(true);
105         parameterCol.setEditable(false);
106 
107         // support
108         final TableColumnExt matrixCol = addColumn(ControlPmfmTableModel.MATRIX);
109         matrixCol.setSortable(true);
110         matrixCol.setEditable(false);
111 
112         // fraction
113         final TableColumnExt fractionCol = addColumn(ControlPmfmTableModel.FRACTION);
114         fractionCol.setSortable(true);
115         fractionCol.setEditable(false);
116 
117         // methode
118         final TableColumnExt methodCol = addColumn(ControlPmfmTableModel.METHOD);
119         methodCol.setSortable(true);
120         methodCol.setEditable(false);
121 
122         // unit
123         final TableColumnExt unitCol = addColumn(ControlPmfmTableModel.UNIT);
124         unitCol.setSortable(true);
125         unitCol.setEditable(false);
126 
127         // Le model
128         ControlPmfmTableModel tableModel = new ControlPmfmTableModel(getTable().getColumnModel());
129         table.setModel(tableModel);
130 
131         // Initialisation du tableau
132         initTable(table);
133         idCol.setVisible(false);
134 
135         // Number rows visible
136         table.setVisibleRowCount(3);
137     }
138 
139     /**
140      * <p>loadPSFMControle.</p>
141      *
142      * @param controlRule a {@link fr.ifremer.dali.dto.configuration.control.ControlRuleDTO} object.
143      */
144     public void loadPmfms(ControlRuleDTO controlRule, boolean editable) {
145 
146         if (controlRule == null) {
147 
148             // Empty table
149             getModel().setBeans(null);
150 
151             // Set pmfm is not mandatory to avoid bad validation behaviour (Mantis #41992)
152             getModel().setPmfmsMandatory(false);
153 
154             editable = false;
155 
156         } else {
157 
158             // if pmfm is mandatory
159             getModel().setPmfmsMandatory(DaliBeans.isPmfmMandatory(controlRule));
160 
161             // disable table sorting for precondition rule
162             if (ControlFunctionValues.PRECONDITION.equals(controlRule.getFunction())) {
163                 getTable().resetSortOrder();
164                 getTable().setSortable(false);
165             } else {
166                 getTable().setSortable(true);
167             }
168 
169             // Load table
170             getModel().setBeans(controlRule.getRulePmfms());
171 
172         }
173 
174         getTable().setEditable(editable);
175         recomputeRowsValidState(!getModel().isPmfmsMandatory());
176     }
177 
178     /**
179      * {@inheritDoc}
180      */
181     @Override
182     protected void onRowModified(int rowIndex, ControlPmfmRowModel row, String propertyName, Integer propertyIndex, Object oldValue, Object newValue) {
183         super.onRowModified(rowIndex, row, propertyName, propertyIndex, oldValue, newValue);
184 
185         saveToParentModel();
186     }
187 
188     private void saveToParentModel() {
189         getModel().getParentModel().getControlRuleUIModel().getSingleSelectedRow().setRulePmfms(getModel().getBeans());
190 
191         getModel().firePropertyChanged(AbstractDaliBeanUIModel.PROPERTY_MODIFY, null, true);
192 
193     }
194 
195     /**
196      * <p>supprimerPSFMControle.</p>
197      */
198     public void clearTable() {
199 
200         // clear table
201         getModel().setBeans(null);
202         getModel().setPmfmsMandatory(false);
203         getModel().setValid(true);
204 
205     }
206 
207     /**
208      * {@inheritDoc}
209      */
210     @Override
211     public AbstractDaliTableModel<ControlPmfmRowModel> getTableModel() {
212         return (ControlPmfmTableModel) getTable().getModel();
213     }
214 
215     /**
216      * {@inheritDoc}
217      */
218     @Override
219     public SwingTable getTable() {
220         return ui.getControlPmfmTable();
221     }
222 
223     /**
224      * <p>openAddPmfmDialog.</p>
225      */
226     public void openAddPmfmDialog() {
227         SelectFilterUI dialog = new SelectFilterUI(getContext(), FilterTypeValues.PMFM.getFilterTypeId());
228         dialog.setTitle(t("dali.filter.pmfm.addDialog.title"));
229         List<PmfmDTO> pmfms = getModel().getBeans().stream().map(RulePmfmDTO::getPmfm)
230                 .sorted(getDecorator(PmfmDTO.class, DecoratorService.NAME_WITH_ID).getCurrentComparator())
231                 // set existing referential as read only to 'fix' these beans on double list
232                 .peek(pmfm -> pmfm.setReadOnly(true))
233                 .collect(Collectors.toList());
234         dialog.getModel().setSelectedElements(pmfms);
235 
236         openDialog(dialog, new Dimension(1024, 720));
237 
238         if (dialog.getModel().isValid()) {
239 
240             List<PmfmDTO> newPmfms = dialog.getModel().getSelectedElements().stream()
241                     .map(element -> ((PmfmDTO) element))
242                     .filter(newPmfm -> getModel().getBeans().stream().noneMatch(rulePmfm -> rulePmfm.getPmfm().equals(newPmfm)))
243                     .collect(Collectors.toList());
244 
245             if (!newPmfms.isEmpty()) {
246 
247                 getModel().addBeans(newPmfms.stream().map(DaliBeans::pmfmToRulePmfm).collect(Collectors.toList()));
248                 getModel().setModify(true);
249                 saveToParentModel();
250             }
251         }
252     }
253 
254     /**
255      * <p>removePmfm.</p>
256      */
257     public void removePmfm() {
258         getModel().deleteSelectedRows();
259         saveToParentModel();
260         recomputeRowsValidState(false);
261     }
262 }