From 055dcf697241c73d4ef2cfe46c60a90870f46449 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 11 Apr 2011 16:21:41 +0200 Subject: [PATCH] allow to open IDEA diff when IDEA is running (IDEA-67894) --- .../application/ApplicationStarter.java | 6 +++ .../application/ApplicationStarterEx.java | 26 +++++++++++ .../openapi/diff/DiffApplication.java | 46 ++++++++++++++----- .../intellij/ide/CommandLineProcessor.java | 16 ++++++- 4 files changed, 81 insertions(+), 13 deletions(-) create mode 100644 platform/platform-api/src/com/intellij/openapi/application/ApplicationStarterEx.java diff --git a/platform/platform-api/src/com/intellij/openapi/application/ApplicationStarter.java b/platform/platform-api/src/com/intellij/openapi/application/ApplicationStarter.java index ee0dcf8a72c3..cd0dd2aef263 100644 --- a/platform/platform-api/src/com/intellij/openapi/application/ApplicationStarter.java +++ b/platform/platform-api/src/com/intellij/openapi/application/ApplicationStarter.java @@ -15,14 +15,20 @@ */ package com.intellij.openapi.application; +import com.intellij.ExtensionPoints; +import com.intellij.openapi.extensions.ExtensionPointName; import org.jetbrains.annotations.NonNls; /** * Implementors of this interface declared via {@link com.intellij.ExtensionPoints#APPLICATION_STARTER} contribute a * command line application based on IDEA platform. + * * @author max + * @see ApplicationStarterEx */ public interface ApplicationStarter { + ExtensionPointName EP_NAME = ExtensionPointName.create(ExtensionPoints.APPLICATION_STARTER); + /** * Command line switch to start with this runner. For example return "inspect" if you'd like to start app with * idea.exe inspect cmdline. diff --git a/platform/platform-api/src/com/intellij/openapi/application/ApplicationStarterEx.java b/platform/platform-api/src/com/intellij/openapi/application/ApplicationStarterEx.java new file mode 100644 index 000000000000..f84fc1481547 --- /dev/null +++ b/platform/platform-api/src/com/intellij/openapi/application/ApplicationStarterEx.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2011 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.openapi.application; + +/** + * Implementors of this interface declared via {@link com.intellij.ExtensionPoints#APPLICATION_STARTER} are also capable of processing + * an external command line within a running IntelliJ Platform instance. + + * @author yole + */ +public interface ApplicationStarterEx extends ApplicationStarter { + void processExternalCommandLine(String[] args); +} diff --git a/platform/platform-api/src/com/intellij/openapi/diff/DiffApplication.java b/platform/platform-api/src/com/intellij/openapi/diff/DiffApplication.java index d4d59e0e8fae..eacb902b65e2 100644 --- a/platform/platform-api/src/com/intellij/openapi/diff/DiffApplication.java +++ b/platform/platform-api/src/com/intellij/openapi/diff/DiffApplication.java @@ -15,8 +15,10 @@ */ package com.intellij.openapi.diff; -import com.intellij.openapi.application.ApplicationStarter; +import com.intellij.openapi.application.ApplicationNamesInfo; +import com.intellij.openapi.application.ApplicationStarterEx; import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; @@ -26,7 +28,7 @@ import java.io.FileNotFoundException; /** * @author max */ -public class DiffApplication implements ApplicationStarter { +public class DiffApplication implements ApplicationStarterEx { public String getCommandName() { return "diff"; } @@ -37,21 +39,14 @@ public class DiffApplication implements ApplicationStarter { } } - private void printHelp() { + private static void printHelp() { System.err.println(DiffBundle.message("diff.application.usage.parameters.and.description")); System.exit(1); } public void main(String[] args) { try { - String path1 = args[1]; - String path2 = args[2]; - VirtualFile file1 = findFile(path1); - VirtualFile file2 = findFile(path2); - SimpleDiffRequest request = SimpleDiffRequest.compareFiles(file1, file2, null); - request.addHint(DiffTool.HINT_SHOW_MODAL_DIALOG); - DiffManager.getInstance().getIdeaDiffTool().show(request); - FileDocumentManager.getInstance().saveAllDocuments(); + processDiffCommand(args); } catch (FileNotFoundException e) { System.err.println(e.getMessage()); @@ -65,7 +60,34 @@ public class DiffApplication implements ApplicationStarter { } } - private VirtualFile findFile(final String path1) throws FileNotFoundException { + @Override + public void processExternalCommandLine(String[] args) { + if (args.length != 3) { + String productName = ApplicationNamesInfo.getInstance().getProductName(); + Messages.showMessageDialog("Usage: " + productName.toLowerCase() + " diff ", + "Diff", Messages.getInformationIcon()); + return; + } + try { + processDiffCommand(args); + } + catch(Exception e) { + Messages.showMessageDialog("Error showing diff: " + e.getMessage(), "Diff", Messages.getErrorIcon()); + } + } + + private static void processDiffCommand(String[] args) throws FileNotFoundException { + String path1 = args[1]; + String path2 = args[2]; + VirtualFile file1 = findFile(path1); + VirtualFile file2 = findFile(path2); + SimpleDiffRequest request = SimpleDiffRequest.compareFiles(file1, file2, null); + request.addHint(DiffTool.HINT_SHOW_MODAL_DIALOG); + DiffManager.getInstance().getIdeaDiffTool().show(request); + FileDocumentManager.getInstance().saveAllDocuments(); + } + + private static VirtualFile findFile(final String path1) throws FileNotFoundException { final VirtualFile vFile = LocalFileSystem.getInstance().findFileByIoFile(new File(path1)); if (vFile == null) { throw new FileNotFoundException(DiffBundle.message("cannot.file.file.error.message", path1)); diff --git a/platform/platform-impl/src/com/intellij/ide/CommandLineProcessor.java b/platform/platform-impl/src/com/intellij/ide/CommandLineProcessor.java index 1d70dc28241b..5cc3f7ee511f 100644 --- a/platform/platform-impl/src/com/intellij/ide/CommandLineProcessor.java +++ b/platform/platform-impl/src/com/intellij/ide/CommandLineProcessor.java @@ -18,7 +18,10 @@ package com.intellij.ide; import com.intellij.ide.highlighter.ProjectFileType; import com.intellij.ide.impl.ProjectUtil; import com.intellij.idea.StartupUtil; +import com.intellij.openapi.application.ApplicationStarter; +import com.intellij.openapi.application.ApplicationStarterEx; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; @@ -28,6 +31,7 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.platform.PlatformProjectOpenProcessor; import com.intellij.projectImport.ProjectOpenProcessor; +import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -118,7 +122,17 @@ public class CommandLineProcessor { } } LOG.info("-----"); - // TODO[yole] handle AppStarters here? + + if (args.size() > 0) { + String command = args.get(0); + for(ApplicationStarter starter: Extensions.getExtensions(ApplicationStarter.EP_NAME)) { + if (starter instanceof ApplicationStarterEx && command.equals(starter.getCommandName())) { + ((ApplicationStarterEx) starter).processExternalCommandLine(ArrayUtil.toStringArray(args)); + return null; + } + } + } + Project lastOpenedProject = null; int line = -1; for (int i = 0, argsSize = args.size(); i < argsSize; i++) {