/******************************************************************************* * Copyright (c) 2008, 2016 ARM Limited 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: * ARM Limited - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.debug.internal.ui.sourcelookup; import org.eclipse.cdt.debug.core.model.ICStackFrame; import org.eclipse.cdt.debug.internal.ui.disassembly.editor.DisassemblyEditorManager; import org.eclipse.cdt.debug.ui.CDebugUIPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IRegisterGroup; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.core.model.IThread; import org.eclipse.debug.core.model.IVariable; import org.eclipse.debug.ui.sourcelookup.ISourceDisplay; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.progress.UIJob; public class SourceDisplayAdapter implements ISourceDisplay { class DelegatingStackFrame implements IStackFrame { private ICStackFrame fDelegate; DelegatingStackFrame(ICStackFrame delegate) { super(); fDelegate = delegate; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getCharEnd() */ @Override public int getCharEnd() throws DebugException { return fDelegate.getCharEnd(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getCharStart() */ @Override public int getCharStart() throws DebugException { return fDelegate.getCharStart(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getLineNumber() */ @Override public int getLineNumber() throws DebugException { return fDelegate.getLineNumber(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getName() */ @Override public String getName() throws DebugException { return fDelegate.getName(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getRegisterGroups() */ @Override public IRegisterGroup[] getRegisterGroups() throws DebugException { return fDelegate.getRegisterGroups(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getThread() */ @Override public IThread getThread() { return fDelegate.getThread(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getVariables() */ @Override public IVariable[] getVariables() throws DebugException { return fDelegate.getVariables(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#hasRegisterGroups() */ @Override public boolean hasRegisterGroups() throws DebugException { return fDelegate.hasRegisterGroups(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#hasVariables() */ @Override public boolean hasVariables() throws DebugException { return fDelegate.hasVariables(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget() */ @Override public IDebugTarget getDebugTarget() { return fDelegate.getDebugTarget(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IDebugElement#getLaunch() */ @Override public ILaunch getLaunch() { return fDelegate.getLaunch(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier() */ @Override public String getModelIdentifier() { return fDelegate.getModelIdentifier(); } @SuppressWarnings("unchecked") @Override public <T> T getAdapter(Class<T> adapter) { if (ICStackFrame.class.equals(adapter)) return (T) fDelegate; return fDelegate.getAdapter(adapter); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#canStepInto() */ @Override public boolean canStepInto() { return fDelegate.canStepInto(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#canStepOver() */ @Override public boolean canStepOver() { return fDelegate.canStepOver(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#canStepReturn() */ @Override public boolean canStepReturn() { return fDelegate.canStepReturn(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#isStepping() */ @Override public boolean isStepping() { return fDelegate.isStepping(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepInto() */ @Override public void stepInto() throws DebugException { fDelegate.stepInto(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepOver() */ @Override public void stepOver() throws DebugException { fDelegate.stepOver(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepReturn() */ @Override public void stepReturn() throws DebugException { fDelegate.stepReturn(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#canResume() */ @Override public boolean canResume() { return fDelegate.canResume(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend() */ @Override public boolean canSuspend() { return fDelegate.canSuspend(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended() */ @Override public boolean isSuspended() { return fDelegate.isSuspended(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#resume() */ @Override public void resume() throws DebugException { fDelegate.resume(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#suspend() */ @Override public void suspend() throws DebugException { fDelegate.suspend(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ITerminate#canTerminate() */ @Override public boolean canTerminate() { return fDelegate.canTerminate(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ITerminate#isTerminated() */ @Override public boolean isTerminated() { return fDelegate.isTerminated(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ITerminate#terminate() */ @Override public void terminate() throws DebugException { fDelegate.terminate(); } } /* (non-Javadoc) * @see org.eclipse.debug.ui.sourcelookup.ISourceDisplay#displaySource(java.lang.Object, org.eclipse.ui.IWorkbenchPage, boolean) */ @Override public void displaySource(Object element, IWorkbenchPage page, boolean forceSourceLookup) { if (element instanceof ICStackFrame) { ICStackFrame frame = (ICStackFrame)element; if (isDisplayDisassembly(frame, page)) { displayDisassembly(page, frame); } else { DelegatingStackFrame delegatingFrame = new DelegatingStackFrame((ICStackFrame)element); ISourceDisplay sd = Platform.getAdapterManager().getAdapter(delegatingFrame, ISourceDisplay.class); if (sd != null) sd.displaySource(element, page, forceSourceLookup); } } } private boolean isDisplayDisassembly(ICStackFrame frame, IWorkbenchPage page) { // always go to the disassembly window if it is already open IEditorPart editor = getDisassemblyEditorManager().findEditor(page, frame); return (editor != null); } protected DisassemblyEditorManager getDisassemblyEditorManager() { return CDebugUIPlugin.getDefault().getDisassemblyEditorManager(); } private void displayDisassembly(final IWorkbenchPage page, final Object debugContext) { Job uijob = new UIJob("Display Disassembly Job") { //$NON-NLS-1$ /* (non-Javadoc) * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStatus runInUIThread(IProgressMonitor monitor) { try { getDisassemblyEditorManager().openEditor(page, debugContext); } catch(DebugException e) { return e.getStatus(); } return Status.OK_STATUS; } }; uijob.setSystem(true); uijob.schedule(); } }