From 7cdfae190b2362081609d1c566e37a1d96b780bd Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 20 Feb 2013 14:22:10 +0400 Subject: [PATCH] Configure JS library properly --- .../JetJavaRuntimeLibraryDescription.java | 69 ++++++++++----- ...JetJavaScriptFrameworkSupportProvider.java | 1 + .../JetJavaScriptLibraryDescription.java | 83 +++++++++---------- ...JavaScriptHeadersPresentationProvider.java | 9 +- .../{CopyFileUtil.java => FileUIUtils.java} | 41 ++++++++- 5 files changed, 128 insertions(+), 75 deletions(-) rename idea/src/org/jetbrains/jet/plugin/framework/ui/{CopyFileUtil.java => FileUIUtils.java} (54%) diff --git a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaRuntimeLibraryDescription.java b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaRuntimeLibraryDescription.java index 9f4a99fe71e..4143bff1095 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaRuntimeLibraryDescription.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaRuntimeLibraryDescription.java @@ -18,25 +18,32 @@ package org.jetbrains.jet.plugin.framework; import com.google.common.collect.Sets; import com.intellij.framework.library.LibraryVersionProperties; -import com.intellij.openapi.fileChooser.FileChooser; -import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.LibraryKind; import com.intellij.openapi.roots.libraries.NewLibraryConfiguration; import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription; import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.plugin.framework.ui.FileUIUtils; import org.jetbrains.jet.plugin.framework.ui.FrameworkSourcePanel; import org.jetbrains.jet.plugin.versions.KotlinRuntimeLibraryUtil; +import org.jetbrains.jet.utils.PathUtil; import javax.management.openmbean.InvalidOpenTypeException; import javax.swing.*; +import java.io.File; +import java.io.IOException; import java.util.Set; public class JetJavaRuntimeLibraryDescription extends CustomLibraryDescription { public static final LibraryKind KOTLIN_JAVA_RUNTIME_KIND = LibraryKind.create("kotlin-java-runtime"); + + private static final String JAVA_RUNTIME_LIBRARY_CREATION = "Java Runtime Library Creation"; + private final FrameworkSourcePanel frameworkSourcePanel; public JetJavaRuntimeLibraryDescription(FrameworkSourcePanel frameworkSourcePanel) { @@ -54,30 +61,46 @@ public class JetJavaRuntimeLibraryDescription extends CustomLibraryDescription { @Override public NewLibraryConfiguration createNewLibrary(@NotNull JComponent parentComponent, @Nullable VirtualFile contextDirectory) { if (frameworkSourcePanel.isConfigureFromBundled()) { - final FileChooserDescriptor descriptor = new FileChooserDescriptor(false, true, false, false, false, false); - - descriptor.setTitle("Select Folder"); - descriptor.setDescription("Select folder where bundled Kotlin java runtime library should be copied"); - - final VirtualFile[] files = FileChooser.chooseFiles(descriptor, parentComponent, null, contextDirectory); - if (files.length == 0) { - return null; - } - - assert files.length == 1: "Only one folder is expected"; - - final VirtualFile directory = files[0]; - assert directory.isDirectory(); - - return new NewLibraryConfiguration(KotlinRuntimeLibraryUtil.LIBRARY_NAME, getDownloadableLibraryType(), new LibraryVersionProperties()) { - @Override - public void addRoots(@NotNull LibraryEditor editor) { - editor.addRoot(directory.getUrl() + "/" + KotlinRuntimeLibraryUtil.KOTLIN_RUNTIME_JAR, OrderRootType.CLASSES); - } - }; + return createFromPlugin(parentComponent, contextDirectory); } else { throw new InvalidOpenTypeException("Isn't supported yet"); } } + + private NewLibraryConfiguration createFromPlugin(JComponent parentComponent, VirtualFile contextDirectory) { + File runtimePath = PathUtil.getKotlinPathsForIdeaPlugin().getRuntimePath(); + + if (!runtimePath.exists()) { + Messages.showErrorDialog("Java Runtime library was not found. Make sure plugin is installed properly.", + JAVA_RUNTIME_LIBRARY_CREATION); + return null; + } + + final VirtualFile directory = FileUIUtils.selectCopyToDirectory( + "Select folder where bundled Kotlin java runtime library should be copied", + parentComponent, contextDirectory); + + if (directory == null) { + return null; + } + + final File targetFile; + try { + targetFile = FileUIUtils.copyWithOverwriteDialog(directory, runtimePath); + } + catch (IOException e) { + Messages.showErrorDialog("Error during file copy", JAVA_RUNTIME_LIBRARY_CREATION); + return null; + } + + return new NewLibraryConfiguration( + KotlinRuntimeLibraryUtil.LIBRARY_NAME, getDownloadableLibraryType(), new LibraryVersionProperties()) { + @Override + public void addRoots(@NotNull LibraryEditor editor) { + editor.addRoot(VfsUtil.getUrlForLibraryRoot(targetFile), OrderRootType.CLASSES); + editor.addRoot(VfsUtil.getUrlForLibraryRoot(targetFile) + "src", OrderRootType.SOURCES); + } + }; + } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaScriptFrameworkSupportProvider.java b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaScriptFrameworkSupportProvider.java index c8dedb0696e..c4c0becd21a 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaScriptFrameworkSupportProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaScriptFrameworkSupportProvider.java @@ -72,6 +72,7 @@ public class JetJavaScriptFrameworkSupportProvider extends FrameworkSupportInMod @NotNull Module module, @NotNull ModifiableRootModel rootModel, @NotNull ModifiableModelsProvider modifiableModelsProvider) { + } private FrameworkSourcePanel getConfigurationPanel() { diff --git a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaScriptLibraryDescription.java b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaScriptLibraryDescription.java index 9808f286aea..f36cd1023d6 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaScriptLibraryDescription.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaScriptLibraryDescription.java @@ -18,20 +18,18 @@ package org.jetbrains.jet.plugin.framework; import com.google.common.collect.Sets; import com.intellij.framework.library.LibraryVersionProperties; -import com.intellij.openapi.fileChooser.FileChooser; -import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.LibraryKind; import com.intellij.openapi.roots.libraries.NewLibraryConfiguration; import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription; import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.plugin.framework.ui.FileUIUtils; import org.jetbrains.jet.plugin.framework.ui.FrameworkSourcePanel; -import org.jetbrains.jet.plugin.versions.KotlinRuntimeLibraryUtil; import org.jetbrains.jet.utils.PathUtil; import javax.swing.*; @@ -42,6 +40,8 @@ import java.util.Set; public class JetJavaScriptLibraryDescription extends CustomLibraryDescription { public static final LibraryKind KOTLIN_JAVASCRIPT_KIND = LibraryKind.create("kotlin-js-stdlib"); + private static final String JAVA_SCRIPT_LIBRARY_CREATION = "JavaScript Library Creation"; + private final FrameworkSourcePanel configurationPanel; public JetJavaScriptLibraryDescription(FrameworkSourcePanel configurationPanel) { @@ -58,47 +58,44 @@ public class JetJavaScriptLibraryDescription extends CustomLibraryDescription { @Override public NewLibraryConfiguration createNewLibrary(@NotNull JComponent parentComponent, @Nullable VirtualFile contextDirectory) { if (configurationPanel.isConfigureFromBundled()) { - // Select folder where to copy bundled library - final FileChooserDescriptor descriptor = new FileChooserDescriptor(false, true, false, false, false, false); - descriptor.setTitle("Select Folder"); - descriptor.setDescription("Select folder where bundled runtime should be placed"); - - final VirtualFile[] files = FileChooser.chooseFiles(descriptor, parentComponent, null, contextDirectory); - if (files.length == 0) { - return null; - } - - assert files.length == 1: "Only one folder is expected"; - - final VirtualFile directory = files[0]; - assert directory.isDirectory(); - - File runtimePath = PathUtil.getKotlinPathsForIdeaPlugin().getRuntimePath(); - if (!runtimePath.exists()) { - return null; - } - - File targetJar = new File(com.intellij.util.PathUtil.getLocalPath(directory), KotlinRuntimeLibraryUtil.KOTLIN_RUNTIME_JAR); - try { - FileUtil.copy(runtimePath, targetJar); - VirtualFile jarVfs = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(targetJar); - if (jarVfs != null) { - jarVfs.refresh(false, false); - } - } - catch (IOException e) { - throw new RuntimeException(e); - } - - return new NewLibraryConfiguration(KotlinRuntimeLibraryUtil.LIBRARY_NAME, getDownloadableLibraryType(), new LibraryVersionProperties()) { - @Override - public void addRoots(@NotNull LibraryEditor editor) { - editor.addRoot(directory.getUrl() + "/" + KotlinRuntimeLibraryUtil.KOTLIN_RUNTIME_JAR, OrderRootType.CLASSES); - } - }; + return createFromPlugin(parentComponent, contextDirectory); } else { throw new IllegalStateException("Feature isn't ready yet"); } } + + private NewLibraryConfiguration createFromPlugin(JComponent parentComponent, VirtualFile contextDirectory) { + File runtimePath = PathUtil.getKotlinPathsForIdeaPlugin().getJsLibJarPath(); + + if (!runtimePath.exists()) { + Messages.showErrorDialog("JavaScript standard library was not found. Make sure plugin is installed properly.", + JAVA_SCRIPT_LIBRARY_CREATION); + return null; + } + + final VirtualFile directory = FileUIUtils.selectCopyToDirectory( + "Select folder where Kotlin JavaScript header should be copied", + parentComponent, contextDirectory); + + if (directory == null) { + return null; + } + + final File targetFile; + try { + targetFile = FileUIUtils.copyWithOverwriteDialog(directory, runtimePath); + } + catch (IOException e) { + Messages.showErrorDialog("Error during file copy", JAVA_SCRIPT_LIBRARY_CREATION); + return null; + } + + return new NewLibraryConfiguration(PathUtil.JS_LIB_JAR_NAME, getDownloadableLibraryType(), new LibraryVersionProperties()) { + @Override + public void addRoots(@NotNull LibraryEditor editor) { + editor.addRoot(VfsUtil.getUrlForLibraryRoot(targetFile), OrderRootType.SOURCES); + } + }; + } } diff --git a/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaScriptHeadersPresentationProvider.java b/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaScriptHeadersPresentationProvider.java index 12abb64278d..bae6d319dca 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaScriptHeadersPresentationProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaScriptHeadersPresentationProvider.java @@ -41,12 +41,9 @@ public class KotlinJavaScriptHeadersPresentationProvider extends LibraryPresenta @Nullable @Override public LibraryVersionProperties detect(@NotNull List classesRoots) { - for (VirtualFile root : classesRoots) { - // TODO: Better detection for headers library - if (root.getName().equals(PathUtil.JS_LIB_JS_NAME)) { - // TODO: Detect library version - return new LibraryVersionProperties("Unknown"); - } + // TODO: Ask for better api of library detection + if (classesRoots.isEmpty()) { + return new LibraryVersionProperties("Unknown"); } return null; diff --git a/idea/src/org/jetbrains/jet/plugin/framework/ui/CopyFileUtil.java b/idea/src/org/jetbrains/jet/plugin/framework/ui/FileUIUtils.java similarity index 54% rename from idea/src/org/jetbrains/jet/plugin/framework/ui/CopyFileUtil.java rename to idea/src/org/jetbrains/jet/plugin/framework/ui/FileUIUtils.java index 0a7ac7845f6..c0ed020fc1d 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/ui/CopyFileUtil.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/ui/FileUIUtils.java @@ -16,17 +16,22 @@ package org.jetbrains.jet.plugin.framework.ui; +import com.intellij.openapi.fileChooser.FileChooser; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.PathUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.io.File; import java.io.IOException; -public class CopyFileUtil { - private CopyFileUtil() { +public class FileUIUtils { + private FileUIUtils() { } @NotNull @@ -42,7 +47,7 @@ public class CopyFileUtil { } else { int replaceIfExist = Messages.showYesNoDialog( - String.format("File \"%s\" already exist in %s. Do you want to rewrite it?", targetFile.getName(), + String.format("File \"%s\" is already exist in %s.\nDo you want to rewrite it?", targetFile.getName(), folder.getAbsolutePath()), "Replace File", Messages.getWarningIcon()); @@ -55,4 +60,34 @@ public class CopyFileUtil { return targetFile; } + + public static File copyWithOverwriteDialog(@NotNull VirtualFile directory, @NotNull File path) throws IOException { + String localPath = PathUtil.getLocalPath(directory); + assert localPath != null; + + return copyWithOverwriteDialog(localPath, path); + } + + @Nullable + public static VirtualFile selectCopyToDirectory( + @NotNull String description, + @Nullable JComponent parentComponent, + @Nullable VirtualFile contextDirectory) { + final FileChooserDescriptor descriptor = new FileChooserDescriptor(false, true, false, false, false, false); + + descriptor.setTitle("Select Folder"); + descriptor.setDescription(description); + + final VirtualFile[] files = FileChooser.chooseFiles(descriptor, parentComponent, null, contextDirectory); + if (files.length == 0) { + return null; + } + + assert files.length == 1: "Only one folder is expected"; + + final VirtualFile directory = files[0]; + assert directory.isDirectory(); + + return directory; + } }