package com.revolsys.collection;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.Collection;
import com.revolsys.beans.PropertyChangeSupportProxy;
public class PropertyChangeArrayList<T> extends ArrayList<T>
implements PropertyChangeListener, PropertyChangeSupportProxy {
private static final long serialVersionUID = 1L;
private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
public PropertyChangeArrayList() {
}
public PropertyChangeArrayList(final Collection<? extends T> objects) {
super(objects);
}
@Override
public void add(final int index, final T object) {
if (object != null && !contains(object)) {
super.add(index, object);
addListener(object);
this.propertyChangeSupport.fireIndexedPropertyChange("objects", index, null, object);
}
}
@Override
public boolean add(final T object) {
final int index = size();
add(index, object);
return true;
}
@Override
public boolean addAll(final Collection<? extends T> objects) {
boolean added = false;
for (final T object : objects) {
if (add(object)) {
added = true;
}
}
return added;
}
@Override
public boolean addAll(int index, final Collection<? extends T> objects) {
boolean added = false;
for (final T object : objects) {
if (!contains(object)) {
add(index, object);
added = true;
index++;
}
}
return added;
}
protected void addListener(final Object object) {
if (object instanceof PropertyChangeSupportProxy) {
final PropertyChangeSupportProxy proxy = (PropertyChangeSupportProxy)object;
final PropertyChangeSupport propertyChangeSupport = proxy.getPropertyChangeSupport();
if (propertyChangeSupport != null) {
propertyChangeSupport.addPropertyChangeListener(this);
}
}
}
@Override
public boolean equals(final Object other) {
return other == this;
}
@Override
public PropertyChangeSupport getPropertyChangeSupport() {
return this.propertyChangeSupport;
}
@Override
public int hashCode() {
return this.propertyChangeSupport.hashCode();
}
@Override
public void propertyChange(final PropertyChangeEvent event) {
this.propertyChangeSupport.firePropertyChange(event);
}
@Override
public T remove(final int index) {
final T object = super.remove(index);
removeListener(object);
this.propertyChangeSupport.fireIndexedPropertyChange("objects", index, object, null);
return object;
}
@Override
public boolean remove(final Object o) {
final int index = indexOf(o);
if (index < 0) {
return false;
} else {
remove(index);
return true;
}
}
@Override
public boolean removeAll(final Collection<?> c) {
final boolean removed = false;
for (Object object : c) {
if (remove(object)) {
object = true;
}
}
return removed;
}
protected void removeListener(final Object object) {
if (object instanceof PropertyChangeSupportProxy) {
final PropertyChangeSupportProxy proxy = (PropertyChangeSupportProxy)object;
final PropertyChangeSupport propertyChangeSupport = proxy.getPropertyChangeSupport();
if (propertyChangeSupport != null) {
propertyChangeSupport.removePropertyChangeListener(this);
}
}
}
@Override
public T set(final int index, final T value) {
final T oldValue = super.set(index, value);
if (value != oldValue) {
removeListener(oldValue);
this.propertyChangeSupport.fireIndexedPropertyChange("objects", index, oldValue, value);
addListener(value);
}
return oldValue;
}
}