From e255526eb77c85ce773cf64fbf06430e4f936ec2 Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Thu, 21 Jun 2012 16:23:34 +0000 Subject: [PATCH] Add a few functionalities to dist UI git-svn-id: https://svn.argeo.org/slc/trunk@5341 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../META-INF/MANIFEST.MF | 1 + .../META-INF/spring/commands.xml | 24 +++ .../icons/addItem.gif | Bin 0 -> 590 bytes .../icons/changeRights.gif | Bin 0 -> 564 bytes .../icons/removeItem.gif | Bin 0 -> 374 bytes .../org.argeo.slc.client.ui.dist/plugin.xml | 39 +++++ .../ui/dist/commands/CopyWorkspace.java | 158 ++++++++++++++++++ .../ui/dist/commands/CreateWorkspace.java | 57 +++++++ .../ui/dist/commands/DeleteWorkspace.java | 65 +++++++ .../ui/dist/commands/ManageWorkspaceAuth.java | 57 +++++++ .../commands/RefreshDistributionsView.java | 28 ++++ .../ui/dist/editors/DistributionEditor.java | 31 +--- .../editors/DistributionOverviewPage.java | 50 ++++++ .../client/ui/dist/utils/CommandHelpers.java | 144 ++++++++++++++++ .../ui/dist/utils/NodeViewerComparator.java | 151 +++++++++++++++++ .../ui/dist/views/DistributionsView.java | 74 ++++++++ .../ui/dist/wizards/ChangeRightsWizard.java | 49 ++++++ .../ui/dist/wizards/ChooseRightsPage.java | 94 +++++++++++ 18 files changed, 993 insertions(+), 29 deletions(-) create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/icons/addItem.gif create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/icons/changeRights.gif create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/icons/removeItem.gif create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CopyWorkspace.java create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/DeleteWorkspace.java create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/ManageWorkspaceAuth.java create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RefreshDistributionsView.java create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/CommandHelpers.java create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/NodeViewerComparator.java create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/ChangeRightsWizard.java create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/ChooseRightsPage.java diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/MANIFEST.MF b/eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/MANIFEST.MF index 9d3d163af..ed401485b 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/MANIFEST.MF +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/MANIFEST.MF @@ -15,6 +15,7 @@ Import-Package: aQute.lib.osgi;resolution:=optional, javax.jcr.nodetype;version="2.0.0", javax.jcr.query, javax.jcr.query.qom;version="2.0.0", + javax.jcr.security, org.apache.commons.io;version="1.4.0", org.apache.commons.logging;version="1.1.1", org.argeo, diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/commands.xml b/eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/commands.xml index 00bf6111e..61f60e2a2 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/commands.xml +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/commands.xml @@ -23,4 +23,28 @@ + + + + + + + + + + + + + + diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/icons/addItem.gif b/eclipse/plugins/org.argeo.slc.client.ui.dist/icons/addItem.gif new file mode 100644 index 0000000000000000000000000000000000000000..a5ac28d4c566907f9206b991a11baa02ce450354 GIT binary patch literal 590 zcmZ?wbhEHb6krfwc*el+@$;`YAAYt^S=%#h)$_MMFJ8U-{pa7W-+%x3`8%#`ac;}n z_~K~^#nTF#792fy@BWJ)k6!&~n6jmD%9f^ytEMkMFk|_FzS$er?>h7K$KQ28^82qz zvzLAT{^!PvAHV{+c)*@-qQ8==c6YNFZ_AC z^Y7>LoB9+t_A73mth#Hu+P2B6f1WM=`*!ENO0h+?5({f2mNiN(Ym#2mA$Mg*>hHVF zhgYTjc{t(nx`4yW;ttJnJT%wq!kUUJ8>)}aN<6o+?D(RhQ%g%Oud8}@|J1?RIY;K@ z@0*eR{8d*Rb6z9wC>*1tMmg_~C<+Ym>RXjlG!!%dz7u3SMkiFE}+k2& zU!HCI`+o1=4~PDKI{x?5$-ke^ZJVU>^;XB9hy8z^%=+_e-k)dl|2$i;v0HIVzw*I( z7Rx#15+*@oPB6j z@yTtS*G_M`d124zw-5h=0mEPdia%Kx85jZ>bU=;*#R&uZ#D;(-IW|_grjE`IUR6<+ zt_cA=@}kTWCvY=O@8VLIoi;mwQ$tBsjBz1{hOCs7jJK7Q=L8XjHIiO7ettF{UBW7I z;y#8>{{Fs(6NEG+-Cexh-MwAhy9AYGER78uw6)AEy95-aE%bD)ZFS5oy7<*3T=gBD iogGbGyV&^{-0V$iek@Qtd}3+3i;&tDF|8m425SKKG1WZ) literal 0 HcmV?d00001 diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/icons/removeItem.gif b/eclipse/plugins/org.argeo.slc.client.ui.dist/icons/removeItem.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b885067b7ade60ddd5f6ee83e308bfff5e1e8d5 GIT binary patch literal 374 zcmZ?wbhEHb6krfwXk}n%VPa{UvhKl&{y+0_mamvOd*Q;#%Z}ZD`D50a(^Kazxw0wq z)3@Jkv-WLTKk3i5DSz^Ex~Hvv^Xb>BU01&S{Jni+{~son=1CjxJpcY@(v-EUr!HJF z=gFI&i#DI1Fl)uFy)`}a5B=G;<>#+I`?q!c|NozX20-yA3nK%AGJ_7tY>=NAI3_c= zbI5pXP;eCF5LPnL2yp3W7ZB}8&`3Ju+^uNiVd9a<#KbHw;UlnMqSHY(?x0m6Hy0$d zu?nda{E#SeY-?gsdQlVbu<;xR3s+W$z-Fd~c|1xP4=gtvXj?Ab^X<+7;ll@5q?67~ ziCWmi+$6ieX{yx%g%)OGM=x8hri2FW0(}ow!}0~KyTzW}n|f-(bLJ*DW+nz}0IGq7 A)&Kwi literal 0 HcmV?d00001 diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/plugin.xml b/eclipse/plugins/org.argeo.slc.client.ui.dist/plugin.xml index 003c8f92f..3b426c6b3 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui.dist/plugin.xml +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/plugin.xml @@ -93,6 +93,45 @@ id="org.argeo.slc.client.ui.dist.normalizeDistribution" defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler" name="Normalize Distribution"> + + + + + + + + + + + + + + + + + + propertiesList = new ArrayList(); + List propertyTypesList = new ArrayList(); + // Define the TableViewer viewer = new TableViewer(form.getBody(), SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); @@ -62,6 +73,10 @@ class DistributionOverviewPage extends FormPage implements SlcNames { return JcrUtils.get((Node) element, SLC_SYMBOLIC_NAME); } }); + col.getColumn().addSelectionListener(getSelectionAdapter(0)); + propertiesList.add(SLC_SYMBOLIC_NAME); + propertyTypesList.add(PropertyType.STRING); + col = new TableViewerColumn(viewer, SWT.NONE); col.getColumn().setWidth(100); col.getColumn().setText("Version"); @@ -71,6 +86,10 @@ class DistributionOverviewPage extends FormPage implements SlcNames { return JcrUtils.get((Node) element, SLC_BUNDLE_VERSION); } }); + col.getColumn().addSelectionListener(getSelectionAdapter(1)); + propertiesList.add(SLC_BUNDLE_VERSION); + propertyTypesList.add(PropertyType.STRING); + col = new TableViewerColumn(viewer, SWT.NONE); col.getColumn().setWidth(150); col.getColumn().setText("Group ID"); @@ -80,6 +99,10 @@ class DistributionOverviewPage extends FormPage implements SlcNames { return JcrUtils.get((Node) element, SLC_GROUP_ID); } }); + col.getColumn().addSelectionListener(getSelectionAdapter(2)); + propertiesList.add(SLC_GROUP_ID); + propertyTypesList.add(PropertyType.STRING); + col = new TableViewerColumn(viewer, SWT.NONE); col.getColumn().setWidth(300); col.getColumn().setText("Name"); @@ -90,6 +113,9 @@ class DistributionOverviewPage extends FormPage implements SlcNames { + Constants.BUNDLE_NAME); } }); + col.getColumn().addSelectionListener(getSelectionAdapter(3)); + propertiesList.add(SLC_ + Constants.BUNDLE_NAME); + propertyTypesList.add(PropertyType.STRING); final Table table = viewer.getTable(); table.setHeaderVisible(true); @@ -98,6 +124,10 @@ class DistributionOverviewPage extends FormPage implements SlcNames { viewer.setContentProvider(new DistributionsContentProvider()); viewer.setInput(session); + comparator = new NodeViewerComparator(1, + NodeViewerComparator.DESCENDING, propertiesList, + propertyTypesList); + viewer.setComparator(comparator); } @Override @@ -125,6 +155,26 @@ class DistributionOverviewPage extends FormPage implements SlcNames { return result.getNodes(); } + private SelectionAdapter getSelectionAdapter(final int index) { + SelectionAdapter selectionAdapter = new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + Table table = viewer.getTable(); + comparator.setColumn(index); + int dir = table.getSortDirection(); + if (table.getSortColumn() == table.getColumn(index)) { + dir = dir == SWT.UP ? SWT.DOWN : SWT.UP; + } else { + dir = SWT.DOWN; + } + table.setSortDirection(dir); + table.setSortColumn(table.getColumn(index)); + viewer.refresh(); + } + }; + return selectionAdapter; + } + private static class DistributionsContentProvider implements IStructuredContentProvider { private Session session; diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/CommandHelpers.java b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/CommandHelpers.java new file mode 100644 index 000000000..ebd8826e2 --- /dev/null +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/CommandHelpers.java @@ -0,0 +1,144 @@ +package org.argeo.slc.client.ui.dist.utils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.argeo.ArgeoException; +import org.argeo.slc.client.ui.dist.DistPlugin; +import org.eclipse.core.commands.Command; +import org.eclipse.core.commands.Parameterization; +import org.eclipse.core.commands.ParameterizedCommand; +import org.eclipse.jface.action.IContributionItem; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.swt.SWT; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.commands.ICommandService; +import org.eclipse.ui.handlers.IHandlerService; +import org.eclipse.ui.menus.CommandContributionItem; +import org.eclipse.ui.menus.CommandContributionItemParameter; +import org.eclipse.ui.services.IServiceLocator; + +/** + * Centralizes useful methods to manage command updates + */ +public class CommandHelpers { + + /** + * Refresh the given command. + */ + public static void refreshCommand(IMenuManager menuManager, + IServiceLocator locator, String cmdId, String label, String iconPath, + boolean showCommand) { + IContributionItem ici = menuManager.find(cmdId); + if (ici != null) + menuManager.remove(ici); + + if (showCommand) { + // Set Params + CommandContributionItemParameter contributionItemParameter = new CommandContributionItemParameter( + locator, null, cmdId, SWT.PUSH); + contributionItemParameter.label = label; + contributionItemParameter.icon = DistPlugin.getImageDescriptor(iconPath); + CommandContributionItem cci = new CommandContributionItem( + contributionItemParameter); + cci.setId(cmdId); + menuManager.add(cci); + } + } + + /** + * Refresh the given command and optionally corresponding parameters. + * + * @param menuManager + * @param locator + * @param cmdId + * @param label + * @param showCommand + * Command must be explicitly removed from the context menu at + * each refresh setting this to false. + * @param params + * maps a paramId with a String value + */ + public static void refreshParameterizedCommand(IMenuManager menuManager, + IServiceLocator locator, String cmdId, String label, String iconPath, + boolean showCommand, Map params) { + IContributionItem ici = menuManager.find(cmdId); + if (ici != null) + menuManager.remove(ici); + + if (showCommand) { + // Set Params + CommandContributionItemParameter contributionItemParameter = new CommandContributionItemParameter( + locator, null, cmdId, SWT.PUSH); + contributionItemParameter.label = label; + contributionItemParameter.icon = DistPlugin.getImageDescriptor(iconPath); + + if (params != null) + contributionItemParameter.parameters = params; + + CommandContributionItem cci = new CommandContributionItem( + contributionItemParameter); + cci.setId(cmdId); + menuManager.add(cci); + } + } + + /** Helper to call a command without parameter easily */ + public static void callCommand(String commandID) { + callCommand(commandID, null); + } + + /** Helper to call a command with a single parameter easily */ + public static void callCommand(String commandID, String parameterID, + String parameterValue) { + Map params = new HashMap(); + params.put(parameterID, parameterValue); + callCommand(commandID, params); + } + + /** + * Helper to call a command with a map of parameters easily + * + * @param paramMap + * a map that links various commands ids with corresponding + * String values. + */ + public static void callCommand(String commandID, + Map paramMap) { + try { + IWorkbench iw = DistPlugin.getDefault().getWorkbench(); + IHandlerService handlerService = (IHandlerService) iw + .getService(IHandlerService.class); + ICommandService cmdService = (ICommandService) iw + .getActiveWorkbenchWindow().getService( + ICommandService.class); + Command cmd = cmdService.getCommand(commandID); + + ArrayList parameters = null; + ParameterizedCommand pc; + + if (paramMap != null) { + // Set parameters of the command to launch : + parameters = new ArrayList(); + Parameterization parameterization; + for (String id : paramMap.keySet()) { + parameterization = new Parameterization( + cmd.getParameter(id), paramMap.get(id)); + parameters.add(parameterization); + } + pc = new ParameterizedCommand(cmd, + parameters.toArray(new Parameterization[parameters.size()])); + } else + pc = new ParameterizedCommand(cmd, null); + + // build the parameterized command + // execute the command + handlerService.executeCommand(pc, null); + } catch (Exception e) { + throw new ArgeoException( + "Unexepected exception while opening node editor", e); + } + } + +} diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/NodeViewerComparator.java b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/NodeViewerComparator.java new file mode 100644 index 000000000..8a0ad600d --- /dev/null +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/NodeViewerComparator.java @@ -0,0 +1,151 @@ +package org.argeo.slc.client.ui.dist.utils; + +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.List; + +import javax.jcr.Node; +import javax.jcr.PropertyType; +import javax.jcr.RepositoryException; +import javax.jcr.Value; +import javax.jcr.ValueFormatException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.GenericTableComparator; +import org.eclipse.jface.viewers.Viewer; + +public class NodeViewerComparator extends GenericTableComparator { + private final static Log log = LogFactory + .getLog(NodeViewerComparator.class); + + protected List propertiesList; + protected List propertyTypesList; + protected Integer propertyType; + protected String property; + + public NodeViewerComparator(int defaultColIndex, int defaultDirection, + List propertiesList, List propertyTypesList) { + super(defaultColIndex, defaultDirection); + this.propertiesList = propertiesList; + this.propertyTypesList = propertyTypesList; + this.propertyIndex = defaultColIndex; + this.propertyType = propertyTypesList.get(defaultColIndex); + this.property = propertiesList.get(defaultColIndex); + setColumn(defaultColIndex); + } + + @Override + public int compare(Viewer viewer, Object e1, Object e2) { + int rc = 0; + long lc = 0; + + try { + Node n1 = (Node) e1; + Node n2 = (Node) e2; + + Value v1 = null; + Value v2 = null; + if (n1.hasProperty(property)) + v1 = n1.getProperty(property).getValue(); + if (n2.hasProperty(property)) + v2 = n2.getProperty(property).getValue(); + + if (v2 == null && v1 == null) + return 0; + else if (v2 == null) + return -1; + else if (v1 == null) + return 1; + + switch (propertyType) { + case PropertyType.STRING: + rc = v1.getString().compareTo(v2.getString()); + break; + case PropertyType.BOOLEAN: + boolean b1 = v1.getBoolean(); + boolean b2 = v2.getBoolean(); + if (b1 == b2) + rc = 0; + else + // we assume true is greater than false + rc = b1 ? 1 : -1; + break; + case PropertyType.DATE: + Calendar c1 = v1.getDate(); + Calendar c2 = v2.getDate(); + if (c1 == null || c2 == null) + log.trace("undefined date"); + lc = c1.getTimeInMillis() - c2.getTimeInMillis(); + if (lc < Integer.MIN_VALUE) + // rc = Integer.MIN_VALUE; + rc = -1; + else if (lc > Integer.MAX_VALUE) + // rc = Integer.MAX_VALUE; + rc = 1; + else + rc = (int) lc; + break; + case PropertyType.LONG: + long l1; + long l2; + // FIXME sometimes an empty string is set instead of the id + try { + l1 = v1.getLong(); + } catch (ValueFormatException ve) { + l1 = 0; + } + try { + l2 = v2.getLong(); + } catch (ValueFormatException ve) { + l2 = 0; + } + + lc = l1 - l2; + if (lc < Integer.MIN_VALUE) + // rc = Integer.MIN_VALUE; + rc = -1; + else if (lc > Integer.MAX_VALUE) + // rc = Integer.MAX_VALUE; + rc = 1; + else + rc = (int) lc; + break; + case PropertyType.DECIMAL: + BigDecimal bd1 = v1.getDecimal(); + BigDecimal bd2 = v2.getDecimal(); + rc = bd1.compareTo(bd2); + break; + default: + throw new ArgeoException( + "Unimplemented comparaison for PropertyType " + + propertyType); + } + + // If descending order, flip the direction + if (direction == DESCENDING) { + rc = -rc; + } + + } catch (RepositoryException re) { + throw new ArgeoException("Unexpected error " + + "while comparing nodes", re); + } + return rc; + } + + @Override + public void setColumn(int column) { + if (column == this.propertyIndex) { + // Same column as last sort; toggle the direction + direction = 1 - direction; + } else { + // New column; do a descending sort + this.propertyIndex = column; + this.propertyType = propertyTypesList.get(column); + this.property = propertiesList.get(column); + direction = ASCENDING; + } + } +} \ No newline at end of file diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java index 7ec83600f..e714a780b 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java @@ -15,6 +15,9 @@ */ package org.argeo.slc.client.ui.dist.views; +import java.util.HashMap; +import java.util.Map; + import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; @@ -25,9 +28,17 @@ import org.argeo.eclipse.ui.AbstractTreeContentProvider; import org.argeo.eclipse.ui.ErrorFeedback; import org.argeo.eclipse.ui.TreeParent; import org.argeo.slc.client.ui.dist.DistPlugin; +import org.argeo.slc.client.ui.dist.commands.CopyWorkspace; +import org.argeo.slc.client.ui.dist.commands.CreateWorkspace; +import org.argeo.slc.client.ui.dist.commands.DeleteWorkspace; +import org.argeo.slc.client.ui.dist.commands.ManageWorkspaceAuth; import org.argeo.slc.client.ui.dist.editors.DistributionEditor; import org.argeo.slc.client.ui.dist.editors.DistributionEditorInput; +import org.argeo.slc.client.ui.dist.utils.CommandHelpers; import org.argeo.slc.jcr.SlcNames; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; @@ -36,7 +47,9 @@ import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Tree; +import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; @@ -75,7 +88,19 @@ public class DistributionsView extends ViewPart implements SlcNames { viewer.setContentProvider(new DistributionsContentProvider()); viewer.addDoubleClickListener(new DistributionsDCL()); + + MenuManager menuManager = new MenuManager(); + Menu menu = menuManager.createContextMenu(viewer.getTree()); + menuManager.addMenuListener(new IMenuListener() { + public void menuAboutToShow(IMenuManager manager) { + contextMenuAboutToShow(manager); + } + }); + viewer.getTree().setMenu(menu); + getSite().registerContextMenu(menuManager, viewer); + viewer.setInput(getSite()); + } @Override @@ -83,10 +108,58 @@ public class DistributionsView extends ViewPart implements SlcNames { viewer.getTree().setFocus(); } + /** + * Force refresh of the whole view + */ + public void refresh() { + viewer.setContentProvider(new DistributionsContentProvider()); + } + public void setRepository(Repository repository) { this.repository = repository; } + /** Programatically configure the context menu */ + protected void contextMenuAboutToShow(IMenuManager menuManager) { + IWorkbenchWindow window = DistPlugin.getDefault().getWorkbench() + .getActiveWorkbenchWindow(); + // Get Current selected item : + Object firstElement = ((IStructuredSelection) viewer.getSelection()) + .getFirstElement(); + String wsName = null; + if (firstElement instanceof TreeParent) { + wsName = ((TreeParent) firstElement).getName(); + } + + // Build conditions depending on element type (repo or workspace) + + // create workspace + CommandHelpers.refreshCommand(menuManager, window, CreateWorkspace.ID, + CreateWorkspace.DEFAULT_LABEL, + CreateWorkspace.DEFAULT_ICON_PATH, true); + + // Copy workspace + Map params = new HashMap(); + params.put(CopyWorkspace.PARAM_WORKSPACE_NAME, wsName); + CommandHelpers.refreshParameterizedCommand(menuManager, window, + CopyWorkspace.ID, CopyWorkspace.DEFAULT_LABEL, + CopyWorkspace.DEFAULT_ICON_PATH, true, params); + + // Delete Workspace + params = new HashMap(); + params.put(DeleteWorkspace.PARAM_WORKSPACE_NAME, wsName); + CommandHelpers.refreshParameterizedCommand(menuManager, window, + DeleteWorkspace.ID, DeleteWorkspace.DEFAULT_LABEL, + DeleteWorkspace.DEFAULT_ICON_PATH, true, params); + + // Manage workspace authorizations + params = new HashMap(); + params.put(ManageWorkspaceAuth.PARAM_WORKSPACE_NAME, wsName); + CommandHelpers.refreshParameterizedCommand(menuManager, window, + ManageWorkspaceAuth.ID, ManageWorkspaceAuth.DEFAULT_LABEL, + ManageWorkspaceAuth.DEFAULT_ICON_PATH, true, params); + } + private class DistributionsContentProvider extends AbstractTreeContentProvider { @@ -160,4 +233,5 @@ public class DistributionsView extends ViewPart implements SlcNames { } } + } diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/ChangeRightsWizard.java b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/ChangeRightsWizard.java new file mode 100644 index 000000000..772a8c256 --- /dev/null +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/ChangeRightsWizard.java @@ -0,0 +1,49 @@ +package org.argeo.slc.client.ui.dist.wizards; + +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.argeo.ArgeoException; +import org.argeo.jcr.JcrUtils; +import org.eclipse.jface.wizard.Wizard; + +/** + * Small wizard to manage authorizations on the root node of the current + * workspace + */ +public class ChangeRightsWizard extends Wizard { + + private Session currentSession; + + // This page widget + private ChooseRightsPage page; + + public ChangeRightsWizard(Session currentSession) { + super(); + this.currentSession = currentSession; + } + + @Override + public void addPages() { + try { + page = new ChooseRightsPage(); + addPage(page); + } catch (Exception e) { + throw new ArgeoException("Cannot add page to wizard ", e); + } + } + + @Override + public boolean performFinish() { + if (!canFinish()) + return false; + try { + JcrUtils.addPrivilege(currentSession, "/", page.getGroupName(), + page.getAuthTypeStr()); + } catch (RepositoryException re) { + throw new ArgeoException( + "Unexpected error while setting privileges", re); + } + return true; + } +} diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/ChooseRightsPage.java b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/ChooseRightsPage.java new file mode 100644 index 000000000..9c3572e18 --- /dev/null +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/ChooseRightsPage.java @@ -0,0 +1,94 @@ +package org.argeo.slc.client.ui.dist.wizards; + +import java.util.regex.Pattern; + +import javax.jcr.security.Privilege; + +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +public class ChooseRightsPage extends WizardPage implements ModifyListener { + + // This page widget + private Text groupNameTxt; + private Combo authorizationCmb; + + // Define acceptable chars for the technical name + private static Pattern p = Pattern.compile("^[A-Za-z0-9]+$"); + + // USABLE SHORTCUTS + protected final static String[] validAuthType = { Privilege.JCR_READ, + Privilege.JCR_WRITE, Privilege.JCR_ALL }; + + public ChooseRightsPage() { + super("Main"); + setTitle("Manange authorizations on the current workspace"); + } + + public void createControl(Composite parent) { + // specify subject + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayout(new GridLayout(2, false)); + Label lbl = new Label(composite, SWT.LEAD); + lbl.setText("Group or user name (no blank, no special chars)"); + lbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); + groupNameTxt = new Text(composite, SWT.LEAD | SWT.BORDER); + groupNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, + false)); + if (groupNameTxt != null) + groupNameTxt.addModifyListener(this); + + // Choose rigths + new Label(composite, SWT.NONE).setText("Choose corresponding rights"); + authorizationCmb = new Combo(composite, SWT.BORDER | SWT.V_SCROLL); + authorizationCmb.setItems(validAuthType); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + authorizationCmb.setLayoutData(gd); + + authorizationCmb.select(0); + + // Compulsory + setControl(composite); + } + + protected String getGroupName() { + return groupNameTxt.getText(); + } + + protected String getAuthTypeStr() { + return authorizationCmb.getItem(authorizationCmb.getSelectionIndex()); + } + + private static boolean match(String s) { + return p.matcher(s).matches(); + } + + public void modifyText(ModifyEvent event) { + String message = checkComplete(); + if (message != null) + setMessage(message, WizardPage.ERROR); + else { + setMessage("Complete", WizardPage.INFORMATION); + setPageComplete(true); + } + } + + /** @return error message or null if complete */ + protected String checkComplete() { + String groupStr = groupNameTxt.getText(); + if (groupStr == null || "".equals(groupStr)) + return "Please enter a short technical name for the new repository."; + else if (!match(groupStr)) + return "Please use only alphanumerical chars for the short technical name."; + + return null; + } +} -- 2.39.2