package com.netifera.platform.ui.tasks.list;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.StructuredViewer;
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.ISpaceTaskChangeEvent;
import com.netifera.platform.api.tasks.ITaskRecord;
import com.netifera.platform.ui.updater.StructuredViewerUpdater;
/**
* @author kevin
*
*/
public class TaskContentProvider implements IStructuredContentProvider {
private ISpace currentSpace;
private StructuredViewer viewer;
private StructuredViewerUpdater updater;
private static final Object[] NO_ELEMENTS = new Object[0];
private TasksView view;
final private IEventHandler taskChangeHandler = new IEventHandler() {
public void handleEvent(IEvent event) {
if(event instanceof ISpaceTaskChangeEvent) {
handleTaskChanged((ISpaceTaskChangeEvent) event);
}
}
};
public TaskContentProvider(TasksView view) {
this.view = view;
}
public Object[] getElements(Object inputElement) {
if(inputElement instanceof ISpace) {
return ((ISpace)inputElement).getTasks().toArray();
}
return NO_ELEMENTS;
}
public void dispose() {
if(currentSpace != null) {
currentSpace.removeTaskChangeListener(taskChangeHandler);
}
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if(!(newInput instanceof ISpace) || (newInput == oldInput) || viewer == null) {
return;
}
if(currentSpace != null) {
currentSpace.removeTaskChangeListener(taskChangeHandler);
currentSpace = null;
}
if(this.viewer != viewer) {
if(!(viewer instanceof StructuredViewer)) {
throw new IllegalArgumentException("TaskContentProvider should be used with Structured viewers only");
}
this.viewer = (StructuredViewer)viewer;
/* get update wrapper for the viewer, creating it the first time */
updater = StructuredViewerUpdater.get(this.viewer);
}
currentSpace = (ISpace) newInput;
currentSpace.addTaskChangeListener(taskChangeHandler);
updateViewActivity(null);
}
private void handleTaskChanged(final ISpaceTaskChangeEvent event) {
if(viewer.getControl().isDisposed()) {
dispose();
return;
}
if(event.isCreationEvent()) {
updater.refresh();
}
else if(event.isUpdateEvent()){
updater.refresh(event.getTask());
}
updateViewActivity(event.getTask());
}
private void updateViewActivity(final ITaskRecord task) {
if (view == null)
return;
updater.asyncExec(new Runnable() {
public void run() {
if (task != null && (task.isRunning() || task.isWaiting())) {
view.setActive(true);
} else {
for (ITaskRecord any: currentSpace.getTasks()) {
if (any.isRunning() || any.isWaiting()) {
view.setActive(true);
return;
}
}
view.setActive(false);
}
}
});
}
}