diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangesUtil.java b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangesUtil.java index af9d00a429e5..c2e4bbc14f2a 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangesUtil.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangesUtil.java @@ -154,6 +154,15 @@ public class ChangesUtil { .filter(Objects::nonNull); } + @NotNull + public static Stream getAfterRevisionsFiles(@NotNull Stream changes) { + return changes + .map(ChangesUtil::getAfterPath) + .filter(Objects::nonNull) + .map(FilePath::getVirtualFile) + .filter(Objects::nonNull); + } + /** * @deprecated Use {@link ChangesUtil#getFiles(Stream)}. */ diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/SpecificFilesViewDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/SpecificFilesViewDialog.java index 94da32763365..ad1e216febdb 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/SpecificFilesViewDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/SpecificFilesViewDialog.java @@ -64,7 +64,7 @@ abstract class SpecificFilesViewDialog extends DialogWrapper { public void calcData(DataKey key, DataSink sink) { super.calcData(key, sink); if (shownDataKey.is(key.getName())) { - sink.put(shownDataKey, getSelectedFiles()); + sink.put(shownDataKey, getSelectedVirtualFiles(null)); } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesListView.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesListView.java index 2c51154d5fd0..1102b5a52cf6 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesListView.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesListView.java @@ -52,6 +52,7 @@ import java.util.List; import java.util.Objects; import java.util.stream.Stream; +import static com.intellij.openapi.vcs.changes.ChangesUtil.getAfterRevisionsFiles; import static com.intellij.openapi.vcs.changes.ChangesUtil.getFiles; import static com.intellij.openapi.vcs.changes.ui.ChangesBrowserNode.*; import static com.intellij.util.containers.UtilKt.getIfSingle; @@ -156,13 +157,13 @@ public class ChangesListView extends Tree implements TypeSafeDataProvider, DnDAw sink.put(VcsDataKeys.VIRTUAL_FILE_STREAM, getSelectedFiles()); } else if (key == CommonDataKeys.NAVIGATABLE) { - VirtualFile file = getIfSingle(getSelectedFiles()); + VirtualFile file = getIfSingle(getNavigatableFiles()); if (file != null && !file.isDirectory()) { sink.put(CommonDataKeys.NAVIGATABLE, new OpenFileDescriptor(myProject, file, 0)); } } else if (key == CommonDataKeys.NAVIGATABLE_ARRAY) { - sink.put(CommonDataKeys.NAVIGATABLE_ARRAY, ChangesUtil.getNavigatableArray(myProject, getSelectedFiles())); + sink.put(CommonDataKeys.NAVIGATABLE_ARRAY, ChangesUtil.getNavigatableArray(myProject, getNavigatableFiles())); } else if (key == PlatformDataKeys.DELETE_ELEMENT_PROVIDER) { if (getSelectionObjectsStream().anyMatch(userObject -> !(userObject instanceof ChangeList))) { @@ -236,7 +237,7 @@ public class ChangesListView extends Tree implements TypeSafeDataProvider, DnDAw } @NotNull - private Stream getSelectedVirtualFiles(@Nullable Object tag) { + protected Stream getSelectedVirtualFiles(@Nullable Object tag) { return getSelectionNodesStream(tag) .flatMap(ChangesBrowserNode::getFilesUnderStream) .distinct(); @@ -317,7 +318,15 @@ public class ChangesListView extends Tree implements TypeSafeDataProvider, DnDAw } @NotNull - protected Stream getSelectedFiles() { + private Stream getSelectedFiles() { + return Stream.concat( + getAfterRevisionsFiles(getSelectedChanges()), + getSelectedVirtualFiles(null) + ).distinct(); + } + + @NotNull + private Stream getNavigatableFiles() { return Stream.concat( getFiles(getSelectedChanges()), getSelectedVirtualFiles(null) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/OldChangesBrowserBase.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/OldChangesBrowserBase.java index fd1818497382..608d44285dc3 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/OldChangesBrowserBase.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/OldChangesBrowserBase.java @@ -57,8 +57,7 @@ import java.util.*; import java.util.List; import java.util.stream.Stream; -import static com.intellij.openapi.vcs.changes.ChangesUtil.getFiles; -import static com.intellij.openapi.vcs.changes.ChangesUtil.getNavigatableArray; +import static com.intellij.openapi.vcs.changes.ChangesUtil.*; import static com.intellij.openapi.vcs.changes.ui.ChangesBrowserNode.UNVERSIONED_FILES_TAG; import static com.intellij.openapi.vcs.changes.ui.ChangesListView.*; @@ -222,7 +221,7 @@ public abstract class OldChangesBrowserBase extends JPanel implements TypeSaf sink.put(CommonDataKeys.VIRTUAL_FILE_ARRAY, getSelectedFiles().toArray(VirtualFile[]::new)); } else if (key == CommonDataKeys.NAVIGATABLE_ARRAY) { - sink.put(CommonDataKeys.NAVIGATABLE_ARRAY, getNavigatableArray(myProject, getSelectedFiles())); + sink.put(CommonDataKeys.NAVIGATABLE_ARRAY, getNavigatableArray(myProject, getNavigatableFiles())); } else if (VcsDataKeys.IO_FILE_ARRAY.equals(key)) { sink.put(VcsDataKeys.IO_FILE_ARRAY, getSelectedIoFiles()); @@ -438,6 +437,14 @@ public abstract class OldChangesBrowserBase extends JPanel implements TypeSaf @NotNull protected Stream getSelectedFiles() { + return Stream.concat( + getAfterRevisionsFiles(getSelectedChanges().stream()), + getVirtualFiles(myViewer.getSelectionPaths(), null) + ).distinct(); + } + + @NotNull + protected Stream getNavigatableFiles() { return Stream.concat( getFiles(getSelectedChanges().stream()), getVirtualFiles(myViewer.getSelectionPaths(), null)