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;
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;
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;
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,
}
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);
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
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);
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;
// 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) {
// Version
col = new TableViewerColumn(viewer, SWT.NONE);
- col.getColumn().setWidth(100);
+ col.getColumn().setWidth(130);
col.getColumn().setText("Version");
col.setLabelProvider(new ColumnLabelProvider() {
@Override
.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) {
// 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);