From: Mathieu Baudier Date: Tue, 21 Sep 2010 14:31:10 +0000 (+0000) Subject: Introduce process builder view with drag and drop X-Git-Tag: argeo-slc-2.1.7~1172 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=20b786a39e7e034ca0b5bcfe7e690c7c742463a8;p=gpl%2Fargeo-slc.git Introduce process builder view with drag and drop git-svn-id: https://svn.argeo.org/slc/trunk@3783 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/eclipse/plugins/org.argeo.slc.client.rcp/src/org/argeo/slc/client/rcp/ApplicationWorkbenchWindowAdvisor.java b/eclipse/plugins/org.argeo.slc.client.rcp/src/org/argeo/slc/client/rcp/ApplicationWorkbenchWindowAdvisor.java index 17250fa5b..2d78e0b23 100644 --- a/eclipse/plugins/org.argeo.slc.client.rcp/src/org/argeo/slc/client/rcp/ApplicationWorkbenchWindowAdvisor.java +++ b/eclipse/plugins/org.argeo.slc.client.rcp/src/org/argeo/slc/client/rcp/ApplicationWorkbenchWindowAdvisor.java @@ -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); } diff --git a/eclipse/plugins/org.argeo.slc.client.rcp/src/org/argeo/slc/client/rcp/Perspective.java b/eclipse/plugins/org.argeo.slc.client.rcp/src/org/argeo/slc/client/rcp/Perspective.java index 746dfe553..857ce722e 100644 --- a/eclipse/plugins/org.argeo.slc.client.rcp/src/org/argeo/slc/client/rcp/Perspective.java +++ b/eclipse/plugins/org.argeo.slc.client.rcp/src/org/argeo/slc/client/rcp/Perspective.java @@ -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); } diff --git a/eclipse/plugins/org.argeo.slc.client.ui/META-INF/MANIFEST.MF b/eclipse/plugins/org.argeo.slc.client.ui/META-INF/MANIFEST.MF index c3bfd54c1..ea098f242 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui/META-INF/MANIFEST.MF +++ b/eclipse/plugins/org.argeo.slc.client.ui/META-INF/MANIFEST.MF @@ -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", diff --git a/eclipse/plugins/org.argeo.slc.client.ui/META-INF/spring/views.xml b/eclipse/plugins/org.argeo.slc.client.ui/META-INF/spring/views.xml index 4c349d6ec..5fc0b87f2 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui/META-INF/spring/views.xml +++ b/eclipse/plugins/org.argeo.slc.client.ui/META-INF/spring/views.xml @@ -15,11 +15,16 @@ - + + + + diff --git a/eclipse/plugins/org.argeo.slc.client.ui/plugin.xml b/eclipse/plugins/org.argeo.slc.client.ui/plugin.xml index aefea5791..591e9fecd 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui/plugin.xml +++ b/eclipse/plugins/org.argeo.slc.client.ui/plugin.xml @@ -18,10 +18,16 @@ restorable="true"> + + diff --git a/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ExecutionModulesView.java b/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ExecutionModulesView.java index a4d040314..4c01230bf 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ExecutionModulesView.java +++ b/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ExecutionModulesView.java @@ -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 realizedFlows = new ArrayList(); - 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 realizedFlows = new ArrayList(); + 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 index 000000000..00a80d27e --- /dev/null +++ b/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessBuilderView.java @@ -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 realizedFlows = new ArrayList(); + + 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; + + } + + } + +} diff --git a/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessListView.java b/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessListView.java index 36a4b9764..1bdcaa0c3 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessListView.java +++ b/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessListView.java @@ -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;