package krasa.mavenrun.action;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.swing.*;
import krasa.mavenrun.ApplicationComponent;
import krasa.mavenrun.model.ApplicationSettings;
import krasa.mavenrun.model.Goal;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.execution.MavenRunConfiguration;
import org.jetbrains.idea.maven.execution.MavenRunConfigurationType;
import org.jetbrains.idea.maven.model.MavenPlugin;
import org.jetbrains.idea.maven.project.MavenProject;
import org.jetbrains.idea.maven.project.MavenProjectsManager;
import org.jetbrains.idea.maven.project.actions.ReimportProjectAction;
import org.jetbrains.idea.maven.utils.MavenArtifactUtil;
import org.jetbrains.idea.maven.utils.MavenPluginInfo;
import org.jetbrains.idea.maven.utils.actions.MavenActionUtil;
import com.intellij.execution.RunManager;
import com.intellij.execution.RunnerAndConfigurationSettings;
import com.intellij.execution.executors.DefaultRunExecutor;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.util.PathUtil;
import icons.MavenIcons;
@SuppressWarnings("ComponentNotRegistered")
public class MainMavenActionGroup extends ActionGroup implements DumbAware {
static final Logger LOG = Logger.getInstance(MainMavenActionGroup.class);
private Set<String> pluginGoalsSet = new HashSet<String>();
public MainMavenActionGroup() {
}
public MainMavenActionGroup(String shortName, Icon icon) {
super(shortName, true);
getTemplatePresentation().setIcon(icon);
}
@NotNull
@Override
public AnAction[] getChildren(@Nullable AnActionEvent e) {
if (e != null) {
return getActions(e.getDataContext(), e.getProject());
} else {
return new AnAction[0];
}
}
public AnAction[] getActions(DataContext dataContext, Project project) {
List<AnAction> result = new ArrayList<AnAction>();
MavenProject mavenProject = getMavenProject(dataContext);
if (mavenProject != null) {
addTestFile(result);
separator(result);
addRunConfigurations(result, project, mavenProject);
separator(result);
addGoals(result);
separator(result);
List<MavenActionGroup> mavenActionGroups = getPlugins(project, mavenProject);
addPluginAwareActions(result, mavenActionGroups);
separator(result);
addPlugins(result, mavenActionGroups);
separator(result);
addReimport(result);
result.add(getCreateCustomGoalAction());
}
return result.toArray(new AnAction[result.size()]);
}
protected MavenProject getMavenProject(DataContext dataContext) {
return MavenActionUtil.getMavenProject(dataContext);
}
private void addRunConfigurations(List<AnAction> result, Project project, final MavenProject mavenProject) {
final RunnerAndConfigurationSettings[] configurationSettings = RunManager.getInstance(project).getConfigurationSettings(
MavenRunConfigurationType.getInstance());
String directory = PathUtil.getCanonicalPath(mavenProject.getDirectory());
for (RunnerAndConfigurationSettings cfg : configurationSettings) {
MavenRunConfiguration mavenRunConfiguration = (MavenRunConfiguration) cfg.getConfiguration();
if (directory.equals(PathUtil.getCanonicalPath(mavenRunConfiguration.getRunnerParameters().getWorkingDirPath()))) {
result.add(getRunConfigurationAction(project, cfg));
}
}
}
protected RunConfigurationAction getRunConfigurationAction(Project project, RunnerAndConfigurationSettings cfg) {
return new RunConfigurationAction(DefaultRunExecutor.getRunExecutorInstance(), true, project, cfg);
}
private void addReimport(List<AnAction> result) {
final ReimportProjectAction e = new MyReimportProjectAction();
e.getTemplatePresentation().setText("Reimport");
e.getTemplatePresentation().setIcon(AllIcons.Actions.Refresh);
e.getTemplatePresentation().setDescription("Reimport selected Maven projects");
result.add(e);
}
protected CreateCustomGoalAction getCreateCustomGoalAction() {
return new CreateCustomGoalAction("New Goal...");
}
protected void addTestFile(List<AnAction> result) {
result.add(new RunTestFileAction());
}
private void addPlugins(List<AnAction> anActions, List<MavenActionGroup> mavenActionGroups) {
MavenActionGroup plugins = new MavenActionGroup("Plugins", true);
anActions.add(plugins);
for (MavenActionGroup mavenActionGroup : mavenActionGroups) {
plugins.add(mavenActionGroup);
}
}
private void separator(List<AnAction> anActions) {
if (!anActions.isEmpty()) {
AnAction anAction = anActions.get(anActions.size() - 1);
if (!(anAction instanceof Separator)) {
anActions.add(new Separator());
}
}
}
private void addGoals(List<AnAction> anActions) {
for (Goal goal : getState().getGoals().getGoals()) {
anActions.add(createGoalRunAction(goal.getCommandLine(), getRunIcon()));
}
}
private ApplicationSettings getState() {
return ApplicationComponent.getInstance().getState();
}
private void addPluginAwareActions(List<AnAction> anActions, List<MavenActionGroup> mavenActionGroups) {
assert mavenActionGroups != null; // just to be sure that pluginGoalsSet was initialized
for (Goal goal : getState().getPluginAwareGoals().getGoals()) {
if (pluginGoalsSet.contains(goal.getCommandLine())) {
anActions.add(createGoalRunAction(goal.getCommandLine(), getRunIcon()));
}
}
}
private List<MavenActionGroup> getPlugins(Project project, MavenProject mavenProject) {
List<MavenActionGroup> mavenActionGroups = new ArrayList<MavenActionGroup>();
for (MavenPlugin mavenPlugin : mavenProject.getDeclaredPlugins()) {
MavenActionGroup plugin = new MavenActionGroup(mavenPlugin.getArtifactId(), true);
plugin.getTemplatePresentation().setIcon(getIcon());
addPluginGoals(project, mavenPlugin, plugin);
mavenActionGroups.add(plugin);
}
return mavenActionGroups;
}
protected Icon getRunIcon() {
return MavenIcons.Phase;
}
protected Icon getIcon() {
return MavenIcons.PhasesClosed;
}
private void addPluginGoals(Project project, MavenPlugin mavenPlugin, MavenActionGroup pluginGroup) {
MavenPluginInfo pluginInfo = MavenArtifactUtil.readPluginInfo(
MavenProjectsManager.getInstance(project).getLocalRepository(), mavenPlugin.getMavenId());
if (pluginInfo != null) {
for (MavenPluginInfo.Mojo mojo : pluginInfo.getMojos()) {
pluginGoalsSet.add(mojo.getDisplayName());
pluginGroup.add(createGoalRunAction(mojo.getDisplayName(), MavenIcons.PluginGoal));
}
}
}
protected RunGoalAction createGoalRunAction(String basicPhase, final Icon phase) {
return new RunGoalAction(basicPhase, phase);
}
}