blob: 6b2462f088d5b7e42a3bd0a849c004e20bca381e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 The University of York.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Dimitrios Kolovos - initial API and implementation
******************************************************************************/
package org.eclipse.epsilon.emc.plainxml;
import java.util.ArrayList;
import java.util.Collection;
public class LoudList<E> extends ArrayList<E> {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
LoudList<Integer> list = new LoudList<>();
list.addListener(new LoudListListener<Integer>() {
public void objectRemoved(LoudList<Integer> list, Integer o, int index) {
System.err.println("Removed " + o + "->" + index);
}
public void objectRemoved(LoudList<Integer> list, Integer o) {
System.err.println("Removed " + o);
}
public void objectAdded(LoudList<Integer> list, Integer o, int index) {
// TODO Auto-generated method stub
}
public void objectAdded(LoudList<Integer> list, Integer o) {
System.err.println("Added " + o);
}
});
list.add(1);
list.add(1);
list.remove(1);
list.add(2);
list.clear();
}
protected ArrayList<LoudListListener<E>> listeners = new ArrayList<>();
protected boolean unique = false;
public void addListener(LoudListListener<E> listener) {
this.listeners.add(listener);
}
public boolean removeListener(LoudListListener<E> listener) {
return this.listeners.remove(listener);
}
public void setUnique(boolean unique) {
this.unique = unique;
}
public boolean isUnique() {
return unique;
}
@Override
public boolean add(E e) {
if (unique && contains(e)) return false;
boolean result = super.add(e);
for (LoudListListener<E> listener : listeners) {
listener.objectAdded(this, e);
}
return result;
}
@Override
public void add(int index, E element) {
if (unique && contains(element)) return;
super.add(index, element);
for (LoudListListener<E> listener : listeners) {
listener.objectAdded(this, element, index);
}
}
@Override
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E o : c) {
modified = modified || add(o);
}
return modified;
}
@Override
public boolean addAll(int index, Collection<? extends E> c) {
for (E o : c) {
add(index, o);
}
return true;
}
@Override
public void clear() {
ArrayList<E> temp = new ArrayList<>();
temp.addAll(this);
super.clear();
for (E o : temp) {
for (LoudListListener<E> listener : listeners) {
listener.objectRemoved(this, o);
}
}
}
@SuppressWarnings("unchecked")
@Override
public boolean remove(Object o) {
boolean result = super.remove(o);
for (LoudListListener<E> listener : listeners) {
listener.objectRemoved(this, (E) o);
}
return result;
}
@Override
public E remove(int index) {
E removed = super.remove(index);
for (LoudListListener<E> listener : listeners) {
listener.objectRemoved(this, removed, index);
}
return removed;
}
@Override
public boolean removeAll(Collection<?> c) {
boolean modified = false;
for (Object o : c) {
modified = modified || remove(o);
}
return modified;
}
@Override
public boolean retainAll(Collection<?> c) {
throw new UnsupportedOperationException();
}
@Override
public E set(int index, E element) {
E oldValue = get(index);
if (element != oldValue) {
remove(index);
add(index, element);
}
return oldValue;
}
}