// Copyright 2016 Pants project contributors (see CONTRIBUTORS.md).
// Licensed under the Apache License, Version 2.0 (see LICENSE).
package com.twitter.intellij.pants.ui;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.twitter.intellij.pants.util.PantsUtil;
import icons.PantsIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.TestOnly;
import javax.swing.Icon;
/**
* PantsOverrideAction is a wrapper action that toggles active actions on Pants or non-Pants projects
*/
public class PantsOverrideAction extends AnAction implements DumbAware {
private AnAction secondaryIdeaAction;
private AnAction primaryPantsAction;
private Icon secondaryIdeaIcon;
@TestOnly
private boolean pantsActive;
public PantsOverrideAction(String actionId, @NotNull AnAction pantsAction) {
this(pantsAction, getAction(actionId));
}
public PantsOverrideAction(String actionId, String oldName, @NotNull AnAction pantsAction, Icon icon) {
this(actionId, oldName, pantsAction);
secondaryIdeaIcon = icon;
}
public PantsOverrideAction(String actionId, String oldName, @NotNull AnAction pantsAction) {
super(oldName);
primaryPantsAction = pantsAction;
secondaryIdeaAction = getAction(actionId);
}
public PantsOverrideAction(AnAction pantsPrimary, AnAction ideaSecondary) {
primaryPantsAction = pantsPrimary;
secondaryIdeaAction = ideaSecondary;
}
public static PantsOverrideAction createDisabledEmptyAction(String actionId) {
return new PantsOverrideAction(actionId, new ShieldAction(getAction(actionId)));
}
private boolean isPantsProject(AnActionEvent event) {
if (event == null) {
return false;
}
Project project = event.getProject();
pantsActive = project != null && PantsUtil.isPantsProject(project);
return pantsActive;
}
@Override
public void update(AnActionEvent event) {
if (secondaryIdeaAction != null) {
secondaryIdeaAction.update(event);
if (secondaryIdeaIcon != null) {
event.getPresentation().setIcon(secondaryIdeaIcon);
}
}
if (isPantsProject(event)) {
event.getPresentation().setIcon(PantsIcons.Icon);
primaryPantsAction.update(event);
}
}
@Override
public void actionPerformed(AnActionEvent event) {
if (isPantsProject(event)) {
primaryPantsAction.actionPerformed(event);
}
else if (secondaryIdeaAction != null) {
secondaryIdeaAction.actionPerformed(event);
}
}
private static AnAction getAction(@NotNull String actionId) {
return ActionManager.getInstance().getAction(actionId);
}
@Override
@TestOnly
public String toString() {
String activeOverride = pantsActive ? " actively" : "";
return
primaryPantsAction.getClass().getSimpleName() + activeOverride + " overriding " +
(secondaryIdeaAction == null ? "NullAction" : secondaryIdeaAction.getClass().getSimpleName());
}
}