/*******************************************************************************
* Copyright (c) 2008, 2015 Matthew Hall and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Matthew Hall - initial API and implementation (bug 237718)
* Stefan Xenos <sxenos@gmail.com> - Bug 335792
******************************************************************************/
package org.eclipse.core.databinding.observable;
import java.util.Collection;
import java.util.Iterator;
/**
* An observable collection which decorates another observable collection
*
* @param <E>
*
* @since 1.2
*/
public class DecoratingObservableCollection<E> extends DecoratingObservable implements IObservableCollection<E> {
private IObservableCollection<E> decorated;
/**
* @param decorated
* @param disposeDecoratedOnDispose
*/
public DecoratingObservableCollection(IObservableCollection<E> decorated,
boolean disposeDecoratedOnDispose) {
super(decorated, disposeDecoratedOnDispose);
this.decorated = decorated;
}
@Override
public boolean add(E o) {
getterCalled();
return decorated.add(o);
}
@Override
public boolean addAll(Collection<? extends E> c) {
getterCalled();
return decorated.addAll(c);
}
@Override
public void clear() {
checkRealm();
decorated.clear();
}
@Override
public boolean contains(Object o) {
getterCalled();
return decorated.contains(o);
}
@Override
public boolean containsAll(Collection<?> c) {
getterCalled();
return decorated.containsAll(c);
}
@Override
public boolean isEmpty() {
getterCalled();
return decorated.isEmpty();
}
@Override
public Iterator<E> iterator() {
getterCalled();
final Iterator<E> decoratedIterator = decorated.iterator();
return new Iterator<E>() {
@Override
public void remove() {
decoratedIterator.remove();
}
@Override
public boolean hasNext() {
getterCalled();
return decoratedIterator.hasNext();
}
@Override
public E next() {
getterCalled();
return decoratedIterator.next();
}
};
}
@Override
public boolean remove(Object o) {
getterCalled();
return decorated.remove(o);
}
@Override
public boolean removeAll(Collection<?> c) {
getterCalled();
return decorated.removeAll(c);
}
@Override
public boolean retainAll(Collection<?> c) {
getterCalled();
return decorated.retainAll(c);
}
@Override
public int size() {
getterCalled();
return decorated.size();
}
@Override
public Object[] toArray() {
getterCalled();
return decorated.toArray();
}
@Override
public <T> T[] toArray(T[] a) {
getterCalled();
return decorated.toArray(a);
}
@Override
public Object getElementType() {
return decorated.getElementType();
}
@Override
public boolean equals(Object obj) {
getterCalled();
if (this == obj) {
return true;
}
return decorated.equals(obj);
}
@Override
public int hashCode() {
getterCalled();
return decorated.hashCode();
}
@Override
public String toString() {
getterCalled();
return decorated.toString();
}
@Override
public synchronized void dispose() {
decorated = null;
super.dispose();
}
}