mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
make AbstractPopups work as ActionPopupMenus from floating toolbars
This commit is contained in:
@@ -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);
|
||||
|
||||
+12
-10
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user