From: Bruno Sinou Date: Thu, 15 Nov 2012 11:35:26 +0000 (+0000) Subject: Fix last issues on ResultTreeViewer before the release X-Git-Tag: argeo-slc-2.1.7~533 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=78a1f1f21b5785919ffe25ddb9baf12aadff5f37;p=gpl%2Fargeo-slc.git Fix last issues on ResultTreeViewer before the release git-svn-id: https://svn.argeo.org/slc/trunk@5827 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/DeleteItems.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/DeleteItems.java index 26790edbc..08d4798d8 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/DeleteItems.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/commands/DeleteItems.java @@ -102,7 +102,8 @@ public class DeleteItems extends AbstractHandler { for (Node node : nodes) { Node parent = node.getParent(); node.remove(); - ResultParentUtils.updateStatusOnRemoval(parent); + ResultParentUtils.updatePassedStatus(parent, + true); monitor.worked(1); } session.save(); diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ParentNodeFolder.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ParentNodeFolder.java index d978711f7..51ffb1118 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ParentNodeFolder.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ParentNodeFolder.java @@ -88,30 +88,25 @@ public class ParentNodeFolder extends ResultParent { } } - @Override - public synchronized void dispose() { - super.dispose(); - } - public Node getNode() { return node; } - /** - * Overriden in the specific case of "My result" root object to return an - * ordered list of children - */ - public synchronized Object[] getChildren() { - Object[] children = super.getChildren(); - try { - if (node.isNodeType(SlcTypes.SLC_MY_RESULT_ROOT_FOLDER)) - return ResultParentUtils.orderChildren(children); - else - return children; - } catch (RepositoryException re) { - throw new SlcException( - "Unexpected error while initializing simple node folder : " - + getName(), re); - } - } + // /** + // * Overriden in the specific case of "My result" root object to return an + // * ordered list of children + // */ + // public synchronized Object[] getChildren() { + // Object[] children = super.getChildren(); + // try { + // if (node.isNodeType(SlcTypes.SLC_MY_RESULT_ROOT_FOLDER)) + // return ResultParentUtils.orderChildren(children); + // else + // return children; + // } catch (RepositoryException re) { + // throw new SlcException( + // "Unexpected error while initializing simple node folder : " + // + getName(), re); + // } + // } } \ No newline at end of file diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultFolder.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultFolder.java index 8abae3f77..429dcedd5 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultFolder.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultFolder.java @@ -25,8 +25,7 @@ import org.argeo.slc.jcr.SlcNames; * UI Tree component that wrap a node of type ResultFolder. list either other * folders and/or a list of results. keeps a reference to its parent. */ -public class ResultFolder extends ParentNodeFolder implements - Comparable { +public class ResultFolder extends ParentNodeFolder { /** * @@ -49,15 +48,15 @@ public class ResultFolder extends ParentNodeFolder implements } } - /** - * Overriden to return an ordered list of children - */ - public synchronized Object[] getChildren() { - Object[] children = super.getChildren(); - return ResultParentUtils.orderChildren(children); - } - - public int compareTo(ResultFolder o) { - return super.compareTo(o); - } + // /** + // * Overriden to return an ordered list of children + // */ + // public synchronized Object[] getChildren() { + // Object[] children = super.getChildren(); + // return ResultParentUtils.orderChildren(children); + // } + // + // public int compareTo(ResultFolder o) { + // return super.compareTo(o); + // } } \ No newline at end of file diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultItemsComparator.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultItemsComparator.java new file mode 100644 index 000000000..8ea293af1 --- /dev/null +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultItemsComparator.java @@ -0,0 +1,82 @@ +package org.argeo.slc.client.ui.model; + +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.RepositoryException; + +import org.argeo.eclipse.ui.TreeParent; +import org.argeo.slc.SlcException; +import org.argeo.slc.jcr.SlcNames; +import org.argeo.slc.jcr.SlcTypes; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerComparator; + +/** Enable specific sorting of the ResultTreeView */ +public class ResultItemsComparator extends ViewerComparator { + + @Override + public int category(Object element) { + if (element instanceof SingleResultNode) { + return 10; + + } + // folder always first + return 5; + } + + @Override + public int compare(Viewer viewer, Object e1, Object e2) { + int cat1 = category(e1); + int cat2 = category(e2); + + if (cat1 != cat2) { + return cat1 - cat2; + } + + int result = 0; + + if (e1 instanceof TreeParent && ((TreeParent) e1).getParent() == null) { + // preserve predefined order on UI root items + return 0; + } + + if (e1 instanceof SingleResultNode && e2 instanceof SingleResultNode) { + Node an = ((SingleResultNode) e1).getNode(); + Node bn = ((SingleResultNode) e2).getNode(); + try { + // Order is different if we are under my Result or )in the + // rest of the tree structure + if (an.getParent().isNodeType( + SlcTypes.SLC_MY_RESULT_ROOT_FOLDER) + || an.getParent() + .isNodeType(SlcTypes.SLC_RESULT_FOLDER)) { + result = super.compare(viewer, e1, e2); + // Specific case of two result with same name + if (result == 0) { + result = an + .getProperty(SlcNames.SLC_COMPLETED) + .getDate() + .compareTo( + bn.getProperty(SlcNames.SLC_COMPLETED) + .getDate()); + } + } else { + result = an + .getProperty(Property.JCR_CREATED) + .getDate() + .compareTo( + bn.getProperty(Property.JCR_CREATED) + .getDate()); + result = result * -1; // last are displayed first + } + } catch (RepositoryException e) { + throw new SlcException("Unable to compare date created", e); + } + } else + // only remaining objects for the time being + // NT_UNSTRUCTURED that display all result tree structures + // We want the newest folders first + result = super.compare(viewer, e1, e2) * -1; + return result; + } +} diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultItemsComparer.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultItemsComparer.java new file mode 100644 index 000000000..14b9b068f --- /dev/null +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultItemsComparer.java @@ -0,0 +1,46 @@ +package org.argeo.slc.client.ui.model; + +import javax.jcr.RepositoryException; + +import org.argeo.slc.SlcException; +import org.eclipse.jface.viewers.IElementComparer; + +/** + * Override default behaviour to insure that 2 distincts results that have the + * same name will be correctly and distincly returned by corresponding + * TreeViewer.getSelection() method. + * + */ +public class ResultItemsComparer implements IElementComparer { + // private final static Log log = + // LogFactory.getLog(ResultItemsComparer.class); + + public boolean equals(Object a, Object b) { + if (b == null) + return a == null ? true : false; + + if (a.hashCode() != b.hashCode() || !a.getClass().equals(b.getClass())) + return false; + else if (a instanceof SingleResultNode) { + try { + String ida = ((SingleResultNode) a).getNode().getIdentifier(); + + String idb = ((SingleResultNode) b).getNode().getIdentifier(); + + if (ida.equals(idb)) + return true; + else + return false; + + } catch (RepositoryException e) { + throw new SlcException("Cannot compare single reult nodes", e); + } + } else + return true; + } + + public int hashCode(Object element) { + return element.hashCode(); + } + +} diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultParent.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultParent.java index adcefaa2a..b62d5b943 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultParent.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultParent.java @@ -15,7 +15,15 @@ */ package org.argeo.slc.client.ui.model; +import java.util.Collections; + +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.RepositoryException; + import org.argeo.eclipse.ui.TreeParent; +import org.argeo.slc.SlcException; +import org.argeo.slc.jcr.SlcTypes; /** * Common base UI object to build result Tree. @@ -53,9 +61,5 @@ public abstract class ResultParent extends TreeParent { initialize(); } - public synchronized void dispose() { - super.dispose(); - } - protected abstract void initialize(); } diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultParentUtils.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultParentUtils.java index 26d44e7c5..e8f10bffa 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultParentUtils.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/model/ResultParentUtils.java @@ -16,7 +16,6 @@ package org.argeo.slc.client.ui.model; import java.util.ArrayList; -import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -38,35 +37,35 @@ public class ResultParentUtils { // private final static Log log = // LogFactory.getLog(ResultParentUtils.class); - public static Object[] orderChildren(Object[] children) { - List folders = new ArrayList(); - List results = new ArrayList(); - for (Object child : children) { - if (child instanceof ResultFolder) - folders.add((ResultFolder) child); - else if (child instanceof SingleResultNode) - results.add((SingleResultNode) child); - } - - // Comparator first = Collections.reverseOrder(); - Collections.sort(folders); - // Comparator second = Collections.reverseOrder(); - Collections.sort(results); - - Object[] orderedChildren = new Object[folders.size() + results.size()]; - int i = 0; - Iterator it = folders.iterator(); - while (it.hasNext()) { - orderedChildren[i] = it.next(); - i++; - } - Iterator it2 = results.iterator(); - while (it2.hasNext()) { - orderedChildren[i] = it2.next(); - i++; - } - return orderedChildren; - } + // public static Object[] orderChildren(Object[] children) { + // List folders = new ArrayList(); + // List results = new ArrayList(); + // for (Object child : children) { + // if (child instanceof ResultFolder) + // folders.add((ResultFolder) child); + // else if (child instanceof SingleResultNode) + // results.add((SingleResultNode) child); + // } + // + // // Comparator first = Collections.reverseOrder(); + // Collections.sort(folders); + // // Comparator second = Collections.reverseOrder(); + // Collections.sort(results); + // + // Object[] orderedChildren = new Object[folders.size() + results.size()]; + // int i = 0; + // Iterator it = folders.iterator(); + // while (it.hasNext()) { + // orderedChildren[i] = it.next(); + // i++; + // } + // Iterator it2 = results.iterator(); + // while (it2.hasNext()) { + // orderedChildren[i] = it2.next(); + // i++; + // } + // return orderedChildren; + // } public static List getResultsForDates(Session session, List dateRelPathes) { @@ -111,7 +110,7 @@ public class ResultParentUtils { } /** - * recursively update passed status of the parent ResultFolder and its + * recursively update passed status of the current ResultFolder and its * parent if needed * * @param node @@ -120,27 +119,28 @@ public class ResultParentUtils { */ public static void updatePassedStatus(Node node, boolean passed) { try { - Node pNode = node.getParent(); - if (!pNode.hasNode(SlcNames.SLC_STATUS)) + if (!node.hasNode(SlcNames.SLC_STATUS)) // we have reached the root of the tree. stop the // recursivity return; - boolean pStatus = pNode.getNode(SlcNames.SLC_STATUS) + boolean pStatus = node.getNode(SlcNames.SLC_STATUS) .getProperty(SlcNames.SLC_SUCCESS).getBoolean(); if (pStatus == passed) // nothing to update return; else if (!passed) { - // error we only update status of the result folder and its + // New status is 'failed' : we only update status of the result + // folder and its // parent if needed - pNode.getNode(SlcNames.SLC_STATUS).setProperty( + node.getNode(SlcNames.SLC_STATUS).setProperty( SlcNames.SLC_SUCCESS, passed); - updatePassedStatus(pNode, passed); + updatePassedStatus(node.getParent(), passed); } else { - // success we must first check if all siblings have also + // New status is 'passed': we must first check if all siblings + // have also // successfully completed boolean success = true; - NodeIterator ni = pNode.getNodes(); + NodeIterator ni = node.getNodes(); children: while (ni.hasNext()) { Node currNode = ni.nextNode(); if ((currNode.isNodeType(SlcTypes.SLC_DIFF_RESULT) || currNode @@ -153,16 +153,16 @@ public class ResultParentUtils { } } if (success) { - pNode.getNode(SlcNames.SLC_STATUS).setProperty( + node.getNode(SlcNames.SLC_STATUS).setProperty( SlcNames.SLC_SUCCESS, passed); - updatePassedStatus(pNode, passed); + updatePassedStatus(node.getParent(), passed); } else // one of the siblings had also the failed status so // above tree remains unchanged. return; } } catch (RepositoryException e) { - throw new SlcException("Cannot register listeners", e); + throw new SlcException("Cannot update result passed status", e); } } diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/providers/ResultTreeLabelProvider.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/providers/ResultTreeLabelProvider.java index 1a55983b5..e3570c2a9 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/providers/ResultTreeLabelProvider.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/providers/ResultTreeLabelProvider.java @@ -24,6 +24,7 @@ import org.argeo.eclipse.ui.TreeParent; import org.argeo.slc.SlcException; import org.argeo.slc.client.ui.SlcImages; import org.argeo.slc.client.ui.SlcUiConstants; +import org.argeo.slc.client.ui.model.ParentNodeFolder; import org.argeo.slc.client.ui.model.ResultParent; import org.argeo.slc.client.ui.model.SingleResultNode; import org.eclipse.jface.viewers.LabelProvider; @@ -36,15 +37,21 @@ public class ResultTreeLabelProvider extends LabelProvider { @Override public String getText(Object element) { - if (element instanceof SingleResultNode) { - Node node = ((SingleResultNode) element).getNode(); - try { + try { + + if (element instanceof SingleResultNode) { + Node node = ((SingleResultNode) element).getNode(); if (node.isNodeType(NodeType.MIX_TITLE)) return node.getProperty(Property.JCR_TITLE).getString(); - } catch (RepositoryException e) { - throw new SlcException("Unexpected error while getting " - + "custom result label", e); + + } else if (element instanceof ParentNodeFolder) { + Node node = ((ParentNodeFolder) element).getNode(); + if (node.hasProperty(Property.JCR_TITLE)) + return node.getProperty(Property.JCR_TITLE).getString(); } + } catch (RepositoryException e) { + throw new SlcException("Unexpected error while getting " + + "custom result label", e); } return ((TreeParent) element).getName(); } diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultTreeView.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultTreeView.java index 820cbcd69..9a9fb6962 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultTreeView.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultTreeView.java @@ -38,7 +38,6 @@ import org.argeo.ArgeoException; import org.argeo.eclipse.ui.jcr.AsyncUiEventListener; import org.argeo.eclipse.ui.utils.CommandUtils; import org.argeo.jcr.JcrUtils; -import org.argeo.jcr.UserJcrUtils; import org.argeo.slc.SlcException; import org.argeo.slc.client.ui.ClientUiPlugin; import org.argeo.slc.client.ui.SlcUiConstants; @@ -49,6 +48,8 @@ import org.argeo.slc.client.ui.editors.ProcessEditor; import org.argeo.slc.client.ui.editors.ProcessEditorInput; import org.argeo.slc.client.ui.model.ParentNodeFolder; import org.argeo.slc.client.ui.model.ResultFolder; +import org.argeo.slc.client.ui.model.ResultItemsComparator; +import org.argeo.slc.client.ui.model.ResultItemsComparer; import org.argeo.slc.client.ui.model.ResultParent; import org.argeo.slc.client.ui.model.ResultParentUtils; import org.argeo.slc.client.ui.model.SingleResultNode; @@ -111,15 +112,20 @@ public class JcrResultTreeView extends ViewPart { private TreeViewer resultTreeViewer; private TableViewer propertiesViewer; - private EventListener resultsObserver = null; + private EventListener myResultsObserver = null; + private EventListener allResultsObserver = null; - private final static String[] observedNodeTypes = { + // under My Results + private final static String[] observedNodeTypesUnderMyResult = { SlcTypes.SLC_TEST_RESULT, SlcTypes.SLC_RESULT_FOLDER, - NodeType.NT_UNSTRUCTURED }; + SlcTypes.SLC_MY_RESULT_ROOT_FOLDER }; + + private final static String[] observedNodeTypesUnderAllResults = { + SlcTypes.SLC_TEST_RESULT, NodeType.NT_UNSTRUCTURED }; // FIXME cache to ease D&D private boolean isActionUnderMyResult = false; - private ResultParent lastSelectedTargetElement; + // private ResultParent lastSelectedTargetElement; private ResultParent lastSelectedSourceElement; private ResultParent lastSelectedSourceElementParent; private boolean isResultFolder = false; @@ -156,22 +162,44 @@ public class JcrResultTreeView extends ViewPart { sashForm.setWeights(getWeights()); - resultTreeViewer.setInput(initializeResultTree()); + setOrderedInput(resultTreeViewer); + // Initialize observer try { ObservationManager observationManager = session.getWorkspace() .getObservationManager(); - resultsObserver = new ResultObserver(resultTreeViewer.getTree() - .getDisplay()); - observationManager.addEventListener(resultsObserver, - Event.NODE_MOVED | Event.NODE_ADDED | Event.NODE_REMOVED, - UserJcrUtils.getUserHome(session).getPath(), true, null, - observedNodeTypes, false); + myResultsObserver = new MyResultsObserver(resultTreeViewer + .getTree().getDisplay()); + allResultsObserver = new AllResultsObserver(resultTreeViewer + .getTree().getDisplay()); + + // observe tree changes under MyResults + observationManager.addEventListener(myResultsObserver, + Event.NODE_ADDED | Event.NODE_REMOVED, + SlcJcrResultUtils.getMyResultsBasePath(session), true, + null, observedNodeTypesUnderMyResult, false); + // observe tree changes under All results + observationManager.addEventListener(allResultsObserver, + Event.NODE_ADDED | Event.NODE_REMOVED, + SlcJcrResultUtils.getSlcResultsBasePath(session), true, + null, observedNodeTypesUnderAllResults, false); } catch (RepositoryException e) { throw new SlcException("Cannot register listeners", e); } } + /** + * Override default behaviour so that default defined order remains + * unchanged on first level of the tree + */ + private void setOrderedInput(TreeViewer viewer) { + // Add specific ordering + resultTreeViewer.setInput(null); + viewer.setComparator(null); + resultTreeViewer.setInput(initializeResultTree()); + viewer.setComparator(new ResultItemsComparator()); + } + // The main tree viewer protected TreeViewer createResultsTreeViewer(Composite parent) { int style = SWT.BORDER | SWT.MULTI; @@ -190,6 +218,12 @@ public class JcrResultTreeView extends ViewPart { decorator)); viewer.addDoubleClickListener(new ViewDoubleClickListener()); + // Override default behaviour to insure that 2 distincts results that + // have the same name will be correctly and distincly returned by + // corresponding + // TreeViewer.getSelection() method. + viewer.setComparer(new ResultItemsComparer()); + // viewer.setLabelProvider(rtLblProvider); getSite().setSelectionProvider(viewer); @@ -321,11 +355,13 @@ public class JcrResultTreeView extends ViewPart { * */ public void refresh(ResultParent resultParent) { - // if (log.isDebugEnabled()) - // log.debug("Refreshing '" + resultParent + "'..."); - // Thread.dumpStack(); if (resultParent == null) { - resultTreeViewer.setInput(initializeResultTree()); + if (!resultTreeViewer.getTree().isDisposed()) { + TreePath[] tps = resultTreeViewer.getExpandedTreePaths(); + setOrderedInput(resultTreeViewer); + resultTreeViewer.setExpandedTreePaths(tps); + } else + setOrderedInput(resultTreeViewer); } else { if (resultParent instanceof ParentNodeFolder) { ParentNodeFolder currFolder = (ParentNodeFolder) resultParent; @@ -333,10 +369,8 @@ public class JcrResultTreeView extends ViewPart { currFolder.forceFullRefresh(); } // FIXME: specific refresh does not work - // resultTreeViewer.refresh(currFolder, true); - TreePath[] tps = resultTreeViewer.getExpandedTreePaths(); - resultTreeViewer.setInput(initializeResultTree()); - resultTreeViewer.setExpandedTreePaths(tps); + // resultTreeViewer.refresh(resultParent, true); + refresh(null); } } @@ -358,9 +392,6 @@ public class JcrResultTreeView extends ViewPart { .getProperty(SlcNames.SLC_SUCCESS).getBoolean(); } else if (node.isNodeType(SlcTypes.SLC_RESULT_FOLDER)) { NodeIterator ni = node.getNodes(); - // quicker but wrong : refresh will stop as soon as a failed - // test is found and the whole tree won't be refreshed - // while (isPassed && ni.hasNext()){ while (ni.hasNext()) { Node currChild = ni.nextNode(); isPassed = isPassed & jcrRefresh(currChild); @@ -601,7 +632,7 @@ public class JcrResultTreeView extends ViewPart { if (doit) { targetParentNode = tpNode; validDrop = true; - lastSelectedTargetElement = (ResultParent) target; + // lastSelectedTargetElement = (ResultParent) target; } } } catch (RepositoryException re) { @@ -618,7 +649,6 @@ public class JcrResultTreeView extends ViewPart { try { Node source = session.getNodeByIdentifier((String) data); - // Check is a node with same name already exists at destination String name; if (source.hasProperty(Property.JCR_TITLE)) name = source.getProperty(Property.JCR_TITLE).getString(); @@ -628,7 +658,11 @@ public class JcrResultTreeView extends ViewPart { else name = source.getName(); - if (targetParentNode.hasNode(name)) { + // Check if a user defined folder result with same name exists + // at target + if (targetParentNode.hasNode(name) + && targetParentNode.getNode(name).isNodeType( + SlcTypes.SLC_RESULT_FOLDER)) { ConfirmOverwriteWizard wizard = new ConfirmOverwriteWizard( name, targetParentNode); WizardDialog dialog = new WizardDialog(Display.getDefault() @@ -645,8 +679,10 @@ public class JcrResultTreeView extends ViewPart { } Node target; + boolean passedStatus = source.getNode(SlcNames.SLC_STATUS) + .getProperty(SlcNames.SLC_SUCCESS).getBoolean(); if (!isActionUnderMyResult) {// Copy - target = targetParentNode.addNode(name, source + target = targetParentNode.addNode(source.getName(), source .getPrimaryNodeType().getName()); JcrUtils.copy(source, target); } else {// move @@ -654,16 +690,18 @@ public class JcrResultTreeView extends ViewPart { String destPath = targetParentNode.getPath() + "/" + name; session.move(sourcePath, destPath); // session.save(); + // Update passed status of the parent source Node + ResultParentUtils.updatePassedStatus( + session.getNode(JcrUtils.parentPath(sourcePath)), + true); target = session.getNode(destPath); + } if (!target.isNodeType(NodeType.MIX_TITLE)) target.addMixin(NodeType.MIX_TITLE); target.setProperty(Property.JCR_TITLE, name); - ResultParentUtils - .updatePassedStatus(target, - target.getNode(SlcNames.SLC_STATUS) - .getProperty(SlcNames.SLC_SUCCESS) - .getBoolean()); + ResultParentUtils.updatePassedStatus(target.getParent(), + passedStatus); session.save(); } catch (RepositoryException re) { throw new SlcException( @@ -673,9 +711,9 @@ public class JcrResultTreeView extends ViewPart { } } - class ResultObserver extends AsyncUiEventListener { + class MyResultsObserver extends AsyncUiEventListener { - public ResultObserver(Display display) { + public MyResultsObserver(Display display) { super(display); } @@ -688,7 +726,22 @@ public class JcrResultTreeView extends ViewPart { protected void onEventInUiThread(List events) throws RepositoryException { - refresh(lastSelectedSourceElementParent); + List nodesToRefresh = new ArrayList(); + + for (Event event : events) { + String parPath = JcrUtils.parentPath(event.getPath()); + if (session.nodeExists(parPath)) { + Node node = session.getNode(parPath); + if (!nodesToRefresh.contains(node)) { + nodesToRefresh.add(node); + } + } + } + + // Update check nodes + for (Node node : nodesToRefresh) + jcrRefresh(node); + refresh(null); // boolean wasRemoved = false; // boolean wasAdded = false; @@ -728,6 +781,29 @@ public class JcrResultTreeView extends ViewPart { } } + class AllResultsObserver extends AsyncUiEventListener { + + public AllResultsObserver(Display display) { + super(display); + } + + @Override + protected Boolean willProcessInUiThread(List events) + throws RepositoryException { + // unfiltered for the time being + return true; + } + + protected void onEventInUiThread(List events) + throws RepositoryException { + for (Event event : events) { + if (log.isDebugEnabled()) + log.debug("Received event " + event); + } + refresh(lastSelectedSourceElementParent); + } + } + class PropertiesContentProvider implements IStructuredContentProvider { public void dispose() { @@ -767,7 +843,7 @@ public class JcrResultTreeView extends ViewPart { else propertiesViewer.setInput(null); // update cache for Drag & drop - lastSelectedTargetElement = firstItem; + // lastSelectedTargetElement = firstItem; lastSelectedSourceElement = firstItem; lastSelectedSourceElementParent = (ResultParent) firstItem .getParent();