package com.netifera.platform.ui.spaces.table; import org.eclipse.jface.viewers.AbstractTableViewer; import org.eclipse.jface.viewers.ILazyContentProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.Viewer; import com.netifera.platform.api.events.IEvent; import com.netifera.platform.api.events.IEventHandler; import com.netifera.platform.api.model.ISpace; import com.netifera.platform.api.model.ISpaceContentChangeEvent; import com.netifera.platform.ui.updater.TableUpdater; public class SpaceTableContentProvider implements ILazyContentProvider, IStructuredContentProvider { // private static final boolean SORT = true; private ISpace space; private AbstractTableViewer viewer; private TableUpdater updater; private IEventHandler spaceListener; // private static Comparator<IShadowEntity> shadowEntityComparator = new EntityComparator(); public Object[] getElements(Object input) { if (input instanceof ISpace) { return ((ISpace)input).getEntities().toArray(); } return new Object[0]; } public void updateElement(int index) { if (viewer != null && space != null) { int inputSize = space.entityCount(); /* * this is a hack? if the virtual table is empty as a result of * being filtered then when the filters are removed the table is not * updated and remains empty. */ if (inputSize == 0) { updater.setItemCount(1); return; } updater.setItemCount(inputSize); if (index < inputSize) { updater.replace(space.getEntities().get(index), index); } } } public void dispose() { if(updater != null) { updater.dispose(); } updater = null; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { if ((newInput == oldInput) || viewer == null) { return; } if(!validInputChange(viewer, newInput)) { return; } if(updater != null) { updater.dispose(); } if(space != null && spaceListener != null) { space.removeChangeListener(spaceListener); } this.viewer = (AbstractTableViewer) viewer; this.space = (ISpace) newInput; this.spaceListener = createSpaceListener(); this.space.addChangeListener(spaceListener); /* get update wrapper for the viewer, creating it the first time */ updater = TableUpdater.get(this.viewer); updater.setItemCount(space.entityCount()); } private boolean validInputChange(Viewer viewer, Object newInput) { return (viewer instanceof AbstractTableViewer) && (newInput instanceof ISpace); } private IEventHandler createSpaceListener() { return new IEventHandler() { public void handleEvent(IEvent event) { if(event instanceof ISpaceContentChangeEvent) { if (!((ISpaceContentChangeEvent)event).isUpdateEvent()) { updater.setItemCount(space.entityCount()); } else { // updater.refresh(); //XXX is this right? } } } }; } }