1 11 package org.eclipse.core.internal.databinding.internal.beans; 12 13 import java.beans.PropertyChangeEvent ; 14 import java.beans.PropertyChangeListener ; 15 import java.lang.reflect.InvocationTargetException ; 16 import java.lang.reflect.Method ; 17 import java.util.HashSet ; 18 import java.util.Iterator ; 19 import java.util.Set ; 20 21 import org.eclipse.core.databinding.beans.BeansObservables; 22 import org.eclipse.core.databinding.util.Policy; 23 import org.eclipse.core.runtime.Assert; 24 import org.eclipse.core.runtime.IStatus; 25 import org.eclipse.core.runtime.Status; 26 27 33 public class ListenerSupport { 34 35 private Set elementsListenedTo = new HashSet (); 36 37 private PropertyChangeListener listener; 38 39 private String propertyName; 40 41 50 public ListenerSupport(final PropertyChangeListener listener, 51 final String propertyName) { 52 Assert.isNotNull(listener); 53 Assert.isNotNull(propertyName); 54 55 this.propertyName = propertyName; 56 this.listener = new PropertyChangeListener () { 57 public void propertyChange(PropertyChangeEvent evt) { 58 if (propertyName.equals(evt.getPropertyName())) { 59 listener.propertyChange(evt); 60 } 61 } 62 }; 63 } 64 65 70 public void hookListener(Object target) { 71 if (processListener( 72 "addPropertyChangeListener", "Could not attach listener to ", target)) { elementsListenedTo.add(new IdentityWrapper(target)); 74 } 75 } 76 77 84 public void setHookTargets(Object [] targets) { 85 Set elementsToUnhook = new HashSet (elementsListenedTo); 86 if (targets!=null) { 87 for (int i = 0; i < targets.length; i++) { 88 Object newValue = targets[i]; 89 IdentityWrapper identityWrapper = new IdentityWrapper(newValue); 90 if(!elementsToUnhook.remove(identityWrapper)) 91 hookListener(newValue); 92 } 93 } 94 95 for (Iterator it = elementsToUnhook.iterator(); it.hasNext();) { 96 Object o = it.next(); 97 if (o.getClass()!=IdentityWrapper.class) 98 o = new IdentityWrapper(o); 99 elementsListenedTo.remove(o); 100 unhookListener(o); 101 } 102 } 103 104 109 public void unhookListener(Object target) { 110 if (target.getClass() == IdentityWrapper.class) 111 target = ((IdentityWrapper) target).unwrap(); 112 113 if (processListener( 114 "removePropertyChangeListener", "Cound not remove listener from ", target)) { elementsListenedTo.remove(new IdentityWrapper(target)); 116 } 117 } 118 119 120 123 public void dispose() { 124 if (elementsListenedTo!=null) { 125 Object [] targets = elementsListenedTo.toArray(); 126 for (int i = 0; i < targets.length; i++) { 127 unhookListener(targets[i]); 128 } 129 elementsListenedTo=null; 130 listener=null; 131 } 132 } 133 134 137 public Object [] getHookedTargets() { 138 Object [] targets = null; 139 if (elementsListenedTo!=null && elementsListenedTo.size()>0) { 140 Object [] identityList = elementsListenedTo.toArray(); 141 targets = new Object [identityList.length]; 142 for (int i = 0; i < identityList.length; i++) 143 targets[i]=((IdentityWrapper)identityList[i]).unwrap(); 144 } 145 return targets; 146 } 147 148 162 private boolean processListener(String methodName, String message, 163 Object target) { 164 Method method = null; 165 Object [] parameters = null; 166 167 try { 168 try { 169 method = target.getClass().getMethod( 170 methodName, 171 new Class [] { String .class, 172 PropertyChangeListener .class }); 173 174 parameters = new Object [] { propertyName, listener }; 175 } catch (NoSuchMethodException e) { 176 method = target.getClass().getMethod(methodName, 177 new Class [] { PropertyChangeListener .class }); 178 179 parameters = new Object [] { listener }; 180 } 181 } catch (SecurityException e) { 182 } catch (NoSuchMethodException e) { 184 log(IStatus.WARNING, message + target, e); 185 } 186 187 if (method != null) { 188 if (!method.isAccessible()) { 189 method.setAccessible(true); 190 } 191 try { 192 method.invoke(target, parameters); 193 return true; 194 } catch (IllegalArgumentException e) { 195 log(IStatus.WARNING, message + target, e); 196 } catch (IllegalAccessException e) { 197 log(IStatus.WARNING, message + target, e); 198 } catch (InvocationTargetException e) { 199 log(IStatus.WARNING, message + target, e); 200 } 201 } 202 return false; 203 } 204 205 208 private void log(int severity, String message, Throwable throwable) { 209 if (BeansObservables.DEBUG) { 210 Policy.getLog().log( 211 new Status(severity, Policy.JFACE_DATABINDING, IStatus.OK, 212 message, throwable)); 213 } 214 } 215 } 216 | Popular Tags |