b35fc8f8634d1da62efd6dac2aefd55d1c2eea7e
[fedora-idea.git] / platform / vcs-impl / src / com / intellij / openapi / vcs / actions / VcsQuickListPopupAction.java
blobb35fc8f8634d1da62efd6dac2aefd55d1c2eea7e
1 package com.intellij.openapi.vcs.actions;
3 import com.intellij.ide.actions.QuickSwitchSchemeAction;
4 import com.intellij.openapi.actionSystem.*;
5 import com.intellij.openapi.project.DumbAware;
6 import com.intellij.openapi.project.Project;
7 import com.intellij.openapi.util.Pair;
8 import com.intellij.openapi.vcs.AbstractVcs;
9 import com.intellij.openapi.vcs.ProjectLevelVcsManager;
10 import com.intellij.openapi.vcs.VcsBundle;
11 import com.intellij.openapi.vfs.VirtualFile;
12 import org.jetbrains.annotations.NotNull;
13 import org.jetbrains.annotations.Nullable;
15 import java.util.ArrayList;
16 import java.util.List;
18 /**
19 * @author Roman.Chernyatchik
21 * Context aware VCS actions quick list.
22 * May be customized using com.intellij.openapi.vcs.actions.VcsQuickListContentProvider extension point.
24 public class VcsQuickListPopupAction extends QuickSwitchSchemeAction implements DumbAware {
26 protected void fillActions(@Nullable final Project project,
27 final DefaultActionGroup group,
28 @Nullable final DataContext dataContext) {
30 if (project == null) {
31 return;
34 final Pair<SupportedVCS, AbstractVcs> typeAndVcs = getActiveVCS(project, dataContext);
35 final AbstractVcs vcs = typeAndVcs.getSecond();
36 final SupportedVCS popupType = typeAndVcs.getFirst();
38 switch (popupType) {
39 case VCS:
40 fillVcsPopup(project, group, dataContext, vcs);
41 break;
43 case NOT_IN_VCS:
44 fillNonInVcsActions(project, group, dataContext);
45 break;
49 protected boolean isEnabled() {
50 return true;
53 private void fillVcsPopup(@NotNull final Project project,
54 @NotNull final DefaultActionGroup group,
55 @Nullable final DataContext dataContext,
56 @Nullable final AbstractVcs vcs) {
58 if (vcs != null) {
59 // replace general vcs actions if necessary
61 for (VcsQuickListContentProvider provider : VcsQuickListContentProvider.EP_NAME.getExtensions()) {
62 if (provider.replaceVcsActionsFor(vcs, dataContext)) {
63 final List<AnAction> actionsToReplace = provider.getVcsActions(project, vcs, dataContext);
64 if (actionsToReplace != null) {
65 // replace general actions with custom ones:
66 addActions(actionsToReplace, group);
67 // local history
68 addLocalHistoryActions(group);
69 return;
75 // general list
76 fillGeneralVcsPopup(project, group, dataContext, vcs);
79 private void fillGeneralVcsPopup(@NotNull final Project project,
80 @NotNull final DefaultActionGroup group,
81 @Nullable final DataContext dataContext,
82 @Nullable final AbstractVcs vcs) {
84 // include all custom actions in general popup
85 final List<AnAction> actions = new ArrayList<AnAction>();
86 for (VcsQuickListContentProvider provider : VcsQuickListContentProvider.EP_NAME.getExtensions()) {
87 final List<AnAction> providerActions = provider.getVcsActions(project, vcs, dataContext);
88 if (providerActions != null) {
89 actions.addAll(providerActions);
93 // basic operations
94 addSeparator(group, vcs != null ? vcs.getDisplayName() : null);
95 addAction("ChangesView.AddUnversioned", group);
96 addAction("CheckinProject", group);
97 addAction("CheckinFiles", group);
98 addAction("ChangesView.Rollback", group);
100 // history and compare
101 addSeparator(group);
102 addAction("Vcs.ShowTabbedFileHistory", group);
103 addAction("Annotate", group);
104 addAction("Compare.SameVersion", group);
106 // custom actions
107 addSeparator(group);
108 addActions(actions, group);
110 // additional stuff
111 addSeparator(group);
112 addAction("MoveToChangeList", group);
114 // local history
115 addLocalHistoryActions(group);
118 private void fillNonInVcsActions(@NotNull final Project project,
119 @NotNull final DefaultActionGroup group,
120 @Nullable final DataContext dataContext) {
121 // add custom vcs actions
122 for (VcsQuickListContentProvider provider : VcsQuickListContentProvider.EP_NAME.getExtensions()) {
123 final List<AnAction> actions = provider.getNotInVcsActions(project, dataContext);
124 if (actions != null) {
125 addActions(actions, group);
128 addSeparator(group);
129 addAction("Start.Use.Vcs", group);
130 addAction("Vcs.Checkout", group);
133 private void addLocalHistoryActions(DefaultActionGroup group) {
134 addSeparator(group, VcsBundle.message("vcs.quicklist.pupup.section.local.history"));
136 addAction("LocalHistory.ShowHistory", group);
137 addAction("LocalHistory.PutLabel", group);
140 private void addActions(@NotNull final List<AnAction> actions,
141 @NotNull final DefaultActionGroup toGroup) {
142 for (AnAction action : actions) {
143 toGroup.addAction(action);
147 private Pair<SupportedVCS, AbstractVcs> getActiveVCS(@NotNull final Project project, @Nullable final DataContext dataContext) {
148 final AbstractVcs[] activeVcss = getActiveVCSs(project);
149 if (activeVcss.length == 0) {
150 // no vcs
151 return new Pair<SupportedVCS, AbstractVcs>(SupportedVCS.NOT_IN_VCS, null);
152 } else if (activeVcss.length == 1) {
153 // get by name
154 return new Pair<SupportedVCS, AbstractVcs>(SupportedVCS.VCS, activeVcss[0]);
157 // by current file
158 final VirtualFile file = dataContext != null ? PlatformDataKeys.VIRTUAL_FILE.getData(dataContext) : null;
159 if (file != null) {
160 final AbstractVcs vscForFile = ProjectLevelVcsManager.getInstance(project).getVcsFor(file);
161 if (vscForFile != null) {
162 return new Pair<SupportedVCS, AbstractVcs>(SupportedVCS.VCS, vscForFile);
166 return new Pair<SupportedVCS, AbstractVcs>(SupportedVCS.VCS, null);
169 private AbstractVcs[] getActiveVCSs(final Project project) {
170 final ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(project);
171 return vcsManager.getAllActiveVcss();
174 private void addAction(final String actionId, final DefaultActionGroup toGroup) {
175 final AnAction action = ActionManager.getInstance().getAction(actionId);
177 // add action to group if it is available
178 if (action != null) {
179 toGroup.add(action);
183 private void addSeparator(final DefaultActionGroup toGroup) {
184 addSeparator(toGroup, null);
187 private void addSeparator(final DefaultActionGroup toGroup, @Nullable final String title) {
188 final Separator separator = title == null ? new Separator() : new Separator(title);
189 toGroup.add(separator);
192 protected String getPopupTitle(AnActionEvent e) {
193 return VcsBundle.message("vcs.quicklist.pupup.title");
196 public enum SupportedVCS {
197 VCS,
198 NOT_IN_VCS