View Javadoc
1   package fr.ifremer.reefdb.ui.swing.content.manage.referential.pmfm.parameter.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.ParameterDTO;
31  import fr.ifremer.reefdb.service.StatusFilter;
32  import fr.ifremer.reefdb.ui.swing.content.manage.referential.pmfm.parameter.menu.ManageParametersMenuUIModel;
33  import fr.ifremer.reefdb.ui.swing.content.manage.referential.pmfm.parameter.table.ParameterTableModel;
34  import fr.ifremer.reefdb.ui.swing.content.manage.referential.pmfm.parameter.table.ParameterTableRowModel;
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.lang3.StringUtils;
41  import org.apache.commons.logging.Log;
42  import org.apache.commons.logging.LogFactory;
43  import org.jdesktop.swingx.table.TableColumnExt;
44  
45  import javax.swing.SwingUtilities;
46  import java.util.List;
47  
48  import static org.nuiton.i18n.I18n.t;
49  
50  /**
51   * Controlleur pour l administration des Parameters au niveau local
52   */
53  public class ManageParametersLocalUIHandler extends AbstractReefDbTableUIHandler<ParameterTableRowModel, ManageParametersLocalUIModel, ManageParametersLocalUI> {
54  
55      /**
56       * Logger.
57       */
58      private static final Log LOG = LogFactory.getLog(ManageParametersLocalUIHandler.class);
59  
60      /** {@inheritDoc} */
61      @Override
62      public void beforeInit(final ManageParametersLocalUI ui) {
63          super.beforeInit(ui);
64  
65          // create model and register to the JAXX context
66          final ManageParametersLocalUIModel model = new ManageParametersLocalUIModel();
67          ui.setContextValue(model);
68      }
69  
70      /** {@inheritDoc} */
71      @Override
72      public void afterInit(final ManageParametersLocalUI ui) {
73          initUI(ui);
74  
75          // Initialisation du tableau
76          initTable();
77  
78          // Disabled buttons
79          getUI().getDeleteButton().setEnabled(false);
80          getUI().getReplaceButton().setEnabled(false);
81  
82          ManageParametersMenuUIModel menuUIModel = getUI().getMenuUI().getModel();
83          menuUIModel.setLocal(true);
84  
85          //listen to results
86          menuUIModel.addPropertyChangeListener(ManageParametersMenuUIModel.PROPERTY_RESULTS, evt -> loadParametersManageLocal((List<ParameterDTO>) evt.getNewValue()));
87  
88      }
89  
90      /**
91       * Initialisation du tableau.
92       */
93      private void initTable() {
94  
95          // code
96          final TableColumnExt codeCol = addColumn(ParameterTableModel.CODE);
97          codeCol.setSortable(true);
98          codeCol.setEditable(false);
99  
100         // mnemonic
101         final TableColumnExt mnemonicCol = addColumn(ParameterTableModel.NAME);
102         mnemonicCol.setSortable(true);
103 
104         // description
105         final TableColumnExt descriptionCol = addColumn(ParameterTableModel.DESCRIPTION);
106         descriptionCol.setSortable(true);
107 
108         // qualitative
109         final TableColumnExt qualitativeCol = addBooleanColumnToModel(ParameterTableModel.IS_QUALITATIVE, getTable());
110         qualitativeCol.setSortable(true);
111 
112         // calculated
113         final TableColumnExt calculatedCol = addBooleanColumnToModel(ParameterTableModel.IS_CALCULATED, getTable());
114         calculatedCol.setSortable(true);
115 
116         // taxonomic
117         final TableColumnExt taxonomicCol = addBooleanColumnToModel(ParameterTableModel.IS_TAXONOMIC, getTable());
118         taxonomicCol.setSortable(true);
119 
120         // Associated qualitative value
121         final TableColumnExt associatedQualitativeValueCol = addColumn(
122                 new AssociatedQualitativeValueCellEditor(getTable(), getUI(), true),
123                 new AssociatedQualitativeValueCellRenderer(),
124                 ParameterTableModel.ASSOCIATED_QUALITATIVE_VALUE);
125         associatedQualitativeValueCol.setSortable(true);
126 
127         // Comment, creation and update dates
128         addCommentColumn(ParameterTableModel.COMMENT);
129         TableColumnExt creationDateCol = addDatePickerColumnToModel(ParameterTableModel.CREATION_DATE, getConfig().getDateTimeFormat(), false);
130         fixColumnWidth(creationDateCol, 120);
131         TableColumnExt updateDateCol = addDatePickerColumnToModel(ParameterTableModel.UPDATE_DATE, getConfig().getDateTimeFormat(), false);
132         fixColumnWidth(updateDateCol, 120);
133 
134         // status
135         final TableColumnExt statusCol = addFilterableComboDataColumnToModel(
136                 ParameterTableModel.STATUS,
137                 getContext().getReferentialService().getStatus(StatusFilter.LOCAL),
138                 false);
139         statusCol.setSortable(true);
140         fixDefaultColumnWidth(statusCol);
141 
142         // parameterGroup
143         final TableColumnExt parameterGroupCol = addFilterableComboDataColumnToModel(
144                 ParameterTableModel.PARAMETER_GROUP,
145                 getContext().getReferentialService().getParameterGroup(StatusFilter.ACTIVE),
146                 false);
147         parameterGroupCol.setSortable(true);
148 
149         // Add column model
150         final ParameterTableModel tableModel = new ParameterTableModel(getTable().getColumnModel(), true);
151         getTable().setModel(tableModel);
152 
153         // Add extraction action
154         addExportToCSVAction(t("reefdb.property.pmfm.parameters.local", ParameterTableModel.ASSOCIATED_QUALITATIVE_VALUE));
155 
156         // Initialisation du tableau
157         initTable(getTable());
158 
159         // hidden columns
160         parameterGroupCol.setVisible(false);
161 
162         creationDateCol.setVisible(false);
163         updateDateCol.setVisible(false);
164 
165         getTable().setVisibleRowCount(5);
166     }
167 
168     /** {@inheritDoc} */
169     @Override
170     public AbstractReefDbTableModel<ParameterTableRowModel> getTableModel() {
171         return (ParameterTableModel) getTable().getModel();
172     }
173 
174     /** {@inheritDoc} */
175     @Override
176     public SwingTable getTable() {
177         return ui.getParametersLocalTable();
178     }
179 
180     /**
181      * Methode permettant le changement des manage de parameter au niveau local.
182      *
183      * @param parameters La liste des manage de parameter au niveau local
184      */
185     public void loadParametersManageLocal(final List<ParameterDTO> parameters) {
186 
187         // Enabeld new button
188         getUI().getNewButton().setEnabled(true);
189 
190         // Chargement des lignes du tableau
191         getModel().setBeans(parameters);
192         getModel().setModify(false);
193     }
194 
195     /** {@inheritDoc} */
196     @Override
197     protected void onRowsAdded(List<ParameterTableRowModel> addedRows) {
198         super.onRowsAdded(addedRows);
199 
200         if (addedRows.size() == 1) {
201             final ParameterTableRowModel rowModel = addedRows.get(0);
202 
203             if (checkNewCode(rowModel)) {
204 
205                 // Set default status
206                 rowModel.setStatus(Daos.getStatus(StatusCode.LOCAL_ENABLE));
207                 rowModel.setNewCode(true);
208                 setFocusOnCell(rowModel);
209 
210             } else {
211                 // the code is invalid, delete this row
212                 SwingUtilities.invokeLater(() -> {
213                     getModel().deleteRow(rowModel);
214                     getModel().setSingleSelectedRow(null);
215                 });
216             }
217         }
218     }
219 
220     private boolean checkNewCode(ParameterTableRowModel row) {
221 
222         boolean edit = StringUtils.isNotBlank(row.getCode());
223         String newCode = (String) getContext().getDialogHelper().showInputDialog(
224                 getUI(),
225                 t("reefdb.property.pmfm.parameter.code"),
226                 edit ? t("reefdb.parameter.editCode.title") : t("reefdb.parameter.setCode.title"),
227                 null,
228                 row.getCode());
229         if (StringUtils.isBlank(newCode)) {
230             return false;
231         }
232         newCode = newCode.trim();
233 
234         // check in current table
235         for (ParameterTableRowModel otherRow : getModel().getRows()) {
236             if (row == otherRow) continue;
237             if (newCode.equalsIgnoreCase(otherRow.getCode())) {
238                 // duplicate found in table
239                 getContext().getDialogHelper().showErrorDialog(
240                         t("reefdb.error.alreadyExists.referential", t("reefdb.property.pmfm.parameter"), newCode, t("reefdb.property.referential.local")),
241                         edit ? t("reefdb.parameter.editCode.title") : t("reefdb.parameter.setCode.title")
242                 );
243                 return false;
244             }
245         }
246 
247         // check unicity in database
248         List<ParameterDTO> existingParameters = getContext().getReferentialService().searchParameters(StatusFilter.ALL, newCode, null, null);
249         if (CollectionUtils.isNotEmpty(existingParameters)) {
250             ParameterDTO parameter = existingParameters.get(0);
251             // duplicate found in database
252             getContext().getDialogHelper().showErrorDialog(
253                     t("reefdb.error.alreadyExists.referential", t("reefdb.property.pmfm.parameter"), newCode,
254                             ReefDbBeans.isLocalStatus(parameter.getStatus()) ? t("reefdb.property.referential.local") : t("reefdb.property.referential.national")),
255                     edit ? t("reefdb.parameter.editCode.title") : t("reefdb.parameter.setCode.title")
256             );
257             return false;
258         }
259 
260         row.setCode(newCode);
261         return true;
262 
263     }
264 
265     /**
266      * <p>editParameterCode.</p>
267      */
268     public void editParameterCode() {
269         ParameterTableRowModel row = getModel().getSingleSelectedRow();
270         if (row != null && row.isLocal() && row.isNewCode()) {
271             if (checkNewCode(row)) {
272                 row.setDirty(true);
273             }
274         }
275     }
276 
277     /** {@inheritDoc} */
278     @Override
279     protected void onRowModified(int rowIndex, ParameterTableRowModel row, String propertyName, Integer propertyIndex, Object oldValue, Object newValue) {
280         super.onRowModified(rowIndex, row, propertyName, propertyIndex, oldValue, newValue);
281         row.setDirty(true);
282     }
283 
284     /** {@inheritDoc} */
285     @Override
286     protected void onRowModifyStateChanged(int rowIndex, ParameterTableRowModel row, Boolean oldValue, Boolean newValue) {
287         super.onRowModifyStateChanged(rowIndex, row, oldValue, newValue);
288         row.setDirty(true);
289         getModel().setModify(true);
290     }
291 
292 }