From 4345c5aab6896285fd478f06455a6725e622cd3d Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Wed, 11 Oct 2017 13:48:07 +0300 Subject: [PATCH] diff: try to guess project in DiffApplication --- .../applications/ApplicationStarterBase.java | 28 +++++++++++++++++-- .../diff/applications/DiffApplication.java | 3 +- .../diff/applications/MergeApplication.java | 3 +- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/platform/diff-impl/src/com/intellij/diff/applications/ApplicationStarterBase.java b/platform/diff-impl/src/com/intellij/diff/applications/ApplicationStarterBase.java index e7acd707d3a5..76c9afa286c7 100644 --- a/platform/diff-impl/src/com/intellij/diff/applications/ApplicationStarterBase.java +++ b/platform/diff-impl/src/com/intellij/diff/applications/ApplicationStarterBase.java @@ -20,19 +20,25 @@ import com.intellij.openapi.application.ApplicationStarterEx; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectLocator; +import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.wm.WindowManager; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.HashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.*; import java.io.File; -import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Set; @SuppressWarnings({"UseOfSystemOutOrSystemErr", "CallToPrintStackTrace"}) public abstract class ApplicationStarterBase extends ApplicationStarterEx { @@ -151,7 +157,23 @@ public abstract class ApplicationStarterBase extends ApplicationStarterEx { } @Nullable - protected Project getProject() { - return null; // TODO: try to guess project + protected static Project guessProject(@NotNull List files) { + Set projects = new HashSet<>(); + for (VirtualFile file : files) { + projects.addAll(ProjectLocator.getInstance().getProjectsForFile(file)); + } + + if (projects.isEmpty()) { + ContainerUtil.addAll(projects, ProjectManager.getInstance().getOpenProjects()); + } + if (projects.isEmpty()) return null; + + Project activeProject = ContainerUtil.find(projects, project -> { + JFrame frame = WindowManager.getInstance().getFrame(project); + return frame != null && frame.isActive(); + }); + if (activeProject != null) return activeProject; + + return projects.iterator().next(); } } diff --git a/platform/diff-impl/src/com/intellij/diff/applications/DiffApplication.java b/platform/diff-impl/src/com/intellij/diff/applications/DiffApplication.java index 6be49b7d730d..91ae31ea61f0 100644 --- a/platform/diff-impl/src/com/intellij/diff/applications/DiffApplication.java +++ b/platform/diff-impl/src/com/intellij/diff/applications/DiffApplication.java @@ -50,10 +50,9 @@ public class DiffApplication extends ApplicationStarterBase { @Override public void processCommand(@NotNull String[] args, @Nullable String currentDirectory) throws Exception { - Project project = getProject(); - List filePaths = Arrays.asList(args).subList(1, args.length); List files = findFiles(filePaths, currentDirectory); + Project project = guessProject(files); DiffRequest request; if (files.size() == 3) { diff --git a/platform/diff-impl/src/com/intellij/diff/applications/MergeApplication.java b/platform/diff-impl/src/com/intellij/diff/applications/MergeApplication.java index 1605867c3a43..fe5078d87d9d 100644 --- a/platform/diff-impl/src/com/intellij/diff/applications/MergeApplication.java +++ b/platform/diff-impl/src/com/intellij/diff/applications/MergeApplication.java @@ -52,10 +52,9 @@ public class MergeApplication extends ApplicationStarterBase { @Override public void processCommand(@NotNull String[] args, @Nullable String currentDirectory) throws Exception { - Project project = getProject(); - List filePaths = Arrays.asList(args).subList(1, args.length); List files = findFiles(filePaths, currentDirectory); + Project project = guessProject(files); List contents = ContainerUtil.list(files.get(0), files.get(2), files.get(1)); // left, base, right VirtualFile outputFile = files.get(files.size() - 1);