make AbstractPopups work as ActionPopupMenus from floating toolbars

This commit is contained in:
Gregory.Shrago
2018-04-24 00:09:25 +03:00
parent cf8e224904
commit fe379917ed
2 changed files with 27 additions and 10 deletions
@@ -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);
@@ -116,7 +116,7 @@ public final class ActionManagerImpl extends ActionManagerEx implements Disposab
private final List<ActionPopupMenuListener> myActionPopupMenuListeners = ContainerUtil.createLockFreeCopyOnWriteList();
private final KeymapManagerEx myKeymapManager;
private final DataManager myDataManager;
private final List<ActionPopupMenuImpl> myPopups = new ArrayList<>();
private final List<Object> myPopups = new ArrayList<>();
private final Map<AnAction, DataContext> myQueuedNotifications = new LinkedHashMap<>();
private final Map<AnAction, AnActionEvent> 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;
}
}