View Javadoc
1   package fr.ifremer.reefdb.ui.swing.content.manage.rule.department;
2   
3   /*-
4    * #%L
5    * Reef DB :: UI
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2014 - 2022 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  
27  import fr.ifremer.quadrige3.ui.swing.ApplicationUI;
28  import fr.ifremer.quadrige3.ui.swing.ApplicationUIUtil;
29  import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
30  import fr.ifremer.reefdb.ui.swing.ReefDbHelpBroker;
31  import fr.ifremer.reefdb.ui.swing.ReefDbUIContext;
32  import fr.ifremer.reefdb.ui.swing.util.ReefDbUI;
33  import java.awt.BorderLayout;
34  import java.awt.Component;
35  import java.awt.Container;
36  import java.awt.FlowLayout;
37  import java.awt.LayoutManager;
38  import java.awt.event.ActionEvent;
39  import java.awt.event.ActionListener;
40  import java.util.ArrayList;
41  import java.util.HashMap;
42  import java.util.List;
43  import java.util.Map;
44  import java.util.TreeMap;
45  import javax.swing.BorderFactory;
46  import javax.swing.Box;
47  import javax.swing.BoxLayout;
48  import javax.swing.JButton;
49  import javax.swing.JPanel;
50  import javax.swing.JScrollPane;
51  import jaxx.runtime.JAXXBinding;
52  import jaxx.runtime.JAXXContext;
53  import jaxx.runtime.JAXXObject;
54  import jaxx.runtime.JAXXObjectDescriptor;
55  import jaxx.runtime.JAXXUtil;
56  import jaxx.runtime.SwingUtil;
57  import jaxx.runtime.binding.DefaultJAXXBinding;
58  import jaxx.runtime.context.DefaultJAXXContext;
59  import jaxx.runtime.swing.help.JAXXHelpUI;
60  import org.apache.commons.logging.Log;
61  import org.apache.commons.logging.LogFactory;
62  import static org.nuiton.i18n.I18n.t;
63  
64  public class ControlDepartmentTableUI extends JPanel implements JAXXHelpUI<ReefDbHelpBroker>, ReefDbUI<ControlDepartmentTableUIModel, ControlDepartmentTableUIHandler>, JAXXObject {
65  
66      /*-----------------------------------------------------------------------*/
67      /*------------------ Constants for all public bindings ------------------*/
68      /*-----------------------------------------------------------------------*/
69  
70      public static final String BINDING_ADD_DEPARTMENT_BUTTON_ENABLED = "addDepartmentButton.enabled";
71      public static final String BINDING_REMOVE_DEPARTMENT_BUTTON_ENABLED = "removeDepartmentButton.enabled";
72  
73      /*-----------------------------------------------------------------------*/
74      /*------------------------- Other static fields -------------------------*/
75      /*-----------------------------------------------------------------------*/
76  
77      private static final String $jaxxObjectDescriptor = "H4sIAAAAAAAAAK1Uz28bRRR+dmOncfjRNhBSmpYkhZKo0piqxyAoaRo1wYXKTkWED3TsmThTdne2s+Nko6iIP4E/Ae5ckLhxQhw4c+CC+BcQ4sAV8d6svRsn69ioWPJqPe993/ve83zv2z+gFBlYfMLjmJluYJUv2dYHOzsft57Itl2XUduo0GoDyadQhGITpkV6Hlm43qwRvNqDV+9qP9SBDI6hV2tQieyhJ6M9Ka2Fq4OIdhRVG2l4NQ67ps+aispj/fqvP4tfiS+/KQLEIaqbwlYWRqGyTiZqUFTCwiWstM+rHg86KMOooIN6X6Szux6Poo+4L5/CFzBZg3LIDZJZWBq/Zcfh8HFoYa6tA2u0ty6RyvoI2eYtTz7atFDfNUztGulLw4yUu6LFuopFB6iHEQpzmc8D3pHYnieZSCmwzXzSMHSVyxZKvhbSs/DJ/1/kATFnlcotoz+XxsLNM0rV8fd66z7i1lx2Br86bEAPeUANvEb/S9yj2Wq0MdWjEMGnUpbZfBYL7Jiop10ujOrI25kuS1msQe8OQHSXUtbzb245Fe/gnRmQ4U4HFfRzb9Hv1+kxl8ZmuBCZsrWutagWZgYok1MCXMm6Qt16X56EUvSNXqaBKwMGQGuxzFrZ3S80oUR/MPp3rnnajXUMJT6cO+FDInTRf2Znfv3h9+83+uarYO1Xc1OP7Q40RWh0iNdDUemXE+d1rfKqD3i42kQLSw8Xj1ss8znCGr0wisN6FwnOCM7u82gPKUqTv/340+zjX85BcQMqnuZig1P+JkzZPYNT0J6Iw/fvOEUvHJzH5wX8FuneaiPo3t47WnNvCfCQtY3kVm4r60mRRJbt8lLvRp80iaW0pZWVZ9jcZ/vcU4IjSY236O5ePxoJfBbjzOdzZp423pr6+e+Zxnd3+nMv4BwuD03PZl/6FMoq8FQg3drrbbTcNTcdRrIrdLa58nYZnLHMwp6f33bPm6fGPWGhgtNVOtgkCjiHhrB4KmPcrRd7E2pr39cBc6Fpq7W3rcJtl3FtyAwxFeeIW3ZSBiQEgW8ducXHOtI+dLvbbavlFaaie0I5uy/T0EnnLTdNersN+Sb9r32VsZa0Mm3tlcHW+tHB7haHdJdkn2zww3EaXLhxY2ExzUvuhhR1fRAliX5oD4eMYcjOGTWJAjbv8UONyfDSu2gCvtBSgcDV9t6pKgV6VkYy0nGdHo18hsvPzTA/RlcV9HQnoEHsnMF0bSwtj89gWBxDy4RqJ9v/uVSoESr+BYqX+WUkCgAA";
78      private static final Log log = LogFactory.getLog(ControlDepartmentTableUI.class);
79      private static final long serialVersionUID = 1L;
80  
81      /*-----------------------------------------------------------------------*/
82      /*--------------------------- Internal states ---------------------------*/
83      /*-----------------------------------------------------------------------*/
84  
85      protected List<Object> $activeBindings = new ArrayList<Object>();
86      protected Map<String, Object> $bindingSources = new HashMap<String, Object>();
87      protected final Map<String, JAXXBinding> $bindings = new TreeMap<String, JAXXBinding>();
88      protected Map<String, Object> $objectMap = new HashMap<String, Object>();
89      protected Map<?, ?> $previousValues = new HashMap<Object, Object>();
90      private boolean allComponentsCreated;
91      protected final JAXXContext delegateContext = new DefaultJAXXContext();
92  
93      /*-----------------------------------------------------------------------*/
94      /*------------------------ Protected components  ------------------------*/
95      /*-----------------------------------------------------------------------*/
96  
97      protected JButton addDepartmentButton;
98      protected ReefDbHelpBroker broker;
99      protected SwingTable controlDepartmentTable;
100     protected ControlDepartmentTableUI controlDepartmentTableUI = this;
101     protected JScrollPane controlDepartmentTableUIPanel;
102     protected final ControlDepartmentTableUIHandler handler = createHandler();
103     protected ControlDepartmentTableUIModel model;
104     protected JButton removeDepartmentButton;
105 
106     /*-----------------------------------------------------------------------*/
107     /*------------------------- Private components  -------------------------*/
108     /*-----------------------------------------------------------------------*/
109 
110     private JPanel $JPanel0;
111     private JPanel $JPanel1;
112 
113     /*-----------------------------------------------------------------------*/
114     /*---------------------------- Constructors  ----------------------------*/
115     /*-----------------------------------------------------------------------*/
116 
117     public ControlDepartmentTableUI(ApplicationUI parentUI) {
118         ApplicationUIUtil.setParentUI(this, parentUI);
119             $initialize();
120     }
121 
122     public ControlDepartmentTableUI(LayoutManager param0, boolean param1) {
123         super(param0 ,param1);
124         $initialize();
125     }
126 
127     public ControlDepartmentTableUI(JAXXContext parentContext, LayoutManager param1, boolean param2) {
128         super(param1 ,param2);
129         JAXXUtil.initContext(this, parentContext);
130         $initialize();
131     }
132 
133     public ControlDepartmentTableUI(boolean param0) {
134         super(param0);
135         $initialize();
136     }
137 
138     public ControlDepartmentTableUI(JAXXContext parentContext, boolean param1) {
139         super(param1);
140         JAXXUtil.initContext(this, parentContext);
141         $initialize();
142     }
143 
144     public ControlDepartmentTableUI() {
145         $initialize();
146     }
147 
148     public ControlDepartmentTableUI(JAXXContext parentContext) {
149         JAXXUtil.initContext(this, parentContext);
150         $initialize();
151     }
152 
153     public ControlDepartmentTableUI(LayoutManager param0) {
154         super(param0);
155         $initialize();
156     }
157 
158     public ControlDepartmentTableUI(JAXXContext parentContext, LayoutManager param1) {
159         super(param1);
160         JAXXUtil.initContext(this, parentContext);
161         $initialize();
162     }
163 
164     /*-----------------------------------------------------------------------*/
165     /*--------------------------- Statics methods ---------------------------*/
166     /*-----------------------------------------------------------------------*/
167 
168     public static JAXXObjectDescriptor $getJAXXObjectDescriptor() {
169         return JAXXUtil.decodeCompressedJAXXObjectDescriptor($jaxxObjectDescriptor);
170     }
171 
172     /*-----------------------------------------------------------------------*/
173     /*---------------------- JAXXObject implementation ----------------------*/
174     /*-----------------------------------------------------------------------*/
175 
176     @Override
177     public void applyDataBinding(String $binding) {
178         if (allComponentsCreated && $bindings.containsKey($binding)) {
179             getDataBinding($binding).applyDataBinding();
180         }
181         processDataBinding($binding);
182     }
183 
184     @Override
185     public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
186         super.firePropertyChange(propertyName, oldValue, newValue);
187     }
188 
189     @Override
190     public Map<String, Object> get$objectMap() {
191         return $objectMap;
192     }
193 
194     @Override
195     public JAXXBinding getDataBinding(String bindingId) {
196         return $bindings.get(bindingId);
197     }
198 
199     @Override
200     public JAXXBinding[] getDataBindings() {
201         return $bindings.values().toArray(new JAXXBinding[$bindings.size()]);
202     }
203 
204     @Override
205     public Object getObjectById(String id) {
206         return $objectMap.get(id);
207     }
208 
209     @Override
210     public void processDataBinding(String $binding, boolean $force) {
211         if (!$force && $activeBindings.contains($binding)) { 
212             return;
213         }
214         $activeBindings.add($binding);
215         try {
216             if (allComponentsCreated && $bindings.containsKey($binding)) {
217                 getDataBinding($binding).processDataBinding();
218             }
219         } finally {
220             $activeBindings.remove($binding);
221         }
222     }
223 
224     @Override
225     public void processDataBinding(String $binding) {
226         processDataBinding($binding, false);
227     }
228 
229     @Override
230     public void registerDataBinding(JAXXBinding binding) {
231         $bindings.put(binding.getId(), binding);
232     }
233 
234     @Override
235     public void removeDataBinding(String $binding) {
236         if (allComponentsCreated && $bindings.containsKey($binding)) {
237             getDataBinding($binding).removeDataBinding();
238         }
239     }
240 
241     /*-----------------------------------------------------------------------*/
242     /*--------------------- JAXXContext implementation  ---------------------*/
243     /*-----------------------------------------------------------------------*/
244 
245     @Override
246     public <T> T getContextValue(Class<T> clazz) {
247         return delegateContext.getContextValue(clazz, null);
248     }
249 
250     @Override
251     public <T> T getContextValue(Class<T> clazz, String name) {
252         return delegateContext.getContextValue(clazz, name);
253     }
254 
255     @Override
256     public JAXXContext getDelegateContext() {
257         return delegateContext;
258     }
259 
260     @Override
261     public <O extends Container> O getParentContainer(Class<O> clazz) {
262         return SwingUtil.getParentContainer(this, clazz);
263     }
264 
265     @Override
266     public <O extends Container> O getParentContainer(Object source, Class<O> clazz) {
267         return SwingUtil.getParentContainer(source, clazz);
268     }
269 
270     @Override
271     public <T> void removeContextValue(Class<T> clazz) {
272         delegateContext.removeContextValue(clazz, null);
273     }
274 
275     @Override
276     public <T> void removeContextValue(Class<T> clazz, String name) {
277         delegateContext.removeContextValue(clazz, name);
278     }
279 
280     @Override
281     public <T> void setContextValue(T o) {
282         delegateContext.setContextValue(o, null);
283     }
284 
285     @Override
286     public <T> void setContextValue(T o, String name) {
287         delegateContext.setContextValue(o, name);
288     }
289 
290     /*-----------------------------------------------------------------------*/
291     /*---------------------------- Event methods ----------------------------*/
292     /*-----------------------------------------------------------------------*/
293 
294     public void doActionPerformed__on__addDepartmentButton(ActionEvent event) {
295         if (log.isDebugEnabled()) {
296             log.debug(event);
297         }
298         handler.openAddDialog();
299     }
300 
301     public void doActionPerformed__on__removeDepartmentButton(ActionEvent event) {
302         if (log.isDebugEnabled()) {
303             log.debug(event);
304         }
305         handler.removeDepartments();
306     }
307 
308     /*-----------------------------------------------------------------------*/
309     /*----------------------- Public acessor methods  -----------------------*/
310     /*-----------------------------------------------------------------------*/
311 
312     public JButton getAddDepartmentButton() {
313         return addDepartmentButton;
314     }
315 
316     public ReefDbHelpBroker getBroker() {
317         return broker;
318     }
319 
320     public SwingTable getControlDepartmentTable() {
321         return controlDepartmentTable;
322     }
323 
324     public JScrollPane getControlDepartmentTableUIPanel() {
325         return controlDepartmentTableUIPanel;
326     }
327 
328     public ControlDepartmentTableUIHandler getHandler() {
329         return handler;
330     }
331 
332     public ControlDepartmentTableUIModel getModel() {
333         return model;
334     }
335 
336     public JButton getRemoveDepartmentButton() {
337         return removeDepartmentButton;
338     }
339 
340     /*-----------------------------------------------------------------------*/
341     /*---------------------------- Other methods ----------------------------*/
342     /*-----------------------------------------------------------------------*/
343 
344     @Override
345     public void registerHelpId(ReefDbHelpBroker broker, Component component, String helpId) {
346         broker.installUI(component, helpId);
347     }
348 
349     @Override
350     public void showHelp(String helpId) {
351         getBroker().showHelp(this, helpId);
352     }
353 
354     /*-----------------------------------------------------------------------*/
355     /*--------------------- Protected acessors methods  ---------------------*/
356     /*-----------------------------------------------------------------------*/
357 
358     protected JPanel get$JPanel0() {
359         return $JPanel0;
360     }
361 
362     protected JPanel get$JPanel1() {
363         return $JPanel1;
364     }
365 
366     /*-----------------------------------------------------------------------*/
367     /*--------------------- Components creation methods ---------------------*/
368     /*-----------------------------------------------------------------------*/
369 
370     protected void addChildrenToControlDepartmentTableUI() {
371         if (!allComponentsCreated) {
372             return;
373         }
374         add(controlDepartmentTableUIPanel);
375         add($JPanel0, BorderLayout.PAGE_END);
376     }
377 
378     protected void addChildrenToControlDepartmentTableUIPanel() {
379         if (!allComponentsCreated) {
380             return;
381         }
382         controlDepartmentTableUIPanel.getViewport().add(controlDepartmentTable);
383     }
384 
385     protected void createAddDepartmentButton() {
386         $objectMap.put("addDepartmentButton", addDepartmentButton = new JButton());
387         
388         addDepartmentButton.setName("addDepartmentButton");
389         addDepartmentButton.setText(t("reefdb.common.add"));
390         addDepartmentButton.setToolTipText(t("reefdb.rule.department.add.tip"));
391         addDepartmentButton.addActionListener(JAXXUtil.getEventListener(ActionListener.class, "actionPerformed", this, "doActionPerformed__on__addDepartmentButton"));
392     }
393 
394     protected void createBroker() {
395         $objectMap.put("broker", broker = new ReefDbHelpBroker("reefdb.home.help"));
396     }
397 
398     protected void createControlDepartmentTable() {
399         $objectMap.put("controlDepartmentTable", controlDepartmentTable = new SwingTable());
400         
401         controlDepartmentTable.setName("controlDepartmentTable");
402     }
403 
404     protected void createControlDepartmentTableUIPanel() {
405         $objectMap.put("controlDepartmentTableUIPanel", controlDepartmentTableUIPanel = new JScrollPane());
406         
407         controlDepartmentTableUIPanel.setName("controlDepartmentTableUIPanel");
408     }
409 
410     protected ControlDepartmentTableUIHandler createHandler() {
411         return new ControlDepartmentTableUIHandler();
412     }
413 
414     protected void createModel() {
415         $objectMap.put("model", model = getContextValue(ControlDepartmentTableUIModel.class));
416     }
417 
418     protected void createRemoveDepartmentButton() {
419         $objectMap.put("removeDepartmentButton", removeDepartmentButton = new JButton());
420         
421         removeDepartmentButton.setName("removeDepartmentButton");
422         removeDepartmentButton.setText(t("reefdb.common.delete"));
423         removeDepartmentButton.setToolTipText(t("reefdb.rule.department.delete.tip"));
424         removeDepartmentButton.addActionListener(JAXXUtil.getEventListener(ActionListener.class, "actionPerformed", this, "doActionPerformed__on__removeDepartmentButton"));
425     }
426 
427     /*-----------------------------------------------------------------------*/
428     /*------------------------ Internal jaxx methods ------------------------*/
429     /*-----------------------------------------------------------------------*/
430 
431     private void $completeSetup() {
432         allComponentsCreated = true;
433         if (log.isDebugEnabled()) {
434             log.debug(this);
435         }
436         addChildrenToControlDepartmentTableUI();
437         addChildrenToControlDepartmentTableUIPanel();
438         // inline complete setup of $JPanel0
439         $JPanel0.add($JPanel1, BorderLayout.LINE_START);
440         // inline complete setup of $JPanel1
441         $JPanel1.add(addDepartmentButton);
442         $JPanel1.add(removeDepartmentButton);
443         
444         // apply 2 data bindings
445         JAXXUtil.applyDataBinding(this, $bindings.keySet());
446         
447         // apply 8 property setters
448         addDepartmentButton.setAlignmentX(Component.CENTER_ALIGNMENT);
449         removeDepartmentButton.setAlignmentX(Component.CENTER_ALIGNMENT);
450         setBorder(BorderFactory.createTitledBorder(t("reefdb.rule.department.title")));
451         addDepartmentButton.setIcon(SwingUtil.createActionIcon("add"));
452         removeDepartmentButton.setIcon(SwingUtil.createActionIcon("delete"));
453     }
454 
455     private void $initialize() {
456         if (allComponentsCreated) {
457             return;
458         }
459         if (log.isDebugEnabled()) {
460             log.debug(this);
461         }
462         handler.beforeInit(this);
463         $objectMap.put("controlDepartmentTableUI", controlDepartmentTableUI);
464         createModel();
465         createBroker();
466         createControlDepartmentTableUIPanel();
467         createControlDepartmentTable();
468         // inline creation of $JPanel0
469         $objectMap.put("$JPanel0", $JPanel0 = new JPanel());
470         
471         $JPanel0.setName("$JPanel0");
472         $JPanel0.setLayout(new BorderLayout());
473         // inline creation of $JPanel1
474         $objectMap.put("$JPanel1", $JPanel1 = new JPanel());
475         
476         $JPanel1.setName("$JPanel1");
477         $JPanel1.setLayout(new FlowLayout());
478         createAddDepartmentButton();
479         createRemoveDepartmentButton();
480         // inline creation of controlDepartmentTableUI
481         setName("controlDepartmentTableUI");
482         setLayout(new BorderLayout());
483         controlDepartmentTableUI.putClientProperty("validatorLabel", t("reefdb.rule.department.title"));
484         
485         // registers 2 data bindings
486         $registerDefaultBindings();
487         $completeSetup();
488         handler.afterInit(this);
489     }
490 
491     private void $registerDefaultBindings() {
492         // register 2 data bindings
493         registerDataBinding(new DefaultJAXXBinding(this, BINDING_ADD_DEPARTMENT_BUTTON_ENABLED, true) {
494         
495             @Override
496             public void applyDataBinding() {
497                 if (model != null) {
498                     model.addPropertyChangeListener("parentModel", this);
499                 }
500             }
501         
502             @Override
503             public void processDataBinding() {
504                 if (model != null && model.getParentModel() != null) {
505                     addDepartmentButton.setEnabled(model.getParentModel().isEditable());
506                 }
507             }
508         
509             @Override
510             public void removeDataBinding() {
511                 if (model != null) {
512                     model.removePropertyChangeListener("parentModel", this);
513                 }
514             }
515         });
516         registerDataBinding(new DefaultJAXXBinding(this, BINDING_REMOVE_DEPARTMENT_BUTTON_ENABLED, true, true) {
517         
518             @Override
519             public void applyDataBinding() {
520                 if (model != null) {
521                     model.addPropertyChangeListener("parentModel", this);
522                 }
523                 if (model != null) {
524                     model.addPropertyChangeListener("selectedRows", this);
525                 }
526             }
527         
528             @Override
529             public void processDataBinding() {
530                 if (model != null && model.getSelectedRows() != null && model.getParentModel() != null) {
531                     removeDepartmentButton.setEnabled(model.getParentModel().isEditable() && !model.getSelectedRows().isEmpty());
532                 }
533             }
534         
535             @Override
536             public void removeDataBinding() {
537                 if (model != null) {
538                     model.removePropertyChangeListener("parentModel", this);
539                 }
540                 if (model != null) {
541                     model.removePropertyChangeListener("selectedRows", this);
542                 }
543             }
544         });
545     }
546 
547 }