*/\r
package org.argeo.slc.client.ui.commands;\r
\r
-import java.util.ArrayList;\r
+import java.util.HashMap;\r
import java.util.Iterator;\r
-import java.util.List;\r
+import java.util.Map;\r
\r
import javax.jcr.Node;\r
import javax.jcr.RepositoryException;\r
.getActiveWorkbenchWindow(event).getActivePage().getSelection();\r
\r
// confirmation\r
- StringBuffer buf = new StringBuffer("");\r
+ StringBuilder buf = new StringBuilder("");\r
Iterator<?> lst = ((IStructuredSelection) selection).iterator();\r
while (lst.hasNext()) {\r
Object obj = lst.next();\r
String msg = "Nothing to delete";\r
// remove last separator\r
if (buf.lastIndexOf(", ") > -1) {\r
- msg = "Do you want to delete following objects: "\r
+ msg = "Do you want to delete following objects (and their children): "\r
+ buf.substring(0, buf.lastIndexOf(", ")) + "?";\r
}\r
Boolean ok = MessageDialog.openConfirm(\r
protected IStatus run(IProgressMonitor monitor) {\r
if (selection != null\r
&& selection instanceof IStructuredSelection) {\r
- List<Node> nodes = new ArrayList<Node>();\r
+ Map<String, Node> nodes = new HashMap<String, Node>();\r
Iterator<?> it = ((IStructuredSelection) selection)\r
.iterator();\r
Object obj = null;\r
- while (it.hasNext()) {\r
- obj = it.next();\r
- if (obj instanceof ResultFolder) {\r
- Node node = ((ResultFolder) obj).getNode();\r
- nodes.add(node);\r
- } else if (obj instanceof SingleResultNode) {\r
- Node node = ((SingleResultNode) obj).getNode();\r
- nodes.add(node);\r
- }\r
- }\r
try {\r
+\r
+ while (it.hasNext()) {\r
+ obj = it.next();\r
+ if (obj instanceof ResultFolder) {\r
+ Node node = ((ResultFolder) obj).getNode();\r
+ nodes.put(node.getPath(), node);\r
+ } else if (obj instanceof SingleResultNode) {\r
+ Node node = ((SingleResultNode) obj).getNode();\r
+ nodes.put(node.getPath(), node);\r
+ }\r
+ }\r
if (!nodes.isEmpty()) {\r
- Session session = nodes.get(0).getSession();\r
+ Session session = null;\r
monitor.beginTask("Delete results", nodes.size());\r
- for (Node node : nodes) {\r
- Node parent = node.getParent();\r
- node.remove();\r
- ResultParentUtils.updatePassedStatus(parent,\r
- true);\r
+ for (String path : nodes.keySet()) {\r
+ if (session == null)\r
+ session = nodes.get(path).getSession();\r
+\r
+ // check if the item has not already been\r
+ // deleted while deleting one of its ancestor\r
+ if (session.itemExists(path)) {\r
+ Node parent = nodes.get(path).getParent();\r
+ nodes.get(path).remove();\r
+ ResultParentUtils.updatePassedStatus(\r
+ parent, true);\r
+ }\r
monitor.worked(1);\r
}\r
session.save();\r
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;
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;
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());
viewer.setLabelProvider(viewLabelProvider);
viewer.setInput(getViewSite());
viewer.addDoubleClickListener(new ViewDoubleClickListener());
+ // context menu
+ addContextMenu(viewer);
+
getViewSite().setSelectionProvider(viewer);
Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
viewer.setInput(getViewSite());
}
+ // Controllers
class ViewContentProvider extends SimpleNodeContentProvider {
public ViewContentProvider(Session session) {
}
+ 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) {
import org.argeo.slc.client.ui.ClientUiPlugin;\r
import org.argeo.slc.client.ui.SlcUiConstants;\r
import org.argeo.slc.client.ui.commands.AddResultFolder;\r
+import org.argeo.slc.client.ui.commands.DeleteItems;\r
+import org.argeo.slc.client.ui.commands.RefreshJcrResultTreeView;\r
import org.argeo.slc.client.ui.commands.RenameResultFolder;\r
import org.argeo.slc.client.ui.commands.RenameResultNode;\r
import org.argeo.slc.client.ui.editors.ProcessEditor;\r
*/\r
private void setOrderedInput(TreeViewer viewer) {\r
// Add specific ordering\r
- resultTreeViewer.setInput(null);\r
+ viewer.setInput(null);\r
viewer.setComparator(null);\r
- resultTreeViewer.setInput(initializeResultTree());\r
+ viewer.setInput(initializeResultTree());\r
viewer.setComparator(new ResultItemsComparator());\r
}\r
\r
}\r
});\r
viewer.getTree().setMenu(menu);\r
+ menuManager.setRemoveAllWhenShown(true);\r
+\r
getSite().registerContextMenu(menuManager, viewer);\r
\r
// add change listener to display TestResult information in the property\r
if (property.getValue().getBoolean())\r
value = "SUCCESS";\r
else {\r
- if (property.getParent().hasNode(\r
+ if (property.getParent().hasProperty(\r
SlcNames.SLC_ERROR_MESSAGE))\r
value = "ERROR";\r
else\r
boolean canAddSubfolder = false;\r
boolean canRenamefolder = false;\r
boolean isSingleResultNode = false;\r
- // Building conditions\r
- if (selection.size() == 1) {\r
- Object obj = selection.getFirstElement();\r
- try {\r
+ boolean isUnderMyResult = false;\r
+ boolean validMultipleDelete = false;\r
+ try {\r
+\r
+ // Building conditions\r
+ if (selection.size() == 1) {\r
+ Object obj = selection.getFirstElement();\r
if (obj instanceof SingleResultNode)\r
isSingleResultNode = true;\r
else if (obj instanceof ParentNodeFolder) {\r
if (cNode.isNodeType(SlcTypes.SLC_RESULT_FOLDER)) {\r
canAddSubfolder = true;\r
canRenamefolder = true;\r
+ isUnderMyResult = true;\r
} else if (cNode\r
.isNodeType(SlcTypes.SLC_MY_RESULT_ROOT_FOLDER)) {\r
canAddSubfolder = true;\r
}\r
}\r
- } catch (RepositoryException re) {\r
- throw new SlcException(\r
- "unexpected error while building condition for context menu",\r
- re);\r
+ } else {\r
+ @SuppressWarnings("rawtypes")\r
+ Iterator it = selection.iterator();\r
+ multicheck: while (it.hasNext()) {\r
+ validMultipleDelete = true;\r
+ Object obj = it.next();\r
+ if (obj instanceof SingleResultNode)\r
+ continue multicheck;\r
+ else if (obj instanceof ParentNodeFolder) {\r
+ Node cNode = ((ParentNodeFolder) obj).getNode();\r
+ if (cNode.isNodeType(SlcTypes.SLC_RESULT_FOLDER))\r
+ continue multicheck;\r
+ else {\r
+ validMultipleDelete = false;\r
+ break multicheck;\r
+ }\r
+ } else {\r
+ validMultipleDelete = false;\r
+ break multicheck;\r
+ }\r
+ }\r
}\r
+ } catch (RepositoryException re) {\r
+ throw new SlcException(\r
+ "unexpected error while building condition for context menu",\r
+ re);\r
}\r
+\r
// Effective Refresh\r
+ CommandUtils.refreshCommand(menuManager, window,\r
+ RefreshJcrResultTreeView.ID,\r
+ RefreshJcrResultTreeView.DEFAULT_LABEL,\r
+ RefreshJcrResultTreeView.DEFAULT_IMG_DESCRIPTOR, true);\r
+\r
+ CommandUtils.refreshCommand(menuManager, window, DeleteItems.ID,\r
+ DeleteItems.DEFAULT_LABEL, DeleteItems.DEFAULT_IMG_DESCRIPTOR,\r
+ isUnderMyResult || isSingleResultNode || validMultipleDelete);\r
+\r
CommandUtils.refreshCommand(menuManager, window, AddResultFolder.ID,\r
AddResultFolder.DEFAULT_LABEL,\r
ClientUiPlugin.getDefault().getWorkbench().getSharedImages()\r
RenameResultFolder.DEFAULT_LABEL,\r
RenameResultFolder.DEFAULT_IMG_DESCRIPTOR, canRenamefolder);\r
\r
+ // Command removed for the time being.\r
CommandUtils.refreshCommand(menuManager, window, RenameResultNode.ID,\r
RenameResultNode.DEFAULT_LABEL,\r
- RenameResultNode.DEFAULT_IMG_DESCRIPTOR, isSingleResultNode);\r
+ RenameResultNode.DEFAULT_IMG_DESCRIPTOR, false);\r
+\r
+ // Test to be removed\r
+ // If you use this pattern, do not forget to call\r
+ // menuManager.setRemoveAllWhenShown(true);\r
+ // when creating the menuManager\r
+\r
+ // menuManager.add(new Action("Test") {\r
+ // public void run() {\r
+ // log.debug("do something");\r
+ // }\r
+ // });\r
}\r
\r
/* INNER CLASSES */\r
} else {\r
@SuppressWarnings("rawtypes")\r
Iterator it = selection.iterator();\r
- StringBuffer nodes = new StringBuffer();\r
+ StringBuilder nodes = new StringBuilder();\r
while (it.hasNext()) {\r
Object obj = it.next();\r
if (obj instanceof SingleResultNode) {\r
Node tNode = ((SingleResultNode) obj).getNode();\r
if (tNode.getPrimaryNodeType().isNodeType(\r
SlcTypes.SLC_TEST_RESULT)) {\r
- nodes.append(tNode.getIdentifier() + ";");\r
+ nodes.append(tNode.getIdentifier()).append(";");\r
}\r
}\r
}\r
}\r
\r
Node target;\r
- boolean passedStatus = source\r
- .getNode(SlcNames.SLC_AGGREGATED_STATUS)\r
- .getProperty(SlcNames.SLC_SUCCESS).getBoolean();\r
+ boolean passedStatus = false;\r
+ if (source.hasNode(SlcNames.SLC_AGGREGATED_STATUS))\r
+ passedStatus = source\r
+ .getNode(SlcNames.SLC_AGGREGATED_STATUS)\r
+ .getProperty(SlcNames.SLC_SUCCESS).getBoolean();\r
\r
boolean isActionUnderMyResult = source.getPath()\r
.startsWith(\r
String destPath = targetParentNode.getPath() + "/"\r
+ name;\r
session.move(sourcePath, destPath);\r
- // session.save();\r
// Update passed status of the parent source Node\r
ResultParentUtils\r
.updatePassedStatus(session.getNode(JcrUtils\r
ResultParentUtils.updatePassedStatus(target.getParent(),\r
passedStatus);\r
session.save();\r
-\r
- // try {\r
- // Node source = session.getNodeByIdentifier(id);\r
- // String name;\r
- // if (source.hasProperty(Property.JCR_TITLE))\r
- // name = source.getProperty(Property.JCR_TITLE)\r
- // .getString();\r
- // else if (source.hasProperty(SlcNames.SLC_TEST_CASE))\r
- // name = source.getProperty(SlcNames.SLC_TEST_CASE)\r
- // .getString();\r
- // else\r
- // name = source.getName();\r
- //\r
- // // Check if a user defined folder result with same name\r
- // // exists\r
- // // at target\r
- // if (targetParentNode.hasNode(name)\r
- // && targetParentNode.getNode(name).isNodeType(\r
- // SlcTypes.SLC_RESULT_FOLDER)) {\r
- // ConfirmOverwriteWizard wizard = new\r
- // ConfirmOverwriteWizard(\r
- // name, targetParentNode);\r
- // WizardDialog dialog = new WizardDialog(Display\r
- // .getDefault().getActiveShell(), wizard);\r
- //\r
- // if (dialog.open() == WizardDialog.CANCEL)\r
- // return true;\r
- //\r
- // if (wizard.overwrite()) {\r
- // targetParentNode.getNode(name).remove();\r
- // // session.save();\r
- // } else\r
- // name = wizard.newName();\r
- // }\r
- //\r
- // Node target;\r
- // boolean passedStatus = source\r
- // .getNode(SlcNames.SLC_AGGREGATED_STATUS)\r
- // .getProperty(SlcNames.SLC_SUCCESS).getBoolean();\r
- //\r
- // if (!isActionUnderMyResult) {// Copy\r
- // target = targetParentNode.addNode(source.getName(),\r
- // source.getPrimaryNodeType().getName());\r
- // JcrUtils.copy(source, target);\r
- // } else {// move\r
- // String sourcePath = source.getPath();\r
- // String destPath = targetParentNode.getPath() + "/"\r
- // + name;\r
- // session.move(sourcePath, destPath);\r
- // // session.save();\r
- // // Update passed status of the parent source Node\r
- // ResultParentUtils\r
- // .updatePassedStatus(session.getNode(JcrUtils\r
- // .parentPath(sourcePath)), true);\r
- // target = session.getNode(destPath);\r
- //\r
- // }\r
- // if (!target.isNodeType(NodeType.MIX_TITLE))\r
- // target.addMixin(NodeType.MIX_TITLE);\r
- // target.setProperty(Property.JCR_TITLE, name);\r
- // ResultParentUtils.updatePassedStatus(target.getParent(),\r
- // passedStatus);\r
- // session.save();\r
-\r
}\r
} catch (RepositoryException re) {\r
throw new SlcException(\r