Configure JS library properly
This commit is contained in:
@@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
+3
-6
@@ -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;
|
||||
|
||||
+38
-3
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user