1 11 12 package org.eclipse.jface.internal.databinding.internal.beans; 13 14 import java.beans.PropertyChangeListener ; 15 import java.beans.PropertyDescriptor ; 16 import java.lang.reflect.InvocationTargetException ; 17 import java.lang.reflect.Method ; 18 import java.util.Arrays ; 19 import java.util.Collection ; 20 import java.util.HashSet ; 21 import java.util.Set ; 22 23 import org.eclipse.jface.internal.databinding.provisional.observable.Diffs; 24 import org.eclipse.jface.internal.databinding.provisional.observable.set.ObservableSet; 25 import org.eclipse.jface.util.Assert; 26 27 31 public class JavaBeanObservableSet extends ObservableSet { 32 33 private final Object object; 34 35 private PropertyChangeListener collectionListener = new PropertyChangeListener () { 36 public void propertyChange(java.beans.PropertyChangeEvent event) { 37 if (!updating) { 38 if (JavaBeanObservableSet.this.descriptor.getName().equals( 39 event.getPropertyName())) { 40 Set newElements = new HashSet (Arrays.asList(getValues())); 41 Set addedElements = new HashSet (newElements); 42 Set removedElements = new HashSet (wrappedSet); 43 removedElements.removeAll(newElements); 46 addedElements.removeAll(wrappedSet); 47 wrappedSet = newElements; 48 fireSetChange(Diffs.createSetDiff(addedElements, 49 removedElements)); 50 } 51 } 52 } 53 }; 54 55 private boolean updating = false; 56 57 private PropertyDescriptor descriptor; 58 59 private ListenerSupport collectionListenSupport = new ListenerSupport( 60 collectionListener); 61 62 67 public JavaBeanObservableSet(Object object, PropertyDescriptor descriptor, 68 Class elementType) { 69 super(new HashSet (), descriptor.getPropertyType()); 70 this.object = object; 71 this.descriptor = descriptor; 72 wrappedSet.addAll(Arrays.asList(getValues())); 73 } 74 75 protected void firstListenerAdded() { 76 collectionListenSupport.hookListener(this.object); 77 } 78 79 protected void lastListenerRemoved() { 80 if (collectionListenSupport != null) { 81 collectionListenSupport.dispose(); 82 } 83 } 84 85 private Object primGetValues() { 86 try { 87 Method readMethod = descriptor.getReadMethod(); 88 if (!readMethod.isAccessible()) { 89 readMethod.setAccessible(true); 90 } 91 return readMethod.invoke(object, new Object [0]); 92 } catch (IllegalArgumentException e) { 93 } catch (IllegalAccessException e) { 94 } catch (InvocationTargetException e) { 95 } 96 Assert.isTrue(false, "Could not read collection values"); return null; 98 } 99 100 private Object [] getValues() { 101 Object [] values = null; 102 103 Object result = primGetValues(); 104 if (descriptor.getPropertyType().isArray()) 105 values = (Object []) result; 106 else { 107 Collection list = (Collection ) result; 109 if (list != null) { 110 values = list.toArray(); 111 } else { 112 values = new Object [] {}; 113 } 114 } 115 return values; 116 } 117 118 } 119 | Popular Tags |