Bug 275614 - REGRESSION: threads no longer expanded if Debug view not visible
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaDebugTargetProxy.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaDebugTargetProxy.java
index 6b5526b..90ae220 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaDebugTargetProxy.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaDebugTargetProxy.java
@@ -14,12 +14,19 @@
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.model.IDebugTarget;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
import org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler;
import org.eclipse.debug.internal.ui.viewers.update.DebugTargetEventHandler;
import org.eclipse.debug.internal.ui.viewers.update.DebugTargetProxy;
import org.eclipse.debug.internal.ui.viewers.update.StackFrameEventHandler;
+import org.eclipse.jdt.debug.core.IJavaDebugTarget;
+import org.eclipse.jdt.internal.debug.ui.monitors.JavaElementContentProvider;
import org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookLauncher;
import org.eclipse.jface.viewers.Viewer;
@@ -36,11 +43,14 @@
*/
private boolean fIsScrapbook = false;
+ private IDebugTarget fDebugTarget = null;
+
/**
* @param target
*/
public JavaDebugTargetProxy(IDebugTarget target) {
super(target);
+ fDebugTarget = target;
ILaunch launch = target.getLaunch();
if (launch != null) {
fIsScrapbook = launch.getAttribute(ScrapbookLauncher.SCRAPBOOK_LAUNCH) != null;
@@ -70,7 +80,7 @@
Job job = new Job("Initialize Java Debug Session") { //$NON-NLS-1$
protected IStatus run(IProgressMonitor monitor) {
if (!isDisposed()) {
- JavaDebugTargetProxy.super.installed(finalViewer);
+ doInstalled(finalViewer);
}
return Status.OK_STATUS;
}
@@ -80,4 +90,45 @@
fThreadEventHandler.init(viewer);
}
+ private void doInstalled(Viewer viewer) {
+ // select any thread that is already suspended after installation
+ IDebugTarget target = fDebugTarget;
+
+ if (target != null) {
+ ModelDelta delta = getNextSuspendedThreadDelta(null, false);
+ if (delta == null) {
+ try {
+ ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
+ ILaunch launch = target.getLaunch();
+ int launchIndex = indexOf(manager.getLaunches(), target.getLaunch());
+ int targetIndex = indexOf(target.getLaunch().getChildren(), target);
+ delta = new ModelDelta(manager, IModelDelta.NO_CHANGE);
+ ModelDelta node = delta.addNode(launch, launchIndex, IModelDelta.NO_CHANGE, target.getLaunch().getChildren().length);
+ node = node.addNode(target, targetIndex, IModelDelta.EXPAND | IModelDelta.SELECT, getTargetChildCount(target));
+ } catch (DebugException e) {
+ // In case of exception do not fire delta
+ return;
+ }
+ }
+ // expand the target if no suspended thread
+ fireModelChanged(delta);
+ }
+ }
+
+ private int getTargetChildCount(IDebugTarget target) throws DebugException{
+ if (target instanceof IJavaDebugTarget) {
+ IJavaDebugTarget javaTarget = (IJavaDebugTarget)target;
+
+ if (JavaElementContentProvider.isDisplayThreadGroups()) {
+ if (javaTarget.isDisconnected() || javaTarget.isTerminated()) {
+ return 0;
+ }
+ return javaTarget.getRootThreadGroups().length;
+ } else {
+ return javaTarget.getThreads().length;
+ }
+ }
+ return 0;
+ }
+
}