JavaFX Scene Builder integration

This commit is contained in:
Alexander Lobas
2014-02-03 14:55:52 +04:00
parent f0facb34db
commit 9eae97504c
2 changed files with 8 additions and 121 deletions
@@ -57,6 +57,7 @@
<actions>
<action class="org.jetbrains.plugins.javaFX.actions.OpenInSceneBuilderAction" id="OpenInSceneBuilder" text="Open In SceneBuilder">
<add-to-group group-id="EditorPopupMenu" anchor="last"/>
<add-to-group group-id="EditorTabPopupMenu" anchor="last"/>
<add-to-group group-id="ProjectViewPopupMenu" anchor="last"/>
</action>
</actions>
@@ -17,35 +17,18 @@ package org.jetbrains.plugins.javaFX.actions;
import com.intellij.CommonBundle;
import com.intellij.execution.configurations.GeneralCommandLine;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.execution.configurations.PathEnvironmentVariableUtil;
import com.intellij.execution.process.OSProcessHandler;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.registry.Registry;
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.Nullable;
import org.jetbrains.plugins.javaFX.JavaFxSettings;
import org.jetbrains.plugins.javaFX.JavaFxSettingsConfigurable;
import org.jetbrains.plugins.javaFX.fxml.JavaFxFileTypeFactory;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.jetbrains.plugins.javaFX.sceneBuilder.SceneBuilderInfo;
/**
* User: anna
@@ -53,84 +36,21 @@ import java.util.List;
*/
public class OpenInSceneBuilderAction extends AnAction {
private static final Logger LOG = Logger.getInstance("#" + OpenInSceneBuilderAction.class.getName());
public static final String ORACLE = "Oracle";
@Override
public void actionPerformed(AnActionEvent e) {
final VirtualFile virtualFile = e.getData(CommonDataKeys.VIRTUAL_FILE);
LOG.assertTrue(virtualFile != null);
final String path = virtualFile.getPath();
final JavaFxSettings settings = JavaFxSettings.getInstance();
String pathToSceneBuilder = settings.getPathToSceneBuilder();
if (StringUtil.isEmptyOrSpaces(settings.getPathToSceneBuilder())){
final VirtualFile sceneBuilderFile = FileChooser.chooseFile(JavaFxSettingsConfigurable.createSceneBuilderDescriptor(), e.getProject(), getPredefinedPath());
if (sceneBuilderFile == null) return;
pathToSceneBuilder = sceneBuilderFile.getPath();
settings.setPathToSceneBuilder(FileUtil.toSystemIndependentName(pathToSceneBuilder));
}
final Project project = getEventProject(e);
if (project != null && !Registry.is("scene.builder.start.executable", true)) {
final Module module = ModuleUtilCore.findModuleForFile(virtualFile, project);
if (module != null) {
try {
final JavaParameters javaParameters = new JavaParameters();
javaParameters.configureByModule(module, JavaParameters.JDK_AND_CLASSES);
final 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 libFile = new File(sceneBuilderRoot, "lib");
if (libFile.isDirectory()) {
sceneBuilderLibsFile = libFile;
}
else {
final File appFile = new File(sceneBuilderRootDir, "app");
sceneBuilderLibsFile = appFile.isDirectory() ? appFile : null;
}
}
else {
sceneBuilderLibsFile = null;
}
} else {
sceneBuilderLibsFile = new File(new File(pathToSceneBuilder).getParent(), "app");
}
if (sceneBuilderLibsFile != null) {
final File[] sceneBuilderLibs = sceneBuilderLibsFile.listFiles();
if (sceneBuilderLibs != null) {
for (File jarFile : sceneBuilderLibs) {
javaParameters.getClassPath().add(jarFile.getPath());
}
javaParameters.setMainClass("com.oracle.javafx.authoring.Main");
javaParameters.getProgramParametersList().add(path);
final OSProcessHandler processHandler = javaParameters.createOSProcessHandler();
final String commandLine = processHandler.getCommandLine();
LOG.info("scene builder command line: " + commandLine);
processHandler.startNotify();
return;
}
}
}
catch (Throwable ex) {
LOG.info(ex);
}
}
final SceneBuilderInfo info = SceneBuilderInfo.get(project, true);
if (info == SceneBuilderInfo.EMPTY) {
return;
}
String pathToSceneBuilder = info.path;
if (SystemInfo.isMac) {
pathToSceneBuilder += "/Contents/MacOS/scenebuilder-launcher.sh";
}
@@ -152,45 +72,11 @@ public class OpenInSceneBuilderAction extends AnAction {
presentation.setEnabled(false);
presentation.setVisible(false);
final VirtualFile virtualFile = e.getData(CommonDataKeys.VIRTUAL_FILE);
if (virtualFile != null &&
if (virtualFile != null &&
JavaFxFileTypeFactory.isFxml(virtualFile) &&
e.getProject() != null) {
presentation.setEnabled(true);
presentation.setVisible(true);
}
}
@Nullable
private static VirtualFile getPredefinedPath() {
String path = null;
if (SystemInfo.isWindows) {
final String sb11 = File.separator + "JavaFX Scene Builder 1.1" + File.separator + "JavaFX Scene Builder 1.1.exe";
final String sb10 = File.separator + "JavaFX Scene Builder 1.0" + File.separator + "bin" + File.separator + "scenebuilder.exe";
final List<String> suspiciousPaths = new ArrayList<String>();
final String programFiles = "C:\\Program Files";
fillPaths(programFiles, sb11, sb10, suspiciousPaths);
fillPaths(programFiles + " (x86)", sb11, sb10, suspiciousPaths);
final File sb = FileUtil.findFirstThatExist(ArrayUtil.toStringArray(suspiciousPaths));
if (sb != null) {
path = sb.getPath();
}
}
else if (SystemInfo.isMac) {
final File sb = FileUtil.findFirstThatExist("/Applications/JavaFX Scene Builder 1.1.app",
"/Applications/JavaFX Scene Builder 1.0.app");
if (sb != null) {
path = sb.getPath();
}
}
else if (SystemInfo.isUnix) {
path = "/opt/JavaFXSceneBuilder1.1/JavaFXSceneBuilder1.1";
}
return path != null ? LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(path)) : null;
}
private static void fillPaths(String programFilesPath, String sb11, String sb10, List<String> suspiciousPaths) {
suspiciousPaths.add(new File(programFilesPath, ORACLE).getPath() + sb11);
suspiciousPaths.add(new File(programFilesPath, ORACLE).getPath() + sb10);
}
}