From 11a8788cce2bd8018dee54daf605baf45b0413e6 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Tue, 16 Feb 2010 12:39:02 +0300 Subject: [PATCH] update menu items on app activation fix --- .../openapi/actionSystem/impl/ActionMenu.java | 7 ++- .../openapi/actionSystem/impl/ActionMenuItem.java | 9 +++- .../intellij/openapi/actionSystem/impl/Utils.java | 53 ++++++++++++++++++---- 3 files changed, 58 insertions(+), 11 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenu.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenu.java index ea4ea5d4f3..8526d8f6fd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenu.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenu.java @@ -38,7 +38,7 @@ import java.beans.PropertyChangeListener; public final class ActionMenu extends JMenu { private final String myPlace; - private final DataContext myContext; + private DataContext myContext; private final ActionGroup myGroup; private final PresentationFactory myPresentationFactory; private final Presentation myPresentation; @@ -70,6 +70,10 @@ public final class ActionMenu extends JMenu { } } + public void updateContext(DataContext context) { + myContext = context; + } + public void addNotify() { super.addNotify(); installSynchronizer(); @@ -174,6 +178,7 @@ public final class ActionMenu extends JMenu { } } + private class MenuListenerImpl implements MenuListener { public void menuCanceled(MenuEvent e) { clearItems(); diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenuItem.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenuItem.java index 3fe08af26b..75bb24d41b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenuItem.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenuItem.java @@ -47,8 +47,8 @@ public class ActionMenuItem extends JMenuItem { private final AnAction myAction; private final Presentation myPresentation; private final String myPlace; - private final DataContext myContext; - private final AnActionEvent myEvent; + private DataContext myContext; + private AnActionEvent myEvent; private MenuItemSynchronizer myMenuItemSynchronizer; private boolean myEnableMnemonics; @@ -183,6 +183,11 @@ public class ActionMenuItem extends JMenuItem { return KeymapUtil.getFirstKeyboardShortcutText(myAction); } + public void updateContext(DataContext context) { + myContext = context; + myEvent = new AnActionEvent(null, context, myPlace, myPresentation, ActionManager.getInstance(), 0); + } + private final class ActionTransmitter implements ActionListener { /** * @param component component diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java index a9fe2bfea9..0f444fb37a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.actionSystem.impl; +import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ActionUtil; import com.intellij.openapi.application.ApplicationManager; @@ -23,12 +24,15 @@ import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.wm.IdeFocusManager; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import javax.swing.*; +import java.awt.*; import java.util.ArrayList; /** @@ -198,13 +202,16 @@ public class Utils{ } - public static void fillMenu(@NotNull ActionGroup group,JComponent component, boolean enableMnemonics, PresentationFactory presentationFactory, DataContext context, String place, boolean isWindowMenu){ + public static void fillMenu(@NotNull final ActionGroup group, + final JComponent component, boolean enableMnemonics, final PresentationFactory presentationFactory, DataContext context, final String place, boolean isWindowMenu){ + final ActionCallback menuBuilt = new ActionCallback(); + ArrayList list = new ArrayList(); expandActionGroup(group, list, presentationFactory, context, place, ActionManager.getInstance()); final boolean fixMacScreenMenu = SystemInfo.isMacSystemMenu && isWindowMenu && Registry.is("actionSystem.mac.screenMenuNotUpdatedFix"); - final ArrayList menuItems = new ArrayList(); + final ArrayList children = new ArrayList(); for (int i = 0; i < list.size(); i++) { AnAction action = list.get(i); @@ -214,13 +221,15 @@ public class Utils{ } } else if (action instanceof ActionGroup) { - component.add(new ActionMenu(context, place, (ActionGroup)action, presentationFactory, enableMnemonics)); + ActionMenu menu = new ActionMenu(context, place, (ActionGroup)action, presentationFactory, enableMnemonics); + component.add(menu); + children.add(menu); } else { final ActionMenuItem each = new ActionMenuItem(action, presentationFactory.getPresentation(action), place, context, enableMnemonics, !fixMacScreenMenu); component.add(each); - menuItems.add(each); + children.add(each); } } @@ -229,19 +238,47 @@ public class Utils{ new ActionMenuItem(EMPTY_MENU_FILLER, presentationFactory.getPresentation(EMPTY_MENU_FILLER), place, context, enableMnemonics, !fixMacScreenMenu); component.add(each); - menuItems.add(each); + children.add(each); } if (fixMacScreenMenu) { SwingUtilities.invokeLater(new Runnable() { public void run() { - for (ActionMenuItem each : menuItems) { - if (each.getParent() != null) { - each.prepare(); + for (Component each : children) { + if (each.getParent() != null && each instanceof ActionMenuItem) { + ((ActionMenuItem)each).prepare(); } } + menuBuilt.setDone(); } }); + } else { + menuBuilt.setDone(); } + + + menuBuilt.doWhenDone(new Runnable() { + public void run() { + if (IdeFocusManager.getInstance(null).isFocusBeingTransferred()) { + IdeFocusManager.getInstance(null).doWhenFocusSettlesDown(new Runnable() { + public void run() { + if (!component.isShowing()) return; + + DataContext context = DataManager.getInstance().getDataContext(); + expandActionGroup(group, new ArrayList(), presentationFactory, context, place, ActionManager.getInstance()); + + for (Component each : children) { + if (each instanceof ActionMenuItem) { + ((ActionMenuItem)each).updateContext(context); + } else if (each instanceof ActionMenu) { + ((ActionMenu)each).updateContext(context); + } + } + } + }); + } + } + }); + } } -- 2.11.4.GIT