package org.csstudio.sds.ui.internal.viewer;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.viewers.IStructuredSelection;
/**
* A selection implementation that references selected objects only weak, using
* {@link WeakReference} instances.
*
* @author swende
*
*/
public class WeakStructuredSelection implements IStructuredSelection {
private List<WeakReference> weakList;
public WeakStructuredSelection(IStructuredSelection originalSelection) {
List originalList = originalSelection.toList();
if (originalList != null) {
weakList = new ArrayList<WeakReference>();
for (Object o : originalList) {
weakList.add(new WeakReference<Object>(o));
}
}
}
@Override
public boolean isEmpty() {
return getAlive().isEmpty();
}
@Override
public Object getFirstElement() {
List<Object> alive = getAlive();
return alive.isEmpty() ? null : alive.get(0);
}
@Override
public Iterator<Object> iterator() {
return getAlive().iterator();
}
@Override
public int size() {
return getAlive().size();
}
@Override
public Object[] toArray() {
return getAlive().toArray();
}
@Override
public List<Object> toList() {
return getAlive();
}
private List<Object> getAlive() {
List<Object> result = new ArrayList<Object>();
if (weakList != null) {
for (WeakReference<Object> wr : weakList) {
Object o = wr.get();
if (o != null) {
result.add(o);
}
}
}
return result;
}
}