From 716da17c25417050933d43acf3c3b6bbcdcc2b43 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Wed, 2 Oct 2019 13:01:21 +0300 Subject: [PATCH] IDEA-205986 QuickDoc popup is not restored in the Editor from the Tool Window GitOrigin-RevId: ae2063cb5114326a65576c07992db3c3cd5bed43 --- .../documentation/DocumentationManager.java | 6 ++-- .../ui/src/com/intellij/util/ui/UIUtil.java | 31 +++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java index 68d562eaf44e..0a5423a95384 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java @@ -71,14 +71,14 @@ import com.intellij.util.ArrayUtil; import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.text.DateFormatUtil; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; import javax.swing.*; import java.awt.*; -import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; +import java.awt.event.*; import java.io.File; import java.lang.ref.WeakReference; import java.nio.file.Files; @@ -174,8 +174,8 @@ public final class DocumentationManager extends DockablePopupManager updateComponent(true)); IdeFocusManager.getInstance(myProject).requestFocus(previouslyFocused, true); - updateComponent(true); } } diff --git a/platform/util/ui/src/com/intellij/util/ui/UIUtil.java b/platform/util/ui/src/com/intellij/util/ui/UIUtil.java index eb6d92311678..2291adbbe0fc 100644 --- a/platform/util/ui/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/ui/src/com/intellij/util/ui/UIUtil.java @@ -3815,4 +3815,35 @@ public final class UIUtil extends StartupUiUtil { } editor.scrollToReference(reference); } + + public static void runWhenFocused(@NotNull Component component, @NotNull Runnable runnable) { + assert component.isShowing(); + if (component.isFocusOwner()) { + runnable.run(); + } + else { + Disposable disposable = Disposer.newDisposable(); + FocusListener focusListener = new FocusAdapter() { + @Override + public void focusGained(FocusEvent e) { + Disposer.dispose(disposable); + runnable.run(); + } + }; + HierarchyListener hierarchyListener = new HierarchyListener() { + @Override + public void hierarchyChanged(HierarchyEvent e) { + if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0 && !component.isShowing()) { + Disposer.dispose(disposable); + } + } + }; + component.addFocusListener(focusListener); + component.addHierarchyListener(hierarchyListener); + Disposer.register(disposable, () -> { + component.removeFocusListener(focusListener); + component.removeHierarchyListener(hierarchyListener); + }); + } + } }