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 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) {
151 return new Pair
<SupportedVCS
, AbstractVcs
>(SupportedVCS
.NOT_IN_VCS
, null);
152 } else if (activeVcss
.length
== 1) {
154 return new Pair
<SupportedVCS
, AbstractVcs
>(SupportedVCS
.VCS
, activeVcss
[0]);
158 final VirtualFile file
= dataContext
!= null ? PlatformDataKeys
.VIRTUAL_FILE
.getData(dataContext
) : 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) {
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
{