From 524221f25edad4b09aac22555450164e587b304a Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Mon, 10 Mar 2014 18:53:05 +0000 Subject: [PATCH] Work on modular distributions - change lazy init policies, add observer on the category base objects. git-svn-id: https://svn.argeo.org/slc/trunk@6890 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../icons/removeMark.gif | Bin 0 -> 225 bytes .../slc/client/ui/dist/DistConstants.java | 6 +- .../ui/dist/commands/CopyWorkspace.java | 185 +++++++++++++++--- .../dist/commands/MarkAsRelevantCategory.java | 28 ++- .../ui/dist/commands/OpenModuleEditor.java | 5 +- .../DistTreeDoubleClickListener.java | 49 +++-- .../controllers/DistTreeLabelProvider.java | 5 +- .../ui/dist/editors/BundleDetailsPage.java | 2 + .../ui/dist/editors/DistWkspSearchPage.java | 130 ++++++------ .../ui/dist/editors/DistWorkspaceEditor.java | 4 +- .../editors/WkspCategoryBaseListPage.java | 151 ++++++++------ .../ui/dist/model/ModularDistBaseElem.java | 6 +- .../client/ui/dist/model/WorkspaceElem.java | 105 +++++----- .../client/ui/views/JcrResultListView.java | 1 - 14 files changed, 430 insertions(+), 247 deletions(-) create mode 100644 plugins/org.argeo.slc.client.ui.dist/icons/removeMark.gif diff --git a/plugins/org.argeo.slc.client.ui.dist/icons/removeMark.gif b/plugins/org.argeo.slc.client.ui.dist/icons/removeMark.gif new file mode 100644 index 0000000000000000000000000000000000000000..d766177e2fa55ba47ff358cf9333a17da7182e1c GIT binary patch literal 225 zcmZ?wbhEHb6krfwXpv!PVPZ)ro)%ZOxUgwKZp+%HiK`l>Y-yabrG3iUo@uN4W^b4@ zd)dtS3l}b#vvTFM4QnTE-_*N%OV_$xXV&jJbN|JUN3VW7fBW;zho2um|N8nJh<^Y0 z`TIW-Q2fcl$iN`apu+$JAUhdY;~uE@rDV=qu}JHMg~ufoQHIFwgM|`S54!h7r8w*4 zH920q5aH6N;M$Z>< it = ((IStructuredSelection) selector) .iterator(); - String msg = "Your are about to mark this group as category base in the current workspace" - + ".\n" + "Are you sure you want to proceed?"; - - boolean result = MessageDialog.openConfirm(DistPlugin - .getDefault().getWorkbench().getDisplay() - .getActiveShell(), "Confirm", msg); + Node node = (Node) it.next(); + if (node.isNodeType(SlcTypes.SLC_RELEVANT_CATEGORY)) { + String msg = "Your are about to unlist this category from the relevant category list for current workspace" + + ".\n" + "Are you sure you want to proceed?"; + if (MessageDialog.openConfirm(DistPlugin.getDefault() + .getWorkbench().getDisplay().getActiveShell(), + "Confirm", msg)) { + node.removeMixin(SlcTypes.SLC_RELEVANT_CATEGORY); + node.getSession().save(); + } + } else { + String msg = "Your are about to mark this group as category base in the current workspace" + + ".\n" + "Are you sure you want to proceed?"; - if (result) { - while (it.hasNext()) { - Node node = (Node) it.next(); + if (MessageDialog.openConfirm(DistPlugin.getDefault() + .getWorkbench().getDisplay().getActiveShell(), + "Confirm", msg)) { node.addMixin(SlcTypes.SLC_RELEVANT_CATEGORY); node.getSession().save(); } diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/OpenModuleEditor.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/OpenModuleEditor.java index b1b9619eb..85d047a95 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/OpenModuleEditor.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/OpenModuleEditor.java @@ -82,8 +82,9 @@ public class OpenModuleEditor extends AbstractHandler { businessSession = RepoUtils.getCorrespondingSession( repositoryFactory, keyring, repoNode, repoUri, workspaceName); - repoUri = repoNode.getProperty(ArgeoNames.ARGEO_URI) - .getString(); + if (repoUri == null && repoNode != null) + repoUri = repoNode.getProperty(ArgeoNames.ARGEO_URI) + .getString(); } catch (RepositoryException e) { throw new SlcException("Cannot log to workspace " diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistTreeDoubleClickListener.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistTreeDoubleClickListener.java index c27267270..5136a9128 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistTreeDoubleClickListener.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistTreeDoubleClickListener.java @@ -40,33 +40,32 @@ public class DistTreeDoubleClickListener implements IDoubleClickListener { treeViewer.refresh(obj); } } else if (obj instanceof WorkspaceElem) { - WorkspaceElem wn = (WorkspaceElem) obj; - if (!wn.isConnected()) { - wn.login(); - treeViewer.refresh(obj); - } else { - WorkspaceElem we = (WorkspaceElem) obj; - Node repoNode = null; - try { - RepoElem repoElem = we.getRepoElem(); - Map params = new HashMap(); + //WorkspaceElem wn = (WorkspaceElem) obj; + // if (!wn.isConnected()) { + // wn.login(); + // treeViewer.refresh(obj); + // } else { + WorkspaceElem we = (WorkspaceElem) obj; + Node repoNode = null; + try { + RepoElem repoElem = we.getRepoElem(); + Map params = new HashMap(); - repoNode = repoElem.getRepoNode(); - if (repoNode != null) - params.put(OpenWorkspaceEditor.PARAM_REPO_NODE_PATH, - repoNode.getPath()); - params.put(OpenWorkspaceEditor.PARAM_REPO_URI, - repoElem.getUri()); - params.put(OpenWorkspaceEditor.PARAM_WORKSPACE_NAME, - we.getWorkspaceName()); - CommandUtils.callCommand(OpenWorkspaceEditor.ID, params); - } catch (RepositoryException re) { - throw new SlcException("Cannot get path for node " - + repoNode + " while " - + "setting parameters of command " - + "OpenWorkspaceEditor", re); - } + repoNode = repoElem.getRepoNode(); + if (repoNode != null) + params.put(OpenWorkspaceEditor.PARAM_REPO_NODE_PATH, + repoNode.getPath()); + params.put(OpenWorkspaceEditor.PARAM_REPO_URI, + repoElem.getUri()); + params.put(OpenWorkspaceEditor.PARAM_WORKSPACE_NAME, + we.getWorkspaceName()); + CommandUtils.callCommand(OpenWorkspaceEditor.ID, params); + } catch (RepositoryException re) { + throw new SlcException("Cannot get path for node " + repoNode + + " while " + "setting parameters of command " + + "OpenWorkspaceEditor", re); } + // } } else if (obj instanceof ModularDistVersionElem) { ModularDistVersionElem modDistElem = (ModularDistVersionElem) obj; WorkspaceElem wkspElem = modDistElem.getWorkspaceElem(); diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistTreeLabelProvider.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistTreeLabelProvider.java index 3fc3aca08..37bff6bd7 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistTreeLabelProvider.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistTreeLabelProvider.java @@ -34,10 +34,7 @@ public class DistTreeLabelProvider extends ColumnLabelProvider { else return JcrImages.REPOSITORY_DISCONNECTED; } else if (element instanceof WorkspaceElem) { - if (((WorkspaceElem) element).isConnected()) - return JcrImages.WORKSPACE_CONNECTED; - else - return JcrImages.WORKSPACE_DISCONNECTED; + return JcrImages.WORKSPACE_CONNECTED; } else if (element instanceof WkspGroupElem) return DistImages.IMG_WKSP_GROUP; // else if (element instanceof GroupBaseElem) diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/BundleDetailsPage.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/BundleDetailsPage.java index c33cca469..d2d0773de 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/BundleDetailsPage.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/BundleDetailsPage.java @@ -33,6 +33,7 @@ import org.argeo.slc.jcr.SlcNames; import org.argeo.slc.jcr.SlcTypes; import org.argeo.slc.repo.RepoConstants; import org.argeo.slc.repo.RepoUtils; +import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; @@ -89,6 +90,7 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes { form.setText(currBundle.hasProperty(DistConstants.SLC_BUNDLE_NAME) ? currBundle .getProperty(DistConstants.SLC_BUNDLE_NAME).getString() : ""); + form.setMessage(" test", IMessageProvider.NONE); Composite body = form.getBody(); GridLayout layout = new GridLayout(1, false); layout.marginWidth = 5; diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWkspSearchPage.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWkspSearchPage.java index 7937eb6b7..1228edfed 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWkspSearchPage.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWkspSearchPage.java @@ -39,6 +39,7 @@ import javax.jcr.query.qom.StaticOperand; import org.argeo.ArgeoMonitor; import org.argeo.eclipse.ui.EclipseArgeoMonitor; +import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.eclipse.ui.utils.CommandUtils; import org.argeo.jcr.JcrUtils; import org.argeo.slc.SlcException; @@ -66,13 +67,12 @@ import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; @@ -105,9 +105,9 @@ public class DistWkspSearchPage extends FormPage implements SlcNames { private NodeViewerComparator comparator; private TableViewer viewer; - private Composite header; + // private Composite header; private Text artifactTxt; - private final static String FILTER_HELP_MSG = "Enter filter criterion separated by a space"; + private final static String FILTER_HELP_MSG = "Search bundles in the current workspace"; public DistWkspSearchPage(DistWorkspaceEditor formEditor, String title, Session session) { @@ -166,22 +166,20 @@ public class DistWkspSearchPage extends FormPage implements SlcNames { Composite body = form.getBody(); body.setLayout(layout); - // Add the filter section - createFilterPart(body); - // Add the table - createTableViewer(body); - // 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(); - } + // Meta info about current workspace + Composite header = tk.createComposite(body); + header.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + createHeaderPart(form, header); - public void controlMoved(ControlEvent e) { - } - }); - asynchronousRefresh(); + // filter text + Composite filter = tk.createComposite(body); + filter.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + createFilterPart(filter); + + // the table + Composite tableCmp = tk.createComposite(body); + tableCmp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + createTableViewer(tableCmp); } /** Build repository request */ @@ -243,42 +241,62 @@ public class DistWkspSearchPage extends FormPage implements SlcNames { } - private void createFilterPart(Composite parent) { - header = tk.createComposite(parent); - GridLayout layout = new GridLayout(2, false); + private void createHeaderPart(ScrolledForm form, Composite parent) { + GridLayout layout = new GridLayout(4, 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); + parent.setLayout(layout); + + String wkspName = ((DistWkspEditorInput) getEditorInput()) + .getWorkspaceName(); + // wkspName = "Workspace " + wkspName; + form.setText(wkspName); - // Title: some meta information - // label = repoNode.isNodeType(NodeType.MIX_TITLE) ? repoNode - // .getProperty(Property.JCR_TITLE).getString() : repoNode - // .getName(); + // form.setMessage("Choose in the below list " + // + "the categories that can be used as base for " + // + "modular distributions maintained via the current workspace", + // IMessageProvider.NONE); - String desc = null; + String repoAlias = ""; Node repoNode = ((DistWorkspaceEditor) getEditor()).getRepoNode(); if (repoNode != null) try { - desc = repoNode.isNodeType(NodeType.MIX_TITLE) ? repoNode + repoAlias = 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 += " (" + ((DistWkspEditorInput) getEditorInput()).getUri() + ")"; - Label lbl = tk.createLabel(header, desc, SWT.NONE); + else + repoAlias = " - "; - gd = new GridData(SWT.FILL, SWT.FILL, false, false); - gd.horizontalSpan = 2; - lbl.setLayoutData(gd); + createLT(parent, "Repository alias", repoAlias); + createLT(parent, "URI", + ((DistWkspEditorInput) getEditorInput()).getUri()); + } + + private Text createLT(Composite parent, String labelValue, String textValue) { + Label label = tk.createLabel(parent, labelValue, SWT.RIGHT); + label.setFont(EclipseUiUtils.getBoldFont(parent)); + label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); + + // Add a trailing space to workaround a display glitch in RAP 1.3 + Text text = tk.createText(parent, textValue + " ", SWT.LEFT); + text.setEditable(false); + return text; + } + + private void createFilterPart(Composite parent) { + GridLayout layout = new GridLayout(2, false); + layout.marginWidth = layout.marginHeight = layout.verticalSpacing = 0; + layout.horizontalSpacing = 5; + parent.setLayout(layout); // Text Area to filter - artifactTxt = tk.createText(header, "", SWT.BORDER | SWT.SINGLE + artifactTxt = tk.createText(parent, "", SWT.BORDER | SWT.SINGLE | SWT.SEARCH | SWT.CANCEL); artifactTxt.setMessage(FILTER_HELP_MSG); - gd = new GridData(SWT.FILL, SWT.FILL, false, false); + GridData gd = new GridData(SWT.FILL, SWT.FILL, false, false); gd.grabExcessHorizontalSpace = true; artifactTxt.setLayoutData(gd); artifactTxt.addModifyListener(new ModifyListener() { @@ -290,7 +308,7 @@ public class DistWkspSearchPage extends FormPage implements SlcNames { } }); - Button resetBtn = tk.createButton(header, null, SWT.PUSH); + Button resetBtn = tk.createButton(parent, null, SWT.PUSH); resetBtn.setImage(DistImages.IMG_REPO_READONLY); resetBtn.addSelectionListener(new SelectionListener() { @@ -301,7 +319,6 @@ public class DistWkspSearchPage extends FormPage implements SlcNames { public void widgetDefaultSelected(SelectionEvent e) { } }); - } private void resetFilter() { @@ -321,6 +338,7 @@ public class DistWkspSearchPage extends FormPage implements SlcNames { } private void createTableViewer(Composite parent) { + parent.setLayout(new FillLayout()); // helpers to enable sorting by column List propertiesList = new ArrayList(); List propertyTypesList = new ArrayList(); @@ -497,21 +515,23 @@ public class DistWkspSearchPage extends FormPage implements SlcNames { * UI Trick to put scroll bar on the table rather than on the scrollform */ private void refreshLayout() { - // Compute desired table size - int maxH = getManagedForm().getForm().getSize().y; - int maxW = getManagedForm().getForm().getParent().getSize().x; - maxH = maxH - header.getSize().y; - final Table table = viewer.getTable(); - GridData gd = new GridData(SWT.LEFT, SWT.TOP, true, true); - - // when table height is less than 200 px, we let the scroll bar on the - // scrollForm - // 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); - - table.setLayoutData(gd); - getManagedForm().reflow(true); + // // Compute desired table size + // int maxH = getManagedForm().getForm().getSize().y; + // int maxW = getManagedForm().getForm().getParent().getSize().x; + // // maxH = maxH - header.getSize().y; + // final Table table = viewer.getTable(); + // GridData gd = new GridData(SWT.LEFT, SWT.TOP, true, true); + // + // // when table height is less than 200 px, we let the scroll bar on + // the + // // scrollForm + // // 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); + // + // table.setLayoutData(gd); + // getManagedForm().reflow(true); } @Override diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWorkspaceEditor.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWorkspaceEditor.java index 8f053bf3b..0d3220aaf 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWorkspaceEditor.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWorkspaceEditor.java @@ -79,8 +79,8 @@ public class DistWorkspaceEditor extends FormEditor implements SlcNames { protected void addPages() { try { addPage(new DistWkspSearchPage(this, "Details ", businessSession)); - addPage(new DistWkspBrowserPage(this, "Browser ", businessSession)); - addPage(new WkspCategoryBaseListPage(this, "Group base ", + addPage(new DistWkspBrowserPage(this, "Maven ", businessSession)); + addPage(new WkspCategoryBaseListPage(this, "Groups ", businessSession)); } catch (PartInitException e) { throw new ArgeoException("Cannot add distribution editor pages", e); diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/WkspCategoryBaseListPage.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/WkspCategoryBaseListPage.java index fa9f65f96..7f67a73a3 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/WkspCategoryBaseListPage.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/WkspCategoryBaseListPage.java @@ -23,6 +23,8 @@ import javax.jcr.NodeIterator; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.observation.Event; +import javax.jcr.observation.ObservationManager; import javax.jcr.query.QueryManager; import javax.jcr.query.QueryResult; import javax.jcr.query.qom.Constraint; @@ -33,9 +35,11 @@ import javax.jcr.query.qom.Selector; import javax.jcr.query.qom.StaticOperand; import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.jcr.AsyncUiEventListener; 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.commands.MarkAsRelevantCategory; @@ -55,17 +59,16 @@ import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.FillLayout; 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.Menu; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; @@ -93,10 +96,13 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames { private NodeViewerComparator comparator; private TableViewer viewer; private FormToolkit tk; - private Composite header; private Text filterTxt; private final static String FILTER_HELP_MSG = "Enter filter criterion separated by a space"; + // Observes changes + private final static String[] observedTypes = { SlcTypes.SLC_GROUP_BASE }; + private CategoryObserver categoriesObserver; + public WkspCategoryBaseListPage(FormEditor formEditor, String title, Session session) { super(formEditor, PAGE_ID, title); @@ -108,29 +114,40 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames { ScrolledForm form = managedForm.getForm(); tk = managedForm.getToolkit(); - form.setText("Category base definition"); - form.setMessage("Define relevant group base objects", + form.setText("Define Relevant Category"); + form.setMessage("Choose in the below list " + + "the categories that can be used as base for " + + "modular distributions maintained via the current workspace", IMessageProvider.NONE); // Main Layout GridLayout layout = new GridLayout(1, false); Composite body = form.getBody(); body.setLayout(layout); - // Add the filter section - createFilterPart(body); - // Add the table - createTableViewer(body); - - // 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(); - } - public void controlMoved(ControlEvent e) { - } - }); + // filter section + Composite header = tk.createComposite(body); + header.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + createFilterPart(header); + + // the table + Composite tableCmp = tk.createComposite(body); + tableCmp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + createTableViewer(tableCmp); + + categoriesObserver = new CategoryObserver(viewer.getTable() + .getDisplay()); + try { + ObservationManager observationManager = session.getWorkspace() + .getObservationManager(); + // FIXME Will not be notified if empty result is deleted + observationManager.addEventListener(categoriesObserver, + Event.PROPERTY_CHANGED, "/", true, null, observedTypes, + false); + } catch (RepositoryException e) { + throw new SlcException("Cannot register listeners", e); + } + refresh(); } @@ -192,39 +209,29 @@ public class WkspCategoryBaseListPage 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); + parent.setLayout(layout); // Text Area to filter - filterTxt = tk.createText(header, "", SWT.BORDER | SWT.SINGLE + filterTxt = tk.createText(parent, "", SWT.BORDER | SWT.SINGLE | SWT.SEARCH | SWT.CANCEL); filterTxt.setMessage(FILTER_HELP_MSG); - gd = new GridData(SWT.FILL, SWT.FILL, false, false); - gd.grabExcessHorizontalSpace = true; - filterTxt.setLayoutData(gd); + filterTxt.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); filterTxt.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent event) { refresh(); } }); - Button resetBtn = tk.createButton(header, null, SWT.PUSH); + Button resetBtn = tk.createButton(parent, null, SWT.PUSH); resetBtn.setImage(DistImages.IMG_REPO_READONLY); - resetBtn.addSelectionListener(new SelectionListener() { - + resetBtn.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { resetFilter(); } - - public void widgetDefaultSelected(SelectionEvent e) { - } }); - } private void resetFilter() { @@ -233,12 +240,13 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames { } private void createTableViewer(Composite parent) { + parent.setLayout(new FillLayout()); // helpers to enable sorting by column List propertiesList = new ArrayList(); List propertyTypesList = new ArrayList(); // Define the TableViewer - viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL + viewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); TableViewerColumn col; @@ -267,20 +275,20 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames { } }); col.getColumn().addSelectionListener(getSelectionAdapter(0)); - propertiesList.add(SLC_NAME); + propertiesList.add(SLC_GROUP_BASE_ID); propertyTypesList.add(PropertyType.STRING); // Version col = new TableViewerColumn(viewer, SWT.NONE); col.getColumn().setWidth(80); - col.getColumn().setText("Is category"); + col.getColumn().setText("Relevant"); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { try { return ((Node) element) .isNodeType(SlcTypes.SLC_RELEVANT_CATEGORY) ? "Yes" - : "-"; + : "No"; } catch (RepositoryException e) { throw new SlcException("unable to check type of node " + element, e); @@ -331,18 +339,31 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames { // Mark as category base Object firstElement = ((IStructuredSelection) viewer.getSelection()) .getFirstElement(); - boolean showMark = false; + Node currSelected = (Node) firstElement; + + boolean isRelevant = false; try { - showMark = !((Node) firstElement) + isRelevant = currSelected .isNodeType(SlcTypes.SLC_RELEVANT_CATEGORY); + boolean canEdit = currSelected + .canAddMixin(SlcTypes.SLC_RELEVANT_CATEGORY); + } catch (RepositoryException e) { throw new SlcException("unable to check type of node " + firstElement, e); } - CommandUtils.refreshCommand(menuManager, window, - MarkAsRelevantCategory.ID, - MarkAsRelevantCategory.DEFAULT_LABEL, - MarkAsRelevantCategory.DEFAULT_ICON, showMark); + // Add + if (isRelevant) {// Remove + CommandUtils.refreshCommand(menuManager, window, + MarkAsRelevantCategory.ID, + MarkAsRelevantCategory.DEFAULT_REMOVE_LABEL, + MarkAsRelevantCategory.DEFAULT_REMOVE_ICON, true); + } else { + CommandUtils.refreshCommand(menuManager, window, + MarkAsRelevantCategory.ID, + MarkAsRelevantCategory.DEFAULT_LABEL, + MarkAsRelevantCategory.DEFAULT_ICON, true); + } } private SelectionAdapter getSelectionAdapter(final int index) { @@ -413,32 +434,36 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames { } } - /** - * UI Trick to put scroll bar on the table rather than on the scrollform - */ - private void refreshLayout() { - // Compute desired table size - int maxH = getManagedForm().getForm().getSize().y; - int maxW = getManagedForm().getForm().getParent().getSize().x; - maxH = maxH - header.getSize().y; - final Table table = viewer.getTable(); - GridData gd = new GridData(SWT.LEFT, SWT.TOP, true, true); + class CategoryObserver extends AsyncUiEventListener { - // when table height is less than 200 px, we let the scroll bar on the - // scrollForm - // 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); + public CategoryObserver(Display display) { + super(display); + } - table.setLayoutData(gd); - getManagedForm().reflow(true); + @Override + protected Boolean willProcessInUiThread(List events) + throws RepositoryException { + for (Event event : events) { + String path = event.getPath(); + if (JcrUtils.lastPathElement(path).equals( + DistConstants.JCR_MIXIN_TYPES)) + return true; + } + return false; + } + + protected void onEventInUiThread(List events) + throws RepositoryException { + if (getLog().isTraceEnabled()) + getLog().trace("Refresh table"); + viewer.refresh(); + } } @Override public void setActive(boolean active) { super.setActive(active); if (active) { - refreshLayout(); } } } \ No newline at end of file diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/ModularDistBaseElem.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/ModularDistBaseElem.java index 08c7d6d3e..35e3f21dd 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/ModularDistBaseElem.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/ModularDistBaseElem.java @@ -21,6 +21,7 @@ import org.argeo.slc.jcr.SlcTypes; */ public class ModularDistBaseElem extends DistParentElem { + final static public String AETHER_CATEGORY_BASE = "categoryBase"; final static public String AETHER_BINARIES_TYPE = "binaries"; final static public String AETHER_DEP_TYPE = "dep"; private String type; @@ -57,7 +58,7 @@ public class ModularDistBaseElem extends DistParentElem { // initialize current object try { NodeIterator ni = getDistVersions(); - while (ni.hasNext()) { + while (ni != null && ni.hasNext()) { Node curNode = ni.nextNode(); addChild(new ModularDistVersionElem(this, curNode .getProperty(SlcNames.SLC_ARTIFACT_VERSION) @@ -74,6 +75,9 @@ public class ModularDistBaseElem extends DistParentElem { public NodeIterator getDistVersions() { try { + if (AETHER_CATEGORY_BASE.equals(type)) + return null; + QueryManager queryManager = artifactBase.getSession() .getWorkspace().getQueryManager(); QueryObjectModelFactory factory = queryManager.getQOMFactory(); diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/WorkspaceElem.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/WorkspaceElem.java index 6f6a93a3a..a16397407 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/WorkspaceElem.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/WorkspaceElem.java @@ -49,7 +49,7 @@ public class WorkspaceElem extends DistParentElem { if (isConnected()) return currSession.getRootNode().hasNodes(); else - return false; + return true; } catch (RepositoryException re) { throw new ArgeoException( "Unexpected error while checking children node existence", @@ -65,61 +65,60 @@ public class WorkspaceElem extends DistParentElem { } else { // initialize current object try { + // Lazy connect the first time we retrieve children if (currSession == null) - return null; - else { - // Retrieve already existing distribution - Query groupQuery = currSession - .getWorkspace() - .getQueryManager() - .createQuery( - "select * from [" - + SlcTypes.SLC_MODULAR_DISTRIBUTION - + "]", Query.JCR_SQL2); - NodeIterator distributions = groupQuery.execute() - .getNodes(); - distribs: while (distributions.hasNext()) { - Node currDist = distributions.nextNode(); - Node distBase = currDist.getParent().getParent(); - if (!distBase.isNodeType(SlcTypes.SLC_ARTIFACT_BASE)) - continue distribs; - String groupId = distBase.getProperty( - SlcNames.SLC_GROUP_ID).getString(); - String artifactId = distBase.getProperty( - SlcNames.SLC_ARTIFACT_ID).getString(); + login(); - String name; - String type; - if (ModularDistBaseElem.AETHER_BINARIES_TYPE - .equals(artifactId)) { - name = groupId; - type = ModularDistBaseElem.AETHER_BINARIES_TYPE; - } else { - name = artifactId; - type = ModularDistBaseElem.AETHER_DEP_TYPE; - } - if (getChildByName(name) == null) - addChild(new ModularDistBaseElem( - WorkspaceElem.this, name, distBase, type)); - } - // Add empty group base that have been marked as relevant - groupQuery = currSession - .getWorkspace() - .getQueryManager() - .createQuery( - "select * from [" - + SlcTypes.SLC_RELEVANT_CATEGORY - + "]", Query.JCR_SQL2); - distributions = groupQuery.execute().getNodes(); - while (distributions.hasNext()) { - Node distBase = distributions.nextNode(); - String groupBaseId = distBase.getProperty( - SlcNames.SLC_GROUP_BASE_ID).getString(); - if (getChildByName(groupBaseId) == null) - addChild(new ModularDistBaseElem( - WorkspaceElem.this, groupBaseId, distBase, - ModularDistBaseElem.AETHER_BINARIES_TYPE)); + // Retrieve already existing distribution + Query groupQuery = currSession + .getWorkspace() + .getQueryManager() + .createQuery( + "select * from [" + + SlcTypes.SLC_MODULAR_DISTRIBUTION + + "]", Query.JCR_SQL2); + NodeIterator distributions = groupQuery.execute().getNodes(); + distribs: while (distributions.hasNext()) { + Node currDist = distributions.nextNode(); + Node distBase = currDist.getParent().getParent(); + if (!distBase.isNodeType(SlcTypes.SLC_ARTIFACT_BASE)) + continue distribs; + String groupId = distBase + .getProperty(SlcNames.SLC_GROUP_ID).getString(); + String artifactId = distBase.getProperty( + SlcNames.SLC_ARTIFACT_ID).getString(); + + String name; + String type; + if (ModularDistBaseElem.AETHER_BINARIES_TYPE + .equals(artifactId)) { + name = groupId; + type = ModularDistBaseElem.AETHER_BINARIES_TYPE; + } else { + name = artifactId; + type = ModularDistBaseElem.AETHER_DEP_TYPE; } + if (getChildByName(name) == null) + addChild(new ModularDistBaseElem(WorkspaceElem.this, + name, distBase, type)); + } + // Add empty group base that have been marked as relevant + groupQuery = currSession + .getWorkspace() + .getQueryManager() + .createQuery( + "select * from [" + + SlcTypes.SLC_RELEVANT_CATEGORY + "]", + Query.JCR_SQL2); + distributions = groupQuery.execute().getNodes(); + while (distributions.hasNext()) { + Node distBase = distributions.nextNode(); + String groupBaseId = distBase.getProperty( + SlcNames.SLC_GROUP_BASE_ID).getString(); + if (getChildByName(groupBaseId) == null) + addChild(new ModularDistBaseElem(WorkspaceElem.this, + groupBaseId, distBase, + ModularDistBaseElem.AETHER_CATEGORY_BASE)); } return super.getChildren(); } catch (RepositoryException e) { diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultListView.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultListView.java index b3faa1784..0f25c7ce7 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultListView.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultListView.java @@ -272,7 +272,6 @@ public class JcrResultListView extends ViewPart implements SlcNames { getLog().trace("Refresh result list"); viewer.refresh(); } - } public void setSession(Session session) { -- 2.39.5