update copyright
[fedora-idea.git] / plugins / maven / src / main / java / org / jetbrains / idea / maven / tasks / MavenKeymapExtension.java
blob9b95aebd93d03ffed5ce84b1f8dace6b7bfc628b
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org.jetbrains.idea.maven.tasks;
18 import com.intellij.execution.ExecutionException;
19 import com.intellij.openapi.actionSystem.ActionManager;
20 import com.intellij.openapi.actionSystem.AnAction;
21 import com.intellij.openapi.actionSystem.AnActionEvent;
22 import com.intellij.openapi.actionSystem.Presentation;
23 import com.intellij.openapi.keymap.KeymapExtension;
24 import com.intellij.openapi.keymap.KeymapGroup;
25 import com.intellij.openapi.keymap.KeymapGroupFactory;
26 import com.intellij.openapi.project.Project;
27 import com.intellij.openapi.util.Condition;
28 import com.intellij.openapi.util.Pair;
29 import org.jetbrains.annotations.TestOnly;
30 import org.jetbrains.idea.maven.embedder.MavenEmbedderFactory;
31 import org.jetbrains.idea.maven.project.MavenPlugin;
32 import org.jetbrains.idea.maven.project.MavenProject;
33 import org.jetbrains.idea.maven.project.MavenProjectsManager;
34 import org.jetbrains.idea.maven.execution.MavenRunConfigurationType;
35 import org.jetbrains.idea.maven.execution.MavenRunnerParameters;
36 import org.jetbrains.idea.maven.utils.actions.MavenAction;
37 import org.jetbrains.idea.maven.utils.actions.MavenActionUtil;
38 import org.jetbrains.idea.maven.utils.MavenArtifactUtil;
39 import org.jetbrains.idea.maven.utils.MavenLog;
40 import org.jetbrains.idea.maven.utils.MavenPluginInfo;
41 import org.jetbrains.idea.maven.utils.MavenIcons;
43 import java.io.File;
44 import java.util.*;
46 public class MavenKeymapExtension implements KeymapExtension {
47 public KeymapGroup createGroup(Condition<AnAction> condition, Project project) {
48 KeymapGroup result = KeymapGroupFactory.getInstance().createGroup(TasksBundle.message("maven.tasks.action.group.name"),
49 MavenIcons.OPEN_PHASES_ICON,
50 MavenIcons.CLOSED_PHASES_ICON);
51 if (project == null) return result;
53 Comparator<MavenProject> projectComparator = new Comparator<MavenProject>() {
54 public int compare(MavenProject o1, MavenProject o2) {
55 return o1.getDisplayName().compareToIgnoreCase(o2.getDisplayName());
58 Map<MavenProject, Set<Pair<String, String>>> projectToActionsMapping
59 = new TreeMap<MavenProject, Set<Pair<String, String>>>(projectComparator);
61 ActionManager actionManager = ActionManager.getInstance();
62 for (String eachId : actionManager.getActionIds(getActionPrefix(project, null))) {
63 AnAction eachAction = actionManager.getAction(eachId);
65 if (!(eachAction instanceof MavenGoalAction)) continue;
66 if (condition != null && !condition.value(actionManager.getActionOrStub(eachId))) continue;
68 MavenGoalAction mavenAction = (MavenGoalAction)eachAction;
69 MavenProject mavenProject = mavenAction.getMavenProject();
70 Set<Pair<String, String>> actions = projectToActionsMapping.get(mavenProject);
71 if (actions == null) {
72 final List<String> projectGoals = collectGoals(mavenProject);
73 actions = new TreeSet<Pair<String, String>>(new Comparator<Pair<String, String>>() {
74 public int compare(Pair<String, String> o1, Pair<String, String> o2) {
75 String goal1 = o1.getFirst();
76 String goal2 = o2.getFirst();
77 int index1 = projectGoals.indexOf(goal1);
78 int index2 = projectGoals.indexOf(goal2);
79 if (index1 == index2) return goal1.compareToIgnoreCase(goal2);
80 return (index1 < index2 ? -1 : 1);
82 });
83 projectToActionsMapping.put(mavenProject, actions);
85 actions.add(Pair.create(mavenAction.getGoal(), eachId));
88 for (Map.Entry<MavenProject, Set<Pair<String, String>>> each : projectToActionsMapping.entrySet()) {
89 MavenProject mavenProject = each.getKey();
90 Set<Pair<String, String>> goalsToActionIds = each.getValue();
91 if (goalsToActionIds.isEmpty()) continue;
92 KeymapGroup group = KeymapGroupFactory.getInstance().createGroup(mavenProject.getDisplayName(),
93 MavenIcons.OPEN_MODULES_ICON,
94 MavenIcons.CLOSED_MODULES_ICON);
95 result.addGroup(group);
96 for (Pair<String, String> eachGoalToActionId : goalsToActionIds) {
97 group.addActionId(eachGoalToActionId.getSecond());
101 return result;
104 public static void updateActions(Project project) {
105 clearActions(project);
106 doUpdateActions(project, MavenProjectsManager.getInstance(project).getNonIgnoredProjects());
109 public static void updateActions(Project project, List<MavenProject> mavenProjects) {
110 clearActions(project, mavenProjects);
111 doUpdateActions(project, mavenProjects);
114 private static void doUpdateActions(Project project, List<MavenProject> mavenProjects) {
115 ActionManager manager = ActionManager.getInstance();
116 for (MavenProject eachProject : mavenProjects) {
117 String actionIdPrefix = getActionPrefix(project, eachProject);
118 for (MavenGoalAction eachAction : collectActions(eachProject)) {
119 manager.registerAction(actionIdPrefix + eachAction.getGoal(), eachAction);
124 private static List<MavenGoalAction> collectActions(MavenProject mavenProject) {
125 List<MavenGoalAction> result = new ArrayList<MavenGoalAction>();
126 for (String eachGoal : collectGoals(mavenProject)) {
127 result.add(new MavenGoalAction(mavenProject, eachGoal));
129 return result;
132 public static void clearActions(Project project) {
133 ActionManager manager = ActionManager.getInstance();
134 for (String each : manager.getActionIds(getActionPrefix(project, null))) {
135 manager.unregisterAction(each);
139 public static void clearActions(Project project, List<MavenProject> mavenProjects) {
140 ActionManager manager = ActionManager.getInstance();
141 for (MavenProject eachProject : mavenProjects) {
142 for (String eachAction : manager.getActionIds(getActionPrefix(project, eachProject))) {
143 manager.unregisterAction(eachAction);
148 private static List<String> collectGoals(MavenProject project) {
149 LinkedHashSet<String> result = new LinkedHashSet<String>(); // may contains similar plugins or somethig
150 result.addAll(MavenEmbedderFactory.getPhasesList());
152 for (MavenPlugin each : project.getPlugins()) {
153 collectGoals(project.getLocalRepository(), each, result);
156 return new ArrayList<String>(result);
159 private static void collectGoals(File repository, MavenPlugin plugin, LinkedHashSet<String> list) {
160 MavenPluginInfo info = MavenArtifactUtil.readPluginInfo(repository, plugin.getMavenId());
161 if (info == null) return;
163 for (MavenPluginInfo.Mojo m : info.getMojos()) {
164 list.add(m.getQualifiedGoal());
168 @TestOnly
169 public static String getActionPrefix(Project project, MavenProject mavenProject) {
170 String pomPath = mavenProject == null ? null : mavenProject.getPath();
171 return MavenShortcutsManager.getInstance(project).getActionId(pomPath, null);
174 private static class MavenGoalAction extends MavenAction {
175 private final MavenProject myMavenProject;
176 private final String myGoal;
178 public MavenGoalAction(MavenProject mavenProject, String goal) {
179 myMavenProject = mavenProject;
180 myGoal = goal;
181 Presentation template = getTemplatePresentation();
182 template.setText(goal, false);
183 template.setIcon(MavenIcons.PHASE_ICON);
186 public void actionPerformed(AnActionEvent e) {
187 try {
188 MavenRunnerParameters params = new MavenRunnerParameters(true,
189 myMavenProject.getDirectory(),
190 Arrays.asList(myGoal),
191 MavenActionUtil.getProjectsManager(e).getActiveProfiles());
192 MavenRunConfigurationType.runConfiguration(MavenActionUtil.getProject(e), params, e.getDataContext());
194 catch (ExecutionException ex) {
195 MavenLog.LOG.warn(ex);
199 public MavenProject getMavenProject() {
200 return myMavenProject;
203 public String getGoal() {
204 return myGoal;
207 public String toString() {
208 return myMavenProject + ":" + myGoal;