IDEA-163208: fixes for AnAction-based buttons

TBItemAnActionButton: store component (to obtain corresponend DataContext), move update inside
TouchBarActionBase: fixes for TimerListener
This commit is contained in:
Artem Bochkarev
2018-04-20 19:49:37 +07:00
parent 484f36525c
commit 8fbbe7abf6
2 changed files with 68 additions and 49 deletions
@@ -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) {
@@ -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);