import javax.jcr.Node;
import javax.jcr.NodeIterator;
-import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.observation.Event;
-import javax.jcr.observation.EventIterator;
import javax.jcr.observation.EventListener;
import javax.jcr.observation.ObservationManager;
import javax.jcr.query.Query;
import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;
+import org.argeo.eclipse.ui.jcr.NodeElementComparer;
import org.argeo.jcr.JcrUtils;
import org.argeo.slc.SlcException;
import org.argeo.slc.client.ui.editors.ProcessEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbenchPage;
private DateFormat dateFormat = new SimpleDateFormat(
"EEE, dd MMM yyyy HH:mm:ss");
- private Integer queryLimit = 100;
+ private Integer queryLimit = 2000;
public void createPartControl(Composite parent) {
+
Table table = createTable(parent);
viewer = new TableViewer(table);
viewer.setLabelProvider(createLabelProvider());
viewer.setContentProvider(new ViewContentProvider());
viewer.setInput(getViewSite());
viewer.addDoubleClickListener(new ViewDoubleClickListener());
+ viewer.setComparer(new NodeElementComparer());
- resultsObserver = new AsyncUiEventListener() {
- protected void onEventInUiThread(EventIterator events) {
- // TODO optimize by updating only the changed result
- viewer.refresh();
- }
- };
+ getViewSite().setSelectionProvider(viewer);
+
+ resultsObserver = new ResultObserver(viewer.getTable().getDisplay());
try {
ObservationManager observationManager = session.getWorkspace()
.getObservationManager();
+ String[] nodeTypes = { SlcTypes.SLC_RESULT };
+ // FIXME Will not be notified if empty result is deleted
observationManager.addEventListener(resultsObserver,
- Event.NODE_ADDED | Event.NODE_REMOVED
- | Event.PROPERTY_CHANGED,
- SlcJcrConstants.RESULTS_BASE_PATH, true, null, null, false);
+ Event.PROPERTY_ADDED | Event.NODE_REMOVED,
+ SlcJcrConstants.RESULTS_BASE_PATH, true, null, nodeTypes,
+ false);
} catch (RepositoryException e) {
throw new SlcException("Cannot register listeners", e);
}
}
protected Table createTable(Composite parent) {
- int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL
- | SWT.FULL_SELECTION;
+ int style = SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL
+ | SWT.FULL_SELECTION | SWT.MULTI;
// does not work with RAP, commented for the time being
// | SWT.HIDE_SELECTION;
return table;
}
+ // public void refresh() {
+ // viewer.refresh();
+ // }
+
/*
* METHODS TO BE OVERRIDDEN
*/
try {
if (obj instanceof Node) {
Node node = (Node) obj;
+ // FIXME: open a default result editor
if (node.isNodeType(SlcTypes.SLC_PROCESS)) {
IWorkbenchPage activePage = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage();
switch (index) {
case 0:
- return dateFormat.format(node
- .getProperty(Property.JCR_LAST_MODIFIED).getDate()
- .getTime());
+ if (node.hasProperty(SLC_COMPLETED)) {
+ return dateFormat
+ .format(node.getProperty(SLC_COMPLETED)
+ .getDate().getTime());
+ } else {
+ return "OPEN";
+ }
case 1:
return node.getProperty(SlcNames.SLC_UUID).getString();
}
}
+ class ResultObserver extends AsyncUiEventListener {
+
+ public ResultObserver(Display display) {
+ super(display);
+ }
+
+ @Override
+ protected Boolean willProcessInUiThread(List<Event> events)
+ throws RepositoryException {
+ for (Event event : events) {
+ // getLog().debug("Received event " + event);
+ int eventType = event.getType();
+ if (eventType == Event.NODE_REMOVED)
+ return true;
+ String path = event.getPath();
+ int index = path.lastIndexOf('/');
+ String propertyName = path.substring(index + 1);
+ if (propertyName.equals(SLC_COMPLETED)
+ || propertyName.equals(SLC_UUID)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected void onEventInUiThread(List<Event> events)
+ throws RepositoryException {
+ if (getLog().isTraceEnabled())
+ getLog().trace("Refresh result list");
+ viewer.refresh();
+ }
+
+ }
+
public void setSession(Session session) {
this.session = session;
}