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.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.argeo.slc.jcr.SlcTypes;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
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(new LabelProvider());
- viewer.setContentProvider(new ContentProvider());
+ 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,
+ 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;
- // does not function with RAP, commented for the time being
+ 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;
Table table = new Table(parent, style);
return table;
}
+ // public void refresh() {
+ // viewer.refresh();
+ // }
+
+ /*
+ * METHODS TO BE OVERRIDDEN
+ */
+ protected IBaseLabelProvider createLabelProvider() {
+ return new ViewLabelProvider();
+ }
+
+ protected void processDoubleClick(DoubleClickEvent evt) {
+ Object obj = ((IStructuredSelection) evt.getSelection())
+ .getFirstElement();
+ 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();
+ activePage.openEditor(
+ new ProcessEditorInput(node.getPath()),
+ ProcessEditor.ID);
+ }
+ }
+ } catch (Exception e) {
+ throw new SlcException("Cannot open " + obj, e);
+ }
+ }
+
public void setFocus() {
viewer.getControl().setFocus();
}
super.dispose();
}
- class ContentProvider implements IStructuredContentProvider {
+ class ViewContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
try {
}
- class LabelProvider extends ColumnLabelProvider implements
+ class ViewLabelProvider extends ColumnLabelProvider implements
ITableLabelProvider {
public Image getColumnImage(Object obj, int columnIndex) {
return null;
try {
Node node = (Node) obj;
- if(node.hasProperty(SLC_COMPLETED)){
+ if (node.hasProperty(SLC_COMPLETED)) {
// TODO
}
return null;
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 ViewDoubleClickListener implements IDoubleClickListener {
public void doubleClick(DoubleClickEvent evt) {
- Object obj = ((IStructuredSelection) evt.getSelection())
- .getFirstElement();
- try {
- if (obj instanceof Node) {
- Node node = (Node) obj;
- if (node.isNodeType(SlcTypes.SLC_PROCESS)) {
- IWorkbenchPage activePage = PlatformUI.getWorkbench()
- .getActiveWorkbenchWindow().getActivePage();
- activePage.openEditor(
- new ProcessEditorInput(node.getPath()),
- ProcessEditor.ID);
- }
+ processDoubleClick(evt);
+ }
+
+ }
+
+ 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;
+ // if (event.getType() == Event.PROPERTY_ADDED) {
+ String path = event.getPath();
+ // getLog().debug(path);
+ int index = path.lastIndexOf('/');
+ String propertyName = path.substring(index + 1);
+ // Property property = session.getProperty(path);
+ // if (!property.getName().equals(SLC_COMPLETED))
+ // return true;
+ if (propertyName.equals(SLC_COMPLETED)
+ || propertyName.equals(SLC_UUID)) {
+ // getLog().debug("Kept " + propertyName);
+ return true;
+ } else {
+ // getLog().debug("Skipped " + propertyName);
}
- } catch (Exception e) {
- throw new SlcException("Cannot open " + obj, e);
+ // } else if (eventType == Event.NODE_ADDED
+ // || eventType == Event.NODE_MOVED
+ // || eventType == Event.NODE_REMOVED) {
+ // return true;
+ // } else {
+ // }
}
+ return false;
+ }
+
+ protected void onEventInUiThread(List<Event> events)
+ throws RepositoryException {
+ if (getLog().isDebugEnabled())
+ getLog().debug("Refresh result list");
+ viewer.refresh();
}
}