diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionManagerVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionManagerVMNode.java index f329378c84c..69801526e43 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionManagerVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionManagerVMNode.java @@ -17,7 +17,6 @@ import org.eclipse.dd.dsf.concurrent.CountingRequestMonitor; import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.IDebugVMConstants; -import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.ExpressionVMProvider.ExpressionsChangedEvent; import org.eclipse.dd.dsf.ui.concurrent.ViewerCountingRequestMonitor; import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMContext; import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMNode; @@ -291,7 +290,7 @@ public class ExpressionManagerVMNode extends AbstractVMNode // Add a flag if the list of expressions in the global expression manager has changed. if (event instanceof ExpressionsChangedEvent) { - retVal |= IModelDelta.CONTENT; + retVal |= IModelDelta.ADDED | IModelDelta.REMOVED | IModelDelta.INSERTED | IModelDelta.CONTENT ; } for (IExpression expression : fManager.getExpressions()) { @@ -302,32 +301,47 @@ public class ExpressionManagerVMNode extends AbstractVMNode } public void buildDelta(final Object event, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor requestMonitor) { - // Add a flag if the list of expressions has changed. if (event instanceof ExpressionsChangedEvent) { - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } + buildDeltaForExpressionsChangedEvent((ExpressionsChangedEvent)event, parentDelta, nodeOffset, requestMonitor); + } else { - // Once again, for each expression, find its corresponding node and ask that - // layout node for its delta flags for given event. If there are delta flags to be - // generated, call the asynchronous method to do so. + // For each expression, find its corresponding node and ask that + // layout node for its delta flags for given event. If there are delta flags to be + // generated, call the asynchronous method to do so. + CountingRequestMonitor multiRm = new CountingRequestMonitor(getExecutor(), requestMonitor); + + int buildDeltaForExpressionCallCount = 0; + + IExpression[] expressions = fManager.getExpressions(); + for (int i = 0; i < expressions.length; i++ ) { + int flags = getExpressionVMProvider().getDeltaFlagsForExpression(expressions[i], event); + // If the given expression has no delta flags, skip it. + if (flags == IModelDelta.NO_CHANGE) continue; + + int elementOffset = nodeOffset >= 0 ? nodeOffset + i : -1; + getExpressionVMProvider().buildDeltaForExpression( + expressions[i], elementOffset, event, parentDelta, getTreePathFromDelta(parentDelta), + new RequestMonitor(getExecutor(), multiRm)); + buildDeltaForExpressionCallCount++; + } + + multiRm.setDoneCount(buildDeltaForExpressionCallCount); + } + } + + private void buildDeltaForExpressionsChangedEvent(ExpressionsChangedEvent event, VMDelta parentDelta, + int nodeOffset, RequestMonitor requestMonitor) + { CountingRequestMonitor multiRm = new CountingRequestMonitor(getExecutor(), requestMonitor); - - int buildDeltaForExpressionCallCount = 0; - - IExpression[] expressions = fManager.getExpressions(); - for (int i = 0; i < expressions.length; i++ ) { - int flags = getExpressionVMProvider().getDeltaFlagsForExpression(expressions[i], event); - // If the given expression has no delta flags, skip it. - if (flags == IModelDelta.NO_CHANGE) continue; - - int elementOffset = nodeOffset >= 0 ? nodeOffset + i : -1; + for (int i = 0; i < event.getExpressions().length; i++) { + int expIndex = event.getIndex() != -1 + ? nodeOffset + event.getIndex() + i + : -1; getExpressionVMProvider().buildDeltaForExpression( - expressions[i], elementOffset, event, parentDelta, getTreePathFromDelta(parentDelta), - new RequestMonitor(getExecutor(), multiRm)); - buildDeltaForExpressionCallCount++; + event.getExpressions()[i], expIndex, event, parentDelta, getTreePathFromDelta(parentDelta), + new RequestMonitor(getExecutor(), multiRm)); } - - multiRm.setDoneCount(buildDeltaForExpressionCallCount); + multiRm.setDoneCount(event.getExpressions().length); } private TreePath getTreePathFromDelta(IModelDelta delta) { diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionVMProviderModelProxyStrategy.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionVMProviderModelProxyStrategy.java index bc62cc04054..c1c763296d6 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionVMProviderModelProxyStrategy.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionVMProviderModelProxyStrategy.java @@ -92,7 +92,7 @@ public class ExpressionVMProviderModelProxyStrategy extends DefaultVMModelProxyS @Override protected void handleSuccess() { buildDeltaForExpressionElement( - node, getData(), expressionElementIdx, event, parentDelta, path, rm); + node, expression, getData(), expressionElementIdx, event, parentDelta, path, rm); } @Override @@ -107,9 +107,9 @@ public class ExpressionVMProviderModelProxyStrategy extends DefaultVMModelProxyS }); } - private void buildDeltaForExpressionElement(final IExpressionVMNode node, Object expressionElement, - final int expressionElementIdx, final Object event, final VMDelta parentDelta, final TreePath path, - final RequestMonitor rm) + + private void buildDeltaForExpressionElement(IExpressionVMNode node, IExpression expression, Object expressionElement, + int expressionElementIdx, Object event, VMDelta parentDelta, TreePath path, RequestMonitor rm) { CountingRequestMonitor multiRm = new CountingRequestMonitor(getVMProvider().getExecutor(), rm); int multiRmCount = 0; @@ -128,7 +128,39 @@ public class ExpressionVMProviderModelProxyStrategy extends DefaultVMModelProxyS event, multiRm); multiRmCount++; } + + if (event instanceof ExpressionsChangedEvent) { + buildDeltaForExpressionsChangedEvent(expressionElement, expressionElementIdx, + (ExpressionsChangedEvent)event, parentDelta, multiRm); + multiRmCount++; + } multiRm.setDoneCount(multiRmCount); } + + private void buildDeltaForExpressionsChangedEvent(Object element, int elementIdx, ExpressionsChangedEvent event, + VMDelta parentDelta, final RequestMonitor rm) + { + switch (event.getType()) { + case ADDED: + parentDelta.addNode(element, -1, IModelDelta.ADDED); + break; + case CHANGED: + parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); + break; + case MOVED: + parentDelta.addNode(element, -1, IModelDelta.REMOVED); + parentDelta.addNode(element, elementIdx, IModelDelta.INSERTED); + break; + case REMOVED: + parentDelta.addNode(element, -1, IModelDelta.REMOVED); + break; + case INSERTED: + parentDelta.addNode(element, elementIdx, IModelDelta.INSERTED); + break; + default: + break; + } + rm.done(); + } }