mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user