1 package fr.ifremer.dali.ui.swing.content.extraction;
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 com.google.common.collect.Sets;
27 import fr.ifremer.dali.dto.DaliBeans;
28 import fr.ifremer.dali.dto.configuration.programStrategy.PmfmStrategyDTO;
29 import fr.ifremer.dali.dto.enums.ExtractionFilterTypeValues;
30 import fr.ifremer.dali.dto.referential.pmfm.PmfmDTO;
31 import fr.ifremer.dali.dto.system.extraction.ExtractionDTO;
32 import fr.ifremer.dali.dto.system.extraction.ExtractionPeriodDTO;
33 import fr.ifremer.dali.ui.swing.action.QuitScreenAction;
34 import fr.ifremer.dali.ui.swing.content.extraction.filters.ExtractionFiltersUIModel;
35 import fr.ifremer.dali.ui.swing.content.extraction.list.ExtractionsRowModel;
36 import fr.ifremer.dali.ui.swing.content.extraction.list.ExtractionsTableUIModel;
37 import fr.ifremer.dali.ui.swing.util.AbstractDaliBeanUIModel;
38 import fr.ifremer.dali.ui.swing.util.AbstractDaliUIHandler;
39 import fr.ifremer.dali.ui.swing.util.DaliUIs;
40 import jaxx.runtime.SwingUtil;
41 import jaxx.runtime.validator.swing.SwingValidator;
42 import org.apache.commons.logging.Log;
43 import org.apache.commons.logging.LogFactory;
44 import org.nuiton.jaxx.application.swing.util.CloseableUI;
45
46 import javax.swing.SwingUtilities;
47 import java.util.*;
48 import java.util.stream.Collectors;
49
50
51
52
53 public class ExtractionUIHandler extends AbstractDaliUIHandler<ExtractionUIModel, ExtractionUI> implements CloseableUI {
54
55
56
57
58 private static final Log LOG = LogFactory.getLog(ExtractionUIHandler.class);
59
60
61 @Override
62 public void beforeInit(final ExtractionUI ui) {
63 super.beforeInit(ui);
64
65
66 final ExtractionUIModel model = new ExtractionUIModel();
67 ui.setContextValue(model);
68
69 ui.setContextValue(SwingUtil.createActionIcon("export"));
70
71 }
72
73
74 @Override
75 public void afterInit(ExtractionUI ui) {
76 initUI(ui);
77 ui.getSelectExtractionLabel().setForeground(getConfig().getColorThematicLabel());
78 ui.getSelectProgramLabel().setForeground(getConfig().getColorThematicLabel());
79
80
81 getModel().setExtractionsTableUIModel(getUI().getExtractionsTable().getModel());
82 getModel().setExtractionFiltersUIModel(getUI().getFiltersTable().getModel());
83 getModel().setExtractionConfigUIModel(getUI().getConfigUI().getModel());
84
85
86 initComboBox();
87
88
89 initListeners();
90
91
92 registerValidators(getValidator());
93 listenValidatorValid(getValidator(), getModel());
94
95
96 SwingUtil.setComponentWidth(getUI().getLeftImage(), ui.getExtractionMenu().getPreferredSize().width * 9 / 10);
97 getUI().getLeftImage().setScaled(true);
98
99 getModel().setModify(false);
100 }
101
102
103
104
105 private void initComboBox() {
106
107
108 initBeanFilterableComboBox(
109 getUI().getContextComboBox(),
110 getContext().getContextService().getAllContexts(),
111 getContext().getSelectedContext());
112
113
114 initBeanFilterableComboBox(
115 getUI().getSelectExtractionCombo(),
116 getContext().getExtractionService().getAllLightExtractions(),
117 null);
118
119
120 initBeanFilterableComboBox(
121 getUI().getSelectProgramCombo(),
122 getContext().getObservationService().getAvailablePrograms(null, null, false),
123 null);
124
125
126 DaliUIs.forceComponentSize(getUI().getContextComboBox());
127 DaliUIs.forceComponentSize(getUI().getSelectExtractionCombo());
128 DaliUIs.forceComponentSize(getUI().getSelectProgramCombo());
129
130 getUI().getSelectExtractionCombo().getComboBoxModel().addWillChangeSelectedItemListener(event -> {
131 if (getModel().isLoading()) return;
132 if (event.getNextSelectedItem() != null) SwingUtilities.invokeLater(() -> getUI().getSearchButton().getAction().actionPerformed(null));
133 });
134 }
135
136
137
138
139 public void reloadComboBox() {
140 getModel().setLoading(true);
141 getUI().getSelectExtractionCombo().setData(getContext().getExtractionService().getAllLightExtractions());
142 getModel().setLoading(false);
143 }
144
145
146
147
148 private void initListeners() {
149
150
151 listenModelModify(getModel().getExtractionsTableUIModel());
152 getModel().getExtractionFiltersUIModel().addPropertyChangeListener(AbstractDaliBeanUIModel.PROPERTY_MODIFY, evt -> {
153 Boolean modify = (Boolean) evt.getNewValue();
154 if (!getModel().getExtractionFiltersUIModel().isLoading() && modify != null) {
155 getModel().setModify(modify);
156 if (modify && getModel().getSelectedExtraction() != null) {
157 getModel().getSelectedExtraction().setDirty(true);
158 }
159 }
160 });
161 getModel().getExtractionConfigUIModel().addPropertyChangeListener(AbstractDaliBeanUIModel.PROPERTY_MODIFY, evt -> {
162 Boolean modify = (Boolean) evt.getNewValue();
163 if (!getModel().getExtractionConfigUIModel().isLoading() && modify != null) {
164 getModel().setModify(modify);
165 ExtractionsRowModel selectedExtraction = getModel().getSelectedExtraction();
166 if (modify && selectedExtraction != null) {
167 selectedExtraction.setParameter(getModel().getExtractionConfigUIModel().toBean());
168 selectedExtraction.setDirty(true);
169 }
170 }
171 });
172
173
174
175 getModel().getExtractionsTableUIModel().addPropertyChangeListener(ExtractionsTableUIModel.PROPERTY_SINGLE_ROW_SELECTED, evt -> {
176 getUI().getFiltersTable().getHandler().loadFilters();
177 getUI().getConfigUI().getHandler().loadConfig();
178 });
179
180 getModel().getExtractionsTableUIModel().addPropertyChangeListener(AbstractDaliBeanUIModel.PROPERTY_VALID, evt -> getValidator().doValidate());
181 getModel().getExtractionFiltersUIModel().addPropertyChangeListener(AbstractDaliBeanUIModel.PROPERTY_VALID, evt -> {
182 Boolean valid = (Boolean) evt.getNewValue();
183 ExtractionsRowModel extractionRow = getModel().getSelectedExtraction();
184 if (extractionRow != null) {
185
186
187 extractionRow.setFiltersValid(valid);
188
189
190 getModel().getExtractionConfigUIModel().setEnabled(valid);
191
192 getUI().getExtractionsTable().getHandler().recomputeRowValidState(extractionRow);
193 getValidator().doValidate();
194 } else {
195
196
197 getModel().getExtractionConfigUIModel().setEnabled(false);
198
199 }
200 });
201
202
203 getModel().addPropertyChangeListener(ExtractionUIModel.PROPERTY_PROGRAM, evt -> {
204
205 });
206
207
208 getModel().getExtractionFiltersUIModel().addPropertyChangeListener(ExtractionFiltersUIModel.PROPERTY_LOADING, evt -> {
209 if (evt.getNewValue() instanceof Boolean) {
210
211 getModel().getExtractionsTableUIModel().setFiltersLoading((Boolean) evt.getNewValue());
212 }
213 });
214
215
216 getModel().addPropertyChangeListener(ExtractionUIModel.PROPERTY_CONTEXT, evt -> getContext().setSelectedContext(getModel().getContext()));
217
218 }
219
220
221
222
223
224
225 public void loadExtractions(final List<ExtractionDTO> extractions) {
226 getModel().getExtractionsTableUIModel().setBeans(extractions);
227
228
229 if (getModel().getExtractionsTableUIModel().getRowCount() == 1) {
230 ExtractionsRowModel rowModel = getModel().getExtractionsTableUIModel().getRows().get(0);
231 SwingUtilities.invokeLater(() -> {
232 getUI().getExtractionsTable().getHandler().selectRow(rowModel);
233 getModel().getExtractionsTableUIModel().setSingleSelectedRow(rowModel);
234 });
235 }
236 }
237
238
239
240
241
242
243
244
245
246 public Set<PmfmDTO> getPmfmsForSelectedExtraction(Collection<String> currentProgramCodes, Collection<ExtractionPeriodDTO> currentPeriods) {
247
248 if (getModel().getSelectedExtraction() == null) return null;
249
250 Collection<String> programCodes = currentProgramCodes != null
251 ? currentProgramCodes
252 : DaliBeans.getFilterElementsIds(getModel().getSelectedExtraction(), ExtractionFilterTypeValues.PROGRAM);
253 Collection<ExtractionPeriodDTO> extractionPeriods = currentPeriods != null
254 ? currentPeriods
255 : DaliBeans.getExtractionPeriods(getModel().getSelectedExtraction());
256 Set<PmfmStrategyDTO> pmfmStrategies = Sets.newHashSet();
257
258 for (ExtractionPeriodDTO period : extractionPeriods) {
259 pmfmStrategies.addAll(getContext().getProgramStrategyService().getPmfmStrategiesByProgramsAndDates(programCodes, period.getStartDate(), period.getEndDate()));
260 }
261
262 return pmfmStrategies.stream().filter(pmfmStrategy -> pmfmStrategy.isSampling() && pmfmStrategy.isGrouping())
263 .sorted(Comparator.comparing(PmfmStrategyDTO::getRankOrder))
264 .map(PmfmStrategyDTO::getPmfm).collect(Collectors.toCollection(LinkedHashSet::new));
265 }
266
267
268 @Override
269 public SwingValidator<ExtractionUIModel> getValidator() {
270 return getUI().getValidator();
271 }
272
273
274 @Override
275 @SuppressWarnings("unchecked")
276 public boolean quitUI() {
277 try {
278 QuitScreenAction action = new QuitScreenAction(this, false, SaveAction.class);
279 if (action.prepareAction()) {
280 return true;
281 }
282 } catch (Exception e) {
283 LOG.error(e.getLocalizedMessage(), e);
284 }
285 return false;
286 }
287 }