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.util.Collections ; 17 import java.util.Set ; 18 19 import org.eclipse.core.runtime.IStatus; 20 import org.eclipse.core.runtime.Status; 21 import org.eclipse.jface.internal.databinding.provisional.observable.IObservableCollection; 22 import org.eclipse.jface.internal.databinding.provisional.observable.mapping.MappingDiff; 23 import org.eclipse.jface.internal.databinding.provisional.observable.mapping.ObservableMultiMappingWithDomain; 24 import org.eclipse.jface.util.Assert; 25 import org.eclipse.jface.util.Policy; 26 27 31 public class JavaBeanObservableMultiMapping extends 32 ObservableMultiMappingWithDomain { 33 34 private final PropertyDescriptor [] propertyDescriptors; 35 36 private PropertyChangeListener elementListener = new PropertyChangeListener () { 37 public void propertyChange(final java.beans.PropertyChangeEvent event) { 38 if (!updating) { 39 for (int i = 0; i < propertyDescriptors.length; i++) { 40 if (propertyDescriptors[i].getName().equals( 41 event.getPropertyName())) { 42 final int[] indices = new int[] { i }; 43 final Set elements = Collections.singleton(event 44 .getSource()); 45 fireMappingValueChange(new MappingDiff() { 46 public Set getElements() { 47 return elements; 48 } 49 50 public int[] getAffectedIndices() { 51 return indices; 52 } 53 54 public Object [] getOldMappingValues(Object element, 55 int[] indices) { 56 return new Object [] { event.getOldValue() }; 57 } 58 59 public Object [] getNewMappingValues(Object element, 60 int[] indices) { 61 return new Object [] { event.getNewValue() }; 62 } 63 }); 64 } 65 } 66 } 67 } 68 }; 69 70 private ListenerSupport listenerSupport = new ListenerSupport( 71 elementListener); 72 73 private boolean updating = false; 74 75 79 public JavaBeanObservableMultiMapping(IObservableCollection domain, 80 PropertyDescriptor [] propertyDescriptors) { 81 this.propertyDescriptors = propertyDescriptors; 82 for (int i = 0; i < propertyDescriptors.length; i++) { 83 Assert.isTrue(propertyDescriptors[i]!=null); 84 } 85 initDomain(domain); 86 } 87 88 protected void addListenerTo(Object domainElement) { 89 listenerSupport.hookListener(domainElement); 90 } 91 92 protected void removeListenerFrom(Object domainElement) { 93 listenerSupport.unhookListener(domainElement); 94 } 95 96 private Object doGetMappingValue(Object element, 97 PropertyDescriptor propertyDescriptor) { 98 try { 99 return propertyDescriptor.getReadMethod().invoke(element, 100 new Object [0]); 101 } catch (Exception e) { 102 Policy.getLog().log( 103 new Status(IStatus.ERROR, Policy.JFACE, IStatus.ERROR, 104 "cannot get value", e)); } 106 return null; 107 } 108 109 public void setMappingValues(Object element, int[] indices, Object [] values) { 110 for (int i = 0; i < indices.length; i++) { 111 setMappingValue(element, propertyDescriptors[indices[i]], values[i]); 112 } 113 } 114 115 private void setMappingValue(Object element, 116 PropertyDescriptor propertyDescriptor, Object value) { 117 try { 118 propertyDescriptor.getWriteMethod().invoke(element, 119 new Object [] { value }); 120 } catch (Exception e) { 121 Policy.getLog().log( 122 new Status(IStatus.ERROR, Policy.JFACE, IStatus.ERROR, 123 "cannot set value", e)); } 125 } 126 127 protected Object [] doGetMappingValues(Object element, int[] indices) { 128 Object [] result = new Object [indices.length]; 129 for (int i = 0; i < result.length; i++) { 130 if(indices[i] < propertyDescriptors.length) { 131 result[i] = doGetMappingValue(element, 132 propertyDescriptors[indices[i]]); 133 } else { 134 result[i] = null; 135 } 136 } 137 return result; 138 } 139 140 public Object [] getValueTypes() { 141 Class [] result = new Class [propertyDescriptors.length]; 142 for (int i = 0; i < result.length; i++) { 143 result[i] = propertyDescriptors[i].getPropertyType(); 144 } 145 return result; 146 } 147 148 } 149 | Popular Tags |