From 48b75ae491c36afdee2e4d1f31f4ec5e75a707a2 Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Wed, 13 Apr 2016 18:25:53 +0300 Subject: [PATCH] Javafx: Support application icon in JavaFX self-contained app deployment - use absolute path when building artifact and relative path when generating Ant build file (IDEA-134616) --- .../packaging/AbstractJavaFxPackager.java | 2 +- .../javaFX/packaging/JavaFxAntGenerator.java | 27 ++++---- .../packaging/JavaFxApplicationIcons.java | 12 ++-- .../javaFX/packaging/JavaFxAntTaskTest.java | 65 ++++++++++++++++++- .../ant/JavaFxChunkBuildExtension.java | 2 +- 5 files changed, 87 insertions(+), 21 deletions(-) diff --git a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/AbstractJavaFxPackager.java b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/AbstractJavaFxPackager.java index e2db2ff6d191..212e46af6ffe 100644 --- a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/AbstractJavaFxPackager.java +++ b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/AbstractJavaFxPackager.java @@ -104,7 +104,7 @@ public abstract class AbstractJavaFxPackager { buf.append(""); final String artifactFileName = getArtifactRootName(); final List tags = - JavaFxAntGenerator.createJarAndDeployTasks(this, artifactFileName, getArtifactName(), tempUnzippedArtifactOutput.getPath()); + JavaFxAntGenerator.createJarAndDeployTasks(this, artifactFileName, getArtifactName(), tempUnzippedArtifactOutput.getPath(), false); for (JavaFxAntGenerator.SimpleTag tag : tags) { tag.generate(buf); } diff --git a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxAntGenerator.java b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxAntGenerator.java index c4517c11de1c..214634b1e110 100644 --- a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxAntGenerator.java +++ b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxAntGenerator.java @@ -33,7 +33,8 @@ public class JavaFxAntGenerator { public static List createJarAndDeployTasks(AbstractJavaFxPackager packager, String artifactFileName, String artifactName, - String tempDirPath) { + String tempDirPath, + boolean isRelativeIconPath) { final String artifactFileNameWithoutExtension = FileUtil.getNameWithoutExtension(artifactFileName); final List topLevelTagsCollector = new ArrayList(); final String preloaderJar = packager.getPreloaderJar(); @@ -119,7 +120,7 @@ public class JavaFxAntGenerator { topLevelTagsCollector.add(createJarTag); final JavaFxPackagerConstants.NativeBundles bundle = packager.getNativeBundle(); - final SimpleTag iconTag = appendApplicationIconPath(topLevelTagsCollector, bundle, packager.getIcons()); + final SimpleTag iconTag = appendApplicationIconPath(topLevelTagsCollector, bundle, packager.getIcons(), isRelativeIconPath); //deploy task final SimpleTag deployTag = new SimpleTag("fx:deploy", @@ -155,32 +156,33 @@ public class JavaFxAntGenerator { private static SimpleTag appendApplicationIconPath(List topLevelTagsCollector, JavaFxPackagerConstants.NativeBundles bundle, - JavaFxApplicationIcons appIcons) { + JavaFxApplicationIcons appIcons, + boolean isRelativeIconPath) { boolean haveAppIcon = false; if (appIcons == null || bundle == null || appIcons.isEmpty()) return null; if (bundle.isOnLinux()) { - String iconPath = appIcons.getRelativeLinuxIcon(); + String iconPath = appIcons.getLinuxIcon(isRelativeIconPath); if (!StringUtil.isEmpty(iconPath)) { final SimpleTag and = new SimpleTag("and"); and.add(new SimpleTag("os", Couple.of("family", "unix"))); final SimpleTag not = new SimpleTag("not"); not.add(new SimpleTag("os", Couple.of("family", "mac"))); and.add(not); - appendIconPropertyTag(topLevelTagsCollector, iconPath, and); + appendIconPropertyTag(topLevelTagsCollector, iconPath, isRelativeIconPath, and); haveAppIcon = true; } } if (bundle.isOnMac()) { - String iconPath = appIcons.getRelativeMacIcon(); + String iconPath = appIcons.getMacIcon(isRelativeIconPath); if (!StringUtil.isEmpty(iconPath)) { - appendIconPropertyTag(topLevelTagsCollector, iconPath, new SimpleTag("os", Couple.of("family", "mac"))); + appendIconPropertyTag(topLevelTagsCollector, iconPath, isRelativeIconPath, new SimpleTag("os", Couple.of("family", "mac"))); haveAppIcon = true; } } if (bundle.isOnWindows()) { - String iconPath = appIcons.getRelativeWindowsIcon(); + String iconPath = appIcons.getWindowsIcon(isRelativeIconPath); if (!StringUtil.isEmpty(iconPath)) { - appendIconPropertyTag(topLevelTagsCollector, iconPath, new SimpleTag("os", Couple.of("family", "windows"))); + appendIconPropertyTag(topLevelTagsCollector, iconPath, isRelativeIconPath, new SimpleTag("os", Couple.of("family", "windows"))); haveAppIcon = true; } } @@ -190,10 +192,13 @@ public class JavaFxAntGenerator { return null; } - private static void appendIconPropertyTag(List tagsCollector, String iconPath, SimpleTag osFamily) { + private static void appendIconPropertyTag(List tagsCollector, + String iconPath, + boolean isRelativeIconPath, + SimpleTag osFamily) { final SimpleTag condition = new SimpleTag("condition", Couple.of("property", "app.icon.path"), - Couple.of("value", "${basedir}/" + iconPath)); + Couple.of("value", isRelativeIconPath ? "${basedir}/" + iconPath : iconPath)); condition.add(osFamily); tagsCollector.add(condition); } diff --git a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxApplicationIcons.java b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxApplicationIcons.java index ef77c89d89c0..89f1d69c6f51 100644 --- a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxApplicationIcons.java +++ b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxApplicationIcons.java @@ -17,8 +17,8 @@ public class JavaFxApplicationIcons { return myLinuxIcon; } - public String getRelativeLinuxIcon() { - return getRelativeIcon(myLinuxIcon); + public String getLinuxIcon(boolean isRelative) { + return isRelative ? getRelativeIcon(myLinuxIcon) : myLinuxIcon; } public void setLinuxIcon(String linuxIcon) { @@ -29,8 +29,8 @@ public class JavaFxApplicationIcons { return myMacIcon; } - public String getRelativeMacIcon() { - return getRelativeIcon(myMacIcon); + public String getMacIcon(boolean isRelative) { + return isRelative ? getRelativeIcon(myMacIcon) : myMacIcon; } public void setMacIcon(String macIcon) { @@ -41,8 +41,8 @@ public class JavaFxApplicationIcons { return myWindowsIcon; } - public String getRelativeWindowsIcon() { - return getRelativeIcon(myWindowsIcon); + public String getWindowsIcon(boolean isRelative) { + return isRelative ? getRelativeIcon(myWindowsIcon) : myWindowsIcon; } public void setWindowsIcon(String windowsIcon) { diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/packaging/JavaFxAntTaskTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/packaging/JavaFxAntTaskTest.java index 760f0ff641ba..5c22ce3d38b4 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/packaging/JavaFxAntTaskTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/packaging/JavaFxAntTaskTest.java @@ -16,6 +16,7 @@ package org.jetbrains.plugins.javaFX.packaging; import com.intellij.testFramework.UsefulTestCase; +import com.intellij.util.containers.ContainerUtil; import java.io.File; import java.util.Collections; @@ -32,6 +33,7 @@ public class JavaFxAntTaskTest extends UsefulTestCase{ private static final String PRELOADER_CLASS = "preloaderClass"; private static final String TITLE = "title"; private static final String ICONS = "icons"; + private static final String RELATIVE_PATH = "relativePath"; private static final String PRELOADER_JAR = "preloaderJar"; private static final String SIGNED = "signed"; @@ -143,7 +145,64 @@ public class JavaFxAntTaskTest extends UsefulTestCase{ "\n" + "\n" + "\n" + - "\n", Collections.singletonMap(ICONS, "app_icon.png,app_icon.icns,app_icon.ico")); + "\n", new ContainerUtil.ImmutableMapBuilder() + .put(ICONS, "/project_dir/app_icon.png,/project_dir/app_icon.icns,/project_dir/app_icon.ico,/project_dir") + .put(RELATIVE_PATH, "true") + .build()); + } + + public void testJarDeployIconAbsolute() throws Exception { + doTest("\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n", new ContainerUtil.ImmutableMapBuilder() + .put(ICONS, "/project_dir/app_icon.png,/project_dir/app_icon.icns,/project_dir/app_icon.ico,/project_dir") + .put(RELATIVE_PATH, "false") + .build()); } public void testJarDeploySigned() throws Exception { @@ -229,6 +288,7 @@ public class JavaFxAntTaskTest extends UsefulTestCase{ packager.setTitle(title); } + boolean isRelativeIconPath = Boolean.valueOf(options.get(RELATIVE_PATH)); final String icon = options.get(ICONS); if (icon != null) { final String[] icons = icon.split(","); @@ -236,6 +296,7 @@ public class JavaFxAntTaskTest extends UsefulTestCase{ appIcons.setLinuxIcon(icons[0]); appIcons.setMacIcon(icons[1]); appIcons.setWindowsIcon(icons[2]); + appIcons.setBaseDir(icons[3]); packager.setIcons(appIcons); packager.setNativeBundle(JavaFxPackagerConstants.NativeBundles.all); } @@ -255,7 +316,7 @@ public class JavaFxAntTaskTest extends UsefulTestCase{ } final List temp = JavaFxAntGenerator - .createJarAndDeployTasks(packager, artifactFileName, artifactName, "temp"); + .createJarAndDeployTasks(packager, artifactFileName, artifactName, "temp", isRelativeIconPath); final StringBuilder buf = new StringBuilder(); for (JavaFxAntGenerator.SimpleTag tag : temp) { tag.generate(buf); diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/ant/JavaFxChunkBuildExtension.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/ant/JavaFxChunkBuildExtension.java index 6228c8ce9db6..19372ca07d19 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/ant/JavaFxChunkBuildExtension.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/ant/JavaFxChunkBuildExtension.java @@ -146,7 +146,7 @@ public class JavaFxChunkBuildExtension extends ChunkBuildExtension { protected void registerJavaFxPackagerError(String message) {} }; final List tags = - JavaFxAntGenerator.createJarAndDeployTasks(javaFxPackager, artifactFileName, artifact.getName(), tempDirPath); + JavaFxAntGenerator.createJarAndDeployTasks(javaFxPackager, artifactFileName, artifact.getName(), tempDirPath, true); for (JavaFxAntGenerator.SimpleTag tag : tags) { buildTags(generator, tag); }