/** * Copyright (c) 2005-2011 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.ui.hover; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IDebugElement; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IValue; import org.eclipse.debug.core.model.IWatchExpression; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextSelection; import org.python.pydev.core.docutils.PySelection; import org.python.pydev.core.log.Log; import org.python.pydev.debug.ui.actions.EvalExpressionAction; import org.python.pydev.editor.codefolding.PySourceViewer; import org.python.pydev.editor.hover.IPyHoverParticipant; import org.python.pydev.editor.hover.PyHoverPreferencesPage; /** * Gathers hover info during a debug session. * * @author Fabio */ public class PyDebugHover implements IPyHoverParticipant { /** * Gets the value from the debugger for the currently hovered string. */ public String getHoverText(IRegion hoverRegion, PySourceViewer s, PySelection ps, ITextSelection selection) { if (!PyHoverPreferencesPage.getShowValuesWhileDebuggingOnHover()) { return null; } IAdaptable object = DebugUITools.getDebugContext(); IDebugElement context = null; if (object instanceof IDebugElement) { context = (IDebugElement) object; } else if (object instanceof ILaunch) { context = ((ILaunch) object).getDebugTarget(); } if (context != null) { IDebugTarget debugTarget = context.getDebugTarget(); if (debugTarget == null || debugTarget.isTerminated()) { return null; } String act = null; ITextSelection textSelection = (ITextSelection) selection; int mouseOffset = ps.getAbsoluteCursorOffset(); int offset = textSelection.getOffset(); int len = textSelection.getLength(); boolean reportSyntaxErrors = false; if (len > 0 && mouseOffset >= offset && offset + len >= mouseOffset) { try { act = ps.getDoc().get(offset, len); reportSyntaxErrors = true; //the user has text selected } catch (BadLocationException e) { //that's Ok... we were not able to get the actual selection here Log.log(e); } } if (act == null || act.trim().length() == 0) { String[] activationTokenAndQual = ps.getActivationTokenAndQual(true); act = activationTokenAndQual[0] + activationTokenAndQual[1]; } //OK, we're in a debug context... IWatchExpression watchExpression = EvalExpressionAction.createWatchExpression(act); watchExpression.evaluate(); EvalExpressionAction.waitForExpressionEvaluation(watchExpression); IValue value = watchExpression.getValue(); if (value != null) { try { String valueString = value.getValueString(); if (valueString != null) { if (!reportSyntaxErrors) { if (valueString.startsWith("SyntaxError") && valueString.indexOf("<string>") != -1) { //Don't report syntax errors in the hover return null; } } return valueString + "\n"; } } catch (DebugException e) { Log.log(e); } } } return null; } }