View Javadoc
1   package fr.ifremer.reefdb.ui.swing.content.manage.program;
2   
3   /*
4    * #%L
5    * Reef DB :: 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.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       * Logger.
53       */
54      private static final Log LOG = LogFactory.getLog(ProgramsUIHandler.class);
55      private ImportSynchroCheckAction importSynchroCheckAction;
56  
57      /** {@inheritDoc} */
58      @Override
59      public void beforeInit(final ProgramsUI ui) {
60          super.beforeInit(ui);
61  
62          // create model and register to the JAXX context
63          ui.setContextValue(new ProgramsUIModel());
64          ui.setContextValue(SwingUtil.createActionIcon("program"));
65      }
66  
67      /** {@inheritDoc} */
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          // Initialiser les parametres des ecrans Observation et prelevemnts
76          getContext().clearObservationPrelevementsIds();
77  
78          // Save models
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          // Chargement des programmes si un lieu a ete selectionne
87          if (getContext().getSelectedProgramCode() != null) {
88  
89              // Load un programme
90              SearchAction searchAction = getContext().getActionFactory().createLogicAction(getUI().getMenuUI().getHandler(), SearchAction.class);
91              searchAction.getModel().setProgram(null);
92              getContext().getActionEngine().runInternalAction(searchAction);
93  
94              // Selection du programme
95              reselectProgram();
96          }
97  
98          getUI().applyDataBinding(ProgramsUI.BINDING_SAVE_BUTTON_ENABLED);
99  
100         // check referential update (Mantis #47231)
101         SwingUtilities.invokeLater(this::checkForReferentialUpdates);
102     }
103 
104     /**
105      * <p>reselectProgram.</p>
106      */
107     public void reselectProgram() {
108 
109         // select again the previous program
110         getUI().getProgramsTableUI().getHandler().autoSelectRow();
111     }
112 
113     private void initListeners() {
114 
115         // listen to menu results
116         getUI().getMenuUI().getModel().addPropertyChangeListener(ProgramsMenuUIModel.PROPERTY_RESULTS, evt -> {
117             // Clear sub tables
118             getUI().getStrategiesTableUI().getHandler().clearTable();
119             getUI().getLocationsTableUI().getHandler().clearTable();
120             getUI().getPmfmsTableUI().getHandler().clearTable();
121             // affect programs
122             getUI().getProgramsTableUI().getHandler().loadPrograms((Collection<ProgramDTO>) evt.getNewValue());
123         });
124 
125         // Listen modify property and set dirty to the selected program
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         // Listen valid state
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         // Add listener on saveEnabled property to disable change (Mantis #48002)
187         getModel().addPropertyChangeListener(ProgramsUIModel.PROPERTY_SAVE_ENABLED, evt -> getModel().getProgramsUIModel().setSaveEnabled(getModel().isSaveEnabled()));
188 
189         // Register validator
190         registerValidators(getValidator());
191         listenValidatorValid(getValidator(), getModel());
192 
193     }
194 
195     /** {@inheritDoc} */
196     @Override
197     public SwingValidator<ProgramsUIModel> getValidator() {
198         return getUI().getValidator();
199     }
200 
201     /** {@inheritDoc} */
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                 // If error occurs (eg. connection problem) set screen read-only (Mantis #48002)
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                     // get result
245                     if (synchroUIContext.isImportReferential()) {
246                         UpdateProgramsAction updateProgramsAction = getContext().getActionFactory().createLogicAction(this, UpdateProgramsAction.class);
247                         getContext().getActionEngine().runAction(updateProgramsAction);
248                     }
249                 }
250 
251                 // Reset correctly the synchro context and widget (Mantis #48832)
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 }