From 59b8a834d4d07abf83fabc6a450f4215a8ea0ae1 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Tue, 17 Apr 2012 19:53:30 +0400 Subject: [PATCH] IDEA-84080 Ability to execute Mac app bundles as external tools --- .../lang-impl/src/com/intellij/tools/Tool.java | 11 ++++++++++- .../src/com/intellij/tools/ToolEditorDialog.java | 4 ++-- .../fileChooser/FileChooserDescriptor.java | 2 +- .../FileChooserDescriptorFactory.java | 16 ++++++++++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/tools/Tool.java b/platform/lang-impl/src/com/intellij/tools/Tool.java index 1ad5476014d3..cfa2d8426c74 100644 --- a/platform/lang-impl/src/com/intellij/tools/Tool.java +++ b/platform/lang-impl/src/com/intellij/tools/Tool.java @@ -34,6 +34,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import org.jetbrains.annotations.NonNls; +import java.io.File; import java.util.ArrayList; public class Tool implements SchemeElement { @@ -300,7 +301,15 @@ public class Tool implements SchemeElement { commandLine.setWorkDirectory(MacroManager.getInstance().expandMacrosInString(workingDir, false, dataContext)); exePath = MacroManager.getInstance().expandMacrosInString(exePath, false, dataContext); if (exePath == null) return null; - commandLine.setExePath(exePath); + + File exeFile = new File(exePath); + if (exeFile.isDirectory() && exeFile.getName().endsWith(".app")) { + commandLine.setExePath("open"); + commandLine.getParametersList().prependAll("-a", exePath); + } + else { + commandLine.setExePath(exePath); + } } catch (Macro.ExecutionCancelledException e) { return null; diff --git a/platform/lang-impl/src/com/intellij/tools/ToolEditorDialog.java b/platform/lang-impl/src/com/intellij/tools/ToolEditorDialog.java index 7c4055402403..e929f1b7fad9 100644 --- a/platform/lang-impl/src/com/intellij/tools/ToolEditorDialog.java +++ b/platform/lang-impl/src/com/intellij/tools/ToolEditorDialog.java @@ -196,7 +196,7 @@ public class ToolEditorDialog extends DialogWrapper { browseCommandButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { - FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor(); + FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileOrExecutableAppDescriptor(); VirtualFile file = FileChooser.chooseFile(descriptor, myProject, null); if (file != null) { myTfCommand.setText(file.getPresentableUrl()); @@ -463,4 +463,4 @@ public class ToolEditorDialog extends DialogWrapper { if (s.length() == 0) return null; return s.replace('/', File.separatorChar); } -} \ No newline at end of file +} diff --git a/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptor.java b/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptor.java index d69b4c68c2bb..ea6067421823 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptor.java +++ b/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptor.java @@ -206,7 +206,7 @@ public class FileChooserDescriptor implements Cloneable { @Nullable public final VirtualFile getFileToSelect(VirtualFile file) { - if (file.isDirectory() && myChooseFolders) { + if (file.isDirectory() && (myChooseFolders || isFileSelectable(file))) { return file; } boolean isJar = file.getFileType() == FileTypes.ARCHIVE; diff --git a/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptorFactory.java b/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptorFactory.java index 2696d8904ceb..057ca54e3b4b 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptorFactory.java +++ b/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptorFactory.java @@ -16,6 +16,7 @@ package com.intellij.openapi.fileChooser; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.UIBundle; @@ -39,6 +40,21 @@ public class FileChooserDescriptorFactory { return new FileChooserDescriptor(true, false, false, false, false, false); } + public static FileChooserDescriptor createSingleFileOrExecutableAppDescriptor() { + return new FileChooserDescriptor(true, false, false, false, false, false) { + @Override + public boolean isFileSelectable(VirtualFile file) { + if (super.isFileSelectable(file)) return true; + + if (SystemInfo.isMac && file.isDirectory() && "app".equals(file.getExtension())) { + return true; + } + + return false; + } + }; + } + public static FileChooserDescriptor createSingleLocalFileDescriptor() { return new FileChooserDescriptor(true, true, true, true, false, false); }