View Javadoc
1   package fr.ifremer.dali.ui.swing.content.manage.rule.controlrule.precondition;
2   
3   /*-
4    * #%L
5    * Dali :: UI
6    * %%
7    * Copyright (C) 2017 - 2018 Ifremer
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU Affero General Public License as published by
11   * the Free Software Foundation, either version 3 of the License, or
12   * (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   * 
19   * You should have received a copy of the GNU Affero General Public License
20   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21   * #L%
22   */
23  
24  import fr.ifremer.dali.decorator.DecoratorService;
25  import fr.ifremer.dali.dto.referential.pmfm.PmfmDTO;
26  import fr.ifremer.dali.dto.referential.pmfm.QualitativeValueDTO;
27  import fr.ifremer.dali.ui.swing.util.table.AbstractDaliTableUIHandler;
28  import fr.ifremer.quadrige3.ui.swing.table.AbstractTableModel;
29  import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
30  import jaxx.runtime.validator.swing.SwingValidator;
31  import org.apache.commons.logging.Log;
32  import org.apache.commons.logging.LogFactory;
33  import org.jdesktop.swingx.table.TableColumnExt;
34  import org.nuiton.jaxx.application.swing.util.Cancelable;
35  
36  import javax.swing.SortOrder;
37  import javax.swing.SwingUtilities;
38  import javax.swing.border.TitledBorder;
39  import java.util.ArrayList;
40  import java.util.Collection;
41  
42  /**
43   * @author peck7 on 05/02/2018.
44   */
45  public class RulePreconditionUIHandler
46          extends AbstractDaliTableUIHandler<RulePreconditionRowModel, RulePreconditionUIModel, RulePreconditionUI>
47          implements Cancelable {
48  
49      private static final Log LOG = LogFactory.getLog(RulePreconditionUIHandler.class);
50      public static final String LIST = "list";
51      public static final String DOUBLE_LIST = "doubleList";
52  
53      @Override
54      public void beforeInit(RulePreconditionUI ui) {
55          super.beforeInit(ui);
56  
57          ui.setContextValue(new RulePreconditionUIModel());
58      }
59  
60      @Override
61      public void afterInit(RulePreconditionUI rulePreconditionUI) {
62          initUI(rulePreconditionUI);
63  
64          initTable();
65  
66          // adjust double list size (Mantis #50643)
67          initBeanList(rulePreconditionUI.getUsedRuleQVDoubleList(), null, new ArrayList<>(), 100);
68          rulePreconditionUI.getUsedRuleQVDoubleList().getHandler().addAdditionalControls();
69  
70          rulePreconditionUI.getUsedRuleQVList().setCellRenderer(newListCellRender(QualitativeValueDTO.class));
71  
72          initListeners();
73  
74          registerValidators(getValidator());
75          listenValidatorValid(getValidator(), getModel());
76      }
77  
78      private void initTable() {
79  
80          TableColumnExt nameCol = addColumn(RulePreconditionTableModel.NAME);
81          nameCol.setSortable(true);
82  
83          RulePreconditionTableModel tableModel = new RulePreconditionTableModel(getTable().getColumnModel());
84          getTable().setModel(tableModel);
85  
86          initTable(getTable(), true);
87  
88          getTable().setSortOrder(RulePreconditionTableModel.NAME, SortOrder.ASCENDING);
89          getTable().setHorizontalScrollEnabled(false);
90          getTable().setEditable(false);
91      }
92  
93      private void initListeners() {
94  
95          getModel().addPropertyChangeListener(evt -> {
96  
97              switch (evt.getPropertyName()) {
98  
99                  case RulePreconditionUIModel.PROPERTY_BASE_PMFM:
100                     initBasePmfm();
101                     break;
102 
103                 case RulePreconditionUIModel.PROPERTY_USED_PMFM:
104                     initUsedPmfm();
105                     break;
106 
107                 case RulePreconditionUIModel.PROPERTY_SINGLE_ROW_SELECTED:
108                     updateLists();
109                     break;
110             }
111         });
112     }
113 
114     private void initBasePmfm() {
115         PmfmDTO basePmfm = getModel().getBasePmfm();
116         if (basePmfm == null) {
117             LOG.error("base PMFM should be set");
118             return;
119         }
120         ((TitledBorder) getUI().getBaseRulePanel().getBorder()).setTitle(decorate(basePmfm, DecoratorService.NAME));
121         getUI().getBaseRulePanel().setToolTipText(decorate(basePmfm));
122 
123         // load real qualitative values
124         getModel().setBeans(getContext().getReferentialService().getUniquePmfmFromPmfm(basePmfm).getQualitativeValues());
125 
126         // select first line
127         if (getModel().getRowCount() > 0)
128             SwingUtilities.invokeLater(() -> selectCell(0, null));
129     }
130 
131     private void initUsedPmfm() {
132         PmfmDTO usedPmfm = getModel().getUsedPmfm();
133         if (usedPmfm == null) {
134             LOG.error("used PMFM should be set");
135             return;
136         }
137         ((TitledBorder) getUI().getUsedRulePanel().getBorder()).setTitle(decorate(usedPmfm, DecoratorService.NAME));
138         getUI().getUsedRulePanel().setToolTipText(decorate(usedPmfm));
139 
140         // load real qualitative values
141         getUI().getUsedRuleQVDoubleList().getHandler().setUniverse(
142                 getContext().getReferentialService().getUniquePmfmFromPmfm(usedPmfm).getQualitativeValues()
143         );
144     }
145 
146     private void updateLists() {
147 
148         if (getModel().getSingleSelectedRow() != null) {
149             getModel().setAdjusting(true);
150             Collection<QualitativeValueDTO> qualitativeValues = getModel().getQvMap().get(getModel().getSingleSelectedRow().toBean());
151             getUI().getUsedRuleQVDoubleList().getHandler().setSelected(
152                     new ArrayList<>(qualitativeValues)
153             );
154             getUI().getUsedRuleQVList().setListData(qualitativeValues.toArray(new QualitativeValueDTO[0]));
155             getModel().setAdjusting(false);
156         }
157     }
158 
159     @Override
160     public SwingValidator<RulePreconditionUIModel> getValidator() {
161         return getUI().getValidator();
162     }
163 
164     public void setEnabled(boolean enabled) {
165         if (enabled)
166             getUI().getSwitchPanelLayout().setSelected(DOUBLE_LIST);
167         else
168             getUI().getSwitchPanelLayout().setSelected(LIST);
169 
170         getUI().getValidButton().setEnabled(enabled);
171     }
172 
173     public void valid() {
174         if (getModel().isValid()) {
175             stopListenValidatorValid(getValidator());
176             closeDialog();
177         }
178     }
179 
180     @Override
181     public void cancel() {
182         getModel().setModify(false);
183 //        getModel().setValid(false);
184         stopListenValidatorValid(getValidator());
185         closeDialog();
186     }
187 
188     @Override
189     public AbstractTableModel<RulePreconditionRowModel> getTableModel() {
190         return (RulePreconditionTableModel) getTable().getModel();
191     }
192 
193     @Override
194     public SwingTable getTable() {
195         return getUI().getBaseRuleQVTable();
196     }
197 }