]> git.argeo.org Git - gpl/argeo-slc.git/blob - eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ExecutionModulesView.java
Introduce process builder view with drag and drop
[gpl/argeo-slc.git] / eclipse / plugins / org.argeo.slc.client.ui / src / org / argeo / slc / client / ui / views / ExecutionModulesView.java
1 package org.argeo.slc.client.ui.views;
2
3 import java.io.ByteArrayOutputStream;
4 import java.io.IOException;
5 import java.util.ArrayList;
6 import java.util.List;
7 import java.util.Properties;
8 import java.util.UUID;
9
10 import org.apache.commons.io.IOUtils;
11 import org.argeo.slc.SlcException;
12 import org.argeo.slc.client.ui.ClientUiPlugin;
13 import org.argeo.slc.client.ui.controllers.ProcessController;
14 import org.argeo.slc.execution.ExecutionFlowDescriptor;
15 import org.argeo.slc.execution.ExecutionModuleDescriptor;
16 import org.argeo.slc.process.RealizedFlow;
17 import org.argeo.slc.process.SlcExecution;
18 import org.eclipse.jface.viewers.DoubleClickEvent;
19 import org.eclipse.jface.viewers.IContentProvider;
20 import org.eclipse.jface.viewers.IDoubleClickListener;
21 import org.eclipse.jface.viewers.IStructuredSelection;
22 import org.eclipse.jface.viewers.ITableLabelProvider;
23 import org.eclipse.jface.viewers.LabelProvider;
24 import org.eclipse.jface.viewers.TreeViewer;
25 import org.eclipse.swt.SWT;
26 import org.eclipse.swt.dnd.DND;
27 import org.eclipse.swt.dnd.DragSourceEvent;
28 import org.eclipse.swt.dnd.DragSourceListener;
29 import org.eclipse.swt.dnd.TextTransfer;
30 import org.eclipse.swt.dnd.Transfer;
31 import org.eclipse.swt.graphics.Image;
32 import org.eclipse.swt.widgets.Composite;
33 import org.eclipse.ui.ISharedImages;
34 import org.eclipse.ui.PlatformUI;
35 import org.eclipse.ui.part.ViewPart;
36
37 public class ExecutionModulesView extends ViewPart {
38 public static final String ID = "org.argeo.slc.client.ui.executionModulesView";
39
40 private TreeViewer viewer;
41
42 private IContentProvider contentProvider;
43
44 private ProcessController processController;
45
46 public void createPartControl(Composite parent) {
47 viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
48 viewer.setContentProvider(contentProvider);
49 viewer.setLabelProvider(new ViewLabelProvider());
50 viewer.setInput(getViewSite());
51 viewer.addDoubleClickListener(new ViewDoubleClickListener());
52 int operations = DND.DROP_COPY | DND.DROP_MOVE;
53 Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
54 viewer.addDragSupport(operations, tt, new ViewDragListener());
55 }
56
57 public void setFocus() {
58 viewer.getControl().setFocus();
59 }
60
61 public TreeViewer getViewer() {
62 return viewer;
63 }
64
65 public void setContentProvider(IContentProvider contentProvider) {
66 this.contentProvider = contentProvider;
67 }
68
69 public void setProcessController(ProcessController processController) {
70 this.processController = processController;
71 }
72
73 class ViewLabelProvider extends LabelProvider implements
74 ITableLabelProvider {
75 public String getColumnText(Object obj, int index) {
76 if (obj instanceof ExecutionModulesContentProvider.ExecutionModuleNode) {
77 ExecutionModuleDescriptor emd = ((ExecutionModulesContentProvider.ExecutionModuleNode) obj)
78 .getDescriptor();
79 if (emd.getLabel() != null)
80 return emd.getLabel();
81 else
82 return getText(emd);
83 } else
84 return getText(obj);
85 }
86
87 public Image getColumnImage(Object obj, int index) {
88 return getImage(obj);
89 }
90
91 public Image getImage(Object obj) {
92 if (obj instanceof ExecutionModulesContentProvider.AgentNode)
93 return ClientUiPlugin.getDefault().getImageRegistry().get(
94 "agent");
95 else if (obj instanceof ExecutionModulesContentProvider.ExecutionModuleNode)
96 return ClientUiPlugin.getDefault().getImageRegistry().get(
97 "executionModule");
98 else if (obj instanceof ExecutionModulesContentProvider.FolderNode)
99 return ClientUiPlugin.getDefault().getImageRegistry().get(
100 "folder");
101 else if (obj instanceof ExecutionModulesContentProvider.FlowNode)
102 return ClientUiPlugin.getDefault().getImageRegistry().get(
103 "flow");
104 else
105 return PlatformUI.getWorkbench().getSharedImages().getImage(
106 ISharedImages.IMG_OBJ_ELEMENT);
107 }
108 }
109
110 class ViewDoubleClickListener implements IDoubleClickListener {
111 public void doubleClick(DoubleClickEvent evt) {
112 Object obj = ((IStructuredSelection) evt.getSelection())
113 .getFirstElement();
114 if (obj instanceof ExecutionModulesContentProvider.FlowNode) {
115 ExecutionModulesContentProvider.FlowNode fn = (ExecutionModulesContentProvider.FlowNode) obj;
116
117 List<RealizedFlow> realizedFlows = new ArrayList<RealizedFlow>();
118 RealizedFlow realizedFlow = new RealizedFlow();
119 realizedFlow.setModuleName(fn.getExecutionModuleNode()
120 .getDescriptor().getName());
121 realizedFlow.setModuleVersion(fn.getExecutionModuleNode()
122 .getDescriptor().getVersion());
123 realizedFlow.setFlowDescriptor(fn.getExecutionModuleNode()
124 .getFlowDescriptors().get(fn.getFlowName()));
125 realizedFlows.add(realizedFlow);
126
127 SlcExecution slcExecution = new SlcExecution();
128 slcExecution.setUuid(UUID.randomUUID().toString());
129 slcExecution.setRealizedFlows(realizedFlows);
130 processController.execute(fn.getExecutionModuleNode()
131 .getAgentNode().getAgent(), slcExecution);
132 }
133 }
134
135 }
136
137 class ViewDragListener implements DragSourceListener {
138 public void dragFinished(DragSourceEvent event) {
139 System.out.println("Finished Drag");
140 }
141
142 public void dragSetData(DragSourceEvent event) {
143 System.out.println("dragSetData: " + event);
144 IStructuredSelection selection = (IStructuredSelection) viewer
145 .getSelection();
146 if (selection.getFirstElement() instanceof ExecutionModulesContentProvider.FlowNode) {
147 if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
148 ExecutionModulesContentProvider.FlowNode flowNode = (ExecutionModulesContentProvider.FlowNode) selection
149 .getFirstElement();
150 RealizedFlow rf = nodeAsRealizedFlow(flowNode);
151 Properties props = new Properties();
152 realizedFlowAsProperties(props, rf);
153 props.setProperty("agentId", flowNode
154 .getExecutionModuleNode().getAgentNode().getAgent()
155 .getAgentUuid());
156
157 ByteArrayOutputStream out = new ByteArrayOutputStream();
158 try {
159 props.store(out, "");
160 event.data = new String(out.toByteArray());
161 } catch (IOException e) {
162 throw new SlcException("Cannot transfor realized flow",
163 e);
164 } finally {
165 IOUtils.closeQuietly(out);
166 }
167 }
168 }
169 }
170
171 public void dragStart(DragSourceEvent event) {
172 System.out.println("Start Drag");
173 }
174
175 private RealizedFlow nodeAsRealizedFlow(
176 ExecutionModulesContentProvider.FlowNode flowNode) {
177 RealizedFlow rf = new RealizedFlow();
178 rf.setModuleName(flowNode.getExecutionModuleNode().getDescriptor()
179 .getName());
180 rf.setModuleVersion(flowNode.getExecutionModuleNode()
181 .getDescriptor().getVersion());
182 ExecutionFlowDescriptor efd = new ExecutionFlowDescriptor();
183 efd.setName(flowNode.getFlowName());
184 rf.setFlowDescriptor(efd);
185 return rf;
186 }
187
188 private void realizedFlowAsProperties(Properties props, RealizedFlow rf) {
189 props.setProperty("moduleName", rf.getModuleName());
190 props.setProperty("moduleVersion", rf.getModuleVersion());
191 props.setProperty("flowName", rf.getFlowDescriptor().getName());
192 }
193
194 }
195
196 }