From: Bruno Sinou Date: Mon, 25 Mar 2013 20:54:30 +0000 (+0000) Subject: enhance management of context menus and commands. Remove a few bugs. X-Git-Tag: argeo-slc-2.1.7~367 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=018795e1c7fb82445c43dcb28fdc515e8cb624ac;p=gpl%2Fargeo-slc.git enhance management of context menus and commands. Remove a few bugs. git-svn-id: https://svn.argeo.org/slc/trunk@6217 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/AddResultFolder.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/AddResultFolder.java index 9ec54eb54..8c2839a0d 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/AddResultFolder.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/AddResultFolder.java @@ -40,7 +40,7 @@ import org.eclipse.ui.handlers.HandlerUtil; public class AddResultFolder extends AbstractHandler { public final static String ID = ClientUiPlugin.ID + ".addResultFolder"; public final static String DEFAULT_ICON_REL_PATH = "icons/addFolder.gif"; - public final static String DEFAULT_LABEL = "New result folder"; + public final static String DEFAULT_LABEL = "Add folder..."; public Object execute(ExecutionEvent event) throws ExecutionException { IStructuredSelection selection = (IStructuredSelection) HandlerUtil diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/DeleteItems.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/DeleteItems.java index 5858f67be..688652825 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/DeleteItems.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/DeleteItems.java @@ -15,9 +15,9 @@ */ package org.argeo.slc.client.ui.commands; -import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; -import java.util.List; +import java.util.Map; import javax.jcr.Node; import javax.jcr.RepositoryException; @@ -54,7 +54,7 @@ public class DeleteItems extends AbstractHandler { .getActiveWorkbenchWindow(event).getActivePage().getSelection(); // confirmation - StringBuffer buf = new StringBuffer(""); + StringBuilder buf = new StringBuilder(""); Iterator lst = ((IStructuredSelection) selection).iterator(); while (lst.hasNext()) { Object obj = lst.next(); @@ -67,7 +67,7 @@ public class DeleteItems extends AbstractHandler { String msg = "Nothing to delete"; // remove last separator if (buf.lastIndexOf(", ") > -1) { - msg = "Do you want to delete following objects: " + msg = "Do you want to delete following objects (and their children): " + buf.substring(0, buf.lastIndexOf(", ")) + "?"; } Boolean ok = MessageDialog.openConfirm( @@ -81,29 +81,37 @@ public class DeleteItems extends AbstractHandler { protected IStatus run(IProgressMonitor monitor) { if (selection != null && selection instanceof IStructuredSelection) { - List nodes = new ArrayList(); + Map nodes = new HashMap(); Iterator it = ((IStructuredSelection) selection) .iterator(); Object obj = null; - while (it.hasNext()) { - obj = it.next(); - if (obj instanceof ResultFolder) { - Node node = ((ResultFolder) obj).getNode(); - nodes.add(node); - } else if (obj instanceof SingleResultNode) { - Node node = ((SingleResultNode) obj).getNode(); - nodes.add(node); - } - } try { + + while (it.hasNext()) { + obj = it.next(); + if (obj instanceof ResultFolder) { + Node node = ((ResultFolder) obj).getNode(); + nodes.put(node.getPath(), node); + } else if (obj instanceof SingleResultNode) { + Node node = ((SingleResultNode) obj).getNode(); + nodes.put(node.getPath(), node); + } + } if (!nodes.isEmpty()) { - Session session = nodes.get(0).getSession(); + Session session = null; monitor.beginTask("Delete results", nodes.size()); - for (Node node : nodes) { - Node parent = node.getParent(); - node.remove(); - ResultParentUtils.updatePassedStatus(parent, - true); + for (String path : nodes.keySet()) { + if (session == null) + session = nodes.get(path).getSession(); + + // check if the item has not already been + // deleted while deleting one of its ancestor + if (session.itemExists(path)) { + Node parent = nodes.get(path).getParent(); + nodes.get(path).remove(); + ResultParentUtils.updatePassedStatus( + parent, true); + } monitor.worked(1); } session.save(); diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/RefreshJcrResultTreeView.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/RefreshJcrResultTreeView.java index a6d85ce9b..ecc81242a 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/RefreshJcrResultTreeView.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/RefreshJcrResultTreeView.java @@ -39,6 +39,7 @@ import org.argeo.slc.client.ui.views.JcrResultTreeView; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.handlers.HandlerUtil; @@ -53,6 +54,9 @@ public class RefreshJcrResultTreeView extends AbstractHandler { public final static String PARAM_REFRESH_TYPE = ClientUiPlugin.ID + ".param.refreshType"; public final static String PARAM_REFRESH_TYPE_FULL = "fullRefresh"; + public final static ImageDescriptor DEFAULT_IMG_DESCRIPTOR = ClientUiPlugin + .getImageDescriptor("icons/refresh.png"); + public final static String DEFAULT_LABEL = "Refresh selected"; public Object execute(final ExecutionEvent event) throws ExecutionException { String refreshType = event.getParameter(PARAM_REFRESH_TYPE); diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/RenameResultFolder.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/RenameResultFolder.java index 3e7291cba..2bdb20db4 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/RenameResultFolder.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/RenameResultFolder.java @@ -39,7 +39,7 @@ public class RenameResultFolder extends AbstractHandler { public final static String ID = ClientUiPlugin.ID + ".renameResultFolder"; public final static ImageDescriptor DEFAULT_IMG_DESCRIPTOR = ClientUiPlugin .getImageDescriptor("icons/rename.png"); - public final static String DEFAULT_LABEL = "Rename folder"; + public final static String DEFAULT_LABEL = "Rename..."; public Object execute(ExecutionEvent event) throws ExecutionException { IStructuredSelection selection = (IStructuredSelection) HandlerUtil diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessBuilderPage.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessBuilderPage.java index a18fecd31..1444ff185 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessBuilderPage.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessBuilderPage.java @@ -859,4 +859,4 @@ public class ProcessBuilderPage extends FormPage implements SlcNames { } } -} +} \ No newline at end of file diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultItemsComparator.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultItemsComparator.java index d36a9ca0c..30e7baa44 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultItemsComparator.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultItemsComparator.java @@ -72,11 +72,24 @@ public class ResultItemsComparator extends ViewerComparator { } catch (RepositoryException e) { throw new SlcException("Unable to compare date created", e); } - } else - // only remaining objects for the time being - // NT_UNSTRUCTURED that display all result tree structures - // We want the newest folders first - result = super.compare(viewer, e1, e2) * -1; + } else if (e1 instanceof ParentNodeFolder + && e2 instanceof ParentNodeFolder) { + try { + Node an = ((ParentNodeFolder) e1).getNode(); + // under my Result + if (an.isNodeType(SlcTypes.SLC_MY_RESULT_ROOT_FOLDER) + || an.isNodeType(SlcTypes.SLC_RESULT_FOLDER)) { + result = super.compare(viewer, e1, e2); + } else { + // only remaining objects for the time being + // NT_UNSTRUCTURED that display all result tree structures + // We want the newest folders first + result = super.compare(viewer, e1, e2) * -1; + } + } catch (RepositoryException e) { + throw new SlcException("Unable to compare date created", e); + } + } return result; } } \ No newline at end of file diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrExecutionModulesView.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrExecutionModulesView.java index 1db61bd3e..a3b7537ed 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrExecutionModulesView.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrExecutionModulesView.java @@ -50,6 +50,10 @@ import org.argeo.slc.execution.ExecutionModulesManager; import org.argeo.slc.jcr.SlcJcrConstants; import org.argeo.slc.jcr.SlcNames; import org.argeo.slc.jcr.SlcTypes; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; @@ -64,6 +68,7 @@ import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; @@ -79,14 +84,13 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, private TreeViewer viewer; + /* DEPENDENCY INJECTION */ private Session session; - private ExecutionModulesManager modulesManager; public void createPartControl(Composite parent) { viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); EclipseUiSpecificUtils.enableToolTipSupport(viewer); - ViewContentProvider contentProvider = new ViewContentProvider(session); viewer.setContentProvider(contentProvider); viewer.setComparer(new NodeElementComparer()); @@ -94,6 +98,9 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, viewer.setLabelProvider(viewLabelProvider); viewer.setInput(getViewSite()); viewer.addDoubleClickListener(new ViewDoubleClickListener()); + // context menu + addContextMenu(viewer); + getViewSite().setSelectionProvider(viewer); Transfer[] tt = new Transfer[] { TextTransfer.getInstance() }; @@ -129,6 +136,7 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, viewer.setInput(getViewSite()); } + // Controllers class ViewContentProvider extends SimpleNodeContentProvider { public ViewContentProvider(Session session) { @@ -211,6 +219,25 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, } + private void addContextMenu(TreeViewer flowsViewer) { + + final MenuManager menuMgr = new MenuManager(); + menuMgr.setRemoveAllWhenShown(true); + menuMgr.addMenuListener(new IMenuListener() { + + public void menuAboutToShow(IMenuManager manager) { + menuMgr.add(new Action("Test") { + public void run() { + log.debug("do something"); + } + }); + } + }); + Menu menu = menuMgr.createContextMenu(flowsViewer.getControl()); + flowsViewer.getTree().setMenu(menu); + getSite().registerContextMenu(menuMgr, flowsViewer); + } + class VmAgentObserver extends AsyncUiEventListener { public VmAgentObserver(Display display) { diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultTreeView.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultTreeView.java index ab312d6e1..8a16986b1 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultTreeView.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultTreeView.java @@ -40,6 +40,8 @@ import org.argeo.slc.SlcException; import org.argeo.slc.client.ui.ClientUiPlugin; import org.argeo.slc.client.ui.SlcUiConstants; import org.argeo.slc.client.ui.commands.AddResultFolder; +import org.argeo.slc.client.ui.commands.DeleteItems; +import org.argeo.slc.client.ui.commands.RefreshJcrResultTreeView; import org.argeo.slc.client.ui.commands.RenameResultFolder; import org.argeo.slc.client.ui.commands.RenameResultNode; import org.argeo.slc.client.ui.editors.ProcessEditor; @@ -186,9 +188,9 @@ public class JcrResultTreeView extends ViewPart { */ private void setOrderedInput(TreeViewer viewer) { // Add specific ordering - resultTreeViewer.setInput(null); + viewer.setInput(null); viewer.setComparator(null); - resultTreeViewer.setInput(initializeResultTree()); + viewer.setInput(initializeResultTree()); viewer.setComparator(new ResultItemsComparator()); } @@ -233,6 +235,8 @@ public class JcrResultTreeView extends ViewPart { } }); viewer.getTree().setMenu(menu); + menuManager.setRemoveAllWhenShown(true); + getSite().registerContextMenu(menuManager, viewer); // add change listener to display TestResult information in the property @@ -295,7 +299,7 @@ public class JcrResultTreeView extends ViewPart { if (property.getValue().getBoolean()) value = "SUCCESS"; else { - if (property.getParent().hasNode( + if (property.getParent().hasProperty( SlcNames.SLC_ERROR_MESSAGE)) value = "ERROR"; else @@ -481,10 +485,13 @@ public class JcrResultTreeView extends ViewPart { boolean canAddSubfolder = false; boolean canRenamefolder = false; boolean isSingleResultNode = false; - // Building conditions - if (selection.size() == 1) { - Object obj = selection.getFirstElement(); - try { + boolean isUnderMyResult = false; + boolean validMultipleDelete = false; + try { + + // Building conditions + if (selection.size() == 1) { + Object obj = selection.getFirstElement(); if (obj instanceof SingleResultNode) isSingleResultNode = true; else if (obj instanceof ParentNodeFolder) { @@ -492,18 +499,50 @@ public class JcrResultTreeView extends ViewPart { if (cNode.isNodeType(SlcTypes.SLC_RESULT_FOLDER)) { canAddSubfolder = true; canRenamefolder = true; + isUnderMyResult = true; } else if (cNode .isNodeType(SlcTypes.SLC_MY_RESULT_ROOT_FOLDER)) { canAddSubfolder = true; } } - } catch (RepositoryException re) { - throw new SlcException( - "unexpected error while building condition for context menu", - re); + } else { + @SuppressWarnings("rawtypes") + Iterator it = selection.iterator(); + multicheck: while (it.hasNext()) { + validMultipleDelete = true; + Object obj = it.next(); + if (obj instanceof SingleResultNode) + continue multicheck; + else if (obj instanceof ParentNodeFolder) { + Node cNode = ((ParentNodeFolder) obj).getNode(); + if (cNode.isNodeType(SlcTypes.SLC_RESULT_FOLDER)) + continue multicheck; + else { + validMultipleDelete = false; + break multicheck; + } + } else { + validMultipleDelete = false; + break multicheck; + } + } } + } catch (RepositoryException re) { + throw new SlcException( + "unexpected error while building condition for context menu", + re); } + // Effective Refresh + CommandUtils.refreshCommand(menuManager, window, + RefreshJcrResultTreeView.ID, + RefreshJcrResultTreeView.DEFAULT_LABEL, + RefreshJcrResultTreeView.DEFAULT_IMG_DESCRIPTOR, true); + + CommandUtils.refreshCommand(menuManager, window, DeleteItems.ID, + DeleteItems.DEFAULT_LABEL, DeleteItems.DEFAULT_IMG_DESCRIPTOR, + isUnderMyResult || isSingleResultNode || validMultipleDelete); + CommandUtils.refreshCommand(menuManager, window, AddResultFolder.ID, AddResultFolder.DEFAULT_LABEL, ClientUiPlugin.getDefault().getWorkbench().getSharedImages() @@ -514,9 +553,21 @@ public class JcrResultTreeView extends ViewPart { RenameResultFolder.DEFAULT_LABEL, RenameResultFolder.DEFAULT_IMG_DESCRIPTOR, canRenamefolder); + // Command removed for the time being. CommandUtils.refreshCommand(menuManager, window, RenameResultNode.ID, RenameResultNode.DEFAULT_LABEL, - RenameResultNode.DEFAULT_IMG_DESCRIPTOR, isSingleResultNode); + RenameResultNode.DEFAULT_IMG_DESCRIPTOR, false); + + // Test to be removed + // If you use this pattern, do not forget to call + // menuManager.setRemoveAllWhenShown(true); + // when creating the menuManager + + // menuManager.add(new Action("Test") { + // public void run() { + // log.debug("do something"); + // } + // }); } /* INNER CLASSES */ @@ -578,14 +629,14 @@ public class JcrResultTreeView extends ViewPart { } else { @SuppressWarnings("rawtypes") Iterator it = selection.iterator(); - StringBuffer nodes = new StringBuffer(); + StringBuilder nodes = new StringBuilder(); while (it.hasNext()) { Object obj = it.next(); if (obj instanceof SingleResultNode) { Node tNode = ((SingleResultNode) obj).getNode(); if (tNode.getPrimaryNodeType().isNodeType( SlcTypes.SLC_TEST_RESULT)) { - nodes.append(tNode.getIdentifier() + ";"); + nodes.append(tNode.getIdentifier()).append(";"); } } } @@ -711,9 +762,11 @@ public class JcrResultTreeView extends ViewPart { } Node target; - boolean passedStatus = source - .getNode(SlcNames.SLC_AGGREGATED_STATUS) - .getProperty(SlcNames.SLC_SUCCESS).getBoolean(); + boolean passedStatus = false; + if (source.hasNode(SlcNames.SLC_AGGREGATED_STATUS)) + passedStatus = source + .getNode(SlcNames.SLC_AGGREGATED_STATUS) + .getProperty(SlcNames.SLC_SUCCESS).getBoolean(); boolean isActionUnderMyResult = source.getPath() .startsWith( @@ -729,7 +782,6 @@ public class JcrResultTreeView extends ViewPart { String destPath = targetParentNode.getPath() + "/" + name; session.move(sourcePath, destPath); - // session.save(); // Update passed status of the parent source Node ResultParentUtils .updatePassedStatus(session.getNode(JcrUtils @@ -743,70 +795,6 @@ public class JcrResultTreeView extends ViewPart { ResultParentUtils.updatePassedStatus(target.getParent(), passedStatus); session.save(); - - // try { - // Node source = session.getNodeByIdentifier(id); - // String name; - // if (source.hasProperty(Property.JCR_TITLE)) - // name = source.getProperty(Property.JCR_TITLE) - // .getString(); - // else if (source.hasProperty(SlcNames.SLC_TEST_CASE)) - // name = source.getProperty(SlcNames.SLC_TEST_CASE) - // .getString(); - // else - // name = source.getName(); - // - // // Check if a user defined folder result with same name - // // exists - // // at target - // if (targetParentNode.hasNode(name) - // && targetParentNode.getNode(name).isNodeType( - // SlcTypes.SLC_RESULT_FOLDER)) { - // ConfirmOverwriteWizard wizard = new - // ConfirmOverwriteWizard( - // name, targetParentNode); - // WizardDialog dialog = new WizardDialog(Display - // .getDefault().getActiveShell(), wizard); - // - // if (dialog.open() == WizardDialog.CANCEL) - // return true; - // - // if (wizard.overwrite()) { - // targetParentNode.getNode(name).remove(); - // // session.save(); - // } else - // name = wizard.newName(); - // } - // - // Node target; - // boolean passedStatus = source - // .getNode(SlcNames.SLC_AGGREGATED_STATUS) - // .getProperty(SlcNames.SLC_SUCCESS).getBoolean(); - // - // if (!isActionUnderMyResult) {// Copy - // target = targetParentNode.addNode(source.getName(), - // source.getPrimaryNodeType().getName()); - // JcrUtils.copy(source, target); - // } else {// move - // String sourcePath = source.getPath(); - // String destPath = targetParentNode.getPath() + "/" - // + name; - // session.move(sourcePath, destPath); - // // session.save(); - // // Update passed status of the parent source Node - // ResultParentUtils - // .updatePassedStatus(session.getNode(JcrUtils - // .parentPath(sourcePath)), true); - // target = session.getNode(destPath); - // - // } - // if (!target.isNodeType(NodeType.MIX_TITLE)) - // target.addMixin(NodeType.MIX_TITLE); - // target.setProperty(Property.JCR_TITLE, name); - // ResultParentUtils.updatePassedStatus(target.getParent(), - // passedStatus); - // session.save(); - } } catch (RepositoryException re) { throw new SlcException(