diff --git a/platform/vcs-log/impl/src/META-INF/vcs-log.xml b/platform/vcs-log/impl/src/META-INF/vcs-log.xml index 3a5fc95eaef1..b81ef1ef13f7 100644 --- a/platform/vcs-log/impl/src/META-INF/vcs-log.xml +++ b/platform/vcs-log/impl/src/META-INF/vcs-log.xml @@ -43,6 +43,8 @@ + diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/actions/history/CompareRevisionsFromFileHistoryActionProvider.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/actions/history/CompareRevisionsFromFileHistoryActionProvider.java new file mode 100644 index 000000000000..c203b7f898e3 --- /dev/null +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/actions/history/CompareRevisionsFromFileHistoryActionProvider.java @@ -0,0 +1,60 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.vcs.log.ui.actions.history; + +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.AnActionExtensionProvider; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vcs.FilePath; +import com.intellij.openapi.vcs.VcsDataKeys; +import com.intellij.openapi.vcs.changes.Change; +import com.intellij.openapi.vcs.changes.actions.diff.ShowDiffAction; +import com.intellij.vcs.log.VcsLog; +import com.intellij.vcs.log.VcsLogDataKeys; +import com.intellij.vcs.log.statistics.VcsLogUsageTriggerCollector; +import com.intellij.vcs.log.ui.VcsLogInternalDataKeys; +import org.jetbrains.annotations.NotNull; + +import java.awt.event.KeyEvent; +import java.util.Arrays; + +public class CompareRevisionsFromFileHistoryActionProvider implements AnActionExtensionProvider { + @Override + public boolean isActive(@NotNull AnActionEvent e) { + FilePath filePath = e.getData(VcsDataKeys.FILE_PATH); + return e.getData(VcsLogInternalDataKeys.FILE_HISTORY_UI) != null && filePath != null && !filePath.isDirectory(); + } + + @Override + public void update(@NotNull AnActionEvent e) { + Project project = e.getProject(); + FilePath filePath = e.getData(VcsDataKeys.FILE_PATH); + VcsLog log = e.getData(VcsLogDataKeys.VCS_LOG); + if (project == null || filePath == null || filePath.isDirectory() || log == null) { + e.getPresentation().setEnabledAndVisible(false); + return; + } + + CompareRevisionsFromHistoryActionProvider.updateActionText(e, log); + e.getPresentation().setVisible(true); + + if (e.getInputEvent() instanceof KeyEvent) { + e.getPresentation().setEnabled(true); + } + else { + Change[] changes = e.getData(VcsDataKeys.SELECTED_CHANGES); + e.getPresentation().setEnabled(changes != null && changes.length == 1 && changes[0] != null); + } + } + + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + VcsLogUsageTriggerCollector.triggerUsage(e); + + Project project = e.getRequiredData(CommonDataKeys.PROJECT); + Change[] changes = e.getData(VcsDataKeys.SELECTED_CHANGES); + if (changes == null || changes.length > 1 || changes[0] == null) return; + + ShowDiffAction.showDiffForChange(project, Arrays.asList(changes)); + } +} diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/actions/history/CompareRevisionsFromHistoryActionProvider.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/actions/history/CompareRevisionsFromHistoryActionProvider.java index 76a83f521beb..6ed45bc1b01f 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/actions/history/CompareRevisionsFromHistoryActionProvider.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/actions/history/CompareRevisionsFromHistoryActionProvider.java @@ -23,18 +23,19 @@ import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.VcsDataKeys; import com.intellij.openapi.vcs.changes.Change; -import com.intellij.openapi.vcs.changes.actions.diff.ShowDiffAction; import com.intellij.openapi.vcs.history.VcsDiffUtil; import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; import com.intellij.util.containers.ContainerUtil; -import com.intellij.vcs.log.*; +import com.intellij.vcs.log.CommitId; +import com.intellij.vcs.log.VcsFullCommitDetails; +import com.intellij.vcs.log.VcsLog; +import com.intellij.vcs.log.VcsLogDiffHandler; import com.intellij.vcs.log.history.FileHistoryUi; import com.intellij.vcs.log.statistics.VcsLogUsageTriggerCollector; import com.intellij.vcs.log.ui.VcsLogInternalDataKeys; import org.jetbrains.annotations.NotNull; import java.awt.event.KeyEvent; -import java.util.Collections; import java.util.List; import static com.intellij.util.ObjectUtils.notNull; @@ -47,7 +48,8 @@ public class CompareRevisionsFromHistoryActionProvider implements AnActionExtens @Override public boolean isActive(@NotNull AnActionEvent e) { - return e.getData(VcsLogInternalDataKeys.FILE_HISTORY_UI) != null; + FilePath filePath = e.getData(VcsDataKeys.FILE_PATH); + return e.getData(VcsLogInternalDataKeys.FILE_HISTORY_UI) != null && filePath != null && filePath.isDirectory(); } @Override @@ -59,29 +61,22 @@ public class CompareRevisionsFromHistoryActionProvider implements AnActionExtens e.getPresentation().setEnabledAndVisible(false); return; } - e.getPresentation().setVisible(true); - List commits = ui.getVcsLog().getSelectedCommits(); + VcsLog log = ui.getVcsLog(); + updateActionText(e, log); + if (e.getInputEvent() instanceof KeyEvent) { e.getPresentation().setEnabled(true); - } - else { - if (commits.size() == 2) { - e.getPresentation().setEnabled(e.getData(VcsLogInternalDataKeys.LOG_DIFF_HANDLER) != null); - } - else { - e.getPresentation().setEnabled(commits.size() == 1); - } + return; } + List commits = log.getSelectedCommits(); if (commits.size() == 2) { - e.getPresentation().setText(COMPARE_TEXT); - e.getPresentation().setDescription(COMPARE_DESCRIPTION); + e.getPresentation().setEnabled(e.getData(VcsLogInternalDataKeys.LOG_DIFF_HANDLER) != null); } else { - e.getPresentation().setText(DIFF_TEXT); - e.getPresentation().setDescription(DIFF_DESCRIPTION); + e.getPresentation().setEnabled(commits.size() == 1); } } @@ -108,18 +103,24 @@ public class CompareRevisionsFromHistoryActionProvider implements AnActionExtens if (commits.size() != 1) return; - if (!filePath.isDirectory()) { - ShowDiffAction.showDiffForChange(project, Collections.singletonList(ui.getSelectedChange())); + List commitIds = ContainerUtil.map(commits, c -> ui.getLogData().getCommitIndex(c.getHash(), c.getRoot())); + ui.getLogData().getCommitDetailsGetter().loadCommitsData(commitIds, details -> { + VcsFullCommitDetails detail = notNull(ContainerUtil.getFirstItem(details)); + List changes = ui.collectRelevantChanges(detail); + VcsDiffUtil.showChangesDialog(project, "Changes in " + detail.getId().toShortString() + " for " + filePath.getName(), + ContainerUtil.newArrayList(changes)); + }, t -> VcsBalloonProblemNotifier.showOverChangesView(project, "Could not load selected commits: " + t.getMessage(), + MessageType.ERROR), null); + } + + public static void updateActionText(@NotNull AnActionEvent e, @NotNull VcsLog log) { + if (log.getSelectedCommits().size() >= 2) { + e.getPresentation().setText(COMPARE_TEXT); + e.getPresentation().setDescription(COMPARE_DESCRIPTION); } else { - List commitIds = ContainerUtil.map(commits, c -> ui.getLogData().getCommitIndex(c.getHash(), c.getRoot())); - ui.getLogData().getCommitDetailsGetter().loadCommitsData(commitIds, details -> { - VcsFullCommitDetails detail = notNull(ContainerUtil.getFirstItem(details)); - List changes = ui.collectRelevantChanges(detail); - VcsDiffUtil.showChangesDialog(project, "Changes in " + detail.getId().toShortString() + " for " + filePath.getName(), - ContainerUtil.newArrayList(changes)); - }, t -> VcsBalloonProblemNotifier.showOverChangesView(project, "Could not load selected commits: " + t.getMessage(), - MessageType.ERROR), null); + e.getPresentation().setText(DIFF_TEXT); + e.getPresentation().setDescription(DIFF_DESCRIPTION); } } }