1 package fr.ifremer.reefdb.ui.swing.content.manage.program;
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.quadrige3.synchro.vo.SynchroProgressionStatus;
27 import fr.ifremer.quadrige3.ui.swing.synchro.action.ImportSynchroCheckAction;
28 import fr.ifremer.reefdb.dto.configuration.programStrategy.ProgramDTO;
29 import fr.ifremer.reefdb.ui.swing.action.QuitScreenAction;
30 import fr.ifremer.reefdb.ui.swing.content.manage.program.menu.ProgramsMenuUIModel;
31 import fr.ifremer.reefdb.ui.swing.content.manage.program.menu.SearchAction;
32 import fr.ifremer.reefdb.ui.swing.content.manage.program.programs.ProgramsTableRowModel;
33 import fr.ifremer.reefdb.ui.swing.util.AbstractReefDbBeanUIModel;
34 import fr.ifremer.reefdb.ui.swing.util.AbstractReefDbUIHandler;
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.SwingUtilities;
42 import java.beans.PropertyChangeListener;
43 import java.util.Collection;
44
45 import static org.nuiton.i18n.I18n.t;
46
47
48
49 public class ProgramsUIHandler extends AbstractReefDbUIHandler<ProgramsUIModel, ProgramsUI> implements CloseableUI {
50
51
52
53
54 private static final Log LOG = LogFactory.getLog(ProgramsUIHandler.class);
55 private ImportSynchroCheckAction importSynchroCheckAction;
56
57
58 @Override
59 public void beforeInit(final ProgramsUI ui) {
60 super.beforeInit(ui);
61
62
63 ui.setContextValue(new ProgramsUIModel());
64 ui.setContextValue(SwingUtil.createActionIcon("program"));
65 }
66
67
68 @Override
69 public void afterInit(final ProgramsUI ui) {
70 initUI(ui);
71
72 ui.getMenuUI().getHandler().enableLocalFilter(false);
73 ui.getMenuUI().getHandler().enableContextFilter(false);
74
75
76 getContext().clearObservationPrelevementsIds();
77
78
79 getModel().setProgramsUIModel(getUI().getProgramsTableUI().getModel());
80 getModel().setStrategiesUIModel(getUI().getStrategiesTableUI().getModel());
81 getModel().setLocationsUIModel(getUI().getLocationsTableUI().getModel());
82 getModel().setPmfmsUIModel(getUI().getPmfmsTableUI().getModel());
83
84 initListeners();
85
86
87 if (getContext().getSelectedProgramCode() != null) {
88
89
90 SearchAction searchAction = getContext().getActionFactory().createLogicAction(getUI().getMenuUI().getHandler(), SearchAction.class);
91 searchAction.getModel().setProgram(null);
92 getContext().getActionEngine().runInternalAction(searchAction);
93
94
95 reselectProgram();
96 }
97
98 getUI().applyDataBinding(ProgramsUI.BINDING_SAVE_BUTTON_ENABLED);
99
100
101 SwingUtilities.invokeLater(this::checkForReferentialUpdates);
102 }
103
104
105
106
107 public void reselectProgram() {
108
109
110 getUI().getProgramsTableUI().getHandler().autoSelectRow();
111 }
112
113 private void initListeners() {
114
115
116 getUI().getMenuUI().getModel().addPropertyChangeListener(ProgramsMenuUIModel.PROPERTY_RESULTS, evt -> {
117
118 getUI().getStrategiesTableUI().getHandler().clearTable();
119 getUI().getLocationsTableUI().getHandler().clearTable();
120 getUI().getPmfmsTableUI().getHandler().clearTable();
121
122 getUI().getProgramsTableUI().getHandler().loadPrograms((Collection<ProgramDTO>) evt.getNewValue());
123 });
124
125
126 PropertyChangeListener modifyListener = evt -> {
127 Boolean modify = (Boolean) evt.getNewValue();
128 if (modify != null) {
129 getModel().setModify(modify);
130
131 ProgramsTableRowModel selectedProgram = getModel().getProgramsUIModel().getSingleSelectedRow();
132 if (selectedProgram != null) {
133 if (modify) {
134 selectedProgram.setDirty(true);
135 }
136 getUI().getProgramsTableUI().getHandler().recomputeRowValidState(selectedProgram);
137 getUI().getProgramsTableUI().getHandler().forceRevalidateModel();
138 forceRevalidateModel();
139 }
140
141 }
142 };
143 getModel().getProgramsUIModel().addPropertyChangeListener(AbstractReefDbBeanUIModel.PROPERTY_MODIFY, modifyListener);
144 getModel().getStrategiesUIModel().addPropertyChangeListener(AbstractReefDbBeanUIModel.PROPERTY_MODIFY, modifyListener);
145 getModel().getLocationsUIModel().addPropertyChangeListener(AbstractReefDbBeanUIModel.PROPERTY_MODIFY, modifyListener);
146 getModel().getPmfmsUIModel().addPropertyChangeListener(AbstractReefDbBeanUIModel.PROPERTY_MODIFY, modifyListener);
147
148
149 listenModelValid(getModel().getProgramsUIModel());
150
151 getModel().getStrategiesUIModel().addPropertyChangeListener(AbstractReefDbBeanUIModel.PROPERTY_VALID, evt -> {
152 Boolean valid = (Boolean) evt.getNewValue();
153 if (valid != null) {
154 getModel().setValid(valid);
155 if (getModel().getProgramsUIModel().getSingleSelectedRow() != null) {
156 getModel().getProgramsUIModel().getSingleSelectedRow().setStrategiesValid(valid);
157 getUI().getProgramsTableUI().getHandler().recomputeRowValidState(getModel().getProgramsUIModel().getSingleSelectedRow());
158 forceRevalidateModel();
159 }
160 }
161 });
162
163 getModel().getLocationsUIModel().addPropertyChangeListener(AbstractReefDbBeanUIModel.PROPERTY_VALID, evt -> {
164 Boolean valid = (Boolean) evt.getNewValue();
165 if (valid != null) {
166 getModel().setValid(valid);
167 if (getModel().getProgramsUIModel().getSingleSelectedRow() != null) {
168 getModel().getProgramsUIModel().getSingleSelectedRow().setLocationsValid(valid);
169 getUI().getProgramsTableUI().getHandler().recomputeRowValidState(getModel().getProgramsUIModel().getSingleSelectedRow());
170 forceRevalidateModel();
171 }
172 }
173 });
174
175 getModel().getPmfmsUIModel().addPropertyChangeListener(AbstractReefDbBeanUIModel.PROPERTY_VALID, evt -> {
176 Boolean valid = (Boolean) evt.getNewValue();
177 if (valid != null) {
178 getModel().setValid(valid);
179 if (getModel().getStrategiesUIModel().getSingleSelectedRow() != null) {
180 getUI().getStrategiesTableUI().getHandler().recomputeRowValidState(getModel().getStrategiesUIModel().getSingleSelectedRow());
181 forceRevalidateModel();
182 }
183 }
184 });
185
186
187 getModel().addPropertyChangeListener(ProgramsUIModel.PROPERTY_SAVE_ENABLED, evt -> getModel().getProgramsUIModel().setSaveEnabled(getModel().isSaveEnabled()));
188
189
190 registerValidators(getValidator());
191 listenValidatorValid(getValidator(), getModel());
192
193 }
194
195
196 @Override
197 public SwingValidator<ProgramsUIModel> getValidator() {
198 return getUI().getValidator();
199 }
200
201
202 @Override
203 @SuppressWarnings("unchecked")
204 public boolean quitUI() {
205 try {
206 QuitScreenAction action = new QuitScreenAction(this, false, SaveAction.class);
207 if (action.prepareAction()) {
208 return true;
209 }
210 } catch (Exception e) {
211 LOG.error(e.getLocalizedMessage(), e);
212 }
213 return false;
214 }
215
216 private void checkForReferentialUpdates() {
217 if (getContext().isNextImportSynchroCheckActionPrevented()) {
218 return;
219 }
220 if (getContext().getSynchroContext().isRunningStatus()) {
221 return;
222 }
223 getImportSynchroCheckAction().execute();
224 if (LOG.isDebugEnabled())
225 LOG.debug("checkForReferentialUpdates executed");
226 }
227
228 private ImportSynchroCheckAction getImportSynchroCheckAction() {
229 if (importSynchroCheckAction == null) {
230 importSynchroCheckAction = getContext().getActionFactory().createNonBlockingUIAction(getContext().getSynchroHandler(), ImportSynchroCheckAction.class);
231 }
232 if (!importSynchroCheckAction.isConsumerSet()) {
233 importSynchroCheckAction.setConsumer(synchroUIContext -> {
234
235 if (LOG.isDebugEnabled())
236 LOG.debug("check result: " + synchroUIContext.isImportReferential());
237
238
239 if (synchroUIContext.getStatus() == SynchroProgressionStatus.FAILED) {
240 getModel().setSaveEnabled(false);
241 getContext().getDialogHelper().showWarningDialog(t("reefdb.error.synchro.serverNotYetAvailable"));
242 } else {
243 getModel().setSaveEnabled(true);
244
245 if (synchroUIContext.isImportReferential()) {
246 UpdateProgramsAction updateProgramsAction = getContext().getActionFactory().createLogicAction(this, UpdateProgramsAction.class);
247 getContext().getActionEngine().runAction(updateProgramsAction);
248 }
249 }
250
251
252 getContext().getSynchroHandler().report(t("quadrige3.synchro.report.idle"), false);
253 getContext().getSynchroContext().resetImportContext();
254 getContext().getSynchroContext().saveImportContext(true, true);
255
256 });
257 }
258 return importSynchroCheckAction;
259 }
260 }