]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultListView.java
Update headers
[gpl/argeo-slc.git] / eclipse / plugins / org.argeo.slc.client.ui / src / main / java / org / argeo / slc / client / ui / views / JcrResultListView.java
index a886e050cd45a62bed707649a82f74dce3fff319..322256b7194caf56c8d68c5e7f82676618757151 100644 (file)
@@ -1,3 +1,18 @@
+/*
+ * Copyright (C) 2007-2012 Mathieu Baudier
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.argeo.slc.client.ui.views;
 
 import java.text.DateFormat;
@@ -7,16 +22,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 +40,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 +50,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 +69,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 +100,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 +121,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 +162,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 +191,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 +199,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 +214,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 +234,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<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;
                                }
-                       } catch (Exception e) {
-                               throw new SlcException("Cannot open " + obj, e);
                        }
+                       return false;
+               }
+
+               protected void onEventInUiThread(List<Event> events)
+                               throws RepositoryException {
+                       if (getLog().isTraceEnabled())
+                               getLog().trace("Refresh result list");
+                       viewer.refresh();
                }
 
        }