]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessBuilderPage.java
Map existing remove and remove all buttons to a context menu
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui / src / main / java / org / argeo / slc / client / ui / editors / ProcessBuilderPage.java
index 5209459771f83dc87232a666cbca32f9f5b899ab..a64055c1386e53417c9ab94881091c7d3c8bc603 100644 (file)
@@ -32,6 +32,8 @@ import javax.jcr.observation.ObservationManager;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryManager;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
 import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;
 import org.argeo.jcr.JcrUtils;
@@ -39,7 +41,6 @@ import org.argeo.slc.SlcException;
 import org.argeo.slc.client.ui.SlcImages;
 import org.argeo.slc.core.execution.PrimitiveAccessor;
 import org.argeo.slc.core.execution.PrimitiveUtils;
-import org.argeo.slc.execution.ExecutionModulesManager;
 import org.argeo.slc.execution.ExecutionProcess;
 import org.argeo.slc.jcr.SlcJcrUtils;
 import org.argeo.slc.jcr.SlcNames;
@@ -78,6 +79,8 @@ import org.eclipse.swt.layout.RowLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.ui.forms.AbstractFormPart;
 import org.eclipse.ui.forms.IManagedForm;
@@ -87,13 +90,14 @@ import org.eclipse.ui.forms.widgets.ScrolledForm;
 
 /** Definition of the process. */
 public class ProcessBuilderPage extends FormPage implements SlcNames {
+       private final static Log log = LogFactory.getLog(ProcessBuilderPage.class);
+
        public final static String ID = "processBuilderPage";
 
        /** To be displayed in empty lists */
        final static String NONE = "<none>";
 
        private Node processNode;
-       private final ExecutionModulesManager modulesManager;
 
        private TreeViewer flowsViewer;
        private TableViewer valuesViewer;
@@ -105,11 +109,9 @@ public class ProcessBuilderPage extends FormPage implements SlcNames {
        private AbstractFormPart formPart;
        private EventListener statusObserver;
 
-       public ProcessBuilderPage(ProcessEditor editor, Node processNode,
-                       ExecutionModulesManager modulesManager) {
+       public ProcessBuilderPage(ProcessEditor editor, Node processNode) {
                super(editor, ID, "Definition");
                this.processNode = processNode;
-               this.modulesManager = modulesManager;
        }
 
        @Override
@@ -239,6 +241,9 @@ public class ProcessBuilderPage extends FormPage implements SlcNames {
                flowsViewer.addDropSupport(operations, tt, new FlowsDropListener(
                                flowsViewer));
 
+               // Context menu
+               addContextMenu();
+
                flowsViewer.setInput(getEditorSite());
                flowsViewer.setInput(processNode);
 
@@ -610,6 +615,39 @@ public class ProcessBuilderPage extends FormPage implements SlcNames {
                }
        }
 
+       /**
+        * Add a context menu that call private methods. It only relies on selected
+        * item(s) not on parameter that are passed in the menuAboutToShow method
+        **/
+       private void addContextMenu() {
+               Menu menu = new Menu(flowsViewer.getControl());
+
+               MenuItem removeItems = new MenuItem(menu, SWT.PUSH);
+               removeItems.addSelectionListener(new SelectionListener() {
+
+                       public void widgetSelected(SelectionEvent e) {
+                               removeSelectedFlows();
+                       }
+
+                       public void widgetDefaultSelected(SelectionEvent e) {
+                       }
+               });
+               removeItems.setText("Remove selected flow(s)");
+
+               MenuItem removeAllItems = new MenuItem(menu, SWT.PUSH);
+               removeAllItems.addSelectionListener(new SelectionListener() {
+
+                       public void widgetSelected(SelectionEvent e) {
+                               removeAllFlows();
+                       }
+
+                       public void widgetDefaultSelected(SelectionEvent e) {
+                       }
+               });
+               removeAllItems.setText("Remove all flows");
+               flowsViewer.getTree().setMenu(menu);
+       }
+
        /** Manages drop event. */
        class FlowsDropListener extends ViewerDropAdapter {
 
@@ -619,32 +657,40 @@ public class ProcessBuilderPage extends FormPage implements SlcNames {
 
                @Override
                public boolean performDrop(Object data) {
-                       String path = data.toString();
-                       try {
-                               // either a node or a whole directory was dragged
-                               QueryManager qm = processNode.getSession().getWorkspace()
-                                               .getQueryManager();
-                               String statement = "SELECT * FROM ["
-                                               + SlcTypes.SLC_EXECUTION_FLOW
-                                               + "] WHERE ISDESCENDANTNODE(['" + path
-                                               + "']) OR ISSAMENODE(['" + path + "'])";
-                               // log.debug(statement);
-                               Query query = qm.createQuery(statement, Query.JCR_SQL2);
-
-                               // order paths
-                               SortedSet<String> paths = new TreeSet<String>();
-                               for (NodeIterator nit = query.execute().getNodes(); nit
-                                               .hasNext();) {
-                                       paths.add(nit.nextNode().getPath());
-                               }
 
-                               for (String p : paths) {
-                                       addFlow(p);
+                       // Parse the received String, paths are separated with a carriage
+                       // return
+                       String[] paths = data.toString().split(new String("\n"));
+                       SortedSet<String> resultPaths = new TreeSet<String>();
+                       for (String path : paths) {
+                               try {
+                                       // either a node or a whole directory can have been dragged
+                                       QueryManager qm = processNode.getSession().getWorkspace()
+                                                       .getQueryManager();
+                                       String statement = "SELECT * FROM ["
+                                                       + SlcTypes.SLC_EXECUTION_FLOW
+                                                       + "] WHERE ISDESCENDANTNODE(['" + path
+                                                       + "']) OR ISSAMENODE(['" + path + "'])";
+                                       Query query = qm.createQuery(statement, Query.JCR_SQL2);
+
+                                       // order paths
+                                       for (NodeIterator nit = query.execute().getNodes(); nit
+                                                       .hasNext();) {
+                                               String currPath = nit.nextNode().getPath();
+                                               // do not add twice a same flow
+                                               if (!resultPaths.contains(currPath))
+                                                       resultPaths.add(currPath);
+                                       }
+                               } catch (RepositoryException e) {
+                                       throw new SlcException("Cannot query flows under " + path,
+                                                       e);
                                }
-                               return true;
-                       } catch (RepositoryException e) {
-                               throw new SlcException("Cannot query flows under " + path, e);
                        }
+                       for (String p : resultPaths) {
+                               addFlow(p);
+                       }
+                       return true;
+
                }
 
                @Override
@@ -672,6 +718,12 @@ public class ProcessBuilderPage extends FormPage implements SlcNames {
                                        if (!specAttrNode
                                                        .isNodeType(SlcTypes.SLC_EXECUTION_SPEC_ATTRIBUTE))
                                                continue specAttrs;
+                                       // workaround to enable hiding of necessary but unusable
+                                       // flow parameters
+                                       else if (specAttrNode.hasProperty(SlcNames.SLC_IS_HIDDEN)
+                                                       && specAttrNode.getProperty(SlcNames.SLC_IS_HIDDEN)
+                                                                       .getBoolean())
+                                               continue specAttrs;
                                        specAttributes.add(specAttrNode);
                                }
                                return specAttributes.toArray();
@@ -732,10 +784,11 @@ public class ProcessBuilderPage extends FormPage implements SlcNames {
                protected boolean canEdit(Object element) {
                        try {
                                Node specAttrNode = (Node) element;
-                               return !(specAttrNode.getProperty(SLC_IS_IMMUTABLE)
-                                               .getBoolean() || specAttrNode.getProperty(
-                                               SLC_IS_CONSTANT).getBoolean())
-                                               && isSupportedAttributeType(specAttrNode);
+                               Boolean cannotEdit = specAttrNode.getProperty(SLC_IS_IMMUTABLE)
+                                               .getBoolean()
+                                               || specAttrNode.getProperty(SLC_IS_CONSTANT)
+                                                               .getBoolean();
+                               return !cannotEdit && isSupportedAttributeType(specAttrNode);
                        } catch (RepositoryException e) {
                                throw new SlcException("Cannot check whether " + element
                                                + " is editable", e);