/** * Copyright (c) 2005-2012 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.debug.newconsole; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.contexts.DebugContextEvent; import org.eclipse.debug.ui.contexts.IDebugContextListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPartSite; import org.python.pydev.debug.model.PyStackFrame; import org.python.pydev.shared_ui.utils.UIUtils; /** * @author Fabio */ public class AnyPyStackFrameSelected implements IPyStackFrameProvider, IDebugContextListener { /** * By default, debug console will be linked with the selected frame */ protected boolean isLinkedWithDebug = true; private PyStackFrame last; public AnyPyStackFrameSelected() { IWorkbenchPart activePart = UIUtils.getActivePart(); if (activePart != null) { IWorkbenchPartSite site = activePart.getSite(); DebugUITools.addPartDebugContextListener(site, this); } } /** * @return the currently selected / suspended frame. If the console is passed, it will only return * a frame that matches the passed console. If no selected / suspended frame is found or the console * doesn't match, null is returned. */ @Override public PyStackFrame getLastSelectedFrame() { updateContext(DebugUITools.getDebugContext()); if (last instanceof PyStackFrame) { PyStackFrame stackFrame = last; if (!stackFrame.isTerminated() && stackFrame.isSuspended()) { // I.e.: can only deal with suspended contexts! return last; } } return null; } private void updateContext(IAdaptable context) { if (!isLinkedWithDebug && last != null) { return; } if (context != last && context instanceof PyStackFrame) { PyStackFrame stackFrame = (PyStackFrame) context; if (!stackFrame.isTerminated() && stackFrame.isSuspended()) { if (acceptsSelection(stackFrame)) { last = stackFrame; } } } } //Subclasses may override protected boolean acceptsSelection(PyStackFrame stackFrame) { return true; } @Override public void debugContextChanged(DebugContextEvent event) { if (event.getFlags() == DebugContextEvent.ACTIVATED) { updateContext(getDebugContextElementForSelection(event.getContext())); } } private static IAdaptable getDebugContextElementForSelection(ISelection activeContext) { if (activeContext instanceof IStructuredSelection) { IStructuredSelection selection = (IStructuredSelection) activeContext; if (!selection.isEmpty()) { Object firstElement = selection.getFirstElement(); if (firstElement instanceof IAdaptable) { return (IAdaptable) firstElement; } } } return null; } /** * Enable/Disable linking of the debug console with the suspended frame. * * @param isLinkedWithDebug */ @Override public void linkWithDebugSelection(boolean isLinkedWithDebug) { this.isLinkedWithDebug = isLinkedWithDebug; } }