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.InvocationTargetException ; 18 import java.lang.reflect.Method ; 19 import java.util.Arrays ; 20 import java.util.Collection ; 21 import java.util.HashSet ; 22 import java.util.Set ; 23 24 import org.eclipse.core.databinding.beans.IBeanObservable; 25 import org.eclipse.core.databinding.observable.Diffs; 26 import org.eclipse.core.databinding.observable.Realm; 27 import org.eclipse.core.databinding.observable.set.ObservableSet; 28 import org.eclipse.core.runtime.Assert; 29 30 34 public class JavaBeanObservableSet extends ObservableSet implements IBeanObservable { 35 36 private final Object object; 37 38 private PropertyChangeListener collectionListener = new PropertyChangeListener () { 39 public void propertyChange(java.beans.PropertyChangeEvent event) { 40 if (!updating) { 41 Set newElements = new HashSet (Arrays.asList(getValues())); 42 Set addedElements = new HashSet (newElements); 43 Set removedElements = new HashSet (wrappedSet); 44 removedElements.removeAll(newElements); 47 addedElements.removeAll(wrappedSet); 48 wrappedSet = newElements; 49 fireSetChange(Diffs.createSetDiff(addedElements, 50 removedElements)); 51 } 52 } 53 }; 54 55 private boolean updating = false; 56 57 private PropertyDescriptor descriptor; 58 59 private ListenerSupport collectionListenSupport; 60 61 67 public JavaBeanObservableSet(Realm realm, Object object, PropertyDescriptor descriptor, 68 Class elementType) { 69 super(realm, new HashSet (), elementType); 70 this.object = object; 71 this.descriptor = descriptor; 72 this.collectionListenSupport = new ListenerSupport(collectionListener, descriptor.getName()); 73 74 wrappedSet.addAll(Arrays.asList(getValues())); 75 } 76 77 protected void firstListenerAdded() { 78 collectionListenSupport.hookListener(this.object); 79 } 80 81 protected void lastListenerRemoved() { 82 if (collectionListenSupport != null) { 83 collectionListenSupport.dispose(); 84 } 85 } 86 87 private Object primGetValues() { 88 try { 89 Method readMethod = descriptor.getReadMethod(); 90 if (!readMethod.isAccessible()) { 91 readMethod.setAccessible(true); 92 } 93 return readMethod.invoke(object, new Object [0]); 94 } catch (IllegalArgumentException e) { 95 } catch (IllegalAccessException e) { 96 } catch (InvocationTargetException e) { 97 } 98 Assert.isTrue(false, "Could not read collection values"); return null; 100 } 101 102 private Object [] getValues() { 103 Object [] values = null; 104 105 Object result = primGetValues(); 106 if (descriptor.getPropertyType().isArray()) 107 values = (Object []) result; 108 else { 109 Collection list = (Collection ) result; 111 if (list != null) { 112 values = list.toArray(); 113 } else { 114 values = new Object [] {}; 115 } 116 } 117 return values; 118 } 119 120 123 public Object getObserved() { 124 return object; 125 } 126 127 130 public PropertyDescriptor getPropertyDescriptor() { 131 return descriptor; 132 } 133 134 } 135 | Popular Tags |