blob: 39f4af453b988aee95ee625958874d0a4a649bd2 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.vcs.actions;
import com.intellij.ide.actions.QuickSwitchSchemeAction;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.vcs.VcsBundle;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
/**
* @author Roman.Chernyatchik
*
* Context aware VCS actions quick list.
* May be customized using com.intellij.openapi.vcs.actions.VcsQuickListContentProvider extension point.
*/
public class VcsQuickListPopupAction extends QuickSwitchSchemeAction implements DumbAware {
public VcsQuickListPopupAction() {
myActionPlace = ActionPlaces.ACTION_PLACE_VCS_QUICK_LIST_POPUP_ACTION;
}
protected void fillActions(@Nullable final Project project,
@NotNull final DefaultActionGroup group,
@NotNull final DataContext dataContext) {
if (project == null) {
return;
}
final Pair<SupportedVCS, AbstractVcs> typeAndVcs = getActiveVCS(project, dataContext);
final AbstractVcs vcs = typeAndVcs.getSecond();
final SupportedVCS popupType = typeAndVcs.getFirst();
switch (popupType) {
case VCS:
fillVcsPopup(project, group, dataContext, vcs);
break;
case NOT_IN_VCS:
fillNonInVcsActions(project, group, dataContext);
break;
}
}
protected boolean isEnabled() {
return true;
}
private void fillVcsPopup(@NotNull final Project project,
@NotNull final DefaultActionGroup group,
@Nullable final DataContext dataContext,
@Nullable final AbstractVcs vcs) {
if (vcs != null) {
// replace general vcs actions if necessary
for (VcsQuickListContentProvider provider : VcsQuickListContentProvider.EP_NAME.getExtensions()) {
if (provider.replaceVcsActionsFor(vcs, dataContext)) {
final List<AnAction> actionsToReplace = provider.getVcsActions(project, vcs, dataContext);
if (actionsToReplace != null) {
// replace general actions with custom ones:
addActions(actionsToReplace, group);
// local history
addLocalHistoryActions(group);
return;
}
}
}
}
// general list
fillGeneralVcsPopup(project, group, dataContext, vcs);
}
private void fillGeneralVcsPopup(@NotNull final Project project,
@NotNull final DefaultActionGroup group,
@Nullable final DataContext dataContext,
@Nullable final AbstractVcs vcs) {
// include all custom actions in general popup
final List<AnAction> actions = new ArrayList<AnAction>();
for (VcsQuickListContentProvider provider : VcsQuickListContentProvider.EP_NAME.getExtensions()) {
final List<AnAction> providerActions = provider.getVcsActions(project, vcs, dataContext);
if (providerActions != null) {
actions.addAll(providerActions);
}
}
// basic operations
addSeparator(group, vcs != null ? vcs.getDisplayName() : null);
addAction("ChangesView.AddUnversioned", group);
addAction("CheckinProject", group);
addAction("CheckinFiles", group);
addAction(IdeActions.CHANGES_VIEW_ROLLBACK, group);
// history and compare
addSeparator(group);
addAction("Vcs.ShowTabbedFileHistory", group);
addAction("Annotate", group);
addAction("Compare.SameVersion", group);
// custom actions
addSeparator(group);
addActions(actions, group);
// additional stuff
addSeparator(group);
addAction(IdeActions.MOVE_TO_ANOTHER_CHANGE_LIST, group);
// local history
addLocalHistoryActions(group);
}
private void fillNonInVcsActions(@NotNull final Project project,
@NotNull final DefaultActionGroup group,
@Nullable final DataContext dataContext) {
// add custom vcs actions
for (VcsQuickListContentProvider provider : VcsQuickListContentProvider.EP_NAME.getExtensions()) {
final List<AnAction> actions = provider.getNotInVcsActions(project, dataContext);
if (actions != null) {
addActions(actions, group);
}
}
addSeparator(group);
addAction("Start.Use.Vcs", group);
addAction("Vcs.Checkout", group);
// local history
addLocalHistoryActions(group);
}
private void addLocalHistoryActions(DefaultActionGroup group) {
addSeparator(group, VcsBundle.message("vcs.quicklist.pupup.section.local.history"));
addAction("LocalHistory.ShowHistory", group);
addAction("LocalHistory.PutLabel", group);
}
private void addActions(@NotNull final List<AnAction> actions,
@NotNull final DefaultActionGroup toGroup) {
for (AnAction action : actions) {
toGroup.addAction(action);
}
}
private Pair<SupportedVCS, AbstractVcs> getActiveVCS(@NotNull final Project project, @Nullable final DataContext dataContext) {
final AbstractVcs[] activeVcss = getActiveVCSs(project);
if (activeVcss.length == 0) {
// no vcs
return new Pair<SupportedVCS, AbstractVcs>(SupportedVCS.NOT_IN_VCS, null);
} else if (activeVcss.length == 1) {
// get by name
return Pair.create(SupportedVCS.VCS, activeVcss[0]);
}
// by current file
final VirtualFile file = dataContext != null ? CommonDataKeys.VIRTUAL_FILE.getData(dataContext) : null;
if (file != null) {
final AbstractVcs vscForFile = ProjectLevelVcsManager.getInstance(project).getVcsFor(file);
if (vscForFile != null) {
return Pair.create(SupportedVCS.VCS, vscForFile);
}
}
return new Pair<SupportedVCS, AbstractVcs>(SupportedVCS.VCS, null);
}
private AbstractVcs[] getActiveVCSs(final Project project) {
final ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(project);
return vcsManager.getAllActiveVcss();
}
private void addAction(final String actionId, final DefaultActionGroup toGroup) {
final AnAction action = ActionManager.getInstance().getAction(actionId);
// add action to group if it is available
if (action != null) {
toGroup.add(action);
}
}
private void addSeparator(final DefaultActionGroup toGroup) {
addSeparator(toGroup, null);
}
private void addSeparator(final DefaultActionGroup toGroup, @Nullable final String title) {
final Separator separator = title == null ? new Separator() : new Separator(title);
toGroup.add(separator);
}
protected String getPopupTitle(AnActionEvent e) {
return VcsBundle.message("vcs.quicklist.popup.title");
}
public enum SupportedVCS {
VCS,
NOT_IN_VCS
}
}