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
;
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) {
34 final Pair
<SupportedVCS
, AbstractVcs
> typeAndVcs
= getActiveVCS(project
, dataContext
);
35 final AbstractVcs vcs
= typeAndVcs
.getSecond();
36 final SupportedVCS popupType
= typeAndVcs
.getFirst();
40 fillVcsPopup(project
, group
, dataContext
, vcs
);
44 fillNonInVcsActions(project
, group
, dataContext
);
49 protected boolean isEnabled() {
53 private void fillVcsPopup(@NotNull final Project project
,
54 @NotNull final DefaultActionGroup group
,
55 @Nullable final DataContext dataContext
,
56 @Nullable final AbstractVcs vcs
) {
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
);
68 addLocalHistoryActions(group
);
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
);
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
102 addAction("Vcs.ShowTabbedFileHistory", group
);
103 addAction("Annotate", group
);
104 addAction("Compare.SameVersion", group
);
108 addActions(actions
, group
);
112 addAction("MoveToChangeList", group
);
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
);
129 addAction("Start.Use.Vcs", group
);
130 addAction("Vcs.Checkout", group
);
133 addLocalHistoryActions(group
);
136 private void addLocalHistoryActions(DefaultActionGroup group
) {
137 addSeparator(group
, VcsBundle
.message("vcs.quicklist.pupup.section.local.history"));
139 addAction("LocalHistory.ShowHistory", group
);
140 addAction("LocalHistory.PutLabel", group
);
143 private void addActions(@NotNull final List
<AnAction
> actions
,
144 @NotNull final DefaultActionGroup toGroup
) {
145 for (AnAction action
: actions
) {
146 toGroup
.addAction(action
);
150 private Pair
<SupportedVCS
, AbstractVcs
> getActiveVCS(@NotNull final Project project
, @Nullable final DataContext dataContext
) {
151 final AbstractVcs
[] activeVcss
= getActiveVCSs(project
);
152 if (activeVcss
.length
== 0) {
154 return new Pair
<SupportedVCS
, AbstractVcs
>(SupportedVCS
.NOT_IN_VCS
, null);
155 } else if (activeVcss
.length
== 1) {
157 return new Pair
<SupportedVCS
, AbstractVcs
>(SupportedVCS
.VCS
, activeVcss
[0]);
161 final VirtualFile file
= dataContext
!= null ? PlatformDataKeys
.VIRTUAL_FILE
.getData(dataContext
) : null;
163 final AbstractVcs vscForFile
= ProjectLevelVcsManager
.getInstance(project
).getVcsFor(file
);
164 if (vscForFile
!= null) {
165 return new Pair
<SupportedVCS
, AbstractVcs
>(SupportedVCS
.VCS
, vscForFile
);
169 return new Pair
<SupportedVCS
, AbstractVcs
>(SupportedVCS
.VCS
, null);
172 private AbstractVcs
[] getActiveVCSs(final Project project
) {
173 final ProjectLevelVcsManager vcsManager
= ProjectLevelVcsManager
.getInstance(project
);
174 return vcsManager
.getAllActiveVcss();
177 private void addAction(final String actionId
, final DefaultActionGroup toGroup
) {
178 final AnAction action
= ActionManager
.getInstance().getAction(actionId
);
180 // add action to group if it is available
181 if (action
!= null) {
186 private void addSeparator(final DefaultActionGroup toGroup
) {
187 addSeparator(toGroup
, null);
190 private void addSeparator(final DefaultActionGroup toGroup
, @Nullable final String title
) {
191 final Separator separator
= title
== null ?
new Separator() : new Separator(title
);
192 toGroup
.add(separator
);
195 protected String
getPopupTitle(AnActionEvent e
) {
196 return VcsBundle
.message("vcs.quicklist.pupup.title");
199 public enum SupportedVCS
{