package krasa.mavenrun;
import com.intellij.notification.NotificationDisplayType;
import com.intellij.notification.NotificationGroup;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.PluginId;
import icons.MavenIcons;
import krasa.mavenrun.action.MainMavenActionGroup;
import krasa.mavenrun.action.RunGoalAction;
import krasa.mavenrun.action.RunTestFileAction;
import krasa.mavenrun.action.debug.Debug;
import krasa.mavenrun.action.debug.DebugGoalAction;
import krasa.mavenrun.action.debug.DebugTestFileAction;
import krasa.mavenrun.action.debug.MainMavenDebugActionGroup;
import krasa.mavenrun.model.ApplicationSettings;
import krasa.mavenrun.model.Goal;
import org.apache.commons.lang.WordUtils;
import org.jetbrains.annotations.NotNull;
@State(name = "MavenRunHelper", storages = { @Storage(id = "MavenRunHelper", file = "$APP_CONFIG$/mavenRunHelper.xml") })
public class ApplicationComponent implements com.intellij.openapi.components.ApplicationComponent,
PersistentStateComponent<ApplicationSettings> {
static final Logger LOG = Logger.getInstance(ApplicationComponent.class);
public static final NotificationGroup NOTIFICATION = new NotificationGroup("Maven Helper",
NotificationDisplayType.STICKY_BALLOON, true);
public static final String RUN_MAVEN = "Run Maven";
public static final String DEBUG_MAVEN = "Debug Maven";
private ApplicationSettings settings = ApplicationSettings.defaultApplicationSettings();
public void initComponent() {
addActionGroup(new MainMavenDebugActionGroup(DEBUG_MAVEN, Debug.ICON), RUN_MAVEN);
addActionGroup(new MainMavenActionGroup(RUN_MAVEN, MavenIcons.Phase), RUN_MAVEN);
registerActions();
}
public void registerActions() {
ActionManager instance = ActionManager.getInstance();
for (Goal goal : settings.getAllGoals()) {
String actionId = getActionId(goal);
registerAction(instance, actionId, new RunGoalAction(goal, MavenIcons.PluginGoal));
actionId = getDebugActionId(goal);
registerAction(instance, actionId, new DebugGoalAction(goal, MavenIcons.PluginGoal));
}
registerAction(instance, "krasa.MavenHelper.RunTestFileAction", new RunTestFileAction());
registerAction(instance, "krasa.MavenHelper.DebugTestFileAction", new DebugTestFileAction());
}
public void unRegisterActions() {
ActionManager instance = ActionManager.getInstance();
for (Goal goal : settings.getAllGoals()) {
unRegisterAction(instance, getActionId(goal));
unRegisterAction(instance, getDebugActionId(goal));
}
}
public void registerAction(Goal o, RunGoalAction runGoalAction) {
ActionManager instance = ActionManager.getInstance();
registerAction(instance, getActionId(o), runGoalAction);
}
private void registerAction(ActionManager instance, String actionId1, AnAction runGoalAction) {
unRegisterAction(instance, actionId1);
instance.registerAction(actionId1, runGoalAction, PluginId.getId("MavenRunHelper"));
}
private void unRegisterAction(ActionManager instance, String actionId) {
instance.unregisterAction(actionId);
}
private String getActionId(Goal goal) {
return "MavenRunHelper" + WordUtils.capitalizeFully(goal.getCommandLine()).replaceAll(" ", "");
}
private String getDebugActionId(Goal goal) {
return "MavenRunHelperDebug" + WordUtils.capitalizeFully(goal.getCommandLine()).replaceAll(" ", "");
}
private void addActionGroup(ActionGroup actionGroup, String runMaven) {
DefaultActionGroup editorPopupMenu = (DefaultActionGroup) ActionManager.getInstance().getAction(
"EditorPopupMenu.Run");
DefaultActionGroup projectViewPopupMenuRunGroup = (DefaultActionGroup) ActionManager.getInstance().getAction(
"ProjectViewPopupMenuRunGroup");
clear(editorPopupMenu, projectViewPopupMenuRunGroup, runMaven);
add(actionGroup, editorPopupMenu, projectViewPopupMenuRunGroup);
}
private void add(ActionGroup actionGroup, DefaultActionGroup editorPopupMenu,
DefaultActionGroup projectViewPopupMenuRunGroup) {
editorPopupMenu.add(actionGroup, Constraints.FIRST);
projectViewPopupMenuRunGroup.add(actionGroup, Constraints.FIRST);
}
private void clear(DefaultActionGroup editorPopupMenu, DefaultActionGroup projectViewPopupMenuRunGroup,
String runMaven) {
clear(editorPopupMenu, RUN_MAVEN);
clear(projectViewPopupMenuRunGroup, runMaven);
}
private void clear(DefaultActionGroup editorPopupMenu, String runMaven) {
AnAction[] childActionsOrStubs = editorPopupMenu.getChildActionsOrStubs();
for (AnAction childActionsOrStub : childActionsOrStubs) {
if (runMaven.equals(childActionsOrStub.getTemplatePresentation().getText())) {
editorPopupMenu.remove(childActionsOrStub);
}
}
}
public void disposeComponent() {
// TODO: insert component disposal logic here
}
@NotNull
public String getComponentName() {
return "ApplicationComponent";
}
@NotNull
@Override
public ApplicationSettings getState() {
if (settings == null) {
settings = ApplicationSettings.defaultApplicationSettings();
}
return settings;
}
public void loadState(ApplicationSettings state) {
if (state.getVersion() < ApplicationSettings.ACTUAL_VERSION) {
settings = ApplicationSettings.defaultApplicationSettings();
} else {
settings = state;
}
}
public static ApplicationComponent getInstance() {
return ApplicationManager.getApplication().getComponent(ApplicationComponent.class);
}
}