1 package org
.argeo
.slc
.client
.ui
.views
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Calendar
;
8 import javax
.jcr
.NodeIterator
;
9 import javax
.jcr
.Property
;
10 import javax
.jcr
.PropertyIterator
;
11 import javax
.jcr
.PropertyType
;
12 import javax
.jcr
.RepositoryException
;
13 import javax
.jcr
.Session
;
14 import javax
.jcr
.Value
;
15 import javax
.jcr
.nodetype
.NodeType
;
16 import javax
.jcr
.observation
.Event
;
17 import javax
.jcr
.observation
.EventListener
;
18 import javax
.jcr
.observation
.ObservationManager
;
20 import org
.apache
.commons
.logging
.Log
;
21 import org
.apache
.commons
.logging
.LogFactory
;
22 import org
.argeo
.ArgeoException
;
23 import org
.argeo
.eclipse
.ui
.jcr
.AsyncUiEventListener
;
24 import org
.argeo
.eclipse
.ui
.utils
.CommandUtils
;
25 import org
.argeo
.jcr
.JcrUtils
;
26 import org
.argeo
.jcr
.UserJcrUtils
;
27 import org
.argeo
.slc
.SlcException
;
28 import org
.argeo
.slc
.client
.ui
.ClientUiPlugin
;
29 import org
.argeo
.slc
.client
.ui
.SlcUiConstants
;
30 import org
.argeo
.slc
.client
.ui
.commands
.AddResultFolder
;
31 import org
.argeo
.slc
.client
.ui
.commands
.RenameResultFolder
;
32 import org
.argeo
.slc
.client
.ui
.commands
.RenameResultNode
;
33 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditor
;
34 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditorInput
;
35 import org
.argeo
.slc
.client
.ui
.model
.ParentNodeFolder
;
36 import org
.argeo
.slc
.client
.ui
.model
.ResultFolder
;
37 import org
.argeo
.slc
.client
.ui
.model
.ResultParent
;
38 import org
.argeo
.slc
.client
.ui
.model
.ResultParentUtils
;
39 import org
.argeo
.slc
.client
.ui
.model
.SingleResultNode
;
40 import org
.argeo
.slc
.client
.ui
.model
.VirtualFolder
;
41 import org
.argeo
.slc
.client
.ui
.providers
.ResultTreeContentProvider
;
42 import org
.argeo
.slc
.client
.ui
.providers
.ResultTreeLabelProvider
;
43 import org
.argeo
.slc
.client
.ui
.wizards
.ConfirmOverwriteWizard
;
44 import org
.argeo
.slc
.jcr
.SlcJcrResultUtils
;
45 import org
.argeo
.slc
.jcr
.SlcNames
;
46 import org
.argeo
.slc
.jcr
.SlcTypes
;
47 import org
.eclipse
.jface
.action
.IMenuListener
;
48 import org
.eclipse
.jface
.action
.IMenuManager
;
49 import org
.eclipse
.jface
.action
.MenuManager
;
50 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
51 import org
.eclipse
.jface
.viewers
.DecoratingLabelProvider
;
52 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
53 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
54 import org
.eclipse
.jface
.viewers
.ILabelDecorator
;
55 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
56 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
57 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
58 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
59 import org
.eclipse
.jface
.viewers
.TableViewer
;
60 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
61 import org
.eclipse
.jface
.viewers
.TreePath
;
62 import org
.eclipse
.jface
.viewers
.TreeViewer
;
63 import org
.eclipse
.jface
.viewers
.Viewer
;
64 import org
.eclipse
.jface
.viewers
.ViewerDropAdapter
;
65 import org
.eclipse
.jface
.wizard
.WizardDialog
;
66 import org
.eclipse
.swt
.SWT
;
67 import org
.eclipse
.swt
.custom
.SashForm
;
68 import org
.eclipse
.swt
.dnd
.DND
;
69 import org
.eclipse
.swt
.dnd
.DragSourceEvent
;
70 import org
.eclipse
.swt
.dnd
.DragSourceListener
;
71 import org
.eclipse
.swt
.dnd
.TextTransfer
;
72 import org
.eclipse
.swt
.dnd
.Transfer
;
73 import org
.eclipse
.swt
.dnd
.TransferData
;
74 import org
.eclipse
.swt
.layout
.FillLayout
;
75 import org
.eclipse
.swt
.layout
.GridData
;
76 import org
.eclipse
.swt
.layout
.GridLayout
;
77 import org
.eclipse
.swt
.widgets
.Composite
;
78 import org
.eclipse
.swt
.widgets
.Display
;
79 import org
.eclipse
.swt
.widgets
.Menu
;
80 import org
.eclipse
.ui
.ISharedImages
;
81 import org
.eclipse
.ui
.IWorkbenchPage
;
82 import org
.eclipse
.ui
.IWorkbenchWindow
;
83 import org
.eclipse
.ui
.PlatformUI
;
84 import org
.eclipse
.ui
.part
.ViewPart
;
86 /** SLC generic JCR Result tree view. */
87 public class JcrResultTreeView
extends ViewPart
{
88 public final static String ID
= ClientUiPlugin
.ID
+ ".jcrResultTreeView";
90 private final static Log log
= LogFactory
.getLog(JcrResultTreeView
.class);
92 /* DEPENDENCY INJECTION */
93 private Session session
;
96 private TreeViewer resultTreeViewer
;
97 private TableViewer propertiesViewer
;
99 private EventListener resultsObserver
= null;
101 private final static String
[] observedNodeTypes
= {
102 SlcTypes
.SLC_TEST_RESULT
, SlcTypes
.SLC_RESULT_FOLDER
,
103 NodeType
.NT_UNSTRUCTURED
};
105 // FIXME cache to ease D&D
106 private boolean isActionUnderMyResult
= false;
107 private ResultParent lastSelectedTargetElement
;
108 private ResultParent lastSelectedSourceElement
;
109 private ResultParent lastSelectedSourceElementParent
;
110 private boolean isResultFolder
= false;
112 // FIXME we cache the fact that we are moving a node to avoid exception
113 // triggered by the "Add Node" event while moving
114 // boolean isMoveInProgress = false;
117 * To be overridden to adapt size of form and result frames.
119 protected int[] getWeights() {
120 return new int[] { 70, 30 };
124 public void createPartControl(Composite parent
) {
125 parent
.setLayout(new FillLayout());
127 SashForm sashForm
= new SashForm(parent
, SWT
.VERTICAL
);
128 sashForm
.setSashWidth(4);
129 sashForm
.setLayout(new FillLayout());
131 // Create the tree on top of the view
132 Composite top
= new Composite(sashForm
, SWT
.NONE
);
133 GridLayout gl
= new GridLayout(1, false);
135 resultTreeViewer
= createResultsTreeViewer(top
);
137 // Create the property viewer on the bottom
138 Composite bottom
= new Composite(sashForm
, SWT
.NONE
);
139 bottom
.setLayout(new GridLayout(1, false));
140 propertiesViewer
= createPropertiesViewer(bottom
);
142 sashForm
.setWeights(getWeights());
144 resultTreeViewer
.setInput(initializeResultTree());
145 // Initialize observer
147 ObservationManager observationManager
= session
.getWorkspace()
148 .getObservationManager();
149 resultsObserver
= new ResultObserver(resultTreeViewer
.getTree()
151 observationManager
.addEventListener(resultsObserver
,
152 Event
.NODE_MOVED
| Event
.NODE_ADDED
| Event
.NODE_REMOVED
,
153 UserJcrUtils
.getUserHome(session
).getPath(), true, null,
154 observedNodeTypes
, false);
155 } catch (RepositoryException e
) {
156 throw new SlcException("Cannot register listeners", e
);
160 // The main tree viewer
161 protected TreeViewer
createResultsTreeViewer(Composite parent
) {
162 int style
= SWT
.BORDER
| SWT
.MULTI
;
164 TreeViewer viewer
= new TreeViewer(parent
, style
);
165 viewer
.getTree().setLayoutData(
166 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
168 viewer
.setContentProvider(new ResultTreeContentProvider());
170 // Add label provider with label decorator
171 ResultTreeLabelProvider rtLblProvider
= new ResultTreeLabelProvider();
172 ILabelDecorator decorator
= ClientUiPlugin
.getDefault().getWorkbench()
173 .getDecoratorManager().getLabelDecorator();
174 viewer
.setLabelProvider(new DecoratingLabelProvider(rtLblProvider
,
176 viewer
.addDoubleClickListener(new ViewDoubleClickListener());
178 // viewer.setLabelProvider(rtLblProvider);
179 getSite().setSelectionProvider(viewer
);
181 // add drag & drop support
182 int operations
= DND
.DROP_COPY
| DND
.DROP_MOVE
;
183 Transfer
[] tt
= new Transfer
[] { TextTransfer
.getInstance() };
184 viewer
.addDragSupport(operations
, tt
, new ViewDragListener());
185 viewer
.addDropSupport(operations
, tt
, new ViewDropListener(viewer
));
188 MenuManager menuManager
= new MenuManager();
189 Menu menu
= menuManager
.createContextMenu(viewer
.getTree());
190 menuManager
.addMenuListener(new IMenuListener() {
191 public void menuAboutToShow(IMenuManager manager
) {
192 contextMenuAboutToShow(manager
);
195 viewer
.getTree().setMenu(menu
);
196 getSite().registerContextMenu(menuManager
, viewer
);
198 // add change listener to display TestResult information in the property
200 viewer
.addSelectionChangedListener(new MySelectionChangedListener());
204 // Detailed property viewer
205 protected TableViewer
createPropertiesViewer(Composite parent
) {
206 propertiesViewer
= new TableViewer(parent
);
207 propertiesViewer
.getTable().setLayoutData(
208 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
209 propertiesViewer
.getTable().setHeaderVisible(true);
210 propertiesViewer
.setContentProvider(new PropertiesContentProvider());
211 TableViewerColumn col
= new TableViewerColumn(propertiesViewer
,
213 col
.getColumn().setText("Name");
214 col
.getColumn().setWidth(200);
215 col
.setLabelProvider(new ColumnLabelProvider() {
216 public String
getText(Object element
) {
218 return ((Property
) element
).getName();
219 } catch (RepositoryException e
) {
220 throw new ArgeoException(
221 "Unexpected exception in label provider", e
);
225 col
= new TableViewerColumn(propertiesViewer
, SWT
.NONE
);
226 col
.getColumn().setText("Value");
227 col
.getColumn().setWidth(400);
228 col
.setLabelProvider(new ColumnLabelProvider() {
229 public String
getText(Object element
) {
231 Property property
= (Property
) element
;
232 if (property
.getType() == PropertyType
.BINARY
)
234 else if (property
.isMultiple()) {
235 StringBuffer buf
= new StringBuffer("[");
236 Value
[] values
= property
.getValues();
237 for (int i
= 0; i
< values
.length
; i
++) {
240 buf
.append(values
[i
].getString());
243 return buf
.toString();
245 return property
.getValue().getString();
246 } catch (RepositoryException e
) {
247 throw new ArgeoException(
248 "Unexpected exception in label provider", e
);
252 col
= new TableViewerColumn(propertiesViewer
, SWT
.NONE
);
253 col
.getColumn().setText("Type");
254 col
.getColumn().setWidth(200);
255 col
.setLabelProvider(new ColumnLabelProvider() {
256 public String
getText(Object element
) {
258 return PropertyType
.nameFromValue(((Property
) element
)
260 } catch (RepositoryException e
) {
261 throw new ArgeoException(
262 "Unexpected exception in label provider", e
);
266 propertiesViewer
.setInput(getViewSite());
267 return propertiesViewer
;
271 * Override to provide specific behaviour. Typically to enable the display
276 protected void processDoubleClick(DoubleClickEvent evt
) {
277 Object obj
= ((IStructuredSelection
) evt
.getSelection())
280 if (obj
instanceof SingleResultNode
) {
281 SingleResultNode srNode
= (SingleResultNode
) obj
;
282 Node node
= srNode
.getNode();
283 // FIXME: open a default result editor
284 if (node
.isNodeType(SlcTypes
.SLC_PROCESS
)) {
285 IWorkbenchPage activePage
= PlatformUI
.getWorkbench()
286 .getActiveWorkbenchWindow().getActivePage();
287 activePage
.openEditor(
288 new ProcessEditorInput(node
.getPath()),
292 } catch (Exception e
) {
293 throw new SlcException("Cannot open " + obj
, e
);
298 public void setFocus() {
302 * refreshes the passed resultParent and its corresponding subtree. It
303 * refreshes the whole viewer if null is passed.
305 * @param ResultParent
308 public void refresh(ResultParent resultParent
) {
309 // if (log.isDebugEnabled())
310 // log.debug("Refreshing '" + resultParent + "'...");
311 // Thread.dumpStack();
312 if (resultParent
== null) {
313 resultTreeViewer
.setInput(initializeResultTree());
315 if (resultParent
instanceof ParentNodeFolder
) {
316 ParentNodeFolder currFolder
= (ParentNodeFolder
) resultParent
;
317 jcrRefresh(currFolder
.getNode());
318 currFolder
.forceFullRefresh();
320 // FIXME: specific refresh does not work
321 // resultTreeViewer.refresh(currFolder, true);
322 TreePath
[] tps
= resultTreeViewer
.getExpandedTreePaths();
323 resultTreeViewer
.setInput(initializeResultTree());
324 resultTreeViewer
.setExpandedTreePaths(tps
);
329 * refreshes the passed node and its corresponding subtree.
335 public boolean jcrRefresh(Node node
) {
336 // if (log.isDebugEnabled())
337 // log.debug(" JCR refreshing " + node + "...");
338 // Thread.dumpStack();
339 boolean isPassed
= true;
341 if (node
.isNodeType(SlcTypes
.SLC_TEST_RESULT
)) {
342 isPassed
= node
.getNode(SlcNames
.SLC_STATUS
)
343 .getProperty(SlcNames
.SLC_SUCCESS
).getBoolean();
344 } else if (node
.isNodeType(SlcTypes
.SLC_RESULT_FOLDER
)) {
345 NodeIterator ni
= node
.getNodes();
346 // quicker but wrong : refresh will stop as soon as a failed
347 // test is found and the whole tree won't be refreshed
348 // while (isPassed && ni.hasNext()){
349 while (ni
.hasNext()) {
350 Node currChild
= ni
.nextNode();
351 isPassed
= isPassed
& jcrRefresh(currChild
);
353 if (isPassed
!= node
.getNode(SlcNames
.SLC_STATUS
)
354 .getProperty(SlcNames
.SLC_SUCCESS
).getBoolean()) {
355 node
.getNode(SlcNames
.SLC_STATUS
).setProperty(
356 SlcNames
.SLC_SUCCESS
, isPassed
);
357 node
.getSession().save();
362 } catch (RepositoryException e
) {
363 throw new SlcException("Cannot register listeners", e
);
368 private ResultParent
[] initializeResultTree() {
370 // Force initialization of the tree structure if needed
371 SlcJcrResultUtils
.getSlcResultsParentNode(session
);
372 SlcJcrResultUtils
.getMyResultParentNode(session
);
373 ResultParent
[] roots
= new ResultParent
[5];
376 roots
[0] = new ParentNodeFolder(null,
377 SlcJcrResultUtils
.getMyResultParentNode(session
),
378 SlcUiConstants
.DEFAULT_MY_RESULTS_FOLDER_LABEL
);
381 Calendar cal
= Calendar
.getInstance();
382 String relPath
= JcrUtils
.dateAsPath(cal
);
383 List
<String
> datePathes
= new ArrayList
<String
>();
384 datePathes
.add(relPath
);
385 roots
[1] = new VirtualFolder(null,
386 ResultParentUtils
.getResultsForDates(session
, datePathes
),
390 cal
= Calendar
.getInstance();
391 cal
.add(Calendar
.DAY_OF_YEAR
, -1);
392 relPath
= JcrUtils
.dateAsPath(cal
);
393 datePathes
= new ArrayList
<String
>();
394 datePathes
.add(relPath
);
395 roots
[2] = new VirtualFolder(null,
396 ResultParentUtils
.getResultsForDates(session
, datePathes
),
400 cal
= Calendar
.getInstance();
401 datePathes
= new ArrayList
<String
>();
403 for (int i
= 0; i
< 7; i
++) {
404 cal
.add(Calendar
.DAY_OF_YEAR
, -i
);
405 relPath
= JcrUtils
.dateAsPath(cal
);
406 datePathes
.add(relPath
);
408 roots
[3] = new VirtualFolder(null,
409 ResultParentUtils
.getResultsForDates(session
, datePathes
),
413 Node otherResultsPar
= session
.getNode(SlcJcrResultUtils
414 .getSlcResultsBasePath(session
));
415 roots
[4] = new ParentNodeFolder(null, otherResultsPar
,
418 } catch (RepositoryException re
) {
419 throw new ArgeoException(
420 "Unexpected error while initializing ResultTree.", re
);
424 // Manage context menu
426 * Defines the commands that will pop up in the context menu.
428 protected void contextMenuAboutToShow(IMenuManager menuManager
) {
429 IWorkbenchWindow window
= ClientUiPlugin
.getDefault().getWorkbench()
430 .getActiveWorkbenchWindow();
432 IStructuredSelection selection
= (IStructuredSelection
) resultTreeViewer
434 boolean canAddSubfolder
= false;
435 boolean canRenamefolder
= false;
436 boolean isSingleResultNode
= false;
437 // Building conditions
438 if (selection
.size() == 1) {
439 Object obj
= selection
.getFirstElement();
441 if (obj
instanceof SingleResultNode
)
442 isSingleResultNode
= true;
443 else if (obj
instanceof ParentNodeFolder
) {
444 Node cNode
= ((ParentNodeFolder
) obj
).getNode();
445 if (cNode
.isNodeType(SlcTypes
.SLC_RESULT_FOLDER
)) {
446 canAddSubfolder
= true;
447 canRenamefolder
= true;
449 .isNodeType(SlcTypes
.SLC_MY_RESULT_ROOT_FOLDER
)) {
450 canAddSubfolder
= true;
453 } catch (RepositoryException re
) {
454 throw new SlcException(
455 "unexpected error while building condition for context menu",
460 CommandUtils
.refreshCommand(menuManager
, window
, AddResultFolder
.ID
,
461 AddResultFolder
.DEFAULT_LABEL
,
462 ClientUiPlugin
.getDefault().getWorkbench().getSharedImages()
463 .getImageDescriptor(ISharedImages
.IMG_OBJ_ADD
),
466 CommandUtils
.refreshCommand(menuManager
, window
, RenameResultFolder
.ID
,
467 RenameResultFolder
.DEFAULT_LABEL
,
468 RenameResultFolder
.DEFAULT_IMG_DESCRIPTOR
, canRenamefolder
);
470 CommandUtils
.refreshCommand(menuManager
, window
, RenameResultNode
.ID
,
471 RenameResultNode
.DEFAULT_LABEL
,
472 RenameResultNode
.DEFAULT_IMG_DESCRIPTOR
, isSingleResultNode
);
476 class ViewDragListener
implements DragSourceListener
{
478 public void dragStart(DragSourceEvent event
) {
479 // Check if the drag action should start.
480 IStructuredSelection selection
= (IStructuredSelection
) resultTreeViewer
482 boolean doIt
= false;
483 // only one node at a time for the time being.
484 if (selection
.size() == 1) {
486 Object obj
= selection
.getFirstElement();
487 if (obj
instanceof SingleResultNode
) {
488 Node tNode
= ((SingleResultNode
) obj
).getNode();
489 if (tNode
.getPrimaryNodeType().isNodeType(
490 SlcTypes
.SLC_TEST_RESULT
)) {
492 isResultFolder
= false;
494 } else if (obj
instanceof ResultFolder
) {
495 Node tNode
= ((ResultFolder
) obj
).getNode();
496 if (tNode
.getPrimaryNodeType().isNodeType(
497 SlcTypes
.SLC_RESULT_FOLDER
)) {
499 isResultFolder
= true;
502 } catch (RepositoryException re
) {
503 throw new SlcException(
504 "unexpected error while validating drag source", re
);
510 public void dragSetData(DragSourceEvent event
) {
511 IStructuredSelection selection
= (IStructuredSelection
) resultTreeViewer
513 Object obj
= selection
.getFirstElement();
516 if (obj
instanceof SingleResultNode
) {
517 first
= ((SingleResultNode
) obj
).getNode();
518 event
.data
= first
.getIdentifier();
519 } else if (obj
instanceof ResultFolder
) {
520 first
= ((ResultFolder
) obj
).getNode();
521 event
.data
= first
.getIdentifier();
523 } catch (RepositoryException re
) {
524 throw new SlcException("unexpected error while setting data",
529 public void dragFinished(DragSourceEvent event
) {
530 // refresh is done via observer
534 // Implementation of the Drop Listener
535 protected class ViewDropListener
extends ViewerDropAdapter
{
536 private Node targetParentNode
= null;
538 public ViewDropListener(Viewer viewer
) {
543 public boolean validateDrop(Object target
, int operation
,
544 TransferData transferType
) {
545 boolean validDrop
= false;
547 // We can only drop under myResults
549 if (target
instanceof SingleResultNode
) {
550 Node currNode
= ((SingleResultNode
) target
).getNode();
551 String pPath
= currNode
.getParent().getPath();
552 if (pPath
.startsWith(SlcJcrResultUtils
553 .getMyResultsBasePath(session
)))
554 tpNode
= currNode
.getParent();
555 } else if (target
instanceof ResultFolder
) {
556 tpNode
= ((ResultFolder
) target
).getNode();
557 } else if (target
instanceof ParentNodeFolder
) {
558 Node node
= ((ParentNodeFolder
) target
).getNode();
559 if (node
.isNodeType(SlcTypes
.SLC_MY_RESULT_ROOT_FOLDER
))
560 tpNode
= ((ParentNodeFolder
) target
).getNode();
563 if (tpNode
!= null) {
564 // Sanity check : we cannot move a folder to one of its sub
565 // folder or neither move an object in the same parent
569 if (isResultFolder
) {
570 source
= ((ParentNodeFolder
) lastSelectedSourceElement
)
572 if (tpNode
.getPath().startsWith(source
.getPath()))
574 } else if (lastSelectedSourceElement
instanceof SingleResultNode
) {
575 source
= ((SingleResultNode
) lastSelectedSourceElement
)
577 String sourceParentPath
= JcrUtils
.parentPath(source
579 if (tpNode
.getPath().equals(sourceParentPath
))
583 targetParentNode
= tpNode
;
585 lastSelectedTargetElement
= (ResultParent
) target
;
588 } catch (RepositoryException re
) {
589 throw new SlcException(
590 "unexpected error while validating drop target", re
);
596 public boolean performDrop(Object data
) {
597 // clear selection to prevent unwanted scrolling of the UI
598 resultTreeViewer
.setSelection(null);
600 Node source
= session
.getNodeByIdentifier((String
) data
);
602 // Check is a node with same name already exists at destination
604 if (source
.hasProperty(Property
.JCR_TITLE
))
605 name
= source
.getProperty(Property
.JCR_TITLE
).getString();
606 else if (source
.hasProperty(SlcNames
.SLC_TEST_CASE
))
607 name
= source
.getProperty(SlcNames
.SLC_TEST_CASE
)
610 name
= source
.getName();
612 if (targetParentNode
.hasNode(name
)) {
613 ConfirmOverwriteWizard wizard
= new ConfirmOverwriteWizard(
614 name
, targetParentNode
);
615 WizardDialog dialog
= new WizardDialog(Display
.getDefault()
616 .getActiveShell(), wizard
);
618 if (dialog
.open() == WizardDialog
.CANCEL
)
621 if (wizard
.overwrite()) {
622 targetParentNode
.getNode(name
).remove();
625 name
= wizard
.newName();
629 if (!isActionUnderMyResult
) {// Copy
630 target
= targetParentNode
.addNode(name
, source
631 .getPrimaryNodeType().getName());
632 JcrUtils
.copy(source
, target
);
634 String sourcePath
= source
.getPath();
635 String destPath
= targetParentNode
.getPath() + "/" + name
;
636 session
.move(sourcePath
, destPath
);
638 target
= session
.getNode(destPath
);
640 if (!target
.isNodeType(NodeType
.MIX_TITLE
))
641 target
.addMixin(NodeType
.MIX_TITLE
);
642 target
.setProperty(Property
.JCR_TITLE
, name
);
644 .updatePassedStatus(target
,
645 target
.getNode(SlcNames
.SLC_STATUS
)
646 .getProperty(SlcNames
.SLC_SUCCESS
)
649 } catch (RepositoryException re
) {
650 throw new SlcException(
651 "unexpected error while copying dropped node", re
);
657 class ResultObserver
extends AsyncUiEventListener
{
659 public ResultObserver(Display display
) {
664 protected Boolean
willProcessInUiThread(List
<Event
> events
)
665 throws RepositoryException
{
666 // unfiltered for the time being
670 protected void onEventInUiThread(List
<Event
> events
)
671 throws RepositoryException
{
672 refresh(lastSelectedSourceElementParent
);
674 // boolean wasRemoved = false;
675 // boolean wasAdded = false;
677 // for (Event event : events) {
678 // // if (log.isDebugEnabled())
679 // // log.debug("Received event " + event);
680 // int eventType = event.getType();
681 // if (eventType == Event.NODE_REMOVED) {
682 // String path = event.getPath();
683 // String parPath = JcrUtils.parentPath(path);
684 // if (session.nodeExists(parPath)) {
685 // Node currNode = session.getNode(parPath);
686 // if (currNode.isNodeType(NodeType.NT_UNSTRUCTURED)) {
687 // // jcrRefresh(currNode);
688 // wasRemoved = true;
691 // } else if (eventType == Event.NODE_ADDED) {
692 // // refresh(lastSelectedTargetElement);
693 // String path = event.getPath();
694 // if (session.nodeExists(path)) {
695 // Node currNode = session.getNode(path);
696 // if (currNode.isNodeType(SlcTypes.SLC_TEST_RESULT)
698 // .isNodeType(SlcTypes.SLC_RESULT_FOLDER)) {
699 // // refresh(lastSelectedTargetElement);
701 // // resultTreeViewer.expandToLevel(
702 // // lastSelectedTargetElement, 1);
707 // if (wasRemoved || wasAdded)
708 // refresh(lastSelectedSourceElementParent);
712 class PropertiesContentProvider
implements IStructuredContentProvider
{
714 public void dispose() {
717 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
720 public Object
[] getElements(Object inputElement
) {
722 if (inputElement
instanceof Node
) {
723 List
<Property
> props
= new ArrayList
<Property
>();
724 PropertyIterator pit
= ((Node
) inputElement
)
726 while (pit
.hasNext())
727 props
.add(pit
.nextProperty());
728 return props
.toArray();
730 return new Object
[] {};
731 } catch (RepositoryException e
) {
732 throw new ArgeoException("Cannot get element for "
738 class MySelectionChangedListener
implements ISelectionChangedListener
{
740 public void selectionChanged(SelectionChangedEvent event
) {
741 if (!event
.getSelection().isEmpty()) {
742 IStructuredSelection sel
= (IStructuredSelection
) event
744 ResultParent firstItem
= (ResultParent
) sel
.getFirstElement();
745 if (firstItem
instanceof SingleResultNode
)
746 propertiesViewer
.setInput(((SingleResultNode
) firstItem
)
749 propertiesViewer
.setInput(null);
750 // update cache for Drag & drop
751 lastSelectedTargetElement
= firstItem
;
752 lastSelectedSourceElement
= firstItem
;
753 lastSelectedSourceElementParent
= (ResultParent
) firstItem
758 if (firstItem
instanceof ParentNodeFolder
)
759 pPath
= ((ParentNodeFolder
) firstItem
).getNode()
761 else if (firstItem
instanceof SingleResultNode
)
762 pPath
= ((SingleResultNode
) firstItem
).getNode()
764 } catch (RepositoryException e
) {
765 throw new SlcException(
766 "Unexpected error while checking parent UI tree", e
);
768 if ((pPath
.startsWith(SlcJcrResultUtils
769 .getMyResultsBasePath(session
))))
770 isActionUnderMyResult
= true;
772 isActionUnderMyResult
= false;
777 class ViewDoubleClickListener
implements IDoubleClickListener
{
778 public void doubleClick(DoubleClickEvent evt
) {
779 processDoubleClick(evt
);
784 /* DEPENDENCY INJECTION */
785 public void setSession(Session session
) {
786 this.session
= session
;