View Javadoc
1   package fr.ifremer.dali.ui.swing.content.manage.program.programs.users;
2   
3   import fr.ifremer.dali.dto.referential.PersonDTO;
4   import fr.ifremer.dali.ui.swing.DaliHelpBroker;
5   import fr.ifremer.dali.ui.swing.DaliUIContext;
6   import fr.ifremer.dali.ui.swing.content.manage.filter.user.element.FilterElementUserUI;
7   import fr.ifremer.dali.ui.swing.util.DaliUI;
8   import fr.ifremer.quadrige3.ui.swing.ApplicationUI;
9   import fr.ifremer.quadrige3.ui.swing.ApplicationUIUtil;
10  import java.awt.BorderLayout;
11  import java.awt.Container;
12  import java.awt.Dialog;
13  import java.awt.Dialog.ModalityType;
14  import java.awt.Frame;
15  import java.awt.GraphicsConfiguration;
16  import java.awt.GridLayout;
17  import java.awt.Window;
18  import java.awt.event.ActionEvent;
19  import java.awt.event.ActionListener;
20  import java.util.ArrayList;
21  import java.util.HashMap;
22  import java.util.List;
23  import java.util.Map;
24  import java.util.TreeMap;
25  import javax.swing.BorderFactory;
26  import javax.swing.JButton;
27  import javax.swing.JDialog;
28  import javax.swing.JList;
29  import javax.swing.JPanel;
30  import javax.swing.SwingConstants;
31  import jaxx.runtime.JAXXBinding;
32  import jaxx.runtime.JAXXContext;
33  import jaxx.runtime.JAXXObject;
34  import jaxx.runtime.JAXXObjectDescriptor;
35  import jaxx.runtime.JAXXUtil;
36  import jaxx.runtime.SwingUtil;
37  import jaxx.runtime.binding.DefaultJAXXBinding;
38  import jaxx.runtime.context.DefaultJAXXContext;
39  import jaxx.runtime.swing.CardLayout2Ext;
40  import org.apache.commons.logging.Log;
41  import org.apache.commons.logging.LogFactory;
42  import static org.nuiton.i18n.I18n.t;
43  
44  public class UsersDialogUI extends JDialog implements DaliUI<UsersDialogUIModel, UsersDialogUIHandler>, JAXXObject {
45  
46      /*-----------------------------------------------------------------------*/
47      /*------------------ Constants for all public bindings ------------------*/
48      /*-----------------------------------------------------------------------*/
49  
50      public static final String BINDING_VALIDATE_BUTTON_ENABLED = "validateButton.enabled";
51  
52      /*-----------------------------------------------------------------------*/
53      /*------------------------- Other static fields -------------------------*/
54      /*-----------------------------------------------------------------------*/
55  
56      private static final String $jaxxObjectDescriptor = "H4sIAAAAAAAAAK1Vz28TRxR+NnESxylpMUS0CSIJrUSENAYk1EqpaNr8UIMcoA2RQn3peHfiDJqd2c7MwkJVxJ/QP6HcuVTqraeqB84ceqn6L1SIA1fEm11nN47XxFKw5LH9fnzv+97Oe372P1SMhvl7NI6JjqTlASM3vt7ZudW+xzy7yoyneWiVhvRVKkO5BTU/sxsLF1pNl97opjdWVBAqyeSB7KUmTBj7UDCzx5i1cK43wzOmsZW5l+Iw0vuoGaki1N9evSz/6j95WgaIQ2RXQylzR2XlSkaaUOa+hVNY6T5tCCo7SENz2UG+HzjbiqDG3KQB+wkew1gTRkOqEczCwvCSE4wkPw4t1CLDtFnlVKiOheauJnxXs4Bp4lPBScSJeYAEiKekRTwSUEk7jIRadTQN9j8NSWDIdg62vRGGSZlRC5VA+UxY+O59wm86zLzGlODG3qaSiSZ9qCLsSe8lSuusUO2n/qtrsc2zxz+9keRexu67Rsfd+NTqgqpZbDWr5Ayn3XEqc9Z3ubBMrwkUKa0jvL1h4dawwtPsRC5hKQZZ70d0xc70kb+S8cl91aRzTWRs4aMeZc7mgj7pw7laoGvSo9Jj4htsLDKGeg9UanWR57OEk/dRp08ty50XuhEaZnoeDY4bycctn4dSCyo6QrOFs63+Cf0eXelsnj00mw4w8b6Zrv/z539/rB8cyDOFoQf2CQ4K3ruQactd6al0GiPLRWOThkstqBp8NF66bGYLiG113UgO6yVdJy6dfEvNHkJUxv796+/pH1+cgPI6TAhF/XXq4jegavc0dkEJPw6/Wk4YTT4Yx/NDfJfxaaKXP6JtgW0asTpi6WxR0f0ZYzNmC5qRMWpXn7+ub/2+vN+QEhL8eGB43pTKDzDKpeCSJTuqu34Kd1ItNCzyVb5mihYP9G6esDuJl5Kz0Sd9BC8gv/KF3JQsUJJ7FmaSMfJUgL9JejdJkHknsJ9cyQ03XTCaul2LWOzGoCdVKINdrFmlxB0e3hkQEUeO2LWkY+7b53BoJI5SUOlTcO5gkf1hGaiBeh4LbabhdFHyYRkDgsaYdDcI/2jmf04WM+kwezvdtBcXCTdrPrcu4uLiL0W6D032UcpLyF50V/LJLzGPzrW59HFxXO9DL7lz4khEZ95xx91ihPqxEaaHUdVW2mf6HSgzx+ZxfIS5IZSMcC/d0AMwFoZiYd6B8BkivAWjdIwa3AkAAA==";
57      private static final Log log = LogFactory.getLog(UsersDialogUI.class);
58      private static final long serialVersionUID = 1L;
59  
60      /*-----------------------------------------------------------------------*/
61      /*--------------------------- Internal states ---------------------------*/
62      /*-----------------------------------------------------------------------*/
63  
64      protected List<Object> $activeBindings = new ArrayList<Object>();
65      protected Map<String, Object> $bindingSources = new HashMap<String, Object>();
66      protected final Map<String, JAXXBinding> $bindings = new TreeMap<String, JAXXBinding>();
67      protected Map<String, Object> $objectMap = new HashMap<String, Object>();
68      protected Map<?, ?> $previousValues = new HashMap<Object, Object>();
69      private boolean allComponentsCreated;
70      protected final JAXXContext delegateContext = new DefaultJAXXContext();
71  
72      /*-----------------------------------------------------------------------*/
73      /*------------------------ Protected components  ------------------------*/
74      /*-----------------------------------------------------------------------*/
75  
76      protected JButton cancelButton;
77      protected FilterElementUserUI filterElementUserUI;
78      protected final UsersDialogUIHandler handler = createHandler();
79      protected JPanel listPanel;
80      protected CardLayout2Ext listPanelLayout;
81      protected UsersDialogUIModel model;
82      protected UsersDialogUI usersDialog = this;
83      protected JList<PersonDTO> usersList;
84      protected JButton validateButton;
85  
86      /*-----------------------------------------------------------------------*/
87      /*------------------------- Private components  -------------------------*/
88      /*-----------------------------------------------------------------------*/
89  
90      private JPanel $JPanel0;
91      private JPanel $JPanel1;
92      private JPanel $JPanel2;
93  
94      /*-----------------------------------------------------------------------*/
95      /*---------------------------- Constructors  ----------------------------*/
96      /*-----------------------------------------------------------------------*/
97  
98      public UsersDialogUI(DaliUIContext context) {
99          super(context.getMainUI());
100         			ApplicationUIUtil.setApplicationContext(this, context);
101             $initialize();
102     }
103 
104     public UsersDialogUI(Window param0) {
105         super(param0);
106         $initialize();
107     }
108 
109     public UsersDialogUI(JAXXContext parentContext, Window param1) {
110         super(param1);
111         JAXXUtil.initContext(this, parentContext);
112         $initialize();
113     }
114 
115     public UsersDialogUI(Dialog param0, String param1, boolean param2, GraphicsConfiguration param3) {
116         super(param0 ,param1 ,param2 ,param3);
117         $initialize();
118     }
119 
120     public UsersDialogUI(JAXXContext parentContext, Dialog param1, String param2, boolean param3, GraphicsConfiguration param4) {
121         super(param1 ,param2 ,param3 ,param4);
122         JAXXUtil.initContext(this, parentContext);
123         $initialize();
124     }
125 
126     public UsersDialogUI(Dialog param0, String param1, boolean param2) {
127         super(param0 ,param1 ,param2);
128         $initialize();
129     }
130 
131     public UsersDialogUI(JAXXContext parentContext, Dialog param1, String param2, boolean param3) {
132         super(param1 ,param2 ,param3);
133         JAXXUtil.initContext(this, parentContext);
134         $initialize();
135     }
136 
137     public UsersDialogUI(Dialog param0, String param1) {
138         super(param0 ,param1);
139         $initialize();
140     }
141 
142     public UsersDialogUI(JAXXContext parentContext, Dialog param1, String param2) {
143         super(param1 ,param2);
144         JAXXUtil.initContext(this, parentContext);
145         $initialize();
146     }
147 
148     public UsersDialogUI(Window param0, String param1, ModalityType param2, GraphicsConfiguration param3) {
149         super(param0 ,param1 ,param2 ,param3);
150         $initialize();
151     }
152 
153     public UsersDialogUI(JAXXContext parentContext, Window param1, String param2, ModalityType param3, GraphicsConfiguration param4) {
154         super(param1 ,param2 ,param3 ,param4);
155         JAXXUtil.initContext(this, parentContext);
156         $initialize();
157     }
158 
159     public UsersDialogUI(Window param0, String param1, ModalityType param2) {
160         super(param0 ,param1 ,param2);
161         $initialize();
162     }
163 
164     public UsersDialogUI(JAXXContext parentContext, Window param1, String param2, ModalityType param3) {
165         super(param1 ,param2 ,param3);
166         JAXXUtil.initContext(this, parentContext);
167         $initialize();
168     }
169 
170     public UsersDialogUI(Window param0, String param1) {
171         super(param0 ,param1);
172         $initialize();
173     }
174 
175     public UsersDialogUI(JAXXContext parentContext, Window param1, String param2) {
176         super(param1 ,param2);
177         JAXXUtil.initContext(this, parentContext);
178         $initialize();
179     }
180 
181     public UsersDialogUI(Window param0, ModalityType param1) {
182         super(param0 ,param1);
183         $initialize();
184     }
185 
186     public UsersDialogUI(JAXXContext parentContext, Window param1, ModalityType param2) {
187         super(param1 ,param2);
188         JAXXUtil.initContext(this, parentContext);
189         $initialize();
190     }
191 
192     public UsersDialogUI(Frame param0, String param1) {
193         super(param0 ,param1);
194         $initialize();
195     }
196 
197     public UsersDialogUI(JAXXContext parentContext, Frame param1, String param2) {
198         super(param1 ,param2);
199         JAXXUtil.initContext(this, parentContext);
200         $initialize();
201     }
202 
203     public UsersDialogUI(Frame param0, boolean param1) {
204         super(param0 ,param1);
205         $initialize();
206     }
207 
208     public UsersDialogUI(JAXXContext parentContext, Frame param1, boolean param2) {
209         super(param1 ,param2);
210         JAXXUtil.initContext(this, parentContext);
211         $initialize();
212     }
213 
214     public UsersDialogUI(Frame param0) {
215         super(param0);
216         $initialize();
217     }
218 
219     public UsersDialogUI(JAXXContext parentContext, Frame param1) {
220         super(param1);
221         JAXXUtil.initContext(this, parentContext);
222         $initialize();
223     }
224 
225     public UsersDialogUI() {
226         $initialize();
227     }
228 
229     public UsersDialogUI(JAXXContext parentContext) {
230         JAXXUtil.initContext(this, parentContext);
231         $initialize();
232     }
233 
234     public UsersDialogUI(Dialog param0, boolean param1) {
235         super(param0 ,param1);
236         $initialize();
237     }
238 
239     public UsersDialogUI(JAXXContext parentContext, Dialog param1, boolean param2) {
240         super(param1 ,param2);
241         JAXXUtil.initContext(this, parentContext);
242         $initialize();
243     }
244 
245     public UsersDialogUI(Dialog param0) {
246         super(param0);
247         $initialize();
248     }
249 
250     public UsersDialogUI(JAXXContext parentContext, Dialog param1) {
251         super(param1);
252         JAXXUtil.initContext(this, parentContext);
253         $initialize();
254     }
255 
256     public UsersDialogUI(Frame param0, String param1, boolean param2, GraphicsConfiguration param3) {
257         super(param0 ,param1 ,param2 ,param3);
258         $initialize();
259     }
260 
261     public UsersDialogUI(JAXXContext parentContext, Frame param1, String param2, boolean param3, GraphicsConfiguration param4) {
262         super(param1 ,param2 ,param3 ,param4);
263         JAXXUtil.initContext(this, parentContext);
264         $initialize();
265     }
266 
267     public UsersDialogUI(Frame param0, String param1, boolean param2) {
268         super(param0 ,param1 ,param2);
269         $initialize();
270     }
271 
272     public UsersDialogUI(JAXXContext parentContext, Frame param1, String param2, boolean param3) {
273         super(param1 ,param2 ,param3);
274         JAXXUtil.initContext(this, parentContext);
275         $initialize();
276     }
277 
278     /*-----------------------------------------------------------------------*/
279     /*--------------------------- Statics methods ---------------------------*/
280     /*-----------------------------------------------------------------------*/
281 
282     public static JAXXObjectDescriptor $getJAXXObjectDescriptor() {
283         return JAXXUtil.decodeCompressedJAXXObjectDescriptor($jaxxObjectDescriptor);
284     }
285 
286     /*-----------------------------------------------------------------------*/
287     /*---------------------- JAXXObject implementation ----------------------*/
288     /*-----------------------------------------------------------------------*/
289 
290     @Override
291     public void applyDataBinding(String $binding) {
292         if (allComponentsCreated && $bindings.containsKey($binding)) {
293             getDataBinding($binding).applyDataBinding();
294         }
295         processDataBinding($binding);
296     }
297 
298     @Override
299     public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
300         super.firePropertyChange(propertyName, oldValue, newValue);
301     }
302 
303     @Override
304     public Map<String, Object> get$objectMap() {
305         return $objectMap;
306     }
307 
308     @Override
309     public JAXXBinding getDataBinding(String bindingId) {
310         return $bindings.get(bindingId);
311     }
312 
313     @Override
314     public JAXXBinding[] getDataBindings() {
315         return $bindings.values().toArray(new JAXXBinding[$bindings.size()]);
316     }
317 
318     @Override
319     public Object getObjectById(String id) {
320         return $objectMap.get(id);
321     }
322 
323     @Override
324     public void processDataBinding(String $binding, boolean $force) {
325         if (!$force && $activeBindings.contains($binding)) { 
326             return;
327         }
328         $activeBindings.add($binding);
329         try {
330             if (allComponentsCreated && $bindings.containsKey($binding)) {
331                 getDataBinding($binding).processDataBinding();
332             }
333         } finally {
334             $activeBindings.remove($binding);
335         }
336     }
337 
338     @Override
339     public void processDataBinding(String $binding) {
340         processDataBinding($binding, false);
341     }
342 
343     @Override
344     public void registerDataBinding(JAXXBinding binding) {
345         $bindings.put(binding.getId(), binding);
346     }
347 
348     @Override
349     public void removeDataBinding(String $binding) {
350         if (allComponentsCreated && $bindings.containsKey($binding)) {
351             getDataBinding($binding).removeDataBinding();
352         }
353     }
354 
355     /*-----------------------------------------------------------------------*/
356     /*--------------------- JAXXContext implementation  ---------------------*/
357     /*-----------------------------------------------------------------------*/
358 
359     @Override
360     public <T> T getContextValue(Class<T> clazz) {
361         return delegateContext.getContextValue(clazz, null);
362     }
363 
364     @Override
365     public <T> T getContextValue(Class<T> clazz, String name) {
366         return delegateContext.getContextValue(clazz, name);
367     }
368 
369     @Override
370     public JAXXContext getDelegateContext() {
371         return delegateContext;
372     }
373 
374     @Override
375     public <O extends Container> O getParentContainer(Class<O> clazz) {
376         return SwingUtil.getParentContainer(this, clazz);
377     }
378 
379     @Override
380     public <O extends Container> O getParentContainer(Object source, Class<O> clazz) {
381         return SwingUtil.getParentContainer(source, clazz);
382     }
383 
384     @Override
385     public <T> void removeContextValue(Class<T> clazz) {
386         delegateContext.removeContextValue(clazz, null);
387     }
388 
389     @Override
390     public <T> void removeContextValue(Class<T> clazz, String name) {
391         delegateContext.removeContextValue(clazz, name);
392     }
393 
394     @Override
395     public <T> void setContextValue(T o) {
396         delegateContext.setContextValue(o, null);
397     }
398 
399     @Override
400     public <T> void setContextValue(T o, String name) {
401         delegateContext.setContextValue(o, name);
402     }
403 
404     /*-----------------------------------------------------------------------*/
405     /*---------------------------- Event methods ----------------------------*/
406     /*-----------------------------------------------------------------------*/
407 
408     public void doActionPerformed__on__cancelButton(ActionEvent event) {
409         if (log.isDebugEnabled()) {
410             log.debug(event);
411         }
412         handler.cancel();
413     }
414 
415     public void doActionPerformed__on__validateButton(ActionEvent event) {
416         if (log.isDebugEnabled()) {
417             log.debug(event);
418         }
419         handler.valid();
420     }
421 
422     /*-----------------------------------------------------------------------*/
423     /*----------------------- Public acessor methods  -----------------------*/
424     /*-----------------------------------------------------------------------*/
425 
426     public JButton getCancelButton() {
427         return cancelButton;
428     }
429 
430     public FilterElementUserUI getFilterElementUserUI() {
431         return filterElementUserUI;
432     }
433 
434     public UsersDialogUIHandler getHandler() {
435         return handler;
436     }
437 
438     public JPanel getListPanel() {
439         return listPanel;
440     }
441 
442     public CardLayout2Ext getListPanelLayout() {
443         return listPanelLayout;
444     }
445 
446     public UsersDialogUIModel getModel() {
447         return model;
448     }
449 
450     public JList<PersonDTO> getUsersList() {
451         return usersList;
452     }
453 
454     public JButton getValidateButton() {
455         return validateButton;
456     }
457 
458     /*-----------------------------------------------------------------------*/
459     /*--------------------- Protected acessors methods  ---------------------*/
460     /*-----------------------------------------------------------------------*/
461 
462     protected JPanel get$JPanel0() {
463         return $JPanel0;
464     }
465 
466     protected JPanel get$JPanel1() {
467         return $JPanel1;
468     }
469 
470     protected JPanel get$JPanel2() {
471         return $JPanel2;
472     }
473 
474     /*-----------------------------------------------------------------------*/
475     /*--------------------- Components creation methods ---------------------*/
476     /*-----------------------------------------------------------------------*/
477 
478     protected void addChildrenToListPanel() {
479         if (!allComponentsCreated) {
480             return;
481         }
482         listPanel.add(filterElementUserUI, UsersDialogUIHandler.DOUBLE_LIST);
483         listPanel.add($JPanel1, UsersDialogUIHandler.LIST);
484     }
485 
486     protected void addChildrenToUsersDialog() {
487         if (!allComponentsCreated) {
488             return;
489         }
490         add($JPanel0);
491     }
492 
493     protected void createCancelButton() {
494         $objectMap.put("cancelButton", cancelButton = new JButton());
495         
496         cancelButton.setName("cancelButton");
497         cancelButton.setText(t("dali.common.close"));
498         cancelButton.setToolTipText(t("dali.common.close"));
499         cancelButton.addActionListener(JAXXUtil.getEventListener(ActionListener.class, "actionPerformed", this, "doActionPerformed__on__cancelButton"));
500     }
501 
502     protected void createFilterElementUserUI() {
503         $objectMap.put("filterElementUserUI", filterElementUserUI = new FilterElementUserUI(this));
504         
505         filterElementUserUI.setName("filterElementUserUI");
506     }
507 
508     protected UsersDialogUIHandler createHandler() {
509         return new UsersDialogUIHandler();
510     }
511 
512     protected void createListPanel() {
513         $objectMap.put("listPanel", listPanel = new JPanel());
514         
515         listPanel.setName("listPanel");
516         listPanel.setLayout(listPanelLayout);
517     }
518 
519     protected void createListPanelLayout() {
520         $objectMap.put("listPanelLayout", listPanelLayout = new CardLayout2Ext(this, "listPanel"));
521     }
522 
523     protected void createModel() {
524         $objectMap.put("model", model = getContextValue(UsersDialogUIModel.class));
525     }
526 
527     protected void createUsersList() {
528         $objectMap.put("usersList", usersList = new JList<PersonDTO>());
529         
530         usersList.setName("usersList");
531     }
532 
533     protected void createValidateButton() {
534         $objectMap.put("validateButton", validateButton = new JButton());
535         
536         validateButton.setName("validateButton");
537         validateButton.setText(t("dali.common.validate"));
538         validateButton.setToolTipText(t("dali.common.validate"));
539         validateButton.addActionListener(JAXXUtil.getEventListener(ActionListener.class, "actionPerformed", this, "doActionPerformed__on__validateButton"));
540     }
541 
542     /*-----------------------------------------------------------------------*/
543     /*------------------------ Internal jaxx methods ------------------------*/
544     /*-----------------------------------------------------------------------*/
545 
546     private void $completeSetup() {
547         allComponentsCreated = true;
548         if (log.isDebugEnabled()) {
549             log.debug(this);
550         }
551         addChildrenToUsersDialog();
552         // inline complete setup of $JPanel0
553         $JPanel0.add(listPanel);
554         $JPanel0.add($JPanel2, BorderLayout.PAGE_END);
555         addChildrenToListPanel();
556         // inline complete setup of $JPanel1
557         $JPanel1.add(usersList);
558         // inline complete setup of $JPanel2
559         $JPanel2.add(cancelButton);
560         $JPanel2.add(validateButton);
561         
562         // apply 1 data bindings
563         JAXXUtil.applyDataBinding(this, $bindings.keySet());
564         
565         // apply 10 property setters
566         $JPanel1.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
567         cancelButton.setMnemonic(SwingUtil.getFirstCharAt(t("dali.common.cancel.mnemonic"),'Z'));
568         cancelButton.setIcon(SwingUtil.createActionIcon("cancel"));
569         validateButton.setMnemonic(SwingUtil.getFirstCharAt(t("dali.common.validate.mnemonic"),'Z'));
570         validateButton.setIcon(SwingUtil.createActionIcon("accept"));
571         // late initializer
572         usersDialog.pack();
573     }
574 
575     private void $initialize() {
576         if (allComponentsCreated) {
577             return;
578         }
579         if (log.isDebugEnabled()) {
580             log.debug(this);
581         }
582         handler.beforeInit(this);
583         $objectMap.put("usersDialog", usersDialog);
584         createModel();
585         createListPanelLayout();
586         // inline creation of $JPanel0
587         $objectMap.put("$JPanel0", $JPanel0 = new JPanel());
588         
589         $JPanel0.setName("$JPanel0");
590         $JPanel0.setLayout(new BorderLayout());
591         createListPanel();
592         createFilterElementUserUI();
593         // inline creation of $JPanel1
594         $objectMap.put("$JPanel1", $JPanel1 = new JPanel());
595         
596         $JPanel1.setName("$JPanel1");
597         $JPanel1.setLayout(new BorderLayout());
598         createUsersList();
599         // inline creation of $JPanel2
600         $objectMap.put("$JPanel2", $JPanel2 = new JPanel());
601         
602         $JPanel2.setName("$JPanel2");
603         $JPanel2.setLayout(new GridLayout(1,0));
604         createCancelButton();
605         createValidateButton();
606         // inline creation of usersDialog
607         setName("usersDialog");
608         usersDialog.getContentPane().setLayout(new BorderLayout());
609         setResizable(true);
610         setModal(true);
611         
612         // registers 1 data bindings
613         $registerDefaultBindings();
614         $completeSetup();
615         handler.afterInit(this);
616     }
617 
618     private void $registerDefaultBindings() {
619         // register 1 data bindings
620         registerDataBinding(new DefaultJAXXBinding(this, BINDING_VALIDATE_BUTTON_ENABLED, true) {
621         
622             @Override
623             public void applyDataBinding() {
624                 if (model != null) {
625                     model.addPropertyChangeListener("program", this);
626                 }
627             }
628         
629             @Override
630             public void processDataBinding() {
631                 if (model != null && model.getProgram() != null) {
632                     validateButton.setEnabled(model.getProgram().isEditable());
633                 }
634             }
635         
636             @Override
637             public void removeDataBinding() {
638                 if (model != null) {
639                     model.removePropertyChangeListener("program", this);
640                 }
641             }
642         });
643     }
644 
645 }