View Javadoc
1   package fr.ifremer.dali.ui.swing.content.extraction.filters.period;
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  import org.nuiton.jaxx.application.swing.util.Cancelable;
32  
33  import javax.swing.JComponent;
34  import java.awt.Component;
35  import java.time.LocalDate;
36  import java.util.List;
37  
38  import static org.nuiton.i18n.I18n.t;
39  
40  /**
41   * <p>ExtractionPeriodUIHandler class.</p>
42   *
43   */
44  public class ExtractionPeriodUIHandler extends AbstractDaliTableUIHandler<ExtractionPeriodRowModel, ExtractionPeriodUIModel, ExtractionPeriodUI> implements Cancelable {
45  
46      /** {@inheritDoc} */
47      @Override
48      public void beforeInit(ExtractionPeriodUI ui) {
49          super.beforeInit(ui);
50  
51          ExtractionPeriodUIModel model = new ExtractionPeriodUIModel();
52          ui.setContextValue(model);
53      }
54  
55      /** {@inheritDoc} */
56      @Override
57      public void afterInit(ExtractionPeriodUI ui) {
58          initUI(ui);
59  
60          initTable();
61  
62          getModel().addPropertyChangeListener(ExtractionPeriodUIModel.PROPERTY_BEANS_LOADED, evt -> {
63              // after periods loaded
64              if (getModel().getRowCount() == 0) {
65                  // create a new row if empty, focus is requested by onRowsAdded
66                  getModel().addNewRow();
67              } else {
68                  // focus on first row
69                  setFocusOnCell(getModel().getRows().get(0));
70              }
71          });
72      }
73  
74      private void initTable() {
75  
76          TableColumnExt startDateCol = addLocalDatePickerColumnToModel(ExtractionPeriodTableModel.START_DATE, getConfig().getDateFormat());
77          fixColumnWidth(startDateCol, 120);
78          TableColumnExt endDateCol = addLocalDatePickerColumnToModel(ExtractionPeriodTableModel.END_DATE, getConfig().getDateFormat());
79          fixColumnWidth(endDateCol, 120);
80  
81          ExtractionPeriodTableModel tableModel = new ExtractionPeriodTableModel(getTable().getColumnModel());
82          getTable().setModel(tableModel);
83  
84          getTable().setVisibleRowCount(5);
85  
86          initTable(getTable());
87      }
88  
89      /** {@inheritDoc} */
90      @Override
91      protected JComponent getComponentToFocus() {
92          return getTable();
93      }
94  
95      /** {@inheritDoc} */
96      @Override
97      public Component getNextComponentToFocus() {
98          return getUI().getValidButton();
99      }
100 
101     /** {@inheritDoc} */
102     @Override
103     protected void onRowsAdded(List<ExtractionPeriodRowModel> addedRows) {
104         super.onRowsAdded(addedRows);
105 
106         if (addedRows.size() == 1) {
107             ExtractionPeriodRowModel row = addedRows.get(0);
108             setFocusOnCell(row);
109         }
110     }
111 
112     /** {@inheritDoc} */
113     @Override
114     protected void onRowModified(int rowIndex, ExtractionPeriodRowModel row, String propertyName, Integer propertyIndex, Object oldValue, Object newValue) {
115         super.onRowModified(rowIndex, row, propertyName, propertyIndex, oldValue, newValue);
116         recomputeRowsValidState(false);
117     }
118 
119     // remove selected rows
120     void removeSelectedRows() {
121         // stop cell editing first (Mantis #45512)
122         getTable().removeEditor();
123         getModel().deleteSelectedRows();
124     }
125 
126     /** {@inheritDoc} */
127     @Override
128     protected boolean isRowValid(ExtractionPeriodRowModel row) {
129         return /*super.isRowValid(row) &&*/ isPeriodValid(row);
130     }
131 
132     private boolean isPeriodValid(ExtractionPeriodRowModel row) {
133 
134         row.getErrors().clear();
135 
136         final LocalDate startDate = row.getStartDate();
137         final LocalDate endDate = row.getEndDate();
138 
139         if (startDate == null) {
140 
141             // both dates must be filled
142             DaliBeans.addError(row, t("dali.extraction.period.empty.message"), ExtractionPeriodRowModel.PROPERTY_START_DATE);
143 
144         } else if (endDate == null) {
145 
146             // both dates must be filled
147             DaliBeans.addError(row, t("dali.extraction.period.empty.message"), ExtractionPeriodRowModel.PROPERTY_END_DATE);
148 
149         } else if (endDate.isBefore(startDate)) {
150 
151             // end date should be after start date
152             DaliBeans.addError(row, t("dali.extraction.period.invalid.message"), ExtractionPeriodRowModel.PROPERTY_END_DATE);
153 
154         }
155 
156         return row.getErrors().isEmpty();
157     }
158 
159     /**
160      * <p>valid.</p>
161      */
162     public void valid() {
163 
164         if (getModel().isValid()) {
165             closeDialog();
166         }
167     }
168 
169     /** {@inheritDoc} */
170     @Override
171     public void cancel() {
172         getModel().setValid(false);
173         closeDialog();
174     }
175 
176     /** {@inheritDoc} */
177     @Override
178     public AbstractDaliTableModel<ExtractionPeriodRowModel> getTableModel() {
179         return (ExtractionPeriodTableModel) getTable().getModel();
180     }
181 
182     /** {@inheritDoc} */
183     @Override
184     public SwingTable getTable() {
185         return getUI().getPeriodTable();
186     }
187 }