From c2737face24a86bd4401acbd2f5acbbe829f393e Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Tue, 17 Sep 2019 12:42:36 +0300 Subject: [PATCH] IDEA-220956 Error tooltip shown on F2 stays longer than it should, and obscures editor contents GitOrigin-RevId: 9fc0f9a54cbac745ec47af99b82841c72a02a0a9 --- .../editor/EditorMouseHoverPopupManager.java | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/editor/EditorMouseHoverPopupManager.java b/platform/lang-impl/src/com/intellij/openapi/editor/EditorMouseHoverPopupManager.java index 1ecf29635fa1..48dd2df7c1fe 100644 --- a/platform/lang-impl/src/com/intellij/openapi/editor/EditorMouseHoverPopupManager.java +++ b/platform/lang-impl/src/com/intellij/openapi/editor/EditorMouseHoverPopupManager.java @@ -8,13 +8,17 @@ import com.intellij.codeInsight.daemon.impl.tooltips.TooltipActionProvider; import com.intellij.codeInsight.documentation.DocumentationComponent; import com.intellij.codeInsight.documentation.DocumentationManager; import com.intellij.codeInsight.documentation.QuickDocUtil; +import com.intellij.codeInsight.hint.HintManagerImpl; import com.intellij.codeInsight.hint.LineTooltipRenderer; import com.intellij.codeInsight.hint.TooltipGroup; import com.intellij.codeInsight.hint.TooltipRenderer; -import com.intellij.ui.WidthBasedLayout; import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.ide.IdeEventQueue; import com.intellij.openapi.Disposable; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.ex.AnActionListener; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.Service; import com.intellij.openapi.components.ServiceManager; @@ -77,7 +81,7 @@ public final class EditorMouseHoverPopupManager implements Disposable { private boolean mySkipNextMovement; public EditorMouseHoverPopupManager() { - myAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, ApplicationManager.getApplication()); + myAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, this); EditorEventMulticaster multicaster = EditorFactory.getInstance().getEventMulticaster(); multicaster.addCaretListener(new CaretListener() { @Override @@ -95,7 +99,7 @@ public final class EditorMouseHoverPopupManager implements Disposable { return; } - cancelCurrentProcessing(); + cancelProcessingAndCloseHint(); }, this); EditorMouseHoverPopupControl.getInstance().addListener(() -> { @@ -109,13 +113,12 @@ public final class EditorMouseHoverPopupManager implements Disposable { } }); - IdeEventQueue.getInstance().addActivityListener(this::onActivity, ApplicationManager.getApplication()); + IdeEventQueue.getInstance().addActivityListener(this::onActivity, this); + ApplicationManager.getApplication().getMessageBus().connect(this).subscribe(AnActionListener.TOPIC, new MyActionListener()); } @Override - public void dispose() { - - } + public void dispose() {} private void handleMouseMoved(@NotNull EditorMouseEvent e) { cancelCurrentProcessing(); @@ -320,6 +323,11 @@ public final class EditorMouseHoverPopupManager implements Disposable { return info == null && elementForQuickDoc == null ? null : new Context(offset, info, elementForQuickDoc); } + private void cancelProcessingAndCloseHint() { + cancelCurrentProcessing(); + closeHint(); + } + private void closeHint() { AbstractPopup hint = getCurrentHint(); if (hint != null) { @@ -356,8 +364,7 @@ public final class EditorMouseHoverPopupManager implements Disposable { int offset, boolean requestFocus, boolean showImmediately) { - cancelCurrentProcessing(); - closeHint(); + cancelProcessingAndCloseHint(); Context context = new Context(offset, info, null) { @Override long getShowingDelay() { @@ -782,4 +789,23 @@ public final class EditorMouseHoverPopupManager implements Disposable { getInstance().cancelCurrentProcessing(); } } + + private static class MyActionListener implements AnActionListener { + @Override + public void beforeActionPerformed(@NotNull AnAction action, @NotNull DataContext dataContext, @NotNull AnActionEvent event) { + if (!Registry.is("editor.new.mouse.hover.popups")) { + return; + } + if (action instanceof HintManagerImpl.ActionToIgnore) return; + getInstance().cancelProcessingAndCloseHint(); + } + + @Override + public void beforeEditorTyping(char c, @NotNull DataContext dataContext) { + if (!Registry.is("editor.new.mouse.hover.popups")) { + return; + } + getInstance().cancelProcessingAndCloseHint(); + } + } }