]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionOverviewPage.java
Fix bug 28 (https://www.argeo.org/bugzilla/show_bug.cgi?id=28)
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / editors / DistributionOverviewPage.java
index eb14ae8cbf2cf5fc89e12ed10e1aa0271660fdad..4401f7da9b2574442e296eeeb28d07c61e9eabdc 100644 (file)
@@ -34,16 +34,22 @@ import javax.jcr.query.qom.Selector;
 import javax.jcr.query.qom.StaticOperand;
 
 import org.argeo.ArgeoException;
-import org.argeo.eclipse.ui.ErrorFeedback;
+import org.argeo.ArgeoMonitor;
+import org.argeo.eclipse.ui.EclipseArgeoMonitor;
 import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.SlcException;
 import org.argeo.slc.client.ui.dist.DistConstants;
 import org.argeo.slc.client.ui.dist.DistImages;
 import org.argeo.slc.client.ui.dist.DistPlugin;
+import org.argeo.slc.client.ui.dist.PrivilegedJob;
 import org.argeo.slc.client.ui.dist.commands.DeleteArtifacts;
 import org.argeo.slc.client.ui.dist.utils.CommandHelpers;
 import org.argeo.slc.client.ui.dist.utils.NodeViewerComparator;
 import org.argeo.slc.jcr.SlcNames;
 import org.argeo.slc.jcr.SlcTypes;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
@@ -67,6 +73,7 @@ import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Menu;
 import org.eclipse.swt.widgets.Table;
@@ -91,11 +98,10 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
        // This page widgets
        private NodeViewerComparator comparator;
        private TableViewer viewer;
-       private Text artifactTxt;
        private FormToolkit tk;
        private Composite header;
-
-       // private Section headerSection;
+       private Text artifactTxt;
+       private final static String FILTER_HELP_MSG = "Enter filter criterion separated by a space";
 
        public DistributionOverviewPage(FormEditor formEditor, String title,
                        Session session) {
@@ -103,6 +109,46 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
                this.session = session;
        }
 
+       private void asynchronousRefresh() {
+               RefreshJob job = new RefreshJob(artifactTxt.getText(), viewer,
+                               getSite().getShell().getDisplay());
+               job.setUser(true);
+               job.schedule();
+       }
+
+       private class RefreshJob extends PrivilegedJob {
+               private TableViewer viewer;
+               private String filter;
+               private Display display;
+
+               public RefreshJob(String filter, TableViewer viewer, Display display) {
+                       super("Get bundle list");
+                       this.filter = filter;
+                       this.viewer = viewer;
+                       this.display = display;
+               }
+
+               @Override
+               protected IStatus doRun(IProgressMonitor progressMonitor) {
+                       try {
+                               ArgeoMonitor monitor = new EclipseArgeoMonitor(progressMonitor);
+                               monitor.beginTask("Getting bundle list", -1);
+                               final List<Node> result = JcrUtils
+                                               .nodeIteratorToList(listBundleArtifacts(session, filter));
+
+                               display.asyncExec(new Runnable() {
+                                       public void run() {
+                                               viewer.setInput(result);
+                                       }
+                               });
+                       } catch (Exception e) {
+                               return new Status(IStatus.ERROR, DistPlugin.ID,
+                                               "Cannot get bundle list", e);
+                       }
+                       return Status.OK_STATUS;
+               }
+       }
+
        @Override
        protected void createFormContent(IManagedForm managedForm) {
                ScrolledForm form = managedForm.getForm();
@@ -117,12 +163,10 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
                createFilterPart(body);
                // Add the table
                createTableViewer(body);
-
-               viewer.setInput(session);
-               resetFilter();
-
+               viewer.setInput(null);
                // Add a listener to enable custom resize process
                form.addControlListener(new ControlListener() {
+                       // form.addListener(SWT.RESIZE, new Listener() does not work
                        public void controlResized(ControlEvent e) {
                                refreshLayout();
                        }
@@ -130,20 +174,11 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
                        public void controlMoved(ControlEvent e) {
                        }
                });
-
-               // This below doesn not work; the listener must be added as a control
-               // listener to be correctly notified when resize events happen
-
-               // form.addListener(SWT.RESIZE, new Listener() {
-               // public void handleEvent(Event event) {
-               // log.debug("Form resized ....");
-               // }
-               // });
-
+               asynchronousRefresh();
        }
 
        /** Build repository request */
-       private NodeIterator listBundleArtifacts(Session session)
+       private NodeIterator listBundleArtifacts(Session session, String filter)
                        throws RepositoryException {
                QueryManager queryManager = session.getWorkspace().getQueryManager();
                QueryObjectModelFactory factory = queryManager.getQOMFactory();
@@ -168,10 +203,9 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
                                                "%.source"))));
 
                // Build constraints based the textArea content
-               String artifactTxtVal = artifactTxt.getText();
-               if (!"".equals(artifactTxtVal.trim())) {
+               if (filter != null && !"".equals(filter.trim())) {
                        // Parse the String
-                       String[] strs = artifactTxtVal.trim().split(" ");
+                       String[] strs = filter.trim().split(" ");
                        for (String token : strs) {
                                token = token.replace('*', '%');
                                StaticOperand so = factory.literal(session.getValueFactory()
@@ -220,13 +254,16 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
 
                // Text Area to filter
                artifactTxt = tk.createText(header, "", SWT.BORDER | SWT.SINGLE);
+               artifactTxt.setMessage(FILTER_HELP_MSG);
                gd = new GridData(SWT.FILL, SWT.FILL, false, false);
                gd.grabExcessHorizontalSpace = true;
                artifactTxt.setLayoutData(gd);
                artifactTxt.addModifyListener(new ModifyListener() {
-
                        public void modifyText(ModifyEvent event) {
-                               refreshFilteredList();
+                               if ("".equals(artifactTxt.getText().trim()))
+                                       asynchronousRefresh();
+                               else
+                                       refreshFilteredList();
                        }
                });
 
@@ -246,12 +283,18 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
 
        private void resetFilter() {
                artifactTxt.setText("");
-               artifactTxt.setMessage("Enter filter criterion separated by a space");
-               viewer.refresh();
+               artifactTxt.setMessage(FILTER_HELP_MSG);
        }
 
        private void refreshFilteredList() {
-               viewer.refresh();
+               List<Node> nodes;
+               try {
+                       nodes = JcrUtils.nodeIteratorToList(listBundleArtifacts(session,
+                                       artifactTxt.getText()));
+                       viewer.setInput(nodes);
+               } catch (RepositoryException e) {
+                       throw new SlcException("Unable to list bundles", e);
+               }
        }
 
        private void createTableViewer(Composite parent) {
@@ -294,7 +337,7 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
 
                // Version
                col = new TableViewerColumn(viewer, SWT.NONE);
-               col.getColumn().setWidth(100);
+               col.getColumn().setWidth(130);
                col.getColumn().setText("Version");
                col.setLabelProvider(new ColumnLabelProvider() {
                        @Override
@@ -340,21 +383,18 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
 
        /** force refresh of the artifact list */
        public void refresh() {
-               viewer.refresh();
+               asynchronousRefresh();
        }
 
        /** Programmatically configure the context menu */
        protected void contextMenuAboutToShow(IMenuManager menuManager) {
                IWorkbenchWindow window = DistPlugin.getDefault().getWorkbench()
                                .getActiveWorkbenchWindow();
-
                // Build conditions
-
                // Delete selected artifacts
                CommandHelpers.refreshCommand(menuManager, window, DeleteArtifacts.ID,
                                DeleteArtifacts.DEFAULT_LABEL,
                                DeleteArtifacts.DEFAULT_ICON_PATH, true);
-
        }
 
        private SelectionAdapter getSelectionAdapter(final int index) {
@@ -380,24 +420,21 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
        /* LOCAL CLASSES */
        private class DistributionsContentProvider implements
                        IStructuredContentProvider {
-               // private Session session;
+               // we keep a cache of the Nodes in the content provider to be able to
+               // manage long request
+               private List<Node> nodes;
 
                public void dispose() {
                }
 
+               // We expect a list of nodes as a new input
+               @SuppressWarnings("unchecked")
                public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-                       // session = (Session) newInput;
+                       nodes = (List<Node>) newInput;
                }
 
                public Object[] getElements(Object arg0) {
-                       try {
-                               List<Node> nodes = JcrUtils
-                                               .nodeIteratorToList(listBundleArtifacts(session));
-                               return nodes.toArray();
-                       } catch (RepositoryException e) {
-                               ErrorFeedback.show("Cannot list bundles", e);
-                               return null;
-                       }
+                       return nodes.toArray();
                }
        }