View Javadoc
1   package fr.ifremer.dali.ui.swing.content.observation.operation.measurement.grouped.initGrid;
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 com.google.common.collect.Lists;
27  import fr.ifremer.dali.dto.DaliBeans;
28  import fr.ifremer.dali.dto.referential.pmfm.PmfmDTO;
29  import fr.ifremer.dali.dto.referential.pmfm.QualitativeValueDTO;
30  import fr.ifremer.dali.service.referential.ReferentialService;
31  import fr.ifremer.dali.ui.swing.util.table.AbstractDaliTableUIHandler;
32  import fr.ifremer.quadrige3.ui.swing.table.AbstractTableModel;
33  import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
34  import jaxx.runtime.validator.swing.SwingValidator;
35  import org.jdesktop.swingx.table.TableColumnExt;
36  import org.nuiton.jaxx.application.swing.util.Cancelable;
37  
38  import java.util.ArrayList;
39  import java.util.List;
40  
41  /**
42   * <p>InitGridUIHandler class.</p>
43   */
44  public class InitGridUIHandler extends AbstractDaliTableUIHandler<InitGridRowModel, InitGridUIModel, InitGridUI> implements Cancelable {
45  
46      /**
47       * {@inheritDoc}
48       */
49      @Override
50      public void beforeInit(InitGridUI ui) {
51          super.beforeInit(ui);
52  
53          InitGridUIModel model = new InitGridUIModel();
54          ui.setContextValue(model);
55      }
56  
57      /**
58       * {@inheritDoc}
59       */
60      @Override
61      public void afterInit(InitGridUI ui) {
62          initUI(ui);
63  
64          initTable();
65  
66          initBeanList(ui.getValueDoubleList(), null, null);
67          ui.getValueDoubleList().getHandler().addAdditionalControls();
68  
69          initListeners();
70  
71          // Register validator
72          registerValidators(getValidator());
73          listenValidatorValid(getValidator(), getModel());
74  
75      }
76  
77      @Override
78      public SwingValidator<InitGridUIModel> getValidator() {
79          return getUI().getValidator();
80      }
81  
82      private void initTable() {
83  
84          addColumn(InitGridTableModel.PMFM);
85  
86          TableColumnExt valuesCol = addColumn(InitGridTableModel.QUALITATIVE_VALUES);
87          fixColumnWidth(valuesCol, 50);
88  
89          InitGridTableModel tableModel = new InitGridTableModel(getTable().getColumnModel());
90          getTable().setModel(tableModel);
91  
92          initTable(getTable(), true);
93  
94          getTable().setHorizontalScrollEnabled(false);
95          getTable().setVisibleRowCount(6);
96          getTable().setEditable(false);
97      }
98  
99      private void initListeners() {
100 
101         getModel().addPropertyChangeListener(evt -> {
102 
103             switch (evt.getPropertyName()) {
104                 case InitGridUIModel.PROPERTY_AVAILABLE_PMFMS:
105 
106                     loadTable();
107                     break;
108 
109                 case InitGridUIModel.PROPERTY_PRESET:
110 
111                     // preset is loaded but only ids, so load the nested beans
112                     buildRowsWithPreset();
113                     break;
114 
115                 case InitGridUIModel.PROPERTY_SINGLE_ROW_SELECTED:
116 
117                     updateDoubleList();
118                     break;
119 
120                 case InitGridUIModel.PROPERTY_SELECTED_VALUES:
121 
122                     if (getModel().getSingleSelectedRow() != null) {
123                         // update row values
124                         getModel().getSingleSelectedRow().setQualitativeValues(
125                                 new ArrayList<>(getModel().getSelectedValues()));
126                     }
127                     break;
128             }
129         });
130     }
131 
132     private void loadTable() {
133 
134         getModel().setLoading(true);
135         List<InitGridRowModel> rows = Lists.newArrayList();
136 
137         for (PmfmDTO pmfm : getModel().getAvailablePmfms()) {
138             InitGridRowModel row = getTableModel().createNewRow();
139             row.setPmfm(pmfm);
140             rows.add(row);
141         }
142 
143         getModel().setRows(rows);
144         recomputeRowsValidState();
145         getModel().setLoading(false);
146     }
147 
148     private void buildRowsWithPreset() {
149 
150         if (getModel().getRowCount() == 0) return; // should not happens
151 
152         getModel().setLoading(true);
153         ReferentialService service = getContext().getReferentialService();
154 
155         for (Integer pmfmId : getModel().getPreset().getPmfmIds()) {
156             InitGridRowModel row = DaliBeans.findByProperty(getModel().getRows(), InitGridRowModel.PROPERTY_PMFM + "." + PmfmDTO.PROPERTY_ID, pmfmId);
157             if (row == null) continue;
158             row.setQualitativeValues(service.getQualitativeValues(getModel().getPreset().getQualitativeValueIds(pmfmId)));
159         }
160 
161         recomputeRowsValidState();
162         getModel().setLoading(false);
163     }
164 
165     private void updateDoubleList() {
166 
167         List<QualitativeValueDTO> universeList = null;
168         List<QualitativeValueDTO> selectedList = null;
169 
170         if (getModel().getSingleSelectedRow() != null) {
171 
172             universeList = getModel().getSingleSelectedRow().getPmfm() == null
173                     ? null
174                     : getModel().getSingleSelectedRow().getPmfm().getQualitativeValues();
175             selectedList = getModel().getSingleSelectedRow().getQualitativeValues();
176 
177         }
178 
179         getUI().getValueDoubleList().getHandler().setUniverse(universeList);
180         getUI().getValueDoubleList().getHandler().setSelected(selectedList);
181     }
182 
183     /**
184      * <p>valid.</p>
185      */
186     public void valid() {
187 
188         if (getModel().isValid()) {
189 
190             // Build the preset from rows
191             buildPresetWithRows();
192 
193             // Save to preset file
194             savePreset();
195 
196             closeDialog();
197         }
198     }
199 
200     private void buildPresetWithRows() {
201 
202         getModel().getPreset().clearPmfmPresets();
203 
204         for (InitGridRowModel row: getModel().getRows()) {
205 
206             getModel().getPreset().addPmfmPreset(
207                     row.getPmfm().getId(),
208                     DaliBeans.collectIds(row.getQualitativeValues())
209             );
210         }
211 
212     }
213 
214     private void savePreset() {
215 
216         PresetFileLoader.save(getModel().getPreset());
217     }
218 
219     /**
220      * {@inheritDoc}
221      */
222     @Override
223     public void cancel() {
224         stopListenValidatorValid(getValidator());
225         getModel().setValid(false);
226         closeDialog();
227     }
228 
229     @Override
230     public AbstractTableModel<InitGridRowModel> getTableModel() {
231         return (InitGridTableModel) getTable().getModel();
232     }
233 
234     @Override
235     public SwingTable getTable() {
236         return getUI().getPmfmTable();
237     }
238 
239 }