View Javadoc
1   package fr.ifremer.dali.ui.swing.content.manage.program;
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.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   * Controlleur pour l'onglet prelevements mesures.
49   */
50  public class ProgramsUIHandler extends AbstractDaliUIHandler<ProgramsUIModel, ProgramsUI> implements CloseableUI {
51  
52      /**
53       * Logger.
54       */
55      private static final Log LOG = LogFactory.getLog(ProgramsUIHandler.class);
56      private ImportSynchroCheckAction importSynchroCheckAction;
57  
58      /** {@inheritDoc} */
59      @Override
60      public void beforeInit(final ProgramsUI ui) {
61          super.beforeInit(ui);
62  
63          // create model and register to the JAXX context
64          final ProgramsUIModel model = new ProgramsUIModel();
65          ui.setContextValue(model);
66  
67          ui.setContextValue(SwingUtil.createActionIcon("program"));
68  
69      }
70  
71      /** {@inheritDoc} */
72      @Override
73      public void afterInit(final ProgramsUI ui) {
74          initUI(ui);
75  
76          ui.getMenuUI().getHandler().enableContextFilter(false);
77  
78          // Initialiser les parametres des ecrans Observation et prelevemnts
79          getContext().clearObservationIds();
80  
81          // Save models
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          // Chargement des programmes si un lieu a ete selectionne
90          if (getContext().getSelectProgramCode() != null) {
91  
92              // Load un programme
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         // check referential update (Mantis #46969)
101         SwingUtilities.invokeLater(this::checkForReferentialUpdates);
102     }
103 
104     @SuppressWarnings("unchecked")
105     private void initListeners() {
106 
107         // listen to menu results
108         getUI().getMenuUI().getModel().addPropertyChangeListener(ProgramsMenuUIModel.PROPERTY_RESULTS, evt -> {
109 
110             // Clear sub tables
111             getModel().getStrategiesUIModel().clear();
112             getModel().getLocationsUIModel().clear();
113             getModel().getPmfmsUIModel().clear();
114             // affect programs
115             getUI().getProgramsTableUI().getHandler().loadPrograms((Collection<ProgramDTO>) evt.getNewValue());
116         });
117 
118         // Listen modify property and set dirty to the selected program
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         // Listen valid state
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         // Add listener on saveEnabled property to disable change (Mantis #47532)
184         getModel().addPropertyChangeListener(ProgramsUIModel.PROPERTY_SAVE_ENABLED, evt -> getModel().getProgramsUIModel().setSaveEnabled(getModel().isSaveEnabled()));
185 
186         // Register validator
187         registerValidators(getValidator());
188         listenValidatorValid(getValidator(), getModel());
189 
190     }
191 
192     /** {@inheritDoc} */
193     @Override
194     public SwingValidator<ProgramsUIModel> getValidator() {
195         return getUI().getValidator();
196     }
197 
198     /** {@inheritDoc} */
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                 // If error occurs (eg. connection problem) set screen read-only (Mantis #47532)
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                     // get result
242                     if (synchroUIContext.isImportReferential()) {
243                         UpdateProgramsAction updateProgramsAction = getContext().getActionFactory().createLogicAction(this, UpdateProgramsAction.class);
244                         getContext().getActionEngine().runAction(updateProgramsAction);
245                     }
246                 }
247 
248                 // Reset correctly the synchro context and widget (Mantis #48842)
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 }