View Javadoc
1   package fr.ifremer.tutti.ui.swing.util.caracteristics;
2   
3   /*
4    * #%L
5    * Tutti :: UI
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2012 - 2017 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU General Public License as
13   * published by the Free Software Foundation, either version 3 of the
14   * License, or (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 General Public
22   * License along with this program.  If not, see
23   * <http://www.gnu.org/licenses/gpl-3.0.html>.
24   * #L%
25   */
26  
27  import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
28  import fr.ifremer.tutti.ui.swing.util.TuttiUI;
29  import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
30  import java.awt.Color;
31  import java.awt.Container;
32  import java.awt.GridBagConstraints;
33  import java.awt.GridLayout;
34  import java.awt.Insets;
35  import java.awt.event.KeyEvent;
36  import java.awt.event.KeyListener;
37  import java.awt.event.MouseEvent;
38  import java.awt.event.MouseListener;
39  import java.util.ArrayList;
40  import java.util.HashMap;
41  import java.util.List;
42  import java.util.Map;
43  import java.util.TreeMap;
44  import javax.swing.JButton;
45  import javax.swing.JMenuItem;
46  import javax.swing.JPanel;
47  import javax.swing.JPopupMenu;
48  import javax.swing.JScrollPane;
49  import javax.swing.ListSelectionModel;
50  import jaxx.runtime.JAXXBinding;
51  import jaxx.runtime.JAXXContext;
52  import jaxx.runtime.JAXXObject;
53  import jaxx.runtime.JAXXObjectDescriptor;
54  import jaxx.runtime.JAXXUtil;
55  import jaxx.runtime.SwingUtil;
56  import jaxx.runtime.binding.DefaultJAXXBinding;
57  import jaxx.runtime.context.DefaultJAXXContext;
58  import jaxx.runtime.swing.Table;
59  import jaxx.runtime.swing.editor.bean.BeanFilterableComboBox;
60  import org.apache.commons.logging.Log;
61  import org.apache.commons.logging.LogFactory;
62  import org.jdesktop.swingx.JXTable;
63  import static org.nuiton.i18n.I18n.t;
64  
65  public class CaracteristicMapEditorUI extends Table implements TuttiUI<CaracteristicMapEditorUIModel, CaracteristicMapEditorUIHandler>, JAXXObject {
66  
67      /*-----------------------------------------------------------------------*/
68      /*------------------ Constants for all public bindings ------------------*/
69      /*-----------------------------------------------------------------------*/
70  
71      public static final String BINDING_ADD_ROW_ENABLED = "addRow.enabled";
72      public static final String BINDING_NEW_ROW_KEY_ENABLED = "newRowKey.enabled";
73      public static final String BINDING_REMOVE_CARACTERISTIC_MENU_ENABLED = "removeCaracteristicMenu.enabled";
74  
75      /*-----------------------------------------------------------------------*/
76      /*------------------------- Other static fields -------------------------*/
77      /*-----------------------------------------------------------------------*/
78  
79      private static final String $jaxxObjectDescriptor = "H4sIAAAAAAAAALVXTW8bRRieOLHz3UCjJC0pUhJClR7YFKSiolDa2I2pEycpcapGWCgd707sScc7y+xsspEVxE/gJ5Qr4oLEjRPiwJkDF8RfQBUHroh3Zp1db72u80UOq2TeeZ/383l28/1fKO0KNLuPfd8Qni1pnRiryzs7m5V9YsqHxDUFdSQXKPjpSaFUGQ1b4bkr0TvlonJfbLov5njd4TaxW7yXimjIlUeMuDVCpERvxz1M110sheYl3/HECWqYVBLqi79fpr6xvv42hZDvQHbDUMpMN6+okr4iSlFLoqsQ6QAvMmxXIQ1B7SrkO6rOcgy77gauky/RV6i/iDIOFgAm0dzpS9YY2t93JOqf38YVRm5LlN8TBt0TpE6EIT0pqeFRwz2E6IYnKTNMLLApiaCupKZr5Fr/XMfOikUhypOC42jwjETpOrcIk2jtcoDXFVqEPiRV3o+540EVk6o5fhN0VR+uE9uLbk9BeH5A4thwQ6KJmKs6K0hSV25jofegTQ63+OEaOZLoTmyegRvRKRoVgm0jC488ZRBE5QeDqPAs9xXQYIiXwZYFeBKNx4JnoTncjl8dnV8tmYIz9hjbakpTMY/IFPeaNhObqEcNVi6qxj5w5rnkTgDlG6s72qoApkOcgflVBc4g8NV4i9WpjinRcEXnrY9OHEdMbJuERRW9pR6z0fRcfEDarQJNx9oLRDQiIkZM6SmjtPDgWKJr5XbuboEpYO21V1irALX138nx33/688f8CVXHIPZE4tUWpQEKOYI7REiqQo8FPFVLvAg9XiqjQZcwkCktQzcSEis1zZAcxHtTuQcceITdGkCk+//4+ZfJZ7/1olQeDTGOrTxW9wvQ55qALnBm+c79BzqjkcMBeL6hcoMVBdvhFnGVmvVJ4REfqr+RUH2YQmXw13/GSz88OOlAD2R0veP1qAvpz1GG2ozaRMtVU4kS5WnYcYln8UhxkjQIKf4ms6bJX0M/P0gq+8ouUOkpodWafGJTqH2qoVXHqBIZHS/cOvY9hfGhrlP9dhc5DgQeZbhC2FMqa+pet2iZmoaUKHXndgfANjJ0gksBu5rLBKoyESwOsWIKBfJMbNUQeClMNmZDFTKou1J35FFiXa1y5XTpYC8wEcJRbhdMbkvUC91sDfpuI4oJHS01k1QKuXBrZvbejO0xdgxt3HVp3WFkWWNJ9EXjbJof5PCK9geataylMgA2TLU3iTU3JbVbwX2guUGrAS6LzedVwT0bKs00mqVE5jwX5MQ82shxBhKfLS7n1uDWgMuFDNQ0vYcZ0A6Nho7qTaV6V4QySq2HzCgVNj4truyWVoorue3C5kZiLa9T724FKu2l79+112144dlqhT4L+q/eUQXbogfU8jDbrLhEHGCVWC5pFEbC+9Koh5ixpRmpYGnW3oPyiCRKfYgPFHl0WWGBU5Jztk2dbQ1cvLR6JHVal/1mUzqou9V+eSW4BYxr3/Znl7ftQeTTLHynL5qzL8jDczU0eMF32olMYA63YekCMYBiuzX49INMG3MXyVWBzB2/uk/3LwKpV+h/VL+cDtN1GWKfW2ffgOy5WqA+4TrNv08Zw+l/dG78aPbZc85eZ5k8+XvnB0yce/ny5l6CIF2n3vIR3W3m8PEyoP492T5yoKdXPrawxDMVClXb1U/asHvUc/IUmBmGj7gnlf1FMsrcKVD6qBn8G9ABY7wrhjr+7jUI1y+McPPCCAuA8B/G6Abj3xAAAA==";
80      private static final Log log = LogFactory.getLog(CaracteristicMapEditorUI.class);
81      private static final long serialVersionUID = 1L;
82  
83      /*-----------------------------------------------------------------------*/
84      /*--------------------------- Internal states ---------------------------*/
85      /*-----------------------------------------------------------------------*/
86  
87      protected List<Object> $activeBindings = new ArrayList<Object>();
88      protected Map<String, Object> $bindingSources = new HashMap<String, Object>();
89      protected final Map<String, JAXXBinding> $bindings = new TreeMap<String, JAXXBinding>();
90      protected Map<String, Object> $objectMap = new HashMap<String, Object>();
91      protected Map<?, ?> $previousValues = new HashMap<Object, Object>();
92      private boolean allComponentsCreated;
93      protected final JAXXContext delegateContext = new DefaultJAXXContext();
94  
95      /*-----------------------------------------------------------------------*/
96      /*------------------------ Protected components  ------------------------*/
97      /*-----------------------------------------------------------------------*/
98  
99      protected JButton addRow;
100     protected JButton cancelButton;
101     protected JXTable caracteristicMapEditorTable;
102     protected final CaracteristicMapEditorUIHandler handler = createHandler();
103     protected CaracteristicMapEditorUIModel model;
104     protected BeanFilterableComboBox<Caracteristic> newRowKey;
105     protected JMenuItem removeCaracteristicMenu;
106     protected JButton saveButton;
107     protected JPopupMenu tablePopup;
108 
109     /*-----------------------------------------------------------------------*/
110     /*------------------------- Private components  -------------------------*/
111     /*-----------------------------------------------------------------------*/
112 
113     private JPanel $JPanel0;
114     private JScrollPane $JScrollPane0;
115     private CaracteristicMapEditorUI $Table0 = this;
116 
117     /*-----------------------------------------------------------------------*/
118     /*---------------------------- Constructors  ----------------------------*/
119     /*-----------------------------------------------------------------------*/
120 
121     public CaracteristicMapEditorUI(TuttiUI parentUI) {
122         TuttiUIUtil.setParentUI(this, parentUI);
123             $initialize();
124     }
125 
126     public CaracteristicMapEditorUI() {
127         $initialize();
128     }
129 
130     public CaracteristicMapEditorUI(JAXXContext parentContext) {
131         JAXXUtil.initContext(this, parentContext);
132         $initialize();
133     }
134 
135     /*-----------------------------------------------------------------------*/
136     /*--------------------------- Statics methods ---------------------------*/
137     /*-----------------------------------------------------------------------*/
138 
139     public static JAXXObjectDescriptor $getJAXXObjectDescriptor() {
140         return JAXXUtil.decodeCompressedJAXXObjectDescriptor($jaxxObjectDescriptor);
141     }
142 
143     /*-----------------------------------------------------------------------*/
144     /*---------------------- JAXXObject implementation ----------------------*/
145     /*-----------------------------------------------------------------------*/
146 
147     @Override
148     public void applyDataBinding(String $binding) {
149         if (allComponentsCreated && $bindings.containsKey($binding)) {
150             getDataBinding($binding).applyDataBinding();
151         }
152         processDataBinding($binding);
153     }
154 
155     @Override
156     public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
157         super.firePropertyChange(propertyName, oldValue, newValue);
158     }
159 
160     @Override
161     public Map<String, Object> get$objectMap() {
162         return $objectMap;
163     }
164 
165     @Override
166     public JAXXBinding getDataBinding(String bindingId) {
167         return $bindings.get(bindingId);
168     }
169 
170     @Override
171     public JAXXBinding[] getDataBindings() {
172         return $bindings.values().toArray(new JAXXBinding[$bindings.size()]);
173     }
174 
175     @Override
176     public Object getObjectById(String id) {
177         return $objectMap.get(id);
178     }
179 
180     @Override
181     public void processDataBinding(String $binding, boolean $force) {
182         if (!$force && $activeBindings.contains($binding)) { 
183             return;
184         }
185         $activeBindings.add($binding);
186         try {
187             if (allComponentsCreated && $bindings.containsKey($binding)) {
188                 getDataBinding($binding).processDataBinding();
189             }
190         } finally {
191             $activeBindings.remove($binding);
192         }
193     }
194 
195     @Override
196     public void processDataBinding(String $binding) {
197         processDataBinding($binding, false);
198     }
199 
200     @Override
201     public void registerDataBinding(JAXXBinding binding) {
202         $bindings.put(binding.getId(), binding);
203     }
204 
205     @Override
206     public void removeDataBinding(String $binding) {
207         if (allComponentsCreated && $bindings.containsKey($binding)) {
208             getDataBinding($binding).removeDataBinding();
209         }
210     }
211 
212     /*-----------------------------------------------------------------------*/
213     /*--------------------- JAXXContext implementation  ---------------------*/
214     /*-----------------------------------------------------------------------*/
215 
216     @Override
217     public <T> T getContextValue(Class<T> clazz) {
218         return delegateContext.getContextValue(clazz, null);
219     }
220 
221     @Override
222     public <T> T getContextValue(Class<T> clazz, String name) {
223         return delegateContext.getContextValue(clazz, name);
224     }
225 
226     @Override
227     public JAXXContext getDelegateContext() {
228         return delegateContext;
229     }
230 
231     @Override
232     public <O extends Container> O getParentContainer(Class<O> clazz) {
233         return SwingUtil.getParentContainer(this, clazz);
234     }
235 
236     @Override
237     public <O extends Container> O getParentContainer(Object source, Class<O> clazz) {
238         return SwingUtil.getParentContainer(source, clazz);
239     }
240 
241     @Override
242     public <T> void removeContextValue(Class<T> clazz) {
243         delegateContext.removeContextValue(clazz, null);
244     }
245 
246     @Override
247     public <T> void removeContextValue(Class<T> clazz, String name) {
248         delegateContext.removeContextValue(clazz, name);
249     }
250 
251     @Override
252     public <T> void setContextValue(T o) {
253         delegateContext.setContextValue(o, null);
254     }
255 
256     @Override
257     public <T> void setContextValue(T o, String name) {
258         delegateContext.setContextValue(o, name);
259     }
260 
261     /*-----------------------------------------------------------------------*/
262     /*---------------------------- Event methods ----------------------------*/
263     /*-----------------------------------------------------------------------*/
264 
265     public void doKeyPressed__on__caracteristicMapEditorTable(KeyEvent event) {
266         if (log.isDebugEnabled()) {
267             log.debug(event);
268         }
269         handler.openRowMenu(event, tablePopup);
270     }
271 
272     public void doMouseClicked__on__caracteristicMapEditorTable(MouseEvent event) {
273         if (log.isDebugEnabled()) {
274             log.debug(event);
275         }
276         handler.autoSelectRowInTable(event, tablePopup);
277     }
278 
279     /*-----------------------------------------------------------------------*/
280     /*----------------------- Public acessor methods  -----------------------*/
281     /*-----------------------------------------------------------------------*/
282 
283     public JButton getAddRow() {
284         return addRow;
285     }
286 
287     public JButton getCancelButton() {
288         return cancelButton;
289     }
290 
291     public JXTable getCaracteristicMapEditorTable() {
292         return caracteristicMapEditorTable;
293     }
294 
295     public CaracteristicMapEditorUIHandler getHandler() {
296         return handler;
297     }
298 
299     public CaracteristicMapEditorUIModel getModel() {
300         return model;
301     }
302 
303     public BeanFilterableComboBox<Caracteristic> getNewRowKey() {
304         return newRowKey;
305     }
306 
307     public JMenuItem getRemoveCaracteristicMenu() {
308         return removeCaracteristicMenu;
309     }
310 
311     public JButton getSaveButton() {
312         return saveButton;
313     }
314 
315     public JPopupMenu getTablePopup() {
316         return tablePopup;
317     }
318 
319     /*-----------------------------------------------------------------------*/
320     /*--------------------- Protected acessors methods  ---------------------*/
321     /*-----------------------------------------------------------------------*/
322 
323     protected JPanel get$JPanel0() {
324         return $JPanel0;
325     }
326 
327     protected JScrollPane get$JScrollPane0() {
328         return $JScrollPane0;
329     }
330 
331     /*-----------------------------------------------------------------------*/
332     /*--------------------- Components creation methods ---------------------*/
333     /*-----------------------------------------------------------------------*/
334 
335     protected void addChildrenToTablePopup() {
336         if (!allComponentsCreated) {
337             return;
338         }
339         tablePopup.add(removeCaracteristicMenu);
340     }
341 
342     protected void createAddRow() {
343         $objectMap.put("addRow", addRow = new JButton());
344         
345         addRow.setName("addRow");
346         addRow.putClientProperty("simpleAction", fr.ifremer.tutti.ui.swing.util.caracteristics.actions.CaracteristicEditorAddRowAction.class);
347     }
348 
349     protected void createCancelButton() {
350         $objectMap.put("cancelButton", cancelButton = new JButton());
351         
352         cancelButton.setName("cancelButton");
353         cancelButton.setText(t("tutti.editIndividualObservationCaracteristics.action.cancel"));
354         cancelButton.setToolTipText(t("tutti.editIndividualObservationCaracteristics.action.cancel.tip"));
355         cancelButton.putClientProperty("help", "tutti.editIndividualObservationCaracteristics.action.cancel.help");
356         cancelButton.putClientProperty("simpleAction", fr.ifremer.tutti.ui.swing.util.caracteristics.actions.CaracteristicEditorCancelAction.class);
357     }
358 
359     protected void createCaracteristicMapEditorTable() {
360         $objectMap.put("caracteristicMapEditorTable", caracteristicMapEditorTable = new JXTable());
361         
362         caracteristicMapEditorTable.setName("caracteristicMapEditorTable");
363         caracteristicMapEditorTable.setSortable(false);
364         caracteristicMapEditorTable.addKeyListener(JAXXUtil.getEventListener(KeyListener.class, "keyPressed", this, "doKeyPressed__on__caracteristicMapEditorTable"));
365         caracteristicMapEditorTable.addMouseListener(JAXXUtil.getEventListener(MouseListener.class, "mouseClicked", this, "doMouseClicked__on__caracteristicMapEditorTable"));
366     }
367 
368     protected CaracteristicMapEditorUIHandler createHandler() {
369         return new CaracteristicMapEditorUIHandler();
370     }
371 
372     protected void createModel() {
373         $objectMap.put("model", model = getContextValue(CaracteristicMapEditorUIModel.class));
374     }
375 
376     protected void createNewRowKey() {
377         $objectMap.put("newRowKey", newRowKey = new BeanFilterableComboBox<Caracteristic>(this));
378         
379         newRowKey.setName("newRowKey");
380         newRowKey.setProperty("selectedCaracteristic");
381         newRowKey.setShowReset(true);
382     }
383 
384     protected void createRemoveCaracteristicMenu() {
385         $objectMap.put("removeCaracteristicMenu", removeCaracteristicMenu = new JMenuItem());
386         
387         removeCaracteristicMenu.setName("removeCaracteristicMenu");
388         removeCaracteristicMenu.setText(t("tutti.editIndividualObservationCaracteristics.action.removeCaracteristic"));
389         removeCaracteristicMenu.setToolTipText(t("tutti.editIndividualObservationCaracteristics.action.removeCaracteristic.tip"));
390         removeCaracteristicMenu.putClientProperty("simpleAction", fr.ifremer.tutti.ui.swing.util.caracteristics.actions.CaracteristicEditorRemoveRowAction.class);
391     }
392 
393     protected void createSaveButton() {
394         $objectMap.put("saveButton", saveButton = new JButton());
395         
396         saveButton.setName("saveButton");
397         saveButton.setText(t("tutti.editIndividualObservationCaracteristics.action.save"));
398         saveButton.setToolTipText(t("tutti.editIndividualObservationCaracteristics.action.save.tip"));
399         saveButton.putClientProperty("help", "tutti.editIndividualObservationCaracteristics.action.save.help");
400         saveButton.putClientProperty("simpleAction", fr.ifremer.tutti.ui.swing.util.caracteristics.actions.CaracteristicEditorSaveAction.class);
401     }
402 
403     protected void createTablePopup() {
404         $objectMap.put("tablePopup", tablePopup = new JPopupMenu());
405         
406         tablePopup.setName("tablePopup");
407     }
408 
409     /*-----------------------------------------------------------------------*/
410     /*------------------------ Internal jaxx methods ------------------------*/
411     /*-----------------------------------------------------------------------*/
412 
413     private void $completeSetup() {
414         allComponentsCreated = true;
415         if (log.isDebugEnabled()) {
416             log.debug(this);
417         }
418         // inline complete setup of $Table0
419         add(newRowKey, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, 10, 1, new Insets(3, 3, 3, 3), 0, 0));
420         add(addRow, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, 10, 1, new Insets(3, 3, 3, 3), 0, 0));
421         add($JScrollPane0, new GridBagConstraints(0, 1, 2, 1, 0.0, 1.0, 10, 1, new Insets(3, 3, 3, 3), 0, 0));
422         add($JPanel0, new GridBagConstraints(0, 2, 2, 1, 0.0, 0.0, 10, 1, new Insets(3, 3, 3, 3), 0, 0));
423         addChildrenToTablePopup();
424         // inline complete setup of $JScrollPane0
425         $JScrollPane0.getViewport().add(caracteristicMapEditorTable);
426         // inline complete setup of $JPanel0
427         $JPanel0.add(cancelButton);
428         $JPanel0.add(saveButton);
429         
430         // apply 3 data bindings
431         JAXXUtil.applyDataBinding(this, $bindings.keySet());
432         
433         // apply 12 property setters
434         newRowKey.setBeanType(Caracteristic.class);
435         removeCaracteristicMenu.setMnemonic(SwingUtil.getFirstCharAt(t("tutti.editIndividualObservationCaracteristics.action.removeCaracteristic.mnemonic"),'Z'));
436         removeCaracteristicMenu.setIcon(SwingUtil.createActionIcon("batch-delete"));
437         addRow.setIcon(SwingUtil.createActionIcon("add"));
438         caracteristicMapEditorTable.setSelectionBackground(null);
439         caracteristicMapEditorTable.setSelectionForeground(Color.BLACK);
440         caracteristicMapEditorTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
441         cancelButton.setMnemonic(SwingUtil.getFirstCharAt(t("tutti.editIndividualObservationCaracteristics.action.cancel.mnemonic"),'Z'));
442         cancelButton.setIcon(SwingUtil.createActionIcon("cancel"));
443         saveButton.setMnemonic(SwingUtil.getFirstCharAt(t("tutti.editIndividualObservationCaracteristics.action.save.mnemonic"),'Z'));
444         saveButton.setIcon(SwingUtil.createActionIcon("save"));
445     }
446 
447     private void $initialize() {
448         if (allComponentsCreated) {
449             return;
450         }
451         if (log.isDebugEnabled()) {
452             log.debug(this);
453         }
454         handler.beforeInit(this);
455         $objectMap.put("$Table0", $Table0);
456         createModel();
457         createTablePopup();
458         createRemoveCaracteristicMenu();
459         createNewRowKey();
460         createAddRow();
461         // inline creation of $JScrollPane0
462         $objectMap.put("$JScrollPane0", $JScrollPane0 = new JScrollPane());
463         
464         $JScrollPane0.setName("$JScrollPane0");
465         createCaracteristicMapEditorTable();
466         // inline creation of $JPanel0
467         $objectMap.put("$JPanel0", $JPanel0 = new JPanel());
468         
469         $JPanel0.setName("$JPanel0");
470         $JPanel0.setLayout(new GridLayout(1, 0));
471         SwingUtil.setComponentHeight($JPanel0,50);
472         createCancelButton();
473         createSaveButton();
474         // inline creation of $Table0
475         setName("$Table0");
476         
477         // registers 3 data bindings
478         $registerDefaultBindings();
479         $completeSetup();
480         handler.afterInit(this);
481     }
482 
483     private void $registerDefaultBindings() {
484         // register 3 data bindings
485         registerDataBinding(new DefaultJAXXBinding(this, BINDING_REMOVE_CARACTERISTIC_MENU_ENABLED, true) {
486         
487             @Override
488             public void applyDataBinding() {
489                 if (model != null) {
490                     model.addPropertyChangeListener("removeCaracteristicEnabled", this);
491                 }
492             }
493         
494             @Override
495             public void processDataBinding() {
496                 if (model != null) {
497                     removeCaracteristicMenu.setEnabled(model.isRemoveCaracteristicEnabled());
498                 }
499             }
500         
501             @Override
502             public void removeDataBinding() {
503                 if (model != null) {
504                     model.removePropertyChangeListener("removeCaracteristicEnabled", this);
505                 }
506             }
507         });
508         registerDataBinding(new DefaultJAXXBinding(this, BINDING_NEW_ROW_KEY_ENABLED, true) {
509         
510             @Override
511             public void applyDataBinding() {
512                 if (newRowKey != null) {
513                     newRowKey.addPropertyChangeListener("empty", this);
514                 }
515             }
516         
517             @Override
518             public void processDataBinding() {
519                 if (newRowKey != null) {
520                     newRowKey.setEnabled(!newRowKey.isEmpty());
521                 }
522             }
523         
524             @Override
525             public void removeDataBinding() {
526                 if (newRowKey != null) {
527                     newRowKey.removePropertyChangeListener("empty", this);
528                 }
529             }
530         });
531         registerDataBinding(new DefaultJAXXBinding(this, BINDING_ADD_ROW_ENABLED, true) {
532         
533             @Override
534             public void applyDataBinding() {
535                 if (newRowKey != null) {
536                     newRowKey.addPropertyChangeListener("selectedItem", this);
537                 }
538             }
539         
540             @Override
541             public void processDataBinding() {
542                 if (newRowKey != null) {
543                     addRow.setEnabled(newRowKey.getSelectedItem() != null);
544                 }
545             }
546         
547             @Override
548             public void removeDataBinding() {
549                 if (newRowKey != null) {
550                     newRowKey.removePropertyChangeListener("selectedItem", this);
551                 }
552             }
553         });
554     }
555 
556 }