package org.marketcetera.photon.ui;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Display;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.TransformedList;
import ca.odell.glazedlists.event.ListEvent;
import ca.odell.glazedlists.event.ListEventListener;
import ca.odell.glazedlists.swt.GlazedListsSWT;
public class EventListContentProvider<T> implements IStructuredContentProvider, ListEventListener<T> {
TransformedList<T, T> swtList;
private IndexedTableViewer viewer;
public Object[] getElements(Object inputElement) {
if (swtList != null){
try {
swtList.getReadWriteLock().readLock().lock();
return swtList.toArray();
} finally {
swtList.getReadWriteLock().readLock().unlock();
}
} else {
return new Object[0];
}
}
public void dispose() {
if (swtList != null){
swtList.removeListEventListener(this);
}
}
@SuppressWarnings("unchecked") //$NON-NLS-1$
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
this.viewer = (IndexedTableViewer) viewer;
if(swtList != null){
swtList.removeListEventListener(this);
swtList.dispose();
swtList = null;
}
if (newInput == null){
viewer.refresh();
} else {
swtList = GlazedListsSWT.swtThreadProxyList((EventList<T>) newInput, Display.getDefault());
swtList.addListEventListener(this);
}
}
public void listChanged(ListEvent<T> event) {
try {
swtList.getReadWriteLock().readLock().lock();
if (event.isReordering()){
viewer.refresh();
} else {
while (event.next()){
int index = event.getIndex();
switch (event.getType()){
case ListEvent.DELETE:
viewer.remove(index);
break;
case ListEvent.INSERT:
viewer.insert(swtList.get(index), index);
break;
case ListEvent.UPDATE:
viewer.replace(swtList.get(index), index);
break;
default:
}
}
}
} finally {
swtList.getReadWriteLock().readLock().unlock();
}
}
}