diff --git a/platform/dvcs/src/com/intellij/dvcs/ui/VcsLogAction.java b/platform/dvcs/src/com/intellij/dvcs/ui/VcsLogAction.java index 116f792ef93f..bb7f64f9b24c 100644 --- a/platform/dvcs/src/com/intellij/dvcs/ui/VcsLogAction.java +++ b/platform/dvcs/src/com/intellij/dvcs/ui/VcsLogAction.java @@ -20,9 +20,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import com.intellij.vcs.log.VcsFullCommitDetails; import com.intellij.vcs.log.VcsLog; @@ -30,27 +28,18 @@ import com.intellij.vcs.log.VcsLogDataKeys; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; import java.util.List; -import java.util.Map; public abstract class VcsLogAction extends DumbAwareAction { - protected enum Mode { - SINGLE_COMMIT, - SINGLE_PER_REPO - } - @Override public void actionPerformed(AnActionEvent e) { Project project = e.getRequiredData(CommonDataKeys.PROJECT); VcsLog log = e.getRequiredData(VcsLogDataKeys.VSC_LOG); List details = log.getSelectedDetails(); - MultiMap grouped = groupByRoot(project, details); + MultiMap grouped = groupByRootWithCheck(project, details); assert grouped != null; - Map singleElementMap = convertToSingleElementMap(grouped); - assert singleElementMap != null; - actionPerformed(project, singleElementMap); + actionPerformed(project, grouped); } @Override @@ -63,40 +52,25 @@ public abstract class VcsLogAction extends DumbAwareAct } List details = log.getSelectedDetails(); - MultiMap grouped = groupByRoot(project, details); + MultiMap grouped = groupByRootWithCheck(project, details); if (grouped == null) { e.getPresentation().setEnabledAndVisible(false); } else { e.getPresentation().setVisible(true); - e.getPresentation().setEnabled(isEnabled(grouped)); + e.getPresentation().setEnabled(!grouped.isEmpty() && isEnabled(grouped)); } } - private boolean isEnabled(@NotNull MultiMap grouped) { - if (grouped.isEmpty()) { - return false; - } - switch (getMode()) { - case SINGLE_COMMIT: - return grouped.size() == 1; - case SINGLE_PER_REPO: - return allValuesAreSingletons(grouped); - default: - return false; - } - } + protected abstract void actionPerformed(@NotNull Project project, @NotNull MultiMap grouped); + + protected abstract boolean isEnabled(@NotNull MultiMap grouped); @Nullable protected abstract Repo getRepositoryForRoot(@NotNull Project project, @NotNull VirtualFile root); - protected abstract void actionPerformed(@NotNull Project project, @NotNull Map commits); - - @NotNull - protected abstract Mode getMode(); - @Nullable - private MultiMap groupByRoot(@NotNull Project project, @NotNull List commits) { + private MultiMap groupByRootWithCheck(@NotNull Project project, @NotNull List commits) { MultiMap map = MultiMap.create(); for (VcsFullCommitDetails commit : commits) { Repo root = getRepositoryForRoot(project, commit.getRoot()); @@ -108,26 +82,4 @@ public abstract class VcsLogAction extends DumbAwareAct return map; } - private boolean allValuesAreSingletons(@NotNull MultiMap grouped) { - return !ContainerUtil.exists(grouped.entrySet(), new Condition>>() { - @Override - public boolean value(Map.Entry> entry) { - return entry.getValue().size() != 1; - } - }); - } - - @Nullable - private Map convertToSingleElementMap(@NotNull MultiMap groupedCommits) { - Map map = ContainerUtil.newHashMap(); - for (Map.Entry> entry : groupedCommits.entrySet()) { - Collection commits = entry.getValue(); - if (commits.size() != 1) { - return null; - } - map.put(entry.getKey(), commits.iterator().next()); - } - return map; - } - } diff --git a/platform/dvcs/src/com/intellij/dvcs/ui/VcsLogOneCommitPerRepoAction.java b/platform/dvcs/src/com/intellij/dvcs/ui/VcsLogOneCommitPerRepoAction.java new file mode 100644 index 000000000000..1b4be918a3e1 --- /dev/null +++ b/platform/dvcs/src/com/intellij/dvcs/ui/VcsLogOneCommitPerRepoAction.java @@ -0,0 +1,69 @@ +/* + * 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.dvcs.ui; + +import com.intellij.dvcs.repo.Repository; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Condition; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.MultiMap; +import com.intellij.vcs.log.VcsFullCommitDetails; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Map; + +public abstract class VcsLogOneCommitPerRepoAction extends VcsLogAction { + + @Override + protected void actionPerformed(@NotNull Project project, @NotNull MultiMap grouped) { + Map singleElementMap = convertToSingleElementMap(grouped); + assert singleElementMap != null; + actionPerformed(project, singleElementMap); + } + + @Override + protected boolean isEnabled(@NotNull MultiMap grouped) { + return allValuesAreSingletons(grouped); + } + + protected abstract void actionPerformed(@NotNull Project project, @NotNull Map commits); + + private boolean allValuesAreSingletons(@NotNull MultiMap grouped) { + return !ContainerUtil.exists(grouped.entrySet(), new Condition>>() { + @Override + public boolean value(Map.Entry> entry) { + return entry.getValue().size() != 1; + } + }); + } + + @Nullable + private Map convertToSingleElementMap(@NotNull MultiMap groupedCommits) { + Map map = ContainerUtil.newHashMap(); + for (Map.Entry> entry : groupedCommits.entrySet()) { + Collection commits = entry.getValue(); + if (commits.size() != 1) { + return null; + } + map.put(entry.getKey(), commits.iterator().next()); + } + return map; + } + + +} diff --git a/platform/dvcs/src/com/intellij/dvcs/ui/VcsLogSingleCommitAction.java b/platform/dvcs/src/com/intellij/dvcs/ui/VcsLogSingleCommitAction.java new file mode 100644 index 000000000000..4b43380ea9eb --- /dev/null +++ b/platform/dvcs/src/com/intellij/dvcs/ui/VcsLogSingleCommitAction.java @@ -0,0 +1,46 @@ +/* + * 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.dvcs.ui; + +import com.intellij.dvcs.repo.Repository; +import com.intellij.openapi.project.Project; +import com.intellij.util.containers.MultiMap; +import com.intellij.vcs.log.VcsFullCommitDetails; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Map; + +public abstract class VcsLogSingleCommitAction extends VcsLogAction { + + @Override + protected boolean isEnabled(@NotNull MultiMap grouped) { + return grouped.size() == 1; + } + + @Override + protected void actionPerformed(@NotNull Project project, @NotNull MultiMap grouped) { + assert grouped.size() == 1; + Map.Entry> entry = grouped.entrySet().iterator().next(); + Repo repository = entry.getKey(); + Collection commits = entry.getValue(); + assert commits.size() == 1; + actionPerformed(repository, commits.iterator().next()); + } + + protected abstract void actionPerformed(@NotNull Repo repository, @NotNull VcsFullCommitDetails commit); + +} diff --git a/plugins/git4idea/src/git4idea/actions/GitLogSingleCommitAction.java b/plugins/git4idea/src/git4idea/actions/GitLogSingleCommitAction.java index 2ddbed7e5478..83512de71d1f 100644 --- a/plugins/git4idea/src/git4idea/actions/GitLogSingleCommitAction.java +++ b/plugins/git4idea/src/git4idea/actions/GitLogSingleCommitAction.java @@ -15,19 +15,16 @@ */ package git4idea.actions; -import com.intellij.dvcs.ui.VcsLogAction; +import com.intellij.dvcs.ui.VcsLogSingleCommitAction; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.vcs.log.VcsFullCommitDetails; import git4idea.repo.GitRepository; import git4idea.repo.GitRepositoryManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Map; - -public abstract class GitLogSingleCommitAction extends VcsLogAction { +public abstract class GitLogSingleCommitAction extends VcsLogSingleCommitAction { @Override @Nullable @@ -35,21 +32,4 @@ public abstract class GitLogSingleCommitAction extends VcsLogAction commits) { - assert commits.size() == 1; - Map.Entry entry = commits.entrySet().iterator().next(); - GitRepository repository = entry.getKey(); - VcsFullCommitDetails commit = entry.getValue(); - actionPerformed(repository, commit); - } - - protected abstract void actionPerformed(@NotNull GitRepository repository, @NotNull VcsFullCommitDetails commit); - } diff --git a/plugins/git4idea/src/git4idea/reset/GitResetAction.java b/plugins/git4idea/src/git4idea/reset/GitResetAction.java index 5870c2fc4993..749acd7e7c7c 100644 --- a/plugins/git4idea/src/git4idea/reset/GitResetAction.java +++ b/plugins/git4idea/src/git4idea/reset/GitResetAction.java @@ -15,7 +15,7 @@ */ package git4idea.reset; -import com.intellij.dvcs.ui.VcsLogAction; +import com.intellij.dvcs.ui.VcsLogOneCommitPerRepoAction; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.Task; @@ -31,7 +31,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Map; -public class GitResetAction extends VcsLogAction { +public class GitResetAction extends VcsLogOneCommitPerRepoAction { @Nullable @Override @@ -39,12 +39,6 @@ public class GitResetAction extends VcsLogAction { return getRepoManager(project).getRepositoryForRoot(root); } - @NotNull - @Override - protected Mode getMode() { - return Mode.SINGLE_PER_REPO; - } - @Override protected void actionPerformed(@NotNull final Project project, @NotNull final Map commits) { GitVcsSettings settings = GitVcsSettings.getInstance(project); diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/action/HgLogSingleCommitAction.java b/plugins/hg4idea/src/org/zmlx/hg4idea/action/HgLogSingleCommitAction.java index e0bde5df924a..43ef70ed2446 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/action/HgLogSingleCommitAction.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/action/HgLogSingleCommitAction.java @@ -16,19 +16,16 @@ package org.zmlx.hg4idea.action; -import com.intellij.dvcs.ui.VcsLogAction; +import com.intellij.dvcs.ui.VcsLogSingleCommitAction; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.vcs.log.VcsFullCommitDetails; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.zmlx.hg4idea.repo.HgRepository; import org.zmlx.hg4idea.repo.HgRepositoryManager; -import java.util.Map; - -public abstract class HgLogSingleCommitAction extends VcsLogAction { +public abstract class HgLogSingleCommitAction extends VcsLogSingleCommitAction { @Nullable @Override @@ -36,21 +33,4 @@ public abstract class HgLogSingleCommitAction extends VcsLogAction return ServiceManager.getService(project, HgRepositoryManager.class).getRepositoryForRoot(root); } - @NotNull - @Override - protected Mode getMode() { - return Mode.SINGLE_COMMIT; - } - - @Override - protected void actionPerformed(@NotNull Project project, @NotNull Map commits) { - assert commits.size() == 1; - Map.Entry entry = commits.entrySet().iterator().next(); - HgRepository repository = entry.getKey(); - VcsFullCommitDetails commit = entry.getValue(); - actionPerformed(repository, commit); - } - - protected abstract void actionPerformed(@NotNull HgRepository repository, @NotNull VcsFullCommitDetails commit); - }