diff options
Diffstat (limited to 'platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick')
4 files changed, 68 insertions, 5 deletions
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java index ca78932701d2..37b641e1042e 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,15 +20,23 @@ import com.intellij.execution.console.LanguageConsoleImpl; import com.intellij.execution.console.LanguageConsoleView; import com.intellij.execution.impl.ConsoleViewImpl; import com.intellij.execution.ui.ConsoleView; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.ShortcutSet; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.keymap.KeymapUtil; +import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vcs.changes.issueLinks.LinkMouseListenerBase; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.SimpleColoredText; +import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.Consumer; import com.intellij.xdebugger.XDebugSession; import com.intellij.xdebugger.XDebuggerUtil; @@ -68,6 +76,8 @@ public class XValueHint extends AbstractValueHint { private final String myExpression; private final String myValueName; private final @Nullable XSourcePosition myExpressionPosition; + private final ExpressionInfo myExpressionInfo; + private Disposable myDisposable; public XValueHint(@NotNull Project project, @NotNull Editor editor, @NotNull Point point, @NotNull ValueHintType type, @NotNull ExpressionInfo expressionInfo, @NotNull XDebuggerEvaluator evaluator, @@ -78,6 +88,7 @@ public class XValueHint extends AbstractValueHint { myDebugSession = session; myExpression = XDebuggerEvaluateActionHandler.getExpressionText(expressionInfo, editor.getDocument()); myValueName = XDebuggerEvaluateActionHandler.getDisplayText(expressionInfo, editor.getDocument()); + myExpressionInfo = expressionInfo; VirtualFile file; ConsoleView consoleView = ConsoleViewImpl.CONSOLE_VIEW_IN_EDITOR_VIEW.get(editor); @@ -98,6 +109,33 @@ public class XValueHint extends AbstractValueHint { } @Override + protected boolean showHint(final JComponent component) { + boolean result = super.showHint(component); + if (result && getType() == ValueHintType.MOUSE_OVER_HINT) { + myDisposable = Disposer.newDisposable(); + ShortcutSet shortcut = ActionManager.getInstance().getAction("ShowErrorDescription").getShortcutSet(); + new DumbAwareAction() { + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + hideHint(); + final Point point = new Point(myPoint.x, myPoint.y + getEditor().getLineHeight()); + new XValueHint(getProject(), getEditor(), point, ValueHintType.MOUSE_CLICK_HINT, myExpressionInfo, myEvaluator, myDebugSession).invokeHint(); + } + }.registerCustomShortcutSet(shortcut, getEditor().getContentComponent(), myDisposable); + } + return result; + } + + @Override + public void hideHint() { + super.hideHint(); + if (myDisposable != null) { + Disposer.dispose(myDisposable); + + } + } + + @Override protected void evaluateAndShowHint() { myEvaluator.evaluate(myExpression, new XEvaluationCallbackBase() { @Override @@ -136,6 +174,11 @@ public class XValueHint extends AbstractValueHint { showTree(result); } else { + if (getType() == ValueHintType.MOUSE_OVER_HINT) { + text.insert(0, "(" + KeymapUtil.getFirstKeyboardShortcutText("ShowErrorDescription") + ") ", + SimpleTextAttributes.GRAYED_ATTRIBUTES); + } + JComponent component = createExpandableHintComponent(text, new Runnable() { @Override public void run() { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/AbstractValueHint.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/AbstractValueHint.java index 7b860b49d255..c24ce74df1c6 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/AbstractValueHint.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/AbstractValueHint.java @@ -65,7 +65,7 @@ public abstract class AbstractValueHint { private final Project myProject; private final Editor myEditor; private final ValueHintType myType; - private final Point myPoint; + protected final Point myPoint; private LightweightHint myCurrentHint; private boolean myHintHidden; private TextRange myCurrentRange; @@ -132,6 +132,10 @@ public abstract class AbstractValueHint { } } + public void invokeHint() { + invokeHint(null); + } + public void invokeHint(Runnable hideRunnable) { myHideRunnable = hideRunnable; diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java index c7c5af9f6fb4..2851c701ef70 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -170,7 +170,7 @@ abstract class DebuggerTreeWithHistoryContainer<D> { } @Override - public void onFailure(Throwable t) { + public void onFailure(@NotNull Throwable t) { LOG.debug(t); } }); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java index e4ea46b69ea9..97edec9133ba 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java @@ -20,6 +20,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Disposer; import com.intellij.ui.ScreenUtil; import com.intellij.ui.awt.RelativePoint; @@ -64,7 +65,7 @@ class DebuggerTreeWithHistoryPopup<D> extends DebuggerTreeWithHistoryContainer<D } @Override - protected void updateContainer(Tree tree, String title) { + protected void updateContainer(final Tree tree, String title) { if (myPopup != null) { myPopup.cancel(); } @@ -75,6 +76,21 @@ class DebuggerTreeWithHistoryPopup<D> extends DebuggerTreeWithHistoryContainer<D .setResizable(true) .setMovable(true) .setDimensionServiceKey(myProject, DIMENSION_SERVICE_KEY, false) + .setMayBeParent(true) + .setCancelCallback(new Computable<Boolean>() { + @Override + public Boolean compute() { + Window parent = SwingUtilities.getWindowAncestor(tree); + if (parent != null) { + for (Window child : parent.getOwnedWindows()) { + if (child.isShowing()) { + return false; + } + } + } + return true; + } + }) .createPopup(); if (tree instanceof Disposable) { |