KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > launch4j > binding > Bindings


1 /*
2     Launch4j (http://launch4j.sourceforge.net/)
3     Cross-platform Java application wrapper for creating Windows native executables.
4
5     Copyright (C) 2004, 2006 Grzegorz Kowal
6
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */

21
22 /*
23  * Created on Apr 30, 2005
24  */

25 package net.sf.launch4j.binding;
26
27 import java.beans.PropertyChangeEvent JavaDoc;
28 import java.beans.PropertyChangeListener JavaDoc;
29 import java.util.HashMap JavaDoc;
30 import java.util.Iterator JavaDoc;
31 import java.util.Map JavaDoc;
32
33 import javax.swing.JComponent JavaDoc;
34 import javax.swing.JList JavaDoc;
35 import javax.swing.JRadioButton JavaDoc;
36 import javax.swing.JTextArea JavaDoc;
37 import javax.swing.JToggleButton JavaDoc;
38 import javax.swing.text.JTextComponent JavaDoc;
39
40 import org.apache.commons.beanutils.PropertyUtils;
41
42 /**
43  * Creates and handles bindings.
44  *
45  * @author Copyright (C) 2005 Grzegorz Kowal
46  */

47 public class Bindings implements PropertyChangeListener JavaDoc {
48     private final Map JavaDoc _bindings = new HashMap JavaDoc();
49     private final Map JavaDoc _optComponents = new HashMap JavaDoc();
50     private boolean _modified = false;
51
52     /**
53      * Used to track component modifications.
54      */

55     public void propertyChange(PropertyChangeEvent JavaDoc evt) {
56         String JavaDoc prop = evt.getPropertyName();
57         if ("AccessibleValue".equals(prop)
58                 || "AccessibleText".equals(prop)
59                 || "AccessibleVisibleData".equals(prop)) {
60             _modified = true;
61         }
62     }
63
64     /**
65      * Any of the components modified?
66      */

67     public boolean isModified() {
68         return _modified;
69     }
70
71     public Binding getBinding(String JavaDoc property) {
72         return (Binding) _bindings.get(property);
73     }
74
75     private void registerPropertyChangeListener(JComponent JavaDoc c) {
76         c.getAccessibleContext().addPropertyChangeListener(this);
77     }
78
79     private void registerPropertyChangeListener(JComponent JavaDoc[] cs) {
80         for (int i = 0; i < cs.length; i++) {
81             cs[i].getAccessibleContext().addPropertyChangeListener(this);
82         }
83     }
84
85     private boolean isPropertyNull(IValidatable bean, Binding b) {
86         try {
87             for (Iterator JavaDoc iter = _optComponents.keySet().iterator(); iter.hasNext();) {
88                 String JavaDoc property = (String JavaDoc) iter.next();
89                 if (b.getProperty().startsWith(property)) {
90                     return PropertyUtils.getProperty(bean, property) == null;
91                 }
92             }
93             return false;
94         } catch (Exception JavaDoc e) {
95             throw new BindingException(e);
96         }
97     }
98
99     /**
100      * Enables or disables all components bound to properties that begin with given prefix.
101      */

102     public void setComponentsEnabled(String JavaDoc prefix, boolean enabled) {
103         for (Iterator JavaDoc iter = _bindings.values().iterator(); iter.hasNext();) {
104             Binding b = (Binding) iter.next();
105             if (b.getProperty().startsWith(prefix)) {
106                 b.setEnabled(enabled);
107             }
108         }
109     }
110
111     /**
112      * Clear all components, set them to their default values.
113      * Clears the _modified flag.
114      */

115     public void clear(IValidatable bean) {
116         for (Iterator JavaDoc iter = _optComponents.values().iterator(); iter.hasNext();) {
117             ((Binding) iter.next()).clear(bean);
118         }
119         for (Iterator JavaDoc iter = _bindings.values().iterator(); iter.hasNext();) {
120             ((Binding) iter.next()).clear(bean);
121         }
122         _modified = false;
123     }
124
125     /**
126      * Copies data from the Java Bean to the UI components.
127      * Clears the _modified flag.
128      */

129     public void put(IValidatable bean) {
130         for (Iterator JavaDoc iter = _optComponents.values().iterator(); iter.hasNext();) {
131             ((Binding) iter.next()).put(bean);
132         }
133         for (Iterator JavaDoc iter = _bindings.values().iterator(); iter.hasNext();) {
134             Binding b = (Binding) iter.next();
135             if (isPropertyNull(bean, b)) {
136                 b.clear(null);
137             } else {
138                 b.put(bean);
139             }
140         }
141         _modified = false;
142     }
143
144     /**
145      * Copies data from UI components to the Java Bean and checks it's class invariants.
146      * Clears the _modified flag.
147      * @throws InvariantViolationException
148      * @throws BindingException
149      */

150     public void get(IValidatable bean) {
151         try {
152             for (Iterator JavaDoc iter = _optComponents.values().iterator(); iter.hasNext();) {
153                 ((Binding) iter.next()).get(bean);
154             }
155             for (Iterator JavaDoc iter = _bindings.values().iterator(); iter.hasNext();) {
156                 Binding b = (Binding) iter.next();
157                 if (!isPropertyNull(bean, b)) {
158                     b.get(bean);
159                 }
160             }
161             bean.checkInvariants();
162             for (Iterator JavaDoc iter = _optComponents.keySet().iterator(); iter.hasNext();) {
163                 String JavaDoc property = (String JavaDoc) iter.next();
164                 IValidatable component = (IValidatable) PropertyUtils.getProperty(bean,
165                         property);
166                 if (component != null) {
167                     component.checkInvariants();
168                 }
169             }
170             _modified = false; // XXX
171
} catch (InvariantViolationException e) {
172             e.setBinding(getBinding(e.getProperty()));
173             throw e;
174         } catch (Exception JavaDoc e) {
175             throw new BindingException(e);
176         }
177     }
178
179     private Bindings add(Binding b) {
180         if (_bindings.containsKey(b.getProperty())) {
181             throw new BindingException(Messages.getString("Bindings.duplicate.binding"));
182         }
183         _bindings.put(b.getProperty(), b);
184         return this;
185     }
186
187     /**
188      * Add an optional (nullable) Java Bean component of type clazz.
189      */

190     public Bindings addOptComponent(String JavaDoc property, Class JavaDoc clazz, JToggleButton JavaDoc c,
191             boolean enabledByDefault) {
192         Binding b = new OptComponentBinding(this, property, clazz, c, enabledByDefault);
193         if (_optComponents.containsKey(property)) {
194             throw new BindingException(Messages.getString("Bindings.duplicate.binding"));
195         }
196         _optComponents.put(property, b);
197         return this;
198     }
199
200     /**
201      * Add an optional (nullable) Java Bean component of type clazz.
202      */

203     public Bindings addOptComponent(String JavaDoc property, Class JavaDoc clazz, JToggleButton JavaDoc c) {
204         return addOptComponent(property, clazz, c, false);
205     }
206
207     /**
208      * Handles JEditorPane, JTextArea, JTextField
209      */

210     public Bindings add(String JavaDoc property, JTextComponent JavaDoc c, String JavaDoc defaultValue) {
211         registerPropertyChangeListener(c);
212         return add(new JTextComponentBinding(property, c, defaultValue));
213     }
214
215     /**
216      * Handles JEditorPane, JTextArea, JTextField
217      */

218     public Bindings add(String JavaDoc property, JTextComponent JavaDoc c) {
219         registerPropertyChangeListener(c);
220         return add(new JTextComponentBinding(property, c, ""));
221     }
222
223     /**
224      * Handles JToggleButton, JCheckBox
225      */

226     public Bindings add(String JavaDoc property, JToggleButton JavaDoc c, boolean defaultValue) {
227         registerPropertyChangeListener(c);
228         return add(new JToggleButtonBinding(property, c, defaultValue));
229     }
230
231     /**
232      * Handles JToggleButton, JCheckBox
233      */

234     public Bindings add(String JavaDoc property, JToggleButton JavaDoc c) {
235         registerPropertyChangeListener(c);
236         return add(new JToggleButtonBinding(property, c, false));
237     }
238
239     /**
240      * Handles JRadioButton
241      */

242     public Bindings add(String JavaDoc property, JRadioButton JavaDoc[] cs, int defaultValue) {
243         registerPropertyChangeListener(cs);
244         return add(new JRadioButtonBinding(property, cs, defaultValue));
245     }
246     
247     /**
248      * Handles JRadioButton
249      */

250     public Bindings add(String JavaDoc property, JRadioButton JavaDoc[] cs) {
251         registerPropertyChangeListener(cs);
252         return add(new JRadioButtonBinding(property, cs, 0));
253     }
254
255     /**
256      * Handles JTextArea
257      */

258     public Bindings add(String JavaDoc property, JTextArea JavaDoc textArea, String JavaDoc defaultValue) {
259         registerPropertyChangeListener(textArea);
260         return add(new JTextComponentBinding(property, textArea, defaultValue));
261     }
262
263     /**
264      * Handles JTextArea lists
265      */

266     public Bindings add(String JavaDoc property, JTextArea JavaDoc textArea) {
267         registerPropertyChangeListener(textArea);
268         return add(new JTextAreaBinding(property, textArea));
269     }
270
271     /**
272      * Handles Optional JTextArea lists
273      */

274     public Bindings add(String JavaDoc property, String JavaDoc stateProperty,
275             JToggleButton JavaDoc button, JTextArea JavaDoc textArea) {
276         registerPropertyChangeListener(button);
277         registerPropertyChangeListener(textArea);
278         return add(new OptJTextAreaBinding(property, stateProperty, button, textArea));
279     }
280
281     /**
282      * Handles JList
283      */

284     public Bindings add(String JavaDoc property, JList JavaDoc list) {
285         registerPropertyChangeListener(list);
286         return add(new JListBinding(property, list));
287     }
288 }
289
Popular Tags