summaryrefslogtreecommitdiff
path: root/plugins/hg4idea/src/org/zmlx/hg4idea/branch/HgBranchPopup.java
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/hg4idea/src/org/zmlx/hg4idea/branch/HgBranchPopup.java')
-rw-r--r--plugins/hg4idea/src/org/zmlx/hg4idea/branch/HgBranchPopup.java119
1 files changed, 119 insertions, 0 deletions
diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/branch/HgBranchPopup.java b/plugins/hg4idea/src/org/zmlx/hg4idea/branch/HgBranchPopup.java
new file mode 100644
index 000000000000..c0d6f58d5e0e
--- /dev/null
+++ b/plugins/hg4idea/src/org/zmlx/hg4idea/branch/HgBranchPopup.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2000-2013 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 org.zmlx.hg4idea.branch;
+
+import com.intellij.dvcs.branch.DvcsBranchPopup;
+import com.intellij.dvcs.repo.AbstractRepositoryManager;
+import com.intellij.dvcs.ui.RootAction;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
+import com.intellij.openapi.components.ServiceManager;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Condition;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.zmlx.hg4idea.HgProjectSettings;
+import org.zmlx.hg4idea.repo.HgRepository;
+import org.zmlx.hg4idea.repo.HgRepositoryManager;
+import org.zmlx.hg4idea.util.HgUtil;
+
+import javax.swing.*;
+import java.util.List;
+
+/**
+ * <p>
+ * The popup which allows to quickly switch and control Hg branches.
+ * </p>
+ * <p>
+ * Use {@link #asListPopup()} to achieve the {@link com.intellij.openapi.ui.popup.ListPopup} itself.
+ * </p>
+ */
+public class HgBranchPopup extends DvcsBranchPopup<HgRepository> {
+
+ /**
+ * @param currentRepository Current repository, which means the repository of the currently open or selected file.
+ */
+ public static HgBranchPopup getInstance(@NotNull Project project, @NotNull HgRepository currentRepository) {
+
+ HgRepositoryManager manager = HgUtil.getRepositoryManager(project);
+ HgProjectSettings hgProjectSettings = ServiceManager.getService(project, HgProjectSettings.class);
+ HgMultiRootBranchConfig hgMultiRootBranchConfig = new HgMultiRootBranchConfig(manager.getRepositories());
+
+ Condition<AnAction> preselectActionCondition = new Condition<AnAction>() {
+ @Override
+ public boolean value(AnAction action) {
+ return false;
+ }
+ };
+ return new HgBranchPopup(currentRepository, manager, hgMultiRootBranchConfig, hgProjectSettings,
+ preselectActionCondition);
+ }
+
+ private HgBranchPopup(@NotNull HgRepository currentRepository,
+ @NotNull HgRepositoryManager repositoryManager,
+ @NotNull HgMultiRootBranchConfig hgMultiRootBranchConfig, @NotNull HgProjectSettings vcsSettings,
+ @NotNull Condition<AnAction> preselectActionCondition) {
+ super(currentRepository, repositoryManager, hgMultiRootBranchConfig, vcsSettings, preselectActionCondition);
+ }
+
+ protected void setCurrentBranchInfo() {
+ String branchText = "Current branch : ";
+ //always display heavy branch name for additional info //
+ myPopup.setAdText(branchText + myCurrentRepository.getCurrentBranch(), SwingConstants.CENTER);
+ }
+
+ @Override
+ protected void fillWithCommonRepositoryActions(@NotNull DefaultActionGroup popupGroup,
+ @NotNull AbstractRepositoryManager<HgRepository> repositoryManager) {
+ List<HgRepository> allRepositories = repositoryManager.getRepositories();
+ popupGroup.add(new HgBranchPopupActions.HgNewBranchAction(myProject, allRepositories, myCurrentRepository));
+ popupGroup.addAction(new HgBranchPopupActions.HgNewBookmarkAction(myProject, allRepositories, myCurrentRepository));
+ popupGroup.addAction(new HgBranchPopupActions.HgShowUnnamedHeadsForCurrentBranchAction(myProject, myCurrentRepository));
+ popupGroup.addAll(createRepositoriesActions());
+
+ popupGroup.addSeparator("Common Branches");
+ for (String branch : myMultiRootBranchConfig.getLocalBranchNames()) {
+ List<HgRepository> repositories = filterRepositoriesNotOnThisBranch(branch, allRepositories);
+ if (!repositories.isEmpty()) {
+ popupGroup.add(new HgCommonBranchActions(myProject, repositories, branch));
+ }
+ }
+ popupGroup.addSeparator("Common Bookmarks");
+ for (String branch : ((HgMultiRootBranchConfig)myMultiRootBranchConfig).getBookmarkNames()) {
+ List<HgRepository> repositories = filterRepositoriesNotOnThisBranch(branch, allRepositories);
+ if (!repositories.isEmpty()) {
+ popupGroup.add(new HgBranchPopupActions.BookmarkActions(myProject, repositories, branch));
+ }
+ }
+ }
+
+ @NotNull
+ protected DefaultActionGroup createRepositoriesActions() {
+ DefaultActionGroup popupGroup = new DefaultActionGroup(null, false);
+ popupGroup.addSeparator("Repositories");
+ for (HgRepository repository : myRepositoryManager.getRepositories()) {
+ popupGroup.add(new RootAction<HgRepository>(repository, highlightCurrentRepo() ? myCurrentRepository : null,
+ new HgBranchPopupActions(repository.getProject(), repository).createActions(null),
+ HgUtil.getDisplayableBranchOrBookmarkText(repository)));
+ }
+ return popupGroup;
+ }
+
+ protected void fillPopupWithCurrentRepositoryActions(@NotNull DefaultActionGroup popupGroup, @Nullable DefaultActionGroup actions) {
+ popupGroup.addAll(new HgBranchPopupActions(myProject, myCurrentRepository).createActions(actions));
+ }
+}
+