]> 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
Work in progress - work on modular distributions.
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / editors / DistributionOverviewPage.java
index 403617654b0c443a5d04f4b09eaefa08e9ccce47..edd848fe98f0a99594e5cfce1598763f901d880f 100644 (file)
@@ -20,9 +20,11 @@ import java.util.List;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
+import javax.jcr.Property;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
 import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.qom.Constraint;
@@ -36,20 +38,20 @@ import javax.jcr.query.qom.StaticOperand;
 import org.argeo.ArgeoException;
 import org.argeo.ArgeoMonitor;
 import org.argeo.eclipse.ui.EclipseArgeoMonitor;
+import org.argeo.eclipse.ui.utils.CommandUtils;
 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.core.runtime.jobs.Job;
 import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
@@ -73,6 +75,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;
@@ -85,21 +88,22 @@ import org.eclipse.ui.forms.editor.FormPage;
 import org.eclipse.ui.forms.widgets.FormToolkit;
 import org.eclipse.ui.forms.widgets.ScrolledForm;
 
-/** Table giving an overview of an OSGi distribution with corresponding filters */
+/** Show all bundles contained in a given workspace as filter-able table */
 public class DistributionOverviewPage extends FormPage implements SlcNames {
-       final static String PAGE_ID = "distributionOverviewPage";
        // final private static Log log = LogFactory
        // .getLog(DistributionOverviewPage.class);
 
+       final static String PAGE_ID = "distributionOverviewPage";
+
        // Business Objects
        private Session session;
 
        // This page widgets
        private NodeViewerComparator comparator;
        private TableViewer viewer;
-       private Text artifactTxt;
        private FormToolkit tk;
        private Composite header;
+       private Text artifactTxt;
        private final static String FILTER_HELP_MSG = "Enter filter criterion separated by a space";
 
        public DistributionOverviewPage(FormEditor formEditor, String title,
@@ -109,32 +113,37 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
        }
 
        private void asynchronousRefresh() {
-               refreshFilteredList();
-               // FIXME Does not work yet: how can the job set the viewer input ?
-               // RefreshJob job = new RefreshJob(session, artifactTxt.getText());
-               // job.setUser(true);
-               // job.schedule();
-               // viewer.setInput(nodes);
+               RefreshJob job = new RefreshJob(artifactTxt.getText(), viewer,
+                               getSite().getShell().getDisplay());
+               job.setUser(true);
+               job.schedule();
        }
 
-       private class RefreshJob extends Job {
-               private Session session;
-               private List<Node> nodes;
+       private class RefreshJob extends PrivilegedJob {
+               private TableViewer viewer;
                private String filter;
+               private Display display;
 
-               public RefreshJob(Session session, String filter, List<Node> nodes) {
+               public RefreshJob(String filter, TableViewer viewer, Display display) {
                        super("Get bundle list");
-                       this.session = session;
+                       this.filter = filter;
+                       this.viewer = viewer;
+                       this.display = display;
                }
 
                @Override
-               protected IStatus run(IProgressMonitor progressMonitor) {
+               protected IStatus doRun(IProgressMonitor progressMonitor) {
                        try {
                                ArgeoMonitor monitor = new EclipseArgeoMonitor(progressMonitor);
                                monitor.beginTask("Getting bundle list", -1);
-                               List<Node> result = JcrUtils
+                               final List<Node> result = JcrUtils
                                                .nodeIteratorToList(listBundleArtifacts(session, filter));
-                               nodes.addAll(result);
+
+                               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);
@@ -157,7 +166,7 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
                createFilterPart(body);
                // Add the table
                createTableViewer(body);
-               viewer.setInput(null);
+               // viewer.setInput(null);
                // Add a listener to enable custom resize process
                form.addControlListener(new ControlListener() {
                        // form.addListener(SWT.RESIZE, new Listener() does not work
@@ -233,13 +242,29 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
        private void createFilterPart(Composite parent) {
                header = tk.createComposite(parent);
                GridLayout layout = new GridLayout(2, false);
+               layout.marginWidth = layout.marginHeight = layout.verticalSpacing = 0;
+               layout.horizontalSpacing = 5;
                header.setLayout(layout);
                GridData gd = new GridData(SWT.FILL, SWT.FILL, false, false);
                header.setLayoutData(gd);
 
                // Title: some meta information
-               String desc = ((DistributionEditorInput) getEditorInput())
-                               .getRepositoryDescription();
+               // label = repoNode.isNodeType(NodeType.MIX_TITLE) ? repoNode
+               // .getProperty(Property.JCR_TITLE).getString() : repoNode
+               // .getName();
+
+               String desc = null;
+               Node repoNode = ((DistributionWorkspaceEditor) getEditor())
+                               .getRepoNode();
+               if (repoNode != null)
+                       try {
+                               desc = repoNode.isNodeType(NodeType.MIX_TITLE) ? repoNode
+                                               .getProperty(Property.JCR_TITLE).getString() : repoNode
+                                               .getName();
+                       } catch (RepositoryException e1) {
+                               throw new SlcException("Unable to get repository alias ", e1);
+                       }
+               desc += " (" + ((WorkspaceEditorInput) getEditorInput()).getUri() + ")";
                Label lbl = tk.createLabel(header, desc, SWT.NONE);
 
                gd = new GridData(SWT.FILL, SWT.FILL, false, false);
@@ -247,7 +272,8 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
                lbl.setLayoutData(gd);
 
                // Text Area to filter
-               artifactTxt = tk.createText(header, "", SWT.BORDER | SWT.SINGLE);
+               artifactTxt = tk.createText(header, "", SWT.BORDER | SWT.SINGLE
+                               | SWT.SEARCH | SWT.CANCEL);
                artifactTxt.setMessage(FILTER_HELP_MSG);
                gd = new GridData(SWT.FILL, SWT.FILL, false, false);
                gd.grabExcessHorizontalSpace = true;
@@ -318,7 +344,7 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
                // Symbolic name
                col = new TableViewerColumn(viewer, SWT.V_SCROLL);
                col.getColumn().setWidth(300);
-               col.getColumn().setText("Symbolic name");
+               col.getColumn().setText("Symbolic Name");
                col.setLabelProvider(new ColumnLabelProvider() {
                        @Override
                        public String getText(Object element) {
@@ -331,7 +357,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
@@ -386,9 +412,9 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
                                .getActiveWorkbenchWindow();
                // Build conditions
                // Delete selected artifacts
-               CommandHelpers.refreshCommand(menuManager, window, DeleteArtifacts.ID,
-                               DeleteArtifacts.DEFAULT_LABEL,
-                               DeleteArtifacts.DEFAULT_ICON_PATH, true);
+               CommandUtils.refreshCommand(menuManager, window, DeleteArtifacts.ID,
+                               DeleteArtifacts.DEFAULT_LABEL, DeleteArtifacts.DEFAULT_ICON,
+                               true);
        }
 
        private SelectionAdapter getSelectionAdapter(final int index) {
@@ -472,7 +498,7 @@ public class DistributionOverviewPage extends FormPage implements SlcNames {
 
                // when table height is less than 200 px, we let the scroll bar on the
                // scrollForm
-               // FIXME substract some spare space. Here is room for optimization
+               // FIXME substract some spare space. There is room here for optimization
                gd.heightHint = Math.max(maxH - 35, 200);
                gd.widthHint = Math.max(maxW - 35, 200);