Introduce process builder view with drag and drop
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 21 Sep 2010 14:31:10 +0000 (14:31 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 21 Sep 2010 14:31:10 +0000 (14:31 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@3783 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

eclipse/plugins/org.argeo.slc.client.rcp/src/org/argeo/slc/client/rcp/ApplicationWorkbenchWindowAdvisor.java
eclipse/plugins/org.argeo.slc.client.rcp/src/org/argeo/slc/client/rcp/Perspective.java
eclipse/plugins/org.argeo.slc.client.ui/META-INF/MANIFEST.MF
eclipse/plugins/org.argeo.slc.client.ui/META-INF/spring/views.xml
eclipse/plugins/org.argeo.slc.client.ui/plugin.xml
eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ExecutionModulesView.java
eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessBuilderView.java [new file with mode: 0644]
eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessListView.java

index 17250fa5bb1f53fca346988dc96afe210cc66822..2d78e0b231f06a61e8cd09d28764690391d0022b 100644 (file)
@@ -32,7 +32,7 @@ public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
 
        public void preWindowOpen() {
                IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-               configurer.setInitialSize(new Point(800, 600));
+               configurer.setInitialSize(new Point(1024, 800));
                configurer.setShowCoolBar(true);
                configurer.setShowStatusLine(false);
        }
index 746dfe5536da702c3297e59b693630c38212abd1..857ce722e9fd2efc34ea01da8eb8e96681681a72 100644 (file)
@@ -1,6 +1,7 @@
 package org.argeo.slc.client.rcp;
 
 import org.argeo.slc.client.ui.views.ExecutionModulesView;
+import org.argeo.slc.client.ui.views.ProcessBuilderView;
 import org.argeo.slc.client.ui.views.ResultListView;
 import org.argeo.slc.client.ui.views.ProcessListView;
 import org.eclipse.ui.IFolderLayout;
@@ -14,15 +15,21 @@ public class Perspective implements IPerspectiveFactory {
                layout.setEditorAreaVisible(false);
                layout.setFixed(true);
 
-               layout.addStandaloneView(ExecutionModulesView.ID, false,
+               IFolderLayout topLeft = layout.createFolder("topLeft",
                                IPageLayout.LEFT, 0.5f, editorArea);
+               topLeft.addView(ExecutionModulesView.ID);
+
                IFolderLayout topRight = layout.createFolder("topRight",
                                IPageLayout.RIGHT, 0.5f, editorArea);
-
                topRight.addView(ResultListView.ID);
+
                IFolderLayout bottomRight = layout.createFolder("bottomRight",
-                               IPageLayout.BOTTOM, 0.5f, "topRight");
+                               IPageLayout.BOTTOM, 0.6f, "topRight");
                bottomRight.addView(ProcessListView.ID);
+
+               IFolderLayout bottomLeft = layout.createFolder("bottomLeft",
+                               IPageLayout.BOTTOM, 0.6f, "topLeft");
+               bottomLeft.addView(ProcessBuilderView.ID);
                // layout.addStandaloneView(SlcExecutionListView.ID, false,
                // IPageLayout.BOTTOM, 0.5f, editorArea);
        }
index c3bfd54c1e2374f12b14127bbc1e4d5d6b91ce4b..ea098f24251d6c62980e4123f239406525a3b7ad 100644 (file)
@@ -14,7 +14,8 @@ Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.argeo.slc.client.ui,
  org.argeo.slc.client.ui.services,
  org.argeo.slc.client.ui.views
-Import-Package: org.apache.commons.logging;version="1.1.1",
+Import-Package: org.apache.commons.io;version="1.4.0",
+ org.apache.commons.logging;version="1.1.1",
  org.argeo.eclipse.spring,
  org.argeo.eclipse.ui,
  org.argeo.slc.build;version="0.13.0.SNAPSHOT-r3685",
index 4c349d6ec18ce1fb219e7a8f87b83df2eab52b50..5fc0b87f2dd1e66affce74e35411f4822ac2ef04 100644 (file)
                <property name="testResultCollectionDao" ref="testResultCollectionDao" />
        </bean>
 
-       <bean id="org.argeo.slc.client.ui.ProcessListView" class="org.argeo.slc.client.ui.views.ProcessListView"
+       <bean id="org.argeo.slc.client.ui.processListView" class="org.argeo.slc.client.ui.views.ProcessListView"
                scope="prototype">
                <property name="slcExecutionDao" ref="slcExecutionDao" />
        </bean>
 
+       <bean id="org.argeo.slc.client.ui.processBuilderView" class="org.argeo.slc.client.ui.views.ProcessBuilderView"
+               scope="prototype">
+               <property name="processController" ref="processController" />
+       </bean>
+
        <bean id="executionModulesContentProvider"
                class="org.argeo.slc.client.ui.views.ExecutionModulesContentProvider">
                <property name="slcAgents" ref="slcAgents" />
index aefea579175359b5b11bfaedd4a1f7a172faa190..591e9fecddc85930739349f8e575687a093fb452 100644 (file)
          restorable="true">
    </view>
    <view
-         id="org.argeo.slc.client.ui.ProcessListView"
+         id="org.argeo.slc.client.ui.processListView"
          class="org.argeo.eclipse.spring.SpringExtensionFactory"
          name="Process List"
          restorable="true">
+   </view>
+   <view
+         id="org.argeo.slc.client.ui.processBuilderView"
+         class="org.argeo.eclipse.spring.SpringExtensionFactory"
+         name="Process Builder"
+         restorable="true">
    </view>
     </extension>
 
index a4d040314f9d6cf8c2d83abe54478d6fbcaa81a8..4c01230bf3912cccf36ee6edcdb90eacc0fcea90 100644 (file)
@@ -1,11 +1,17 @@
 package org.argeo.slc.client.ui.views;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Properties;
 import java.util.UUID;
 
+import org.apache.commons.io.IOUtils;
+import org.argeo.slc.SlcException;
 import org.argeo.slc.client.ui.ClientUiPlugin;
 import org.argeo.slc.client.ui.controllers.ProcessController;
+import org.argeo.slc.execution.ExecutionFlowDescriptor;
 import org.argeo.slc.execution.ExecutionModuleDescriptor;
 import org.argeo.slc.process.RealizedFlow;
 import org.argeo.slc.process.SlcExecution;
@@ -17,6 +23,11 @@ import org.eclipse.jface.viewers.ITableLabelProvider;
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.ISharedImages;
@@ -32,6 +43,33 @@ public class ExecutionModulesView extends ViewPart {
 
        private ProcessController processController;
 
+       public void createPartControl(Composite parent) {
+               viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+               viewer.setContentProvider(contentProvider);
+               viewer.setLabelProvider(new ViewLabelProvider());
+               viewer.setInput(getViewSite());
+               viewer.addDoubleClickListener(new ViewDoubleClickListener());
+               int operations = DND.DROP_COPY | DND.DROP_MOVE;
+               Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
+               viewer.addDragSupport(operations, tt, new ViewDragListener());
+       }
+
+       public void setFocus() {
+               viewer.getControl().setFocus();
+       }
+
+       public TreeViewer getViewer() {
+               return viewer;
+       }
+
+       public void setContentProvider(IContentProvider contentProvider) {
+               this.contentProvider = contentProvider;
+       }
+
+       public void setProcessController(ProcessController processController) {
+               this.processController = processController;
+       }
+
        class ViewLabelProvider extends LabelProvider implements
                        ITableLabelProvider {
                public String getColumnText(Object obj, int index) {
@@ -69,56 +107,90 @@ public class ExecutionModulesView extends ViewPart {
                }
        }
 
-       public void createPartControl(Composite parent) {
-               viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-               viewer.setContentProvider(contentProvider);
-               viewer.setLabelProvider(new ViewLabelProvider());
-               viewer.setInput(getViewSite());
-               viewer.addDoubleClickListener(new IDoubleClickListener() {
-
-                       public void doubleClick(DoubleClickEvent evt) {
-                               Object obj = ((IStructuredSelection) evt.getSelection())
-                                               .getFirstElement();
-                               if (obj instanceof ExecutionModulesContentProvider.FlowNode) {
-                                       ExecutionModulesContentProvider.FlowNode fn = (ExecutionModulesContentProvider.FlowNode) obj;
-
-                                       List<RealizedFlow> realizedFlows = new ArrayList<RealizedFlow>();
-                                       RealizedFlow realizedFlow = new RealizedFlow();
-                                       realizedFlow.setModuleName(fn.getExecutionModuleNode()
-                                                       .getDescriptor().getName());
-                                       realizedFlow.setModuleVersion(fn.getExecutionModuleNode()
-                                                       .getDescriptor().getVersion());
-                                       realizedFlow.setFlowDescriptor(fn.getExecutionModuleNode()
-                                                       .getFlowDescriptors().get(fn.getFlowName()));
-                                       realizedFlows.add(realizedFlow);
-
-                                       SlcExecution slcExecution = new SlcExecution();
-                                       slcExecution.setUuid(UUID.randomUUID().toString());
-                                       slcExecution.setRealizedFlows(realizedFlows);
-                                       processController.execute(fn.getExecutionModuleNode()
-                                                       .getAgentNode().getAgent(), slcExecution);
-                               }
+       class ViewDoubleClickListener implements IDoubleClickListener {
+               public void doubleClick(DoubleClickEvent evt) {
+                       Object obj = ((IStructuredSelection) evt.getSelection())
+                                       .getFirstElement();
+                       if (obj instanceof ExecutionModulesContentProvider.FlowNode) {
+                               ExecutionModulesContentProvider.FlowNode fn = (ExecutionModulesContentProvider.FlowNode) obj;
+
+                               List<RealizedFlow> realizedFlows = new ArrayList<RealizedFlow>();
+                               RealizedFlow realizedFlow = new RealizedFlow();
+                               realizedFlow.setModuleName(fn.getExecutionModuleNode()
+                                               .getDescriptor().getName());
+                               realizedFlow.setModuleVersion(fn.getExecutionModuleNode()
+                                               .getDescriptor().getVersion());
+                               realizedFlow.setFlowDescriptor(fn.getExecutionModuleNode()
+                                               .getFlowDescriptors().get(fn.getFlowName()));
+                               realizedFlows.add(realizedFlow);
+
+                               SlcExecution slcExecution = new SlcExecution();
+                               slcExecution.setUuid(UUID.randomUUID().toString());
+                               slcExecution.setRealizedFlows(realizedFlows);
+                               processController.execute(fn.getExecutionModuleNode()
+                                               .getAgentNode().getAgent(), slcExecution);
                        }
-               });
-       }
+               }
 
-       /**
-        * Passing the focus request to the viewer's control.
-        */
-       public void setFocus() {
-               viewer.getControl().setFocus();
        }
 
-       public TreeViewer getViewer() {
-               return viewer;
-       }
+       class ViewDragListener implements DragSourceListener {
+               public void dragFinished(DragSourceEvent event) {
+                       System.out.println("Finished Drag");
+               }
 
-       public void setContentProvider(IContentProvider contentProvider) {
-               this.contentProvider = contentProvider;
-       }
+               public void dragSetData(DragSourceEvent event) {
+                       System.out.println("dragSetData: " + event);
+                       IStructuredSelection selection = (IStructuredSelection) viewer
+                                       .getSelection();
+                       if (selection.getFirstElement() instanceof ExecutionModulesContentProvider.FlowNode) {
+                               if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
+                                       ExecutionModulesContentProvider.FlowNode flowNode = (ExecutionModulesContentProvider.FlowNode) selection
+                                                       .getFirstElement();
+                                       RealizedFlow rf = nodeAsRealizedFlow(flowNode);
+                                       Properties props = new Properties();
+                                       realizedFlowAsProperties(props, rf);
+                                       props.setProperty("agentId", flowNode
+                                                       .getExecutionModuleNode().getAgentNode().getAgent()
+                                                       .getAgentUuid());
+
+                                       ByteArrayOutputStream out = new ByteArrayOutputStream();
+                                       try {
+                                               props.store(out, "");
+                                               event.data = new String(out.toByteArray());
+                                       } catch (IOException e) {
+                                               throw new SlcException("Cannot transfor realized flow",
+                                                               e);
+                                       } finally {
+                                               IOUtils.closeQuietly(out);
+                                       }
+                               }
+                       }
+               }
+
+               public void dragStart(DragSourceEvent event) {
+                       System.out.println("Start Drag");
+               }
+
+               private RealizedFlow nodeAsRealizedFlow(
+                               ExecutionModulesContentProvider.FlowNode flowNode) {
+                       RealizedFlow rf = new RealizedFlow();
+                       rf.setModuleName(flowNode.getExecutionModuleNode().getDescriptor()
+                                       .getName());
+                       rf.setModuleVersion(flowNode.getExecutionModuleNode()
+                                       .getDescriptor().getVersion());
+                       ExecutionFlowDescriptor efd = new ExecutionFlowDescriptor();
+                       efd.setName(flowNode.getFlowName());
+                       rf.setFlowDescriptor(efd);
+                       return rf;
+               }
+
+               private void realizedFlowAsProperties(Properties props, RealizedFlow rf) {
+                       props.setProperty("moduleName", rf.getModuleName());
+                       props.setProperty("moduleVersion", rf.getModuleVersion());
+                       props.setProperty("flowName", rf.getFlowDescriptor().getName());
+               }
 
-       public void setProcessController(ProcessController processController) {
-               this.processController = processController;
        }
 
 }
\ No newline at end of file
diff --git a/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessBuilderView.java b/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessBuilderView.java
new file mode 100644 (file)
index 0000000..00a80d2
--- /dev/null
@@ -0,0 +1,185 @@
+package org.argeo.slc.client.ui.views;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.UUID;
+
+import org.apache.commons.io.IOUtils;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.client.ui.controllers.ProcessController;
+import org.argeo.slc.execution.ExecutionFlowDescriptor;
+import org.argeo.slc.process.RealizedFlow;
+import org.argeo.slc.process.SlcExecution;
+import org.argeo.slc.runtime.SlcAgent;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerDropAdapter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.part.ViewPart;
+
+public class ProcessBuilderView extends ViewPart {
+       public static final String ID = "org.argeo.slc.client.ui.processBuilderView";
+
+       // private final static Log log =
+       // LogFactory.getLog(ProcessBuilderView.class);
+
+       private TableViewer viewer;
+
+       private List<RealizedFlow> realizedFlows = new ArrayList<RealizedFlow>();
+
+       private String currentAgentUuid = null;
+       private ProcessController processController;
+
+       public void createPartControl(Composite parent) {
+               Table table = createTable(parent);
+               viewer = new TableViewer(table);
+               viewer.setLabelProvider(new ViewLabelProvider());
+               viewer.setContentProvider(new ViewContentProvider());
+               int operations = DND.DROP_COPY | DND.DROP_MOVE;
+               Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
+               viewer.addDropSupport(operations, tt, new ViewDropListener(viewer));
+               viewer.setInput(getViewSite());
+       }
+
+       protected Table createTable(Composite parent) {
+               int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL
+                               | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
+
+               Table table = new Table(parent, style);
+
+               GridData gridData = new GridData(GridData.FILL_BOTH);
+               gridData.grabExcessVerticalSpace = true;
+               gridData.grabExcessHorizontalSpace = true;
+               gridData.horizontalSpan = 3;
+               table.setLayoutData(gridData);
+
+               table.setLinesVisible(true);
+               table.setHeaderVisible(true);
+
+               TableColumn column = new TableColumn(table, SWT.LEFT, 0);
+               column.setText("Date");
+               column.setWidth(200);
+
+               column = new TableColumn(table, SWT.LEFT, 1);
+               column.setText("UUID");
+               column.setWidth(300);
+
+               return table;
+       }
+
+       protected void execute() {
+               // TODO: use agent proxy to retrieve it
+               SlcAgent agent = null;
+               SlcExecution slcExecution = new SlcExecution();
+               slcExecution.setUuid(UUID.randomUUID().toString());
+               slcExecution.setRealizedFlows(realizedFlows);
+
+               processController.execute(agent, slcExecution);
+       }
+
+       public void setFocus() {
+               viewer.getControl().setFocus();
+       }
+
+       public void setProcessController(ProcessController processController) {
+               this.processController = processController;
+       }
+
+       protected class ViewContentProvider implements IStructuredContentProvider {
+               public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
+               }
+
+               public void dispose() {
+               }
+
+               public Object[] getElements(Object obj) {
+                       return realizedFlows.toArray();
+               }
+       }
+
+       protected class ViewLabelProvider extends LabelProvider implements
+                       ITableLabelProvider {
+               public String getColumnText(Object obj, int index) {
+                       RealizedFlow rf = (RealizedFlow) obj;
+                       switch (index) {
+                       case 0:
+                               return rf.getModuleName();
+                       case 1:
+                               return rf.getFlowDescriptor().getName();
+                       }
+                       return getText(obj);
+               }
+
+               public Image getColumnImage(Object obj, int index) {
+                       return null;
+               }
+
+       }
+
+       protected class ViewDropListener extends ViewerDropAdapter {
+
+               public ViewDropListener(Viewer viewer) {
+                       super(viewer);
+               }
+
+               @Override
+               public boolean performDrop(Object data) {
+                       System.out.println(data);
+                       Properties props = new Properties();
+                       ByteArrayInputStream in = new ByteArrayInputStream(data.toString()
+                                       .getBytes());
+                       try {
+                               props.load(in);
+                       } catch (IOException e) {
+                               throw new SlcException("Cannot create read realized flow", e);
+                       } finally {
+                               IOUtils.closeQuietly(in);
+                       }
+
+                       String agentId = props.getProperty("agentId");
+                       if (currentAgentUuid == null)
+                               currentAgentUuid = agentId;
+                       else if (currentAgentUuid.equals(agentId))
+                               return false;
+
+                       RealizedFlow rf = realizedFlowFromProperties(props);
+                       realizedFlows.add(rf);
+                       getViewer().refresh();
+                       return true;
+               }
+
+               private RealizedFlow realizedFlowFromProperties(Properties props) {
+                       RealizedFlow rf = new RealizedFlow();
+                       rf.setModuleName(props.getProperty("moduleName"));
+                       rf.setModuleVersion(props.getProperty("moduleVersion"));
+                       ExecutionFlowDescriptor efd = new ExecutionFlowDescriptor();
+                       efd.setName(props.getProperty("flowName"));
+                       rf.setFlowDescriptor(efd);
+                       return rf;
+               }
+
+               @Override
+               public boolean validateDrop(Object target, int operation,
+                               TransferData transferType) {
+                       return true;
+
+               }
+
+       }
+
+}
index 36a4b97640405eaf3d97a5466ff788b1908bcd3d..1bdcaa0c3cc21c944ca26d805f527c1a778c93a9 100644 (file)
@@ -24,7 +24,7 @@ public class ProcessListView extends ViewPart {
        private final static Log log = LogFactory
                        .getLog(ProcessListView.class);
 
-       public static final String ID = "org.argeo.slc.client.ui.ProcessListView";
+       public static final String ID = "org.argeo.slc.client.ui.processListView";
 
        private TableViewer viewer;