/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Observable;
public class ObservableList<K> extends Observable implements List<K> {
private List<K> list;
public enum Event {
add,
append,
remove,
clear,
}
public ObservableList() {
list = new ArrayList<K>();
}
public ObservableList(List<K> list) {
assert list != null : "List cannot be null";
this.list = list;
}
@Override
public List<K> subList(int fromIndex, int toIndex) {
return list.subList(fromIndex, toIndex);
}
// Improper Override annotation @Override
public void sort(Comparator<? super K> comparitor) {
Collections.sort(list, comparitor);
}
@Override
public boolean contains(Object item) {
return list.contains(item);
}
@Override
public int indexOf(Object item) {
return list.indexOf(item);
}
@Override
public K get(int i) {
return list.get(i);
}
@Override
public boolean add(K item) {
boolean b=list.add(item);
fireUpdate(Event.append, item);
return b;
}
@Override
public void add(int index, K element) {
list.add(index, element);
fireUpdate((index == list.size() ? Event.append : Event.add), element);
}
@Override
public boolean remove(Object item) {
boolean b=list.remove(item);
fireUpdate(Event.remove, item);
return b;
}
@Override
public K remove(int i) {
K source = list.remove(i);
fireUpdate(Event.remove, source);
return source;
}
@Override
public void clear() {
list.clear();
fireUpdate(Event.clear, null);
}
@Override
public int size() {
return list.size();
}
////
// INTERNAL
protected void fireUpdate(Event event, Object source) {
setChanged();
notifyObservers(event);
}
public class ObservableEvent {
private Event event;
private K source;
public ObservableEvent(Event event, K source) {
this.event = event;
this.source = source;
}
public Event getEvent() {
return event;
}
public K getSource() {
return source;
}
}
/**
* Get an iterator over the items in the list.
*
* @return An iterator over the displayed list.
*/
@Override
public Iterator<K> iterator() {
return list.iterator();
}
@Override
public boolean addAll(Collection<? extends K> c) {
boolean b=list.addAll(c);
for(K k:c)
fireUpdate(Event.add, c);
return b;
}
@Override
public boolean addAll(int index, Collection<? extends K> c) {
boolean b=list.addAll(index,c);
for(K k:c)
fireUpdate(Event.add, c);
return b;
}
@Override
public boolean containsAll(Collection<?> c) {
return list.containsAll(c);
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
@Override
public int lastIndexOf(Object o) {
return list.lastIndexOf(o);
}
@Override
public ListIterator<K> listIterator() {
return list.listIterator();
}
@Override
public ListIterator<K> listIterator(int index) {
return list.listIterator(index);
}
@Override
public boolean removeAll(Collection<?> c) {
boolean b=list.removeAll(c);
for(Object o:c)
fireUpdate(Event.remove, o);
return b;
}
@Override
public boolean retainAll(Collection<?> c) {
throw new UnsupportedOperationException();
}
@Override
public K set(int index, K element) {
K old=list.set(index, element);
if(old!=null)
fireUpdate(Event.remove, old);
fireUpdate(Event.add, element);
return old;
}
@Override
public Object[] toArray() {
return list.toArray();
}
@Override
public <T> T[] toArray(T[] a) {
return list.toArray(a);
}
}