X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=eclipse%2Fplugins%2Forg.argeo.slc.client.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fviews%2FJcrResultListView.java;h=06a4289746df118d9dab892db7efe0e8d1855cd7;hb=a04bdc0fac50a960370e068bf854a83e503b0ab7;hp=a886e050cd45a62bed707649a82f74dce3fff319;hpb=a0e8f9b4d92028975baaba0317899536045804c8;p=gpl%2Fargeo-slc.git diff --git a/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultListView.java b/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultListView.java index a886e050c..06a428974 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultListView.java +++ b/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultListView.java @@ -7,16 +7,15 @@ import java.util.List; 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; @@ -26,6 +25,7 @@ import org.argeo.slc.jcr.SlcNames; 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; @@ -35,6 +35,7 @@ import org.eclipse.jface.viewers.Viewer; 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; @@ -53,29 +54,29 @@ public class JcrResultListView extends ViewPart implements SlcNames { 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); @@ -84,9 +85,9 @@ public class JcrResultListView extends ViewPart implements SlcNames { } 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); @@ -105,6 +106,37 @@ public class JcrResultListView extends ViewPart implements SlcNames { 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(); } @@ -115,7 +147,7 @@ public class JcrResultListView extends ViewPart implements SlcNames { super.dispose(); } - class ContentProvider implements IStructuredContentProvider { + class ViewContentProvider implements IStructuredContentProvider { public Object[] getElements(Object inputElement) { try { @@ -144,7 +176,7 @@ public class JcrResultListView extends ViewPart implements SlcNames { } - class LabelProvider extends ColumnLabelProvider implements + class ViewLabelProvider extends ColumnLabelProvider implements ITableLabelProvider { public Image getColumnImage(Object obj, int columnIndex) { @@ -152,7 +184,7 @@ public class JcrResultListView extends ViewPart implements SlcNames { return null; try { Node node = (Node) obj; - if(node.hasProperty(SLC_COMPLETED)){ + if (node.hasProperty(SLC_COMPLETED)) { // TODO } return null; @@ -167,9 +199,13 @@ public class JcrResultListView extends ViewPart implements SlcNames { 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(); } @@ -183,22 +219,41 @@ public class JcrResultListView extends ViewPart implements SlcNames { 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 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; } - } catch (Exception e) { - throw new SlcException("Cannot open " + obj, e); } + return false; + } + + protected void onEventInUiThread(List events) + throws RepositoryException { + if (getLog().isTraceEnabled()) + getLog().trace("Refresh result list"); + viewer.refresh(); } }