From 8fbbe7abf6f3f3cf2d07df77f3d00a68df9a6abe Mon Sep 17 00:00:00 2001 From: Artem Bochkarev Date: Fri, 20 Apr 2018 17:50:38 +0700 Subject: [PATCH] IDEA-163208: fixes for AnAction-based buttons TBItemAnActionButton: store component (to obtain corresponend DataContext), move update inside TouchBarActionBase: fixes for TimerListener --- .../ui/mac/touchbar/TBItemAnActionButton.java | 54 ++++++++++++---- .../ui/mac/touchbar/TouchBarActionBase.java | 63 ++++++++----------- 2 files changed, 68 insertions(+), 49 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/mac/touchbar/TBItemAnActionButton.java b/platform/platform-impl/src/com/intellij/ui/mac/touchbar/TBItemAnActionButton.java index 2731e5e57b4a..f1e3078beca1 100644 --- a/platform/platform-impl/src/com/intellij/ui/mac/touchbar/TBItemAnActionButton.java +++ b/platform/platform-impl/src/com/intellij/ui/mac/touchbar/TBItemAnActionButton.java @@ -1,12 +1,11 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ui.mac.touchbar; -import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.ActionPlaces; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.ide.DataManager; +import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ActionManagerEx; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.IconLoader; import com.intellij.util.ui.EmptyIcon; @@ -33,11 +32,19 @@ public class TBItemAnActionButton extends TBItemButton { private final boolean myHiddenWhenDisabled; private final int myShowMode; - TBItemAnActionButton(@NotNull String uid, @NotNull AnAction action, boolean hiddenWhenDisabled, int showMode) { + private final Component myComponent; + + TBItemAnActionButton(@NotNull String uid, @NotNull AnAction action, boolean hiddenWhenDisabled, int showMode, Component component, ModalityState modality) { super(uid); myAnAction = action; myActionId = ActionManager.getInstance().getId(myAnAction); - myAction = () -> ApplicationManager.getApplication().invokeLater(() -> _performAction()); + myComponent = component; + myAction = () -> { + if (modality != null) + ApplicationManager.getApplication().invokeLater(() -> _performAction(), modality); + else + ApplicationManager.getApplication().invokeLater(() -> _performAction()); + }; myAutoVisibility = true; myHiddenWhenDisabled = hiddenWhenDisabled; @@ -45,8 +52,25 @@ public class TBItemAnActionButton extends TBItemButton { myShowMode = showMode; } + TBItemAnActionButton(@NotNull String uid, @NotNull AnAction action, boolean hiddenWhenDisabled, int showMode) { + this(uid, action, hiddenWhenDisabled, showMode, null, null); + } + TBItemAnActionButton(@NotNull String uid, @NotNull AnAction action, boolean hiddenWhenDisabled) { - this(uid, action, hiddenWhenDisabled, SHOWMODE_IMAGE_ONLY); + this(uid, action, hiddenWhenDisabled, SHOWMODE_IMAGE_ONLY, null, null); + } + + void updateAnAction(Presentation presentation) { + final DataContext dctx = DataManager.getInstance().getDataContext(_getComponent()); + final AnActionEvent e = new AnActionEvent( + null, + dctx, + ActionPlaces.TOUCHBAR_GENERAL, + presentation, + ActionManagerEx.getInstanceEx(), + 0 + ); + myAnAction.update(e); } boolean isAutoVisibility() { return myAutoVisibility; } @@ -100,15 +124,21 @@ public class TBItemAnActionButton extends TBItemButton { private void _performAction() { final ActionManagerEx actionManagerEx = ActionManagerEx.getInstanceEx(); + final Component src = _getComponent(); + final InputEvent ie = new KeyEvent(src, COMPONENT_FIRST, System.currentTimeMillis(), 0, 0, '\0'); + actionManagerEx.tryToExecute(myAnAction, ie, src, ActionPlaces.TOUCHBAR_GENERAL, true); + } + + private Component _getComponent() { return myComponent != null ? myComponent : _getCurrentFocusComponent(); } + + private static Component _getCurrentFocusComponent() { final KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); Component focusOwner = focusManager.getFocusOwner(); if (focusOwner == null) { - // LOG.info(String.format("WARNING: [%s:%s] _performAction: null focus-owner, use focused window", myUid, myActionId)); - focusOwner = focusManager.getFocusedWindow(); + // LOG.info(String.format("WARNING: [%s:%s] _getCurrentFocusContext: null focus-owner, use focused window", myUid, myActionId)); + return focusManager.getFocusedWindow(); } - - final InputEvent ie = new KeyEvent(focusOwner, COMPONENT_FIRST, System.currentTimeMillis(), 0, 0, '\0'); - actionManagerEx.tryToExecute(myAnAction, ie, focusOwner, ActionPlaces.TOUCHBAR_GENERAL, true); + return focusOwner; } private static String _printPresentation(Presentation presentation) { diff --git a/platform/platform-impl/src/com/intellij/ui/mac/touchbar/TouchBarActionBase.java b/platform/platform-impl/src/com/intellij/ui/mac/touchbar/TouchBarActionBase.java index fcee8478479f..f3babbaaac23 100644 --- a/platform/platform-impl/src/com/intellij/ui/mac/touchbar/TouchBarActionBase.java +++ b/platform/platform-impl/src/com/intellij/ui/mac/touchbar/TouchBarActionBase.java @@ -5,9 +5,10 @@ import com.intellij.execution.ExecutionListener; import com.intellij.execution.ExecutionManager; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.runners.ExecutionEnvironment; -import com.intellij.ide.impl.DataManagerImpl; -import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.actionSystem.ex.ActionManagerEx; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.actionSystem.TimerListener; import com.intellij.openapi.actionSystem.impl.PresentationFactory; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; @@ -18,33 +19,35 @@ import org.jetbrains.annotations.NotNull; import java.awt.*; -import static com.intellij.openapi.application.ModalityState.NON_MODAL; - public class TouchBarActionBase extends TouchBarProjectBase implements ExecutionListener { private static final Logger LOG = Logger.getInstance(TouchBarActionBase.class); private final PresentationFactory myPresentationFactory = new PresentationFactory(); + private final TimerListener myTimerListener; - TouchBarActionBase(@NotNull String touchbarName, @NotNull Project project) { + public TouchBarActionBase(@NotNull String touchbarName, @NotNull Project project) { super(touchbarName, project); - ActionManager.getInstance().addTimerListener(500, new TimerListener() { + myTimerListener = new TimerListener() { @Override - public ModalityState getModalityState() { - return NON_MODAL; - } + public ModalityState getModalityState() { return ModalityState.current(); } @Override - public void run() { - _updateActionItems(); - } - }); + public void run() { _updateActionItems(); } + }; + ActionManager.getInstance().addTimerListener(500, myTimerListener); final MessageBus mb = project.getMessageBus(); mb.connect().subscribe(ExecutionManager.EXECUTION_TOPIC, this); } + @Override + public void release() { + super.release(); + ActionManager.getInstance().removeTimerListener(myTimerListener); + } + TBItemAnActionButton addAnActionButton(String actId) { - return addAnActionButton(ActionManager.getInstance().getAction(actId), true, TBItemAnActionButton.SHOWMODE_IMAGE_ONLY); + return addAnActionButton(ActionManager.getInstance().getAction(actId), true, TBItemAnActionButton.SHOWMODE_IMAGE_ONLY, null, null); } TBItemAnActionButton addAnActionButton(String actId, boolean hiddenWhenDisabled) { @@ -53,17 +56,21 @@ public class TouchBarActionBase extends TouchBarProjectBase implements Execution LOG.error("can't find action by id: " + actId); return null; } - return addAnActionButton(act, hiddenWhenDisabled, TBItemAnActionButton.SHOWMODE_IMAGE_ONLY); + return addAnActionButton(act, hiddenWhenDisabled, TBItemAnActionButton.SHOWMODE_IMAGE_ONLY, null, null); } TBItemAnActionButton addAnActionButton(AnAction act, boolean hiddenWhenDisabled, int showMode) { + return addAnActionButton(act, hiddenWhenDisabled, showMode, null, null); + } + + TBItemAnActionButton addAnActionButton(AnAction act, boolean hiddenWhenDisabled, int showMode, Component component, ModalityState modality) { if (act == null) { LOG.error("can't create action-button with null action"); return null; } final String uid = String.format("%s.anActionButton.%d", myName, myCounter++); - final TBItemAnActionButton butt = new TBItemAnActionButton(uid, act, hiddenWhenDisabled, showMode); + final TBItemAnActionButton butt = new TBItemAnActionButton(uid, act, hiddenWhenDisabled, showMode, component, modality); myItems.add(butt); return butt; } @@ -88,26 +95,8 @@ public class TouchBarActionBase extends TouchBarProjectBase implements Execution continue; final TBItemAnActionButton item = (TBItemAnActionButton)tbitem; - final AnAction act = item.getAnAction(); - final Presentation presentation = myPresentationFactory.getPresentation(act); - final KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); - - Component focusOwner = focusManager.getFocusOwner(); - if (focusOwner == null) { - // LOG.info(String.format("WARNING: [%s:%s] _updateActionItems: null focus-owner, use focused window", myName, item.myUid)); - focusOwner = focusManager.getFocusedWindow(); - } - final DataContext ctx = DataManagerImpl.getInstance().getDataContext(focusOwner); - - final AnActionEvent e = new AnActionEvent( - null, - ctx, - ActionPlaces.TOUCHBAR_GENERAL, - presentation, - ActionManagerEx.getInstanceEx(), - 0 - ); - act.update(e); + final Presentation presentation = myPresentationFactory.getPresentation(item.getAnAction()); + item.updateAnAction(presentation); if (item.isAutoVisibility()) { final boolean itemVisibilityChanged = item.updateVisibility(presentation);