diff options
Diffstat (limited to 'platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesViewBase.java')
-rw-r--r-- | platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesViewBase.java | 119 |
1 files changed, 52 insertions, 67 deletions
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesViewBase.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesViewBase.java index d4bd27c30d9b..4bfcfa58855f 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesViewBase.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesViewBase.java @@ -15,34 +15,34 @@ */ package com.intellij.xdebugger.impl.frame; -import com.intellij.codeInsight.hint.HintManager; -import com.intellij.codeInsight.hint.HintUtil; import com.intellij.ide.dnd.DnDManager; -import com.intellij.openapi.Disposable; +import com.intellij.openapi.application.AccessToken; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.event.SelectionEvent; import com.intellij.openapi.editor.event.SelectionListener; +import com.intellij.openapi.editor.impl.SelectionModelImpl; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.ui.SimpleColoredComponent; -import com.intellij.ui.SimpleColoredText; +import com.intellij.xdebugger.XDebugSession; import com.intellij.xdebugger.XDebuggerBundle; import com.intellij.xdebugger.XSourcePosition; +import com.intellij.xdebugger.evaluation.ExpressionInfo; import com.intellij.xdebugger.evaluation.XDebuggerEditorsProvider; import com.intellij.xdebugger.evaluation.XDebuggerEvaluator; -import com.intellij.xdebugger.frame.XFullValueEvaluator; import com.intellij.xdebugger.frame.XStackFrame; import com.intellij.xdebugger.frame.XValue; -import com.intellij.xdebugger.frame.XValuePlace; -import com.intellij.xdebugger.frame.presentation.XValuePresentation; import com.intellij.xdebugger.impl.actions.XDebuggerActions; +import com.intellij.xdebugger.impl.evaluate.quick.XValueHint; +import com.intellij.xdebugger.impl.evaluate.quick.common.ValueHintType; import com.intellij.xdebugger.impl.ui.tree.XDebuggerTree; import com.intellij.xdebugger.impl.ui.tree.XDebuggerTreePanel; import com.intellij.xdebugger.impl.ui.tree.XDebuggerTreeRestorer; @@ -50,11 +50,11 @@ import com.intellij.xdebugger.impl.ui.tree.XDebuggerTreeState; import com.intellij.xdebugger.impl.ui.tree.nodes.XEvaluationCallbackBase; import com.intellij.xdebugger.impl.ui.tree.nodes.XStackFrameNode; import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl; -import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodePresentationConfigurator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.awt.*; import java.util.HashMap; import java.util.Set; @@ -88,68 +88,53 @@ public abstract class XVariablesViewBase extends XDebugView { myTreeRestorer = myTreeState.restoreState(tree); } if (position != null && Registry.is("ide.debugger.inline")) { - final VirtualFile file = position.getFile(); - final FileEditor fileEditor = FileEditorManagerEx.getInstanceEx(project).getSelectedEditor(file); - if (fileEditor instanceof PsiAwareTextEditorImpl) { - final Editor editor = ((PsiAwareTextEditorImpl)fileEditor).getEditor(); - final SelectionListener listener = new SelectionListener() { - @Override - public void selectionChanged(SelectionEvent e) { - final String text = editor.getDocument().getText(e.getNewRange()); - final XDebuggerEvaluator evaluator = stackFrame.getEvaluator(); - if (evaluator != null && !StringUtil.isEmpty(text) - && !(text.contains("exec(") || text.contains("++") || text.contains("--") || text.contains("="))) { - evaluator.evaluate(text, new XEvaluationCallbackBase() { - @Override - public void evaluated(@NotNull XValue result) { - result.computePresentation(new XValueNodePresentationConfigurator.ConfigurableXValueNodeImpl() { - @Override - public void applyPresentation(@Nullable Icon icon, - @NotNull XValuePresentation valuePresenter, - boolean hasChildren) { - SimpleColoredText text = new SimpleColoredText(); - XValueNodeImpl.buildText(valuePresenter, text, false); - SimpleColoredComponent component = HintUtil.createInformationComponent(); - text.appendToComponent(component); - String str = text.toString(); - if ("undefined".equals(str) || str.startsWith("Cannot find local variable") - || str.startsWith("Invalid expression")) { - return; //todo[kb] this is temporary solution - } - HintManager.getInstance().hideAllHints(); - HintManager.getInstance().showInformationHint(editor, component); - } + registerInlineEvaluator(stackFrame, tree, position, project); + } + } - @Override - public void setFullValueEvaluator(@NotNull XFullValueEvaluator fullValueEvaluator) { - } + private void registerInlineEvaluator(final XStackFrame stackFrame, + XDebuggerTree tree, + final XSourcePosition position, + final Project project) { + final VirtualFile file = position.getFile(); + final FileEditor fileEditor = FileEditorManagerEx.getInstanceEx(project).getSelectedEditor(file); + if (fileEditor instanceof PsiAwareTextEditorImpl) { + final Editor editor = ((PsiAwareTextEditorImpl)fileEditor).getEditor(); + final SelectionListener listener = new SelectionListener() { + @Override + public void selectionChanged(final SelectionEvent e) { + final String text = editor.getDocument().getText(e.getNewRange()); + final XDebuggerEvaluator evaluator = stackFrame.getEvaluator(); + if (evaluator != null && !StringUtil.isEmpty(text) + && !(text.contains("exec(") || text.contains("++") || text.contains("--") || text.contains("="))) { + evaluator.evaluate(text, new XEvaluationCallbackBase() { + @Override + public void evaluated(@NotNull XValue result) { + final AccessToken token = ApplicationManager.getApplication().acquireReadActionLock(); + try { + final XDebugSession session = getSession(getTree()); + if (session == null) return; + final TextRange range = e.getNewRange(); + final ExpressionInfo info = new ExpressionInfo(range); + final int offset = range.getStartOffset(); + final LogicalPosition pos = editor.offsetToLogicalPosition(offset); + final Point point = editor.logicalPositionToXY(pos); - @Override - public boolean isObsolete() { - return true; - } - }, XValuePlace.TOOLTIP); + new XValueHint(project, editor, point, ValueHintType.MOUSE_OVER_HINT, info, evaluator, session).invokeHint(); } - - @Override - public void errorOccurred(@NotNull String errorMessage) { - System.out.println(errorMessage); + finally { + token.finish(); } - }, position); - } - } - }; - editor.getSelectionModel().addSelectionListener(listener); - Disposer.register(tree, new Disposable() { - @Override - public void dispose() { - final FileEditor fileEditor = FileEditorManagerEx.getInstanceEx(project).getSelectedEditor(file); - if (fileEditor instanceof PsiAwareTextEditorImpl) { - ((PsiAwareTextEditorImpl)fileEditor).getEditor().getSelectionModel().removeSelectionListener(listener); - } + } + + @Override + public void errorOccurred(@NotNull String errorMessage) { + } + }, position); } - }); - } + } + }; + ((SelectionModelImpl)editor.getSelectionModel()).addSelectionListener(listener, tree); } } |