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