From a12a4967e3670c700efb539f7698bdc137fc49cd Mon Sep 17 00:00:00 2001
From: Pawel Piech >(getExecutor(), null) {
+ @Override
+ public void handleCompleted() {
+ if (getStatus().isOK() && getData().size() != 0) {
+ rm.setData(new IVMContext[] { (IVMContext)getData().get(0) });
+ } else {
+ // In case of errors, return an empty set of frames.
+ rm.setData(new IVMContext[0]);
+ }
+ rm.done();
+ }
+ })
+ );
+ return;
+ }
+ super.getContextsForEvent(parentDelta, e, rm);
+ }
+
public int getDeltaFlags(Object e) {
// This node generates delta if the timers have changed, or if the
// label has changed.
@@ -282,9 +316,12 @@ public class StackFramesVMNode extends AbstractDMVMNode
} else {
return IModelDelta.CONTENT;
}
- } else if (e instanceof IStepQueueManager.ISteppingTimedOutEvent) {
+ } else if (e instanceof StepQueueManager.ISteppingTimedOutEvent) {
return IModelDelta.CONTENT;
+ } else if (e instanceof ModelProxyInstalledEvent) {
+ return IModelDelta.SELECT | IModelDelta.EXPAND;
}
+
return IModelDelta.NO_CHANGE;
}
@@ -300,8 +337,10 @@ public class StackFramesVMNode extends AbstractDMVMNode
buildDeltaForSuspendedEvent((ISuspendedDMEvent)e, execDmc, execDmc, parent, nodeOffset, rm);
} else if (e instanceof IResumedDMEvent) {
buildDeltaForResumedEvent((IResumedDMEvent)e, parent, nodeOffset, rm);
- } else if (e instanceof IStepQueueManager.ISteppingTimedOutEvent) {
- buildDeltaForSteppingTimedOutEvent((IStepQueueManager.ISteppingTimedOutEvent)e, parent, nodeOffset, rm);
+ } else if (e instanceof StepQueueManager.ISteppingTimedOutEvent) {
+ buildDeltaForSteppingTimedOutEvent((StepQueueManager.ISteppingTimedOutEvent)e, parent, nodeOffset, rm);
+ } else if (e instanceof ModelProxyInstalledEvent) {
+ buildDeltaForModelProxyInstalledEvent(parent, nodeOffset, rm);
} else {
rm.done();
}
@@ -372,9 +411,27 @@ public class StackFramesVMNode extends AbstractDMVMNode
rm.done();
}
- private void buildDeltaForSteppingTimedOutEvent(final IStepQueueManager.ISteppingTimedOutEvent e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor rm) {
+ private void buildDeltaForSteppingTimedOutEvent(final StepQueueManager.ISteppingTimedOutEvent e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor rm) {
// Repaint the stack frame images to have the running symbol.
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
rm.done();
}
+
+ private void buildDeltaForModelProxyInstalledEvent(final VMDelta parentDelta, final int nodeOffset, final RequestMonitor rm) {
+ // Retrieve the list of stack frames, and mark the top frame to be selected.
+ getElementsTopStackFrameOnly(
+ new VMChildrenUpdate(
+ parentDelta, getVMProvider().getPresentationContext(), -1, -1,
+ new DataRequestMonitor
>(getExecutor(), null) {
+ @Override
+ public void handleCompleted() {
+ if (getStatus().isOK() && getData().size() != 0) {
+ parentDelta.addNode( getData().get(0), 0, IModelDelta.SELECT | IModelDelta.EXPAND);
+ }
+ rm.done();
+ }
+ })
+ );
+ }
+
}
diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/AbstractVMNode.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/AbstractVMNode.java
index e91fc401214..436aec4aeca 100644
--- a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/AbstractVMNode.java
+++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/AbstractVMNode.java
@@ -10,7 +10,12 @@
*******************************************************************************/
package org.eclipse.dd.dsf.ui.viewmodel;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
import org.eclipse.dd.dsf.concurrent.DsfExecutor;
+import org.eclipse.dd.dsf.service.IDsfService;
+import org.eclipse.dd.dsf.ui.DsfUIPlugin;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
@@ -46,8 +51,9 @@ abstract public class AbstractVMNode implements IVMNode {
fDisposed = true;
}
- public IVMContext getContextFromEvent(Object event) {
- return null;
+ public void getContextsForEvent(VMDelta parentDelta, Object event, DataRequestMonitor
>(getExecutor(), update) {
@Override
@@ -349,7 +349,7 @@ abstract public class AbstractVMProvider implements IVMProvider
update.done();
}
})
- });
+ );
} else {
update.setStatus(getStatus());
@@ -370,13 +370,11 @@ abstract public class AbstractVMProvider implements IVMProvider
* overrides this method to optionally return the results for an update from
* a cache.
*/
- protected void updateNode(final IVMNode node, IChildrenCountUpdate[] updates) {
- IChildrenCountUpdate[] updateProxies = new IChildrenCountUpdate[updates.length];
- for (int i = 0; i < updates.length; i++) {
- final IChildrenCountUpdate update = updates[i];
- updateProxies[i] = new VMChildrenCountUpdate(
+ public void updateNode(final IVMNode node, final IChildrenCountUpdate update) {
+ node.update(new IChildrenCountUpdate[] {
+ new VMChildrenCountUpdate(
update,
- new ViewerDataRequestMonitor
>(getExecutor(), update) {
@Override
@@ -397,14 +395,13 @@ abstract public class AbstractVMProvider implements IVMProvider
update.done();
}
})
- });
+ );
}
}
- });
- }
- node.update(updateProxies);
+ })
+ });
}
/**
@@ -415,8 +412,8 @@ abstract public class AbstractVMProvider implements IVMProvider
* overrides this method to optionally return the results for an update from
* a cache.
*/
- protected void updateNode(IVMNode node, IChildrenUpdate[] updates) {
- node.update(updates);
+ public void updateNode(IVMNode node, IChildrenUpdate update) {
+ node.update(new IChildrenUpdate[] { update });
}
diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/DefaultVMContentProviderStrategy.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/DefaultVMContentProviderStrategy.java
index afff0d73f4c..6009f7b16c9 100644
--- a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/DefaultVMContentProviderStrategy.java
+++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/DefaultVMContentProviderStrategy.java
@@ -170,7 +170,7 @@ public class DefaultVMContentProviderStrategy implements IElementContentProvider
update.setChildCount(0);
update.done();
} else if (childNodes.length == 1) {
- getVMProvider().updateNode(childNodes[0], new IChildrenCountUpdate[] { update } );
+ getVMProvider().updateNode(childNodes[0], update);
} else {
getChildrenCountsForNode(
update,
@@ -208,7 +208,7 @@ public class DefaultVMContentProviderStrategy implements IElementContentProvider
// Invalid update, just mark done.
update.done();
} else if (childNodes.length == 1) {
- getVMProvider().updateNode(childNodes[0], new IChildrenUpdate[] { update });
+ getVMProvider().updateNode(childNodes[0], update);
} else {
getChildrenCountsForNode(
update,
@@ -261,23 +261,22 @@ public class DefaultVMContentProviderStrategy implements IElementContentProvider
final int nodeIndex = i;
getVMProvider().updateNode(
childNodes[i],
- new IChildrenCountUpdate[] {
- new VMChildrenCountUpdate(
- update,
- childrenCountMultiReqMon.add(
- new DataRequestMonitor
>(getVMProvider().getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (getStatus().isOK()) {
- for (int i = 0; i < elementsLength; i++) {
- update.setChild(getData().get(i), elementsStartIdx + nodeStartIdx + i);
- }
+ new VMChildrenUpdate(
+ update, elementsStartIdx, elementsLength,
+ elementsMultiRequestMon.add(new DataRequestMonitor
>(getVMProvider().getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (getStatus().isOK()) {
+ for (int i = 0; i < elementsLength; i++) {
+ update.setChild(getData().get(i), elementsStartIdx + nodeStartIdx + i);
}
- elementsMultiRequestMon.requestMonitorDone(this);
}
- }))
- }
+ elementsMultiRequestMon.requestMonitorDone(this);
+ }
+ }))
);
}
}
diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/DefaultVMModelProxyStrategy.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/DefaultVMModelProxyStrategy.java
index 4a3739f5439..f51c807277a 100644
--- a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/DefaultVMModelProxyStrategy.java
+++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/DefaultVMModelProxyStrategy.java
@@ -24,9 +24,8 @@ import org.eclipse.dd.dsf.concurrent.CountingRequestMonitor;
import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
import org.eclipse.dd.dsf.concurrent.MultiRequestMonitor;
import org.eclipse.dd.dsf.concurrent.RequestMonitor;
+import org.eclipse.dd.dsf.service.IDsfService;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
@@ -182,6 +181,7 @@ public class DefaultVMModelProxyStrategy implements IVMModelProxy {
*/
public void installed(Viewer viewer) {
fViewer = viewer;
+ fProvider.handleEvent(new ModelProxyInstalledEvent(this, viewer, fRootElement));
}
/**
@@ -262,8 +262,8 @@ public class DefaultVMModelProxyStrategy implements IVMModelProxy {
// If no child nodes have deltas we can stop here.
if (childNodesWithDeltaFlags.size() == 0) {
- rm.done();
rm.setData(viewRootDelta);
+ rm.done();
return;
}
@@ -284,19 +284,26 @@ public class DefaultVMModelProxyStrategy implements IVMModelProxy {
protected void buildChildDeltas(final IVMNode node, final Object event, final VMDelta parentDelta,
final int nodeOffset, final RequestMonitor rm)
{
- final IVMContext vmc = node.getContextFromEvent(event);
-
- if (vmc != null) {
- buildChildDeltasForEventContext(vmc, node, event, parentDelta, nodeOffset, rm);
- } else {
- // The DMC for this node was not found in the event. Call the
- // super-class to resort to the default behavior which may add a
- // delta for every element in this node.
- buildChildDeltasForAllContexts(node, event, parentDelta, nodeOffset, rm);
- }
+ node.getContextsForEvent(
+ parentDelta,
+ event,
+ new DataRequestMonitor
>(getVMProvider().getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (isDisposed()) return;
-
- // Check for an empty list of elements. If it's empty then we
- // don't have to call the children nodes, so return here.
- // No need to propagate error, there's no means or need to display it.
- if (!getStatus().isOK() || getData().isEmpty()) {
- requestMonitor.done();
- return;
- }
-
- // Find the index.
+ new VMChildrenUpdate(
+ parentDelta, getVMProvider().getPresentationContext(), -1, -1,
+ new DataRequestMonitor
>(getVMProvider().getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (isDisposed()) return;
+
+ // Check for an empty list of elements. If it's empty then we
+ // don't have to call the children nodes, so return here.
+ // No need to propagate error, there's no means or need to display it.
+ if (!getStatus().isOK() || getData().isEmpty()) {
+ requestMonitor.done();
+ return;
+ }
+
+ CountingRequestMonitor countingRm =
+ new CountingRequestMonitor(getVMProvider().getExecutor(), requestMonitor);
+
+ int count = 0;
+ for (IVMContext vmc : vmcs) {
+ // Find the index of the vmc in the full list of elements.
int i;
for (i = 0; i < getData().size(); i++) {
if (vmc.equals(getData().get(i))) break;
}
if (i == getData().size()) {
// Element not found, no need to generate the delta.
- requestMonitor.done();
- return;
+ continue;
}
// Optimization: Try to find a delta with a matching element, if found use it.
@@ -359,18 +369,27 @@ public class DefaultVMModelProxyStrategy implements IVMModelProxy {
delta = parentDelta.addNode(vmc, elementIndex, IModelDelta.NO_CHANGE);
}
- callChildNodesToBuildDelta(node, childNodeDeltas, delta, event, requestMonitor);
+ callChildNodesToBuildDelta(node, childNodeDeltas, delta, event, countingRm);
+ count++;
}
- })
- });
+ countingRm.setDoneCount(count);
+ }
+ }));
} else {
- // Optimization: Try to find a delta with a matching element, if found use it.
- // Otherwise create a new delta for the event element.
- VMDelta delta = (VMDelta)parentDelta.getChildDelta(vmc);
- if (delta == null) {
- delta = parentDelta.addNode(vmc, IModelDelta.NO_CHANGE);
+ CountingRequestMonitor countingRm =
+ new CountingRequestMonitor(getVMProvider().getExecutor(), requestMonitor);
+ int count = 0;
+ for (IVMContext vmc : vmcs) {
+ // Optimization: Try to find a delta with a matching element, if found use it.
+ // Otherwise create a new delta for the event element.
+ VMDelta delta = (VMDelta)parentDelta.getChildDelta(vmc);
+ if (delta == null) {
+ delta = parentDelta.addNode(vmc, IModelDelta.NO_CHANGE);
+ }
+ callChildNodesToBuildDelta(node, childNodeDeltas, delta, event, requestMonitor);
+ count++;
}
- callChildNodesToBuildDelta(node, childNodeDeltas, delta, event, requestMonitor);
+ countingRm.setDoneCount(count);
}
}
@@ -414,49 +433,48 @@ public class DefaultVMModelProxyStrategy implements IVMModelProxy {
// each element as the parent of their delta.
getVMProvider().updateNode(
node,
- new IChildrenUpdate[] {
- new VMChildrenUpdate(
- parentDelta, getVMProvider().getPresentationContext(), -1, -1,
- new DataRequestMonitor
>(getVMProvider().getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (fDisposed) return;
-
- // Check for an empty list of elements. If it's empty then we
- // don't have to call the children nodes, so return here.
- // No need to propagate error, there's no means or need to display it.
- if (!getStatus().isOK() || getData().size() == 0) {
- requestMonitor.done();
- return;
- }
-
- final MultiRequestMonitor
>(getVMProvider().getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (fDisposed) return;
+
+ // Check for an empty list of elements. If it's empty then we
+ // don't have to call the children nodes, so return here.
+ // No need to propagate error, there's no means or need to display it.
+ if (!getStatus().isOK() || getData().size() == 0) {
+ requestMonitor.done();
+ return;
+ }
+
+ final MultiRequestMonitor
null
- * if it cannot.
+ * @param Request monitor for the array of elements corresponding to the
+ * given event.
*/
- public IVMContext getContextFromEvent(Object event);
+ public void getContextsForEvent(VMDelta parentDelta, Object event, DataRequestMonitor