1 12 13 package org.eclipse.core.internal.databinding.internal.beans; 14 15 import java.beans.PropertyChangeListener ; 16 import java.beans.PropertyDescriptor ; 17 import java.lang.reflect.Method ; 18 19 import org.eclipse.core.databinding.beans.IBeanObservable; 20 import org.eclipse.core.databinding.observable.Diffs; 21 import org.eclipse.core.databinding.observable.map.ComputedObservableMap; 22 import org.eclipse.core.databinding.observable.set.IObservableSet; 23 import org.eclipse.core.databinding.util.Policy; 24 import org.eclipse.core.runtime.IStatus; 25 import org.eclipse.core.runtime.Status; 26 27 31 public class JavaBeanObservableMap extends ComputedObservableMap implements IBeanObservable { 32 33 private PropertyDescriptor propertyDescriptor; 34 35 private PropertyChangeListener elementListener = new PropertyChangeListener () { 36 public void propertyChange(final java.beans.PropertyChangeEvent event) { 37 if (!updating) { 38 fireMapChange(Diffs.createMapDiffSingleChange( 39 event.getSource(), event.getOldValue(), event 40 .getNewValue())); 41 } 42 } 43 }; 44 45 private ListenerSupport listenerSupport; 46 47 private boolean updating = false; 48 49 53 public JavaBeanObservableMap(IObservableSet domain, 54 PropertyDescriptor propertyDescriptor) { 55 super(domain); 56 57 this.propertyDescriptor = propertyDescriptor; 58 this.listenerSupport = new ListenerSupport(elementListener, 59 propertyDescriptor.getName()); 60 init(); 61 } 62 63 protected void hookListener(Object domainElement) { 64 listenerSupport.hookListener(domainElement); 65 } 66 67 protected void unhookListener(Object domainElement) { 68 listenerSupport.unhookListener(domainElement); 69 } 70 71 protected Object doGet(Object key) { 72 try { 73 Method readMethod = propertyDescriptor.getReadMethod(); 74 if (!readMethod.isAccessible()) { 75 readMethod.setAccessible(true); 76 } 77 return readMethod.invoke(key, new Object [0]); 78 } catch (Exception e) { 79 Policy.getLog().log( 80 new Status(IStatus.ERROR, Policy.JFACE_DATABINDING, 81 IStatus.ERROR, "cannot get value", e)); throw new RuntimeException (e); 83 } 84 } 85 86 protected Object doPut(Object key, Object value) { 87 try { 88 Object oldValue = get(key); 89 propertyDescriptor.getWriteMethod().invoke(key, 90 new Object [] { value }); 91 keySet().add(key); 92 return oldValue; 93 } catch (Exception e) { 94 Policy.getLog().log( 95 new Status(IStatus.ERROR, Policy.JFACE_DATABINDING, 96 IStatus.ERROR, "cannot set value", e)); throw new RuntimeException (e); 98 } 99 } 100 101 104 public Object getObserved() { 105 return keySet(); 106 } 107 108 111 public PropertyDescriptor getPropertyDescriptor() { 112 return propertyDescriptor; 113 } 114 } 115 | Popular Tags |