1 21 22 25 package net.sf.launch4j.binding; 26 27 import java.beans.PropertyChangeEvent ; 28 import java.beans.PropertyChangeListener ; 29 import java.util.HashMap ; 30 import java.util.Iterator ; 31 import java.util.Map ; 32 33 import javax.swing.JComponent ; 34 import javax.swing.JList ; 35 import javax.swing.JRadioButton ; 36 import javax.swing.JTextArea ; 37 import javax.swing.JToggleButton ; 38 import javax.swing.text.JTextComponent ; 39 40 import org.apache.commons.beanutils.PropertyUtils; 41 42 47 public class Bindings implements PropertyChangeListener { 48 private final Map _bindings = new HashMap (); 49 private final Map _optComponents = new HashMap (); 50 private boolean _modified = false; 51 52 55 public void propertyChange(PropertyChangeEvent evt) { 56 String prop = evt.getPropertyName(); 57 if ("AccessibleValue".equals(prop) 58 || "AccessibleText".equals(prop) 59 || "AccessibleVisibleData".equals(prop)) { 60 _modified = true; 61 } 62 } 63 64 67 public boolean isModified() { 68 return _modified; 69 } 70 71 public Binding getBinding(String property) { 72 return (Binding) _bindings.get(property); 73 } 74 75 private void registerPropertyChangeListener(JComponent c) { 76 c.getAccessibleContext().addPropertyChangeListener(this); 77 } 78 79 private void registerPropertyChangeListener(JComponent [] 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 iter = _optComponents.keySet().iterator(); iter.hasNext();) { 88 String property = (String ) iter.next(); 89 if (b.getProperty().startsWith(property)) { 90 return PropertyUtils.getProperty(bean, property) == null; 91 } 92 } 93 return false; 94 } catch (Exception e) { 95 throw new BindingException(e); 96 } 97 } 98 99 102 public void setComponentsEnabled(String prefix, boolean enabled) { 103 for (Iterator 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 115 public void clear(IValidatable bean) { 116 for (Iterator iter = _optComponents.values().iterator(); iter.hasNext();) { 117 ((Binding) iter.next()).clear(bean); 118 } 119 for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) { 120 ((Binding) iter.next()).clear(bean); 121 } 122 _modified = false; 123 } 124 125 129 public void put(IValidatable bean) { 130 for (Iterator iter = _optComponents.values().iterator(); iter.hasNext();) { 131 ((Binding) iter.next()).put(bean); 132 } 133 for (Iterator 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 150 public void get(IValidatable bean) { 151 try { 152 for (Iterator iter = _optComponents.values().iterator(); iter.hasNext();) { 153 ((Binding) iter.next()).get(bean); 154 } 155 for (Iterator 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 iter = _optComponents.keySet().iterator(); iter.hasNext();) { 163 String property = (String ) iter.next(); 164 IValidatable component = (IValidatable) PropertyUtils.getProperty(bean, 165 property); 166 if (component != null) { 167 component.checkInvariants(); 168 } 169 } 170 _modified = false; } catch (InvariantViolationException e) { 172 e.setBinding(getBinding(e.getProperty())); 173 throw e; 174 } catch (Exception 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 190 public Bindings addOptComponent(String property, Class clazz, JToggleButton 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 203 public Bindings addOptComponent(String property, Class clazz, JToggleButton c) { 204 return addOptComponent(property, clazz, c, false); 205 } 206 207 210 public Bindings add(String property, JTextComponent c, String defaultValue) { 211 registerPropertyChangeListener(c); 212 return add(new JTextComponentBinding(property, c, defaultValue)); 213 } 214 215 218 public Bindings add(String property, JTextComponent c) { 219 registerPropertyChangeListener(c); 220 return add(new JTextComponentBinding(property, c, "")); 221 } 222 223 226 public Bindings add(String property, JToggleButton c, boolean defaultValue) { 227 registerPropertyChangeListener(c); 228 return add(new JToggleButtonBinding(property, c, defaultValue)); 229 } 230 231 234 public Bindings add(String property, JToggleButton c) { 235 registerPropertyChangeListener(c); 236 return add(new JToggleButtonBinding(property, c, false)); 237 } 238 239 242 public Bindings add(String property, JRadioButton [] cs, int defaultValue) { 243 registerPropertyChangeListener(cs); 244 return add(new JRadioButtonBinding(property, cs, defaultValue)); 245 } 246 247 250 public Bindings add(String property, JRadioButton [] cs) { 251 registerPropertyChangeListener(cs); 252 return add(new JRadioButtonBinding(property, cs, 0)); 253 } 254 255 258 public Bindings add(String property, JTextArea textArea, String defaultValue) { 259 registerPropertyChangeListener(textArea); 260 return add(new JTextComponentBinding(property, textArea, defaultValue)); 261 } 262 263 266 public Bindings add(String property, JTextArea textArea) { 267 registerPropertyChangeListener(textArea); 268 return add(new JTextAreaBinding(property, textArea)); 269 } 270 271 274 public Bindings add(String property, String stateProperty, 275 JToggleButton button, JTextArea textArea) { 276 registerPropertyChangeListener(button); 277 registerPropertyChangeListener(textArea); 278 return add(new OptJTextAreaBinding(property, stateProperty, button, textArea)); 279 } 280 281 284 public Bindings add(String property, JList list) { 285 registerPropertyChangeListener(list); 286 return add(new JListBinding(property, list)); 287 } 288 } 289 | Popular Tags |