blob: 1a8b01a4fcb4caaea1e16ca420d2bda7ee9c2767 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.debug.internal.ui.elements.adapters;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IDebugEventSetListener;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.ISourceLocator;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.internal.ui.InstructionPointerManager;
import org.eclipse.debug.internal.ui.contexts.ISourceDisplayAdapter;
import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupResult;
import org.eclipse.debug.internal.ui.views.launch.DecorationManager;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.sourcelookup.ISourceLookupResult;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.progress.UIJob;
/**
* @since 3.2
*/
public class StackFrameSourceDisplayAdapter implements ISourceDisplayAdapter {
private IStackFrame fPrevFrame;
private SourceLookupResult fPrevResult;
/**
* Constructs singleton source display adapter for stack frames.
*/
public StackFrameSourceDisplayAdapter() {
DebugPlugin.getDefault().addDebugEventListener(new IDebugEventSetListener() {
public void handleDebugEvents(DebugEvent[] events) {
for (int i = 0; i < events.length; i++) {
DebugEvent event = events[i];
switch (event.getKind()) {
case DebugEvent.TERMINATE:
case DebugEvent.RESUME:
if (!event.isEvaluation()) {
clearSourceSelection(event.getSource());
}
break;
}
}
}
});
}
/**
* A job to perform source lookup on the currently selected stack frame.
*/
class SourceLookupJob extends Job {
private IStackFrame fTarget;
private ISourceLocator fLocator;
private IWorkbenchPage fPage;
/**
* Constructs a new source lookup job.
*/
public SourceLookupJob(IStackFrame frame, ISourceLocator locator, IWorkbenchPage page) {
super("Debug Source Lookup"); //$NON-NLS-1$
setPriority(Job.INTERACTIVE);
setSystem(true);
fTarget = frame;
fLocator = locator;
fPage = page;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
*/
protected IStatus run(IProgressMonitor monitor) {
if (!monitor.isCanceled()) {
ISourceLookupResult result = null;
result = DebugUITools.lookupSource(fTarget, fLocator);
synchronized (StackFrameSourceDisplayAdapter.this) {
fPrevResult = (SourceLookupResult)result;
fPrevFrame = fTarget;
}
if (!monitor.isCanceled()) {
SourceDisplayJob job = new SourceDisplayJob(result, fPage);
job.schedule();
}
}
return Status.OK_STATUS;
}
}
class SourceDisplayJob extends UIJob {
private ISourceLookupResult fResult;
private IWorkbenchPage fPage;
/**
* Constructs a new source display job
*/
public SourceDisplayJob(ISourceLookupResult result, IWorkbenchPage page) {
super("Debug Source Display"); //$NON-NLS-1$
setSystem(true);
setPriority(Job.INTERACTIVE);
fResult = result;
fPage = page;
}
/* (non-Javadoc)
* @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
*/
public IStatus runInUIThread(IProgressMonitor monitor) {
if (!monitor.isCanceled()) {
DebugUITools.displaySource(fResult, fPage);
}
return Status.OK_STATUS;
}
}
/* (non-Javadoc)
* @see org.eclipse.debug.ui.contexts.ISourceDisplayAdapter#displaySource(java.lang.Object, org.eclipse.ui.IWorkbenchPage, boolean)
*/
public synchronized void displaySource(Object context, IWorkbenchPage page, boolean force) {
IStackFrame frame = (IStackFrame)context;
if (!force && frame.equals(fPrevFrame)) {
fPrevResult.updateArtifact(context);
(new SourceDisplayJob(fPrevResult, page)).schedule();
} else {
(new SourceLookupJob(frame, frame.getLaunch().getSourceLocator(), page)).schedule();
}
}
/**
* Deselects any source decorations associated with the given thread or
* debug target.
*
* @param source thread or debug target
*/
private void clearSourceSelection(Object source) {
if (source instanceof IThread) {
IThread thread = (IThread)source;
DecorationManager.removeDecorations(thread);
InstructionPointerManager.getDefault().removeAnnotations(thread);
} else if (source instanceof IDebugTarget) {
IDebugTarget target = (IDebugTarget)source;
DecorationManager.removeDecorations(target);
InstructionPointerManager.getDefault().removeAnnotations(target);
}
}
}