blob: 4881afe73622e715f481dc2b1da383ac13d75923 [file] [log] [blame]
package org.jetbrains.plugins.javaFX.sceneBuilder;
import com.intellij.execution.configurations.PathEnvironmentVariableUtil;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.javaFX.JavaFxSettings;
import org.jetbrains.plugins.javaFX.JavaFxSettingsConfigurable;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* @author Alexander Lobas
*/
public class SceneBuilderInfo {
public static final SceneBuilderInfo EMPTY = new SceneBuilderInfo(null, null);
public final String path;
public final String libPath;
private SceneBuilderInfo(String path, String libPath) {
this.path = path;
this.libPath = libPath;
}
@Override
public boolean equals(Object object) {
if (object instanceof SceneBuilderInfo) {
SceneBuilderInfo info = (SceneBuilderInfo)object;
return Comparing.equal(path, info.path) && Comparing.equal(libPath, info.libPath);
}
return false;
}
@NotNull
public static SceneBuilderInfo get(Project project, boolean choosePathIfEmpty) {
JavaFxSettings settings = JavaFxSettings.getInstance();
String pathToSceneBuilder = settings.getPathToSceneBuilder();
if (StringUtil.isEmptyOrSpaces(pathToSceneBuilder)) {
VirtualFile sceneBuilderFile = null;
if (choosePathIfEmpty) {
sceneBuilderFile = FileChooser.chooseFile(JavaFxSettingsConfigurable.createSceneBuilderDescriptor(), project, getPredefinedPath());
}
if (sceneBuilderFile == null) {
return EMPTY;
}
pathToSceneBuilder = FileUtil.toSystemIndependentName(sceneBuilderFile.getPath());
settings.setPathToSceneBuilder(pathToSceneBuilder);
}
File sceneBuilderLibsFile;
if (SystemInfo.isMac) {
sceneBuilderLibsFile = new File(new File(pathToSceneBuilder, "Contents"), "Java");
}
else if (SystemInfo.isWindows) {
File sceneBuilderRoot = new File(pathToSceneBuilder);
File sceneBuilderRootDir = sceneBuilderRoot.getParentFile();
if (sceneBuilderRootDir == null) {
final File foundInPath = PathEnvironmentVariableUtil.findInPath(pathToSceneBuilder);
if (foundInPath != null) {
sceneBuilderRootDir = foundInPath.getParentFile();
}
}
sceneBuilderRoot = sceneBuilderRootDir != null ? sceneBuilderRootDir.getParentFile() : null;
if (sceneBuilderRoot != null) {
final File appFile = new File(sceneBuilderRootDir, "app");
if (appFile.isDirectory()) {
sceneBuilderLibsFile = appFile;
}
else {
final File libFile = new File(sceneBuilderRoot, "lib");
sceneBuilderLibsFile = libFile.isDirectory() ? libFile : null;
}
}
else {
sceneBuilderLibsFile = null;
}
}
else {
sceneBuilderLibsFile = new File(new File(pathToSceneBuilder).getParent(), "app");
}
if (sceneBuilderLibsFile != null && (!sceneBuilderLibsFile.exists() || !sceneBuilderLibsFile.isDirectory())) {
sceneBuilderLibsFile = null;
}
return new SceneBuilderInfo(pathToSceneBuilder, sceneBuilderLibsFile == null ? null : sceneBuilderLibsFile.getAbsolutePath());
}
@Nullable
private static VirtualFile getPredefinedPath() {
String path = null;
if (SystemInfo.isWindows) {
List<String> suspiciousPaths = new ArrayList<String>();
String programFiles = "C:\\Program Files";
String sb20 = "\\JavaFX Scene Builder 2.0\\JavaFX Scene Builder 2.0.exe";
String sb11 = "\\JavaFX Scene Builder 1.1\\JavaFX Scene Builder 1.1.exe";
String sb10 = "\\JavaFX Scene Builder 1.0\\bin\\scenebuilder.exe";
fillPaths(programFiles, suspiciousPaths, sb20, sb11, sb10);
fillPaths(programFiles + " (x86)", suspiciousPaths, sb20, sb11, sb10);
path = findFirstThatExist(ArrayUtil.toStringArray(suspiciousPaths));
}
else if (SystemInfo.isMac) {
path = findFirstThatExist("/Applications/JavaFX Scene Builder 2.0.app",
"/Applications/JavaFX Scene Builder 1.1.app",
"/Applications/JavaFX Scene Builder 1.0.app");
}
else if (SystemInfo.isUnix) {
path = findFirstThatExist("/opt/JavaFXSceneBuilder2.0/JavaFXSceneBuilder2.0", "/opt/JavaFXSceneBuilder1.1/JavaFXSceneBuilder1.1");
}
return path != null ? LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(path)) : null;
}
private static String findFirstThatExist(String... paths) {
File sb = FileUtil.findFirstThatExist(paths);
return sb == null ? null : sb.getPath();
}
private static void fillPaths(String programFilesPath, List<String> suspiciousPaths, String... sb) {
for (String sbi : sb) {
suspiciousPaths.add(new File(programFilesPath, "Oracle").getPath() + sbi);
}
}
}