package org.openflexo.toolbox;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
public class PropertyChangeListenerRegistrationManager {
private List<PropertyChangeListenerRegistration> registrations;
public PropertyChangeListenerRegistrationManager() {
registrations = new Vector<PropertyChangeListenerRegistrationManager.PropertyChangeListenerRegistration>();
}
public boolean hasListener(String propertyName, PropertyChangeListener listener, HasPropertyChangeSupport hasPropertyChangeSupport) {
for (PropertyChangeListenerRegistration registration : registrations) {
if (registration.hasPropertyChangeSupport == hasPropertyChangeSupport && registration.listener == listener
&& registration.propertyName == null && propertyName == null || registration.propertyName != null
&& registration.propertyName.equals(propertyName)) {
return true;
}
}
return false;
}
public void delete() {
for (PropertyChangeListenerRegistration registration : new ArrayList<PropertyChangeListenerRegistration>(registrations)) {
registration.removeListener();
}
// Just to be sure
registrations.clear();
}
public class PropertyChangeListenerRegistration {
private final String propertyName;
private final PropertyChangeListener listener;
private final HasPropertyChangeSupport hasPropertyChangeSupport;
public PropertyChangeListenerRegistration(PropertyChangeListener listener, HasPropertyChangeSupport hasPropertyChangeSupport) {
this(null, listener, hasPropertyChangeSupport);
}
public PropertyChangeListenerRegistration(String propertyName, PropertyChangeListener listener,
HasPropertyChangeSupport hasPropertyChangeSupport) {
this.propertyName = propertyName;
this.listener = listener;
this.hasPropertyChangeSupport = hasPropertyChangeSupport;
if (propertyName != null) {
hasPropertyChangeSupport.getPropertyChangeSupport().addPropertyChangeListener(propertyName, listener);
} else {
hasPropertyChangeSupport.getPropertyChangeSupport().addPropertyChangeListener(listener);
}
registrations.add(this);
}
public void removeListener() {
if (propertyName != null) {
hasPropertyChangeSupport.getPropertyChangeSupport().removePropertyChangeListener(propertyName, listener);
} else {
hasPropertyChangeSupport.getPropertyChangeSupport().removePropertyChangeListener(listener);
}
registrations.remove(this);
}
}
public void addListener(PropertyChangeListener listener, HasPropertyChangeSupport hasPropertyChangeSupport) {
addListener(null, listener, hasPropertyChangeSupport);
}
public void addListener(String propertyName, PropertyChangeListener listener, HasPropertyChangeSupport hasPropertyChangeSupport) {
new PropertyChangeListenerRegistration(propertyName, listener, hasPropertyChangeSupport);
}
public void removeListener(PropertyChangeListener listener, HasPropertyChangeSupport hasPropertyChangeSupport) {
removeListener(null, listener, hasPropertyChangeSupport);
}
public void removeListener(String propertyName, PropertyChangeListener listener, HasPropertyChangeSupport hasPropertyChangeSupport) {
Iterator<PropertyChangeListenerRegistration> i = registrations.iterator();
while (i.hasNext()) {
PropertyChangeListenerRegistration r = i.next();
if (r.hasPropertyChangeSupport == hasPropertyChangeSupport
&& (r.propertyName == null && propertyName == null || propertyName != null && propertyName.equals(r.propertyName))
&& r.listener == listener) {
i.remove();
}
}
}
}