1 19 20 package org.netbeans.spi.project.support.ant; 21 22 import java.util.ArrayList ; 23 import java.util.List ; 24 import java.util.Map ; 25 import javax.swing.event.ChangeEvent ; 26 import javax.swing.event.ChangeListener ; 27 import org.openide.util.WeakListeners; 28 29 34 public abstract class FilterPropertyProvider implements PropertyProvider { 35 36 private PropertyProvider delegate; 37 private final List <ChangeListener > listeners = new ArrayList <ChangeListener >(); 38 private final ChangeListener strongListener = new ChangeListener () { 39 public void stateChanged(ChangeEvent e) { 40 fireChange(); 42 } 43 }; 44 private ChangeListener weakListener = null; 46 50 protected FilterPropertyProvider(PropertyProvider delegate) { 51 assert delegate != null; 52 setDelegate(delegate); 53 } 54 55 59 protected final void setDelegate(PropertyProvider delegate) { 60 if (delegate == this.delegate) { 61 return; 62 } 63 if (this.delegate != null) { 64 assert weakListener != null; 65 this.delegate.removeChangeListener(weakListener); 66 } 67 this.delegate = delegate; 68 weakListener = WeakListeners.change(strongListener, delegate); 69 delegate.addChangeListener(weakListener); 70 fireChange(); 71 } 72 73 public final Map <String , String > getProperties() { 74 return delegate.getProperties(); 75 } 76 77 public final synchronized void addChangeListener(ChangeListener listener) { 78 listeners.add(listener); 80 } 81 82 public final synchronized void removeChangeListener(ChangeListener listener) { 83 listeners.add(listener); 84 } 85 86 private void fireChange() { 87 ChangeListener [] ls; 88 synchronized (this) { 89 if (listeners.isEmpty()) { 90 return; 91 } 92 ls = listeners.toArray(new ChangeListener [listeners.size()]); 93 } 94 ChangeEvent ev = new ChangeEvent (this); 95 for(ChangeListener l : ls) { 96 l.stateChanged(ev); 97 } 98 } 99 100 } 101 | Popular Tags |