View Javadoc
1   package fr.ifremer.dali.ui.swing.content.manage.program.strategiesByLocation.programs;
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.dto.configuration.programStrategy.ProgramDTO;
28  import fr.ifremer.dali.dto.referential.LocationDTO;
29  import fr.ifremer.dali.ui.swing.util.table.AbstractDaliTableModel;
30  import fr.ifremer.dali.ui.swing.util.table.AbstractDaliTableUIHandler;
31  import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
32  import org.jdesktop.swingx.table.TableColumnExt;
33  
34  import javax.swing.BorderFactory;
35  
36  import static org.nuiton.i18n.I18n.t;
37  
38  /**
39   * Controleur pour la zone des programmes.
40   */
41  public class StrategiesProgrammeTableUIHandler extends AbstractDaliTableUIHandler<StrategiesProgrammeTableRowModel, StrategiesProgrammeTableUIModel, StrategiesProgrammeTableUI> {
42  
43      /**
44       * <p>Constructor for StrategiesProgrammeTableUIHandler.</p>
45       */
46      public StrategiesProgrammeTableUIHandler() {
47          super(StrategiesProgrammeTableRowModel.PROPERTY_START_DATE,
48                  StrategiesProgrammeTableRowModel.PROPERTY_END_DATE);
49      }
50  
51      /** {@inheritDoc} */
52      @Override
53      public AbstractDaliTableModel<StrategiesProgrammeTableRowModel> getTableModel() {
54          return (StrategiesProgrammeTableModel) getTable().getModel();
55      }
56  
57      /** {@inheritDoc} */
58      @Override
59      public SwingTable getTable() {
60          return getUI().getTableau();
61      }
62  
63      /** {@inheritDoc} */
64      @Override
65      public void beforeInit(final StrategiesProgrammeTableUI ui) {
66          super.beforeInit(ui);
67  
68          // create model and register to the JAXX context
69          final StrategiesProgrammeTableUIModel model = new StrategiesProgrammeTableUIModel();
70          ui.setContextValue(model);
71      }
72  
73      /** {@inheritDoc} */
74      @Override
75      public void afterInit(StrategiesProgrammeTableUI ui) {
76  
77          // Initialiser l UI
78          initUI(ui);
79  
80          // Initialiser le tableau
81          initialiserTableau();
82      }
83  
84      /** {@inheritDoc} */
85      @Override
86      protected boolean isRowValid(final StrategiesProgrammeTableRowModel row) {
87          row.getErrors().clear();
88          return super.isRowValid(row) && isDatesValid(row);
89      }
90  
91      private boolean isDatesValid(StrategiesProgrammeTableRowModel row) {
92  
93          // both start and end dates must be null or not null
94          if (row.getStartDate() == null && row.getEndDate() != null) {
95              DaliBeans.addError(row, t("dali.program.location.startDate.null"), StrategiesProgrammeTableRowModel.PROPERTY_START_DATE);
96  
97          } else if (row.getStartDate() != null && row.getEndDate() == null) {
98              DaliBeans.addError(row, t("dali.program.location.endDate.null"), StrategiesProgrammeTableRowModel.PROPERTY_END_DATE);
99  
100         } else if (row.getStartDate() != null && row.getEndDate() != null) {
101             // end date must be after start date
102             if (row.getStartDate().isAfter(row.getEndDate())) {
103                 DaliBeans.addError(row, t("dali.program.location.endDate.before"), StrategiesProgrammeTableRowModel.PROPERTY_END_DATE);
104             } else {
105 
106                 // if dates valid, check surveys outside dates
107                 long surveysCount = getContext().getObservationService().countSurveysWithProgramLocationAndOutsideDates(row, getModel().getLocationId());
108                 if (surveysCount > 0) {
109                     DaliBeans.addError(row, t("dali.program.location.period.surveyOutsidePeriod"),
110                             StrategiesProgrammeTableRowModel.PROPERTY_START_DATE, StrategiesProgrammeTableRowModel.PROPERTY_END_DATE);
111                 }
112             }
113         }
114 
115         return row.getErrors().isEmpty();
116     }
117 
118     /**
119      * Chargement des strategies.
120      *
121      * @param lieu Lieu selectionne
122      * @param programme a {@link fr.ifremer.dali.dto.configuration.programStrategy.ProgramDTO} object.
123      */
124     public void load(final ProgramDTO programme, final LocationDTO lieu) {
125 
126         // Ajout de la liste des strategies dans le tableau
127         getModel().setBeans(getContext().getProgramStrategyService().getStrategyUsageByProgramAndLocationId(
128                 programme.getCode(), lieu.getId()));
129 
130         getModel().setLocationId(lieu.getId());
131         getModel().setModify(false);
132         recomputeRowsValidState(true);
133 
134         // Initialiser le titre du panel
135         getUI().setBorder(BorderFactory.createTitledBorder(
136                 t("dali.program.strategies.program.titre",
137                         programme.getCode(), lieu.getName())));
138     }
139 
140     /**
141      * Initialisation de le tableau.
142      */
143     private void initialiserTableau() {
144 
145         // La table des prelevements
146         final SwingTable table = getTable();
147 
148         // Colonne libelle
149         final TableColumnExt colonneLibelle = addColumn(
150                 StrategiesProgrammeTableModel.NAME);
151         colonneLibelle.setSortable(true);
152         colonneLibelle.setMinWidth(200);
153 
154         // Colonne date debut
155         final TableColumnExt colonneStartDate = addLocalDatePickerColumnToModel(
156                 StrategiesProgrammeTableModel.START_DATE, getConfig().getDateFormat());
157         colonneStartDate.setSortable(true);
158         colonneStartDate.setMinWidth(100);
159 
160         // Colonne date fin
161         final TableColumnExt colonneEndDate = addLocalDatePickerColumnToModel(
162                 StrategiesProgrammeTableModel.END_DATE, getConfig().getDateFormat());
163         colonneEndDate.setSortable(true);
164         colonneEndDate.setMinWidth(100);
165 
166         // Modele de la table
167         final StrategiesProgrammeTableModel tableModel = new StrategiesProgrammeTableModel(getTable().getColumnModel());
168         table.setModel(tableModel);
169 
170         // Initialisation de la table
171         initTable(table, true);
172 
173         // Les colonnes obligatoire sont toujours presentes
174         colonneLibelle.setHideable(false);
175         colonneStartDate.setHideable(false);
176         colonneEndDate.setHideable(false);
177 
178         // Seul les colonnes startDate et endDate doivent ĂȘtre editables
179         colonneLibelle.setEditable(false);
180         colonneStartDate.setEditable(true);
181         colonneEndDate.setEditable(true);
182     }
183 }