View Javadoc
1   package fr.ifremer.dali.ui.swing.content.manage.campaign.table;
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.dto.DaliBeans;
27  import fr.ifremer.dali.ui.swing.util.table.AbstractDaliTableModel;
28  import fr.ifremer.dali.ui.swing.util.table.AbstractDaliTableUIHandler;
29  import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
30  import org.jdesktop.swingx.table.TableColumnExt;
31  
32  import javax.swing.SortOrder;
33  import java.util.List;
34  
35  import static org.nuiton.i18n.I18n.t;
36  
37  /**
38   * Controleur pour la zone des programmes.
39   */
40  public class CampaignsTableUIHandler extends AbstractDaliTableUIHandler<CampaignsTableRowModel, CampaignsTableUIModel, CampaignsTableUI> {
41  
42      /**
43       * <p>Constructor for CampaignsTableUIHandler.</p>
44       */
45      public CampaignsTableUIHandler() {
46          super(CampaignsTableRowModel.PROPERTY_NAME,
47                  CampaignsTableRowModel.PROPERTY_SISMER_LINK,
48                  CampaignsTableRowModel.PROPERTY_START_DATE,
49                  CampaignsTableRowModel.PROPERTY_END_DATE,
50                  CampaignsTableRowModel.PROPERTY_MANAGER,
51                  CampaignsTableRowModel.PROPERTY_COMMENT);
52      }
53  
54      /**
55       * {@inheritDoc}
56       */
57      @Override
58      protected String[] getRowPropertiesToIgnore() {
59          return new String[]{CampaignsTableRowModel.PROPERTY_ERRORS};
60      }
61  
62      /**
63       * {@inheritDoc}
64       */
65      @Override
66      public AbstractDaliTableModel<CampaignsTableRowModel> getTableModel() {
67          return (CampaignsTableModel) getTable().getModel();
68      }
69  
70      /**
71       * {@inheritDoc}
72       */
73      @Override
74      public SwingTable getTable() {
75          return getUI().getCampaignsTable();
76      }
77  
78      /**
79       * {@inheritDoc}
80       */
81      @Override
82      public void beforeInit(final CampaignsTableUI ui) {
83          super.beforeInit(ui);
84  
85          // create model and register to the JAXX context
86          final CampaignsTableUIModel model = new CampaignsTableUIModel();
87          ui.setContextValue(model);
88      }
89  
90      /**
91       * {@inheritDoc}
92       */
93      @Override
94      public void afterInit(CampaignsTableUI ui) {
95  
96          // Initialiser l UI
97          initUI(ui);
98  
99          // Initialiser le tableau
100         initTable();
101 
102         // Ajout des listeners
103         initListeners();
104 
105         getModel().setModify(false);
106         recomputeRowsValidState(true);
107     }
108 
109     /**
110      * {@inheritDoc}
111      */
112     @Override
113     public boolean isRowValid(final CampaignsTableRowModel row) {
114         row.getErrors().clear();
115         return !row.isEditable() || (super.isRowValid(row) && isCampaignValid(row));
116     }
117 
118     private boolean isCampaignValid(CampaignsTableRowModel row) {
119 
120         // check for name duplicates in table
121         boolean nameDuplicateInTable = false;
122         for (CampaignsTableRowModel otherRow : getModel().getRows()) {
123             if (otherRow == row) continue;
124             if (otherRow.getName().equals(row.getName())) {
125                 DaliBeans.addError(row, t("dali.campaign.name.duplicates"), CampaignsTableRowModel.PROPERTY_NAME);
126                 nameDuplicateInTable = true;
127                 break;
128             }
129         }
130         // check for name duplicate in database
131         if (!nameDuplicateInTable && row.isDirty()) {
132             if (getContext().getCampaignService().checkCampaignNameDuplicates(row.getId(), row.getName())) {
133                 DaliBeans.addError(row, t("dali.campaign.name.duplicates"), CampaignsTableRowModel.PROPERTY_NAME);
134             }
135         }
136 
137         // check end date
138         if (row.getStartDate() != null && row.getEndDate() != null && row.getEndDate().before(row.getStartDate())) {
139             DaliBeans.addError(row, t("dali.campaign.endDate.before"), CampaignsTableRowModel.PROPERTY_END_DATE);
140         }
141 
142         return row.isErrorsEmpty();
143     }
144 
145     @Override
146     protected void onRowsAdded(List<CampaignsTableRowModel> addedRows) {
147         super.onRowsAdded(addedRows);
148 
149         if (addedRows.size() == 1) {
150             CampaignsTableRowModel newRow = addedRows.get(0);
151 
152             setFocusOnCell(newRow);
153         }
154     }
155 
156     /**
157      * {@inheritDoc}
158      */
159     @Override
160     protected void onRowModified(int rowIndex, CampaignsTableRowModel row, String propertyName, Integer propertyIndex, Object oldValue, Object newValue) {
161         super.onRowModified(rowIndex, row, propertyName, propertyIndex, oldValue, newValue);
162 
163         row.setDirty(true);
164     }
165 
166     /**
167      * Initialisation des listeners.
168      */
169     private void initListeners() {
170 
171         // Add listener on saveEnabled property to disable change (Mantis #47532)
172         getModel().addPropertyChangeListener(CampaignsTableUIModel.PROPERTY_SAVE_ENABLED, evt -> {
173             getModel().getRows().forEach(campaignsTableRowModel -> campaignsTableRowModel.setEditable(getModel().isSaveEnabled()));
174             getUI().getCampaignsTable().invalidate();
175             getUI().getCampaignsTable().repaint();
176         });
177 
178     }
179 
180     /**
181      * Initialisation de le tableau.
182      */
183     private void initTable() {
184 
185         // Column name
186         final TableColumnExt columnName = addColumn(
187                 CampaignsTableModel.NAME);
188         columnName.setSortable(true);
189 
190         // Column sismer
191         final TableColumnExt columnSismer = addColumn(
192                 CampaignsTableModel.SISMER_LINK);
193         columnSismer.setSortable(true);
194 
195         final TableColumnExt columnStartDate = addDatePickerColumnToModel(
196                 CampaignsTableModel.START_DATE,
197                 getConfig().getDateFormat(),
198                 true
199         );
200         columnStartDate.setSortable(true);
201 
202         final TableColumnExt columnEndDate = addDatePickerColumnToModel(
203                 CampaignsTableModel.END_DATE,
204                 getConfig().getDateFormat(),
205                 true
206         );
207         columnEndDate.setSortable(true);
208 
209         final TableColumnExt columnRecorderPerson = addExtendedComboDataColumnToModel(
210                 CampaignsTableModel.MANAGER,
211                 getContext().getUserService().getActiveUsers(),
212                 false
213         );
214         columnRecorderPerson.setSortable(true);
215 
216         // Column comment
217         addCommentColumn(CampaignsTableModel.COMMENT);
218         TableColumnExt updateDateCol = addDatePickerColumnToModel(CampaignsTableModel.UPDATE_DATE, getConfig().getDateTimeFormat(), false);
219         fixColumnWidth(updateDateCol, 120);
220 
221         // Modele de la table
222         final CampaignsTableModel tableModel = new CampaignsTableModel(getTable().getColumnModel());
223         getTable().setModel(tableModel);
224 
225         // Les columns obligatoire sont toujours presentes
226         columnName.setHideable(false);
227         columnStartDate.setHideable(false);
228         columnRecorderPerson.setHideable(false);
229 
230         // Initialisation de la table
231         initTable(getTable());
232 
233         // Tri par defaut
234         getTable().setSortOrder(CampaignsTableModel.NAME, SortOrder.ASCENDING);
235     }
236 
237 }