View Javadoc
1   package fr.ifremer.dali.ui.swing.content.manage.filter;
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.service.DaliTechnicalException;
27  import fr.ifremer.dali.ui.swing.action.QuitScreenAction;
28  import fr.ifremer.dali.ui.swing.content.manage.filter.element.AbstractFilterElementUIHandler;
29  import fr.ifremer.dali.ui.swing.content.manage.filter.element.FilterElementUIModel;
30  import fr.ifremer.dali.ui.swing.content.manage.filter.list.FilterListRowModel;
31  import fr.ifremer.dali.ui.swing.util.AbstractDaliBeanUIModel;
32  import fr.ifremer.dali.ui.swing.util.AbstractDaliUIHandler;
33  import fr.ifremer.dali.ui.swing.util.table.AbstractDaliTableUIModel;
34  import fr.ifremer.quadrige3.ui.core.dto.QuadrigeBean;
35  import jaxx.runtime.SwingUtil;
36  import jaxx.runtime.validator.swing.SwingValidator;
37  import org.apache.commons.logging.Log;
38  import org.apache.commons.logging.LogFactory;
39  import org.nuiton.jaxx.application.swing.util.CloseableUI;
40  
41  import javax.swing.SwingWorker;
42  import java.awt.Dimension;
43  import java.awt.event.ComponentAdapter;
44  import java.awt.event.ComponentEvent;
45  import java.util.ArrayList;
46  import java.util.List;
47  import java.util.Objects;
48  import java.util.concurrent.ExecutionException;
49  import java.util.stream.Collectors;
50  
51  import static org.nuiton.i18n.I18n.t;
52  
53  /**
54   * Controller.
55   */
56  public class FilterUIHandler extends AbstractDaliUIHandler<FilterUIModel, FilterUI> implements CloseableUI {
57  
58      /**
59       * Logger.
60       */
61      private static final Log LOG = LogFactory.getLog(FilterUIHandler.class);
62  
63      private FilterElementsLoader filterElementsLoader;
64  
65      /**
66       * {@inheritDoc}
67       */
68      @Override
69      public void beforeInit(final FilterUI ui) {
70          super.beforeInit(ui);
71  
72          // Create model and register to the JAXX context
73          final FilterUIModel model = new FilterUIModel();
74          ui.setContextValue(model);
75  
76          ui.setContextValue(SwingUtil.createActionIcon("config"));
77      }
78  
79      /**
80       * {@inheritDoc}
81       */
82      @Override
83      public void afterInit(final FilterUI ui) {
84          initUI(ui);
85  
86          // set client property here because overridden FilterUI don't add it
87          ui.getFilterElementUI().putClientProperty("validatorLabel", t("dali.filter.selected.label"));
88  
89          // Clean observations id on context
90          getContext().clearObservationIds();
91  
92          // List model
93          getModel().setFilterListUIModel(getUI().getFilterListUI().getModel());
94          listenModelModify(getModel().getFilterListUIModel());
95          getModel().getFilterListUIModel().addPropertyChangeListener(AbstractDaliBeanUIModel.PROPERTY_VALID, evt -> getValidator().doValidate());
96  
97          // Element model
98          getModel().setFilterElementUIModel(getUI().getFilterElementUI().getModel());
99  
100         initListeners();
101 
102         getModel().setValid(true);
103     }
104 
105     /**
106      * {@inheritDoc}
107      */
108     @Override
109     public SwingValidator<FilterUIModel> getValidator() {
110         return getUI().getValidator();
111     }
112 
113     @SuppressWarnings("unchecked")
114     private void initListeners() {
115 
116         getModel().getFilterListUIModel().addPropertyChangeListener(AbstractDaliTableUIModel.PROPERTY_SINGLE_ROW_SELECTED, evt -> {
117 
118             if (filterElementsLoader != null && !filterElementsLoader.isDone()) {
119                 filterElementsLoader.cancel(true);
120             }
121             getModel().setSelectedFilter(null);
122             getModel().getFilterElementUIModel().setLoading(true);
123             filterElementsLoader = new FilterElementsLoader(getModel().getFilterListUIModel().getSingleSelectedRow());
124             filterElementsLoader.execute();
125 
126         });
127 
128         getModel().getFilterElementUIModel().addPropertyChangeListener(FilterElementUIModel.PROPERTY_ELEMENTS, evt -> {
129 
130             if (getModel().getSelectedFilter() != null
131                     && !getModel().getFilterElementUIModel().isLoading()
132                     && !getModel().getFilterElementUIModel().isAdjusting()) {
133                 List<? extends QuadrigeBean> list = getUI().getFilterElementUI().getModel().getElements();
134                 getModel().getSelectedFilter().setElements(list != null
135                         ? list.stream().filter(Objects::nonNull).collect(Collectors.toList())
136                         : new ArrayList<>());
137                 getModel().getSelectedFilter().setFilterLoaded(true);
138                 getModel().getSelectedFilter().setDirty(true);
139                 getModel().setModify(true);
140             }
141             getUI().getFilterListUI().getHandler().recomputeRowsValidState();
142             getValidator().doValidate();
143         });
144 
145         listenValidatorValid(getValidator(), getModel());
146         registerValidators(getValidator());
147 
148         // adapt filterElementUI height: use a scroll pane when UI height is too narrow (Mantis #46824)
149         getUI().addComponentListener(new ComponentAdapter() {
150             @Override
151             public void componentResized(ComponentEvent e) {
152                 int h = getUI().getHeight()
153                         - getUI().getButtonsPanel().getPreferredSize().height
154                         - getUI().getFilterListUI().getPreferredSize().height
155                         - 10;
156                 h = Math.max(h, getUI().getFilterElementUI().getFilterElementMenuPanel().getPreferredSize().height);
157                 Dimension d = new Dimension(getUI().getFilterElementUI().getPreferredSize().width, h);
158                 getUI().getFilterElementUI().setPreferredSize(d);
159                 getUI().getFilterElementUI().invalidate();
160             }
161         });
162     }
163 
164     private AbstractFilterElementUIHandler getFilterElementUIHandler() {
165         return (AbstractFilterElementUIHandler) getUI().getFilterElementUI().getHandler();
166     }
167 
168     /**
169      * Delete filter.
170      */
171     public void clearFilterElements() {
172         getFilterElementUIHandler().clear();
173     }
174 
175     /**
176      * {@inheritDoc}
177      */
178     @Override
179     @SuppressWarnings("unchecked")
180     public boolean quitUI() {
181         try {
182             QuitScreenAction action = new QuitScreenAction(this, false, SaveAction.class);
183             if (action.prepareAction()) {
184                 return true;
185             }
186         } catch (Exception e) {
187             LOG.error(e.getLocalizedMessage(), e);
188         }
189         return false;
190     }
191 
192     private class FilterElementsLoader extends SwingWorker<Object, Object> {
193 
194         private FilterListRowModel selectedFilter;
195 
196         FilterElementsLoader(FilterListRowModel selectedFilter) {
197             this.selectedFilter = selectedFilter;
198         }
199 
200         @Override
201         protected Object doInBackground() {
202 
203             // Load filter elements by service
204             getContext().getContextService().loadFilteredElements(selectedFilter);
205 
206             return null;
207         }
208 
209         @Override
210         @SuppressWarnings("unchecked")
211         protected void done() {
212             try {
213                 if (isCancelled()) {
214                     return;
215                 }
216                 try {
217                     get();
218                 } catch (InterruptedException | ExecutionException e) {
219                     throw new DaliTechnicalException(e.getMessage(), e);
220                 }
221 
222                 getModel().getFilterElementUIModel().setLoading(true);
223 
224                 getModel().setSelectedFilter(selectedFilter);
225 
226                 // Load elements in FilterElementUI
227                 getFilterElementUIHandler().loadSelectedElements(selectedFilter != null
228                         ? new ArrayList<>(selectedFilter.getElements())
229                         : null);
230 
231                 getValidator().doValidate();
232 
233             } finally {
234                 getModel().getFilterElementUIModel().setLoading(false);
235             }
236 
237         }
238     }
239 }