From fe379917ed0cc596afe69fb021de9a3cb50a6dde Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Tue, 24 Apr 2018 00:06:55 +0300 Subject: [PATCH] make AbstractPopups work as ActionPopupMenus from floating toolbars --- .../actionSystem/impl/ActionButton.java | 15 +++++++++++++ .../actionSystem/impl/ActionManagerImpl.java | 22 ++++++++++--------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java index 10494acc30e6..c5860793601b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java @@ -13,6 +13,10 @@ import com.intellij.openapi.actionSystem.ex.CustomComponentAction; import com.intellij.openapi.application.impl.LaterInvocator; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.keymap.KeymapUtil; +import com.intellij.openapi.ui.popup.JBPopup; +import com.intellij.openapi.ui.popup.JBPopupAdapter; +import com.intellij.openapi.ui.popup.LightweightWindowEvent; +import com.intellij.openapi.ui.popup.StackingPopupDispatcher; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; @@ -137,7 +141,18 @@ public class ActionButton extends JComponent implements ActionButtonComponent, A if (component != null && !component.isShowing()) { return; } + JBPopup prevLast = StackingPopupDispatcher.getInstance().getPopupStream().reduce((a, b) -> b).orElse(null); actionPerformed(event); + JBPopup curLast = StackingPopupDispatcher.getInstance().getPopupStream().reduce((a, b) -> b).orElse(null); + if (curLast != null && curLast != prevLast) { + ((ActionManagerImpl)manager).addActionPopup(curLast); + curLast.addListener(new JBPopupAdapter() { + @Override + public void onClosed(LightweightWindowEvent event) { + ((ActionManagerImpl)manager).removeActionPopup(curLast); + } + }); + } manager.queueActionPerformedEvent(myAction, dataContext, event); if (event.getInputEvent() instanceof MouseEvent) { ToolbarClicksCollector.record(myAction, myPlace); diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java index 6266029abb2f..95f772fde587 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java @@ -116,7 +116,7 @@ public final class ActionManagerImpl extends ActionManagerEx implements Disposab private final List myActionPopupMenuListeners = ContainerUtil.createLockFreeCopyOnWriteList(); private final KeymapManagerEx myKeymapManager; private final DataManager myDataManager; - private final List myPopups = new ArrayList<>(); + private final List myPopups = new ArrayList<>(); private final Map myQueuedNotifications = new LinkedHashMap<>(); private final Map myQueuedNotificationsEvents = new LinkedHashMap<>(); private MyTimer myTimer; @@ -1069,20 +1069,20 @@ public final class ActionManagerImpl extends ActionManagerEx implements Disposab return ArrayUtilRt.toStringArray(myPlugin2Id.get(pluginName)); } - public void addActionPopup(final ActionPopupMenuImpl menu) { + public void addActionPopup(final Object menu) { boolean added = myPopups.add(menu); - if (added) { + if (added && menu instanceof ActionPopupMenu) { for (ActionPopupMenuListener listener : myActionPopupMenuListeners) { - listener.actionPopupMenuCreated(menu); + listener.actionPopupMenuCreated((ActionPopupMenu)menu); } } } - public void removeActionPopup(final ActionPopupMenuImpl menu) { + public void removeActionPopup(final Object menu) { final boolean removed = myPopups.remove(menu); - if (removed) { + if (removed && menu instanceof ActionPopupMenu) { for (ActionPopupMenuListener listener : myActionPopupMenuListeners) { - listener.actionPopupMenuReleased(menu); + listener.actionPopupMenuReleased((ActionPopupMenu)menu); } } if (removed && myPopups.isEmpty()) { @@ -1094,14 +1094,16 @@ public final class ActionManagerImpl extends ActionManagerEx implements Disposab public void queueActionPerformedEvent(final AnAction action, DataContext context, AnActionEvent event) { if (!myPopups.isEmpty()) { myQueuedNotifications.put(action, context); - } else { + } + else { fireAfterActionPerformed(action, context, event); } } public boolean isToolWindowContextMenuVisible() { - for (ActionPopupMenuImpl popup : myPopups) { - if (popup.isToolWindowContextMenu()) { + for (Object popup : myPopups) { + if (popup instanceof ActionPopupMenuImpl && + ((ActionPopupMenuImpl)popup).isToolWindowContextMenu()) { return true; } }