X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=plugins%2Forg.argeo.slc.client.ui.dist%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fdist%2Feditors%2FDistributionOverviewPage.java;h=4401f7da9b2574442e296eeeb28d07c61e9eabdc;hb=b7ad99f6fc4414eeb82b9a4ae65aa20e02af66ce;hp=eb14ae8cbf2cf5fc89e12ed10e1aa0271660fdad;hpb=60fc68b90de1f65a0d64fe385033e1a9e6de5eef;p=gpl%2Fargeo-slc.git diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionOverviewPage.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionOverviewPage.java index eb14ae8cb..4401f7da9 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionOverviewPage.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionOverviewPage.java @@ -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 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 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 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) newInput; } public Object[] getElements(Object arg0) { - try { - List nodes = JcrUtils - .nodeIteratorToList(listBundleArtifacts(session)); - return nodes.toArray(); - } catch (RepositoryException e) { - ErrorFeedback.show("Cannot list bundles", e); - return null; - } + return nodes.toArray(); } }