package org.eclipse.dltk.javascript.internal.debug.ui; import org.eclipse.dltk.core.IField; import org.eclipse.dltk.dbgp.IDbgpProperty; import org.eclipse.dltk.dbgp.commands.IDbgpPropertyCommands; import org.eclipse.dltk.debug.core.model.IScriptStackFrame; import org.eclipse.dltk.debug.core.model.IScriptValue; import org.eclipse.dltk.debug.ui.ScriptDebugModelPresentation; import org.eclipse.dltk.internal.debug.core.model.ScriptValue; import org.eclipse.dltk.internal.debug.ui.ScriptDebugHover; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; public class JavaScriptDebugHover extends ScriptDebugHover { protected ScriptDebugModelPresentation getModelPresentation() { return new JavaScriptDebugModelPresentation() { @Override protected boolean isShowLabelDetails(IScriptValue value) { return true; } @Override protected String getValueText(IScriptValue value) { String valueText = super.getValueText(value); if (valueText != null && valueText.length() > 400) { valueText = valueText.substring(0, 400) + "..."; } return valueText; } }; } public void setPreferenceStore(IPreferenceStore store) { } protected String getFieldProperty(IField field) { // if (field instanceof FakeField) { // return ((FakeField) field).getSnippet(); // } return super.getFieldProperty(field); } /** * @see String#charAt(int); */ public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { IScriptStackFrame frame = getFrame(); if (frame == null) return null; String txt = textViewer.getDocument().get(); int end = hoverRegion.getOffset(); int maxPos = txt.length(); if (end < maxPos) { while (end < maxPos) { char charAt = txt.charAt(end); if (Character.isJavaIdentifierPart(charAt) || charAt == ']') { end++; continue; } else { break; } } } else end = maxPos; int begin = hoverRegion.getOffset(); int inBracket = 0; if (txt.charAt(end - 1) == ']') inBracket++; while (begin > 0) { char charAt = txt.charAt(begin); if (inBracket > 0) { if (charAt == ']') { inBracket++; } else if (charAt == '[') { inBracket--; } begin--; continue; } if (!Character.isJavaIdentifierPart(charAt)) { if (charAt == ']') { inBracket++; } else if (charAt != '.') break; } begin--; } if (inBracket > 0 || (begin + 1) >= end) return null; String snippet = txt.substring(begin + 1, end); IDbgpPropertyCommands propCmds = frame.getScriptThread() .getDbgpSession().getCoreCommands(); try { IDbgpProperty property = propCmds.getProperty(snippet, frame.getLevel()); return getResultText(snippet, ScriptValue.createValue(frame, property)); } catch (Exception e) { } return null; } }