1 package org
.argeo
.slc
.client
.ui
.views
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Arrays
;
5 import java
.util
.Comparator
;
9 import javax
.jcr
.Property
;
10 import javax
.jcr
.RepositoryException
;
11 import javax
.jcr
.Session
;
12 import javax
.jcr
.nodetype
.NodeType
;
13 import javax
.jcr
.observation
.Event
;
14 import javax
.jcr
.observation
.EventIterator
;
16 import org
.argeo
.ArgeoException
;
17 import org
.argeo
.eclipse
.ui
.jcr
.AsyncUiEventListener
;
18 import org
.argeo
.eclipse
.ui
.jcr
.DefaultNodeLabelProvider
;
19 import org
.argeo
.eclipse
.ui
.jcr
.SimpleNodeContentProvider
;
20 import org
.argeo
.slc
.SlcException
;
21 import org
.argeo
.slc
.client
.ui
.SlcImages
;
22 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditor
;
23 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditorInput
;
24 import org
.argeo
.slc
.jcr
.SlcJcrConstants
;
25 import org
.argeo
.slc
.jcr
.SlcNames
;
26 import org
.argeo
.slc
.jcr
.SlcTypes
;
27 import org
.eclipse
.jface
.viewers
.ColumnViewerToolTipSupport
;
28 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
29 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
30 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
31 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
32 import org
.eclipse
.jface
.viewers
.TreeViewer
;
33 import org
.eclipse
.swt
.SWT
;
34 import org
.eclipse
.swt
.dnd
.DND
;
35 import org
.eclipse
.swt
.dnd
.DragSourceAdapter
;
36 import org
.eclipse
.swt
.dnd
.DragSourceEvent
;
37 import org
.eclipse
.swt
.dnd
.TextTransfer
;
38 import org
.eclipse
.swt
.dnd
.Transfer
;
39 import org
.eclipse
.swt
.graphics
.Image
;
40 import org
.eclipse
.swt
.widgets
.Composite
;
41 import org
.eclipse
.ui
.IWorkbenchPage
;
42 import org
.eclipse
.ui
.PlatformUI
;
43 import org
.eclipse
.ui
.part
.ViewPart
;
45 /** JCR based view of the execution modules. */
46 public class JcrExecutionModulesView
extends ViewPart
implements SlcTypes
,
48 // private final static Log log = LogFactory
49 // .getLog(JcrExecutionModulesView.class);
51 public static final String ID
= "org.argeo.slc.client.ui.jcrExecutionModulesView";
53 private TreeViewer viewer
;
55 private Session session
;
57 public void createPartControl(Composite parent
) {
58 viewer
= new TreeViewer(parent
, SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
);
59 ColumnViewerToolTipSupport
.enableFor(viewer
);
61 ViewContentProvider contentProvider
= new ViewContentProvider(session
);
63 viewer
.setContentProvider(contentProvider
);
64 final ViewLabelProvider viewLabelProvider
= new ViewLabelProvider();
65 viewer
.setLabelProvider(viewLabelProvider
);
66 viewer
.setInput(getViewSite());
67 viewer
.addDoubleClickListener(new ViewDoubleClickListener());
69 Transfer
[] tt
= new Transfer
[] { TextTransfer
.getInstance() };
70 // Transfer[] tt = new Transfer[] { EditorInputTransfer.getInstance() };
71 int operations
= DND
.DROP_COPY
| DND
.DROP_MOVE
;
72 viewer
.addDragSupport(operations
, tt
, new ViewDragListener());
75 session
.getWorkspace()
76 .getObservationManager()
78 new VmAgentObserver(),
79 Event
.NODE_ADDED
| Event
.NODE_REMOVED
81 SlcJcrConstants
.VM_AGENT_FACTORY_PATH
, true, null,
83 } catch (RepositoryException e
) {
84 throw new SlcException("Cannot add observer", e
);
88 public void setFocus() {
89 viewer
.getControl().setFocus();
92 public TreeViewer
getViewer() {
96 public void refreshView() {
97 viewer
.setInput(getViewSite());
100 class ViewContentProvider
extends SimpleNodeContentProvider
{
102 public ViewContentProvider(Session session
) {
104 new String
[] { SlcJcrConstants
.VM_AGENT_FACTORY_PATH
});
108 // protected Object[] getChildren(Node node) throws RepositoryException
110 // if (node.isNodeType(SlcTypes.SLC_AGENT_FACTORY)) {
111 // List<AgentNodesWrapper> wrappers = new
112 // ArrayList<AgentNodesWrapper>();
113 // for (NodeIterator nit = node.getNodes(); nit.hasNext();) {
114 // wrappers.add(new AgentNodesWrapper(nit.nextNode()));
116 // return wrappers.toArray();
118 // return super.getChildren(node);
122 protected Object
[] sort(Object parent
, Object
[] children
) {
123 Object
[] sorted
= new Object
[children
.length
];
124 System
.arraycopy(children
, 0, sorted
, 0, children
.length
);
125 Arrays
.sort(sorted
, new ViewComparator());
130 static class ViewComparator
implements Comparator
<Object
> {
132 public int compare(Object o1
, Object o2
) {
134 if (o1
instanceof Node
&& o2
instanceof Node
) {
135 Node node1
= (Node
) o1
;
136 Node node2
= (Node
) o2
;
138 if (node1
.getName().equals(SLC_EXECUTION_SPECS
))
140 if (node2
.getName().equals(SLC_EXECUTION_SPECS
))
143 if (node1
.isNodeType(SLC_EXECUTION_FLOW
)
144 && node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
145 return node1
.getName().compareTo(node2
.getName());
146 } else if (node1
.isNodeType(SLC_EXECUTION_FLOW
)
147 && !node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
149 } else if (!node1
.isNodeType(SLC_EXECUTION_FLOW
)
150 && node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
154 return node1
.getName().compareTo(node2
.getName());
157 } catch (RepositoryException e
) {
158 throw new ArgeoException("Cannot compare " + o1
+ " and " + o2
,
166 // /** Wraps the execution modules of an agent. */
167 // static class AgentNodesWrapper extends NodesWrapper {
169 // public AgentNodesWrapper(Node node) {
173 // protected List<WrappedNode> getWrappedNodes()
174 // throws RepositoryException {
175 // List<WrappedNode> children = new ArrayList<WrappedNode>();
176 // Node executionModules = getNode();
177 // for (NodeIterator nit = executionModules.getNodes(); nit.hasNext();) {
178 // for (NodeIterator nitVersions = nit.nextNode().getNodes(); nitVersions
180 // children.add(new WrappedNode(this, nitVersions.nextNode()));
188 class VmAgentObserver
extends AsyncUiEventListener
{
189 protected void onEventInUiThread(EventIterator events
) {
194 class ViewLabelProvider
extends DefaultNodeLabelProvider
implements
195 ITableLabelProvider
{
198 protected String
getText(Node node
) throws RepositoryException
{
199 if (node
.getName().equals(SLC_EXECUTION_SPECS
))
200 return "Execution Specifications";
201 else if (node
.getPath().equals(
202 SlcJcrConstants
.VM_AGENT_FACTORY_PATH
))
203 return "Internal Agents";
204 return super.getText(node
);
208 public Image
getImage(Node node
) throws RepositoryException
{
209 // we try to optimize a bit by putting deeper nodes first
210 if (node
.getParent().isNodeType(
211 SlcTypes
.SLC_EXECUTION_SPEC_ATTRIBUTE
))
212 return SlcImages
.CHOICES
;
213 else if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_SPEC_ATTRIBUTE
))
214 return SlcImages
.EXECUTION_SPEC_ATTRIBUTE
;
215 else if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_SPEC
))
216 return SlcImages
.EXECUTION_SPEC
;
217 else if (node
.getName().equals(SLC_EXECUTION_SPECS
))
218 return SlcImages
.EXECUTION_SPECS
;
219 else if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_FLOW
))
220 return SlcImages
.FLOW
;
221 else if (node
.isNodeType(SlcTypes
.SLC_MODULE
))
222 return SlcImages
.MODULE
;
223 else if (node
.isNodeType(SlcTypes
.SLC_AGENT
))
224 return SlcImages
.AGENT
;
225 else if (node
.isNodeType(SlcTypes
.SLC_AGENT_FACTORY
))
226 return SlcImages
.AGENT_FACTORY
;
228 return SlcImages
.FOLDER
;
231 public String
getToolTipText(Node node
) throws RepositoryException
{
232 if (node
.isNodeType(NodeType
.MIX_TITLE
)
233 && node
.hasProperty(Property
.JCR_DESCRIPTION
))
234 return node
.getProperty(Property
.JCR_DESCRIPTION
).getString();
235 return super.getToolTipText(node
);
238 public String
getColumnText(Object obj
, int index
) {
242 public Image
getColumnImage(Object obj
, int index
) {
243 return getImage(obj
);
248 class ViewDoubleClickListener
implements IDoubleClickListener
{
249 public void doubleClick(DoubleClickEvent evt
) {
250 Object obj
= ((IStructuredSelection
) evt
.getSelection())
253 if (obj
instanceof Node
) {
254 Node node
= (Node
) obj
;
255 if (node
.isNodeType(SLC_EXECUTION_FLOW
)) {
256 List
<String
> paths
= new ArrayList
<String
>();
257 paths
.add(node
.getPath());
258 IWorkbenchPage activePage
= PlatformUI
.getWorkbench()
259 .getActiveWorkbenchWindow().getActivePage();
260 activePage
.openEditor(new ProcessEditorInput(paths
,
261 true), ProcessEditor
.ID
);
264 } catch (Exception e
) {
265 throw new SlcException("Cannot open " + obj
, e
);
271 class ViewDragListener
extends DragSourceAdapter
{
272 public void dragSetData(DragSourceEvent event
) {
273 IStructuredSelection selection
= (IStructuredSelection
) viewer
275 if (selection
.getFirstElement() instanceof Node
) {
276 Node node
= (Node
) selection
.getFirstElement();
278 // if (node.isNodeType(SLC_EXECUTION_FLOW)) {
279 // if (EditorInputTransfer.getInstance().isSupportedType(
280 // event.dataType)) {
281 // ProcessEditorInput pei = new ProcessEditorInput(
283 // EditorInputData eid = EditorInputTransfer
284 // .createEditorInputData(ProcessEditor.ID,
286 // event.data = new EditorInputTransfer.EditorInputData[] { eid
291 // } catch (RepositoryException e1) {
292 // throw new SlcException("Cannot drag " + node, e1);
295 if (TextTransfer
.getInstance().isSupportedType(event
.dataType
)) {
297 event
.data
= node
.getPath();
298 } catch (RepositoryException e1
) {
299 // TODO Auto-generated catch block
300 e1
.printStackTrace();
307 public void setSession(Session session
) {
308 this.session
= session
;