1 11 package org.eclipse.jface.internal.databinding.internal.beans; 12 13 import java.beans.PropertyChangeListener ; 14 import java.beans.PropertyDescriptor ; 15 import java.lang.reflect.InvocationTargetException ; 16 import java.lang.reflect.Method ; 17 18 import org.eclipse.jface.internal.databinding.provisional.BindingException; 19 import org.eclipse.jface.internal.databinding.provisional.observable.Diffs; 20 import org.eclipse.jface.internal.databinding.provisional.observable.value.AbstractObservableValue; 21 22 26 public class JavaBeanObservableValue extends AbstractObservableValue { 27 private final Object object; 28 29 private PropertyChangeListener listener; 30 31 private boolean updating = false; 32 33 private final PropertyDescriptor propertyDescriptor; 34 35 39 public JavaBeanObservableValue(Object object, PropertyDescriptor descriptor) { 40 this.object = object; 41 this.propertyDescriptor = descriptor; 42 } 43 44 protected void firstListenerAdded() { 45 listener = new PropertyChangeListener () { 46 public void propertyChange(java.beans.PropertyChangeEvent event) { 47 if (!updating && event.getPropertyName().equals(propertyDescriptor.getName())) { 48 fireValueChange(Diffs.createValueDiff(event.getOldValue(), event 49 .getNewValue())); 50 } 51 } 52 }; 53 Method addPropertyChangeListenerMethod = null; 54 try { 55 addPropertyChangeListenerMethod = object.getClass().getMethod( 56 "addPropertyChangeListener", new Class [] { String .class, PropertyChangeListener .class }); 58 } catch (SecurityException e) { 59 } catch (NoSuchMethodException e) { 61 } 63 if (addPropertyChangeListenerMethod != null) { 64 try { 65 addPropertyChangeListenerMethod.invoke(object, new Object [] { 66 propertyDescriptor.getName(), listener }); 67 return; 68 } catch (IllegalArgumentException e) { 69 } catch (IllegalAccessException e) { 71 } catch (InvocationTargetException e) { 73 } 75 } 76 listener = null; 78 } 79 80 public void setValue(Object value) { 81 updating = true; 82 try { 83 Object oldValue = doGetValue(); 84 Method writeMethod = propertyDescriptor.getWriteMethod(); 85 if (!writeMethod.isAccessible()) { 86 writeMethod.setAccessible(true); 87 } 88 writeMethod.invoke(object, new Object [] { value }); 89 fireValueChange(Diffs.createValueDiff(oldValue, doGetValue())); 90 } catch (Exception e) { 91 e.printStackTrace(); 93 } finally { 94 updating = false; 95 } 96 } 97 98 public Object doGetValue() { 99 try { 100 Method readMethod = propertyDescriptor.getReadMethod(); 101 if (readMethod == null) { 102 throw new BindingException(propertyDescriptor.getName() 103 + " property does not have a read method."); } 105 if (!readMethod.isAccessible()) { 106 readMethod.setAccessible(true); 107 } 108 return readMethod.invoke(object, null); 109 } catch (Exception e) { 110 e.printStackTrace(); 111 return null; 112 } 113 } 114 115 protected void lastListenerRemoved() { 116 if (listener != null) { 117 Method removePropertyChangeListenerMethod = null; 118 try { 119 removePropertyChangeListenerMethod = object.getClass() 120 .getMethod( 121 "removePropertyChangeListener", new Class [] { String .class, 123 PropertyChangeListener .class }); 124 } catch (SecurityException e) { 125 } catch (NoSuchMethodException e) { 127 } 129 if (removePropertyChangeListenerMethod != null) { 130 try { 131 removePropertyChangeListenerMethod.invoke(object, 132 new Object [] { propertyDescriptor.getName(), 133 listener }); 134 } catch (IllegalArgumentException e) { 135 } catch (IllegalAccessException e) { 137 } catch (InvocationTargetException e) { 139 } 141 } 142 listener = null; 144 } 145 } 146 147 public Object getValueType() { 148 return propertyDescriptor.getPropertyType(); 149 } 150 } 151 | Popular Tags |