1 package fr.ifremer.dali.ui.swing.content.manage.filter;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
55
56 public class FilterUIHandler extends AbstractDaliUIHandler<FilterUIModel, FilterUI> implements CloseableUI {
57
58
59
60
61 private static final Log LOG = LogFactory.getLog(FilterUIHandler.class);
62
63 private FilterElementsLoader filterElementsLoader;
64
65
66
67
68 @Override
69 public void beforeInit(final FilterUI ui) {
70 super.beforeInit(ui);
71
72
73 final FilterUIModel model = new FilterUIModel();
74 ui.setContextValue(model);
75
76 ui.setContextValue(SwingUtil.createActionIcon("config"));
77 }
78
79
80
81
82 @Override
83 public void afterInit(final FilterUI ui) {
84 initUI(ui);
85
86
87 ui.getFilterElementUI().putClientProperty("validatorLabel", t("dali.filter.selected.label"));
88
89
90 getContext().clearObservationIds();
91
92
93 getModel().setFilterListUIModel(getUI().getFilterListUI().getModel());
94 listenModelModify(getModel().getFilterListUIModel());
95 getModel().getFilterListUIModel().addPropertyChangeListener(AbstractDaliBeanUIModel.PROPERTY_VALID, evt -> getValidator().doValidate());
96
97
98 getModel().setFilterElementUIModel(getUI().getFilterElementUI().getModel());
99
100 initListeners();
101
102 getModel().setValid(true);
103 }
104
105
106
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
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
170
171 public void clearFilterElements() {
172 getFilterElementUIHandler().clear();
173 }
174
175
176
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
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
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 }