Configure JS library properly

This commit is contained in:
Nikolay Krasko
2013-02-20 14:22:10 +04:00
parent 057bdb7731
commit 7cdfae190b
5 changed files with 128 additions and 75 deletions
@@ -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);
}
};
}
}
@@ -72,6 +72,7 @@ public class JetJavaScriptFrameworkSupportProvider extends FrameworkSupportInMod
@NotNull Module module,
@NotNull ModifiableRootModel rootModel,
@NotNull ModifiableModelsProvider modifiableModelsProvider) {
}
private FrameworkSourcePanel getConfigurationPanel() {
@@ -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);
}
};
}
}
@@ -41,12 +41,9 @@ public class KotlinJavaScriptHeadersPresentationProvider extends LibraryPresenta
@Nullable
@Override
public LibraryVersionProperties detect(@NotNull List<VirtualFile> 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;
@@ -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;
}
}