diff --git a/community-resources/src/idea/IdeaApplicationInfo.xml b/community-resources/src/idea/IdeaApplicationInfo.xml
index 9341e4669861..c72056508335 100644
--- a/community-resources/src/idea/IdeaApplicationInfo.xml
+++ b/community-resources/src/idea/IdeaApplicationInfo.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/ApplicationInfoProperties.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/ApplicationInfoProperties.groovy
index 46c4efaad909..958adb74c866 100644
--- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/ApplicationInfoProperties.groovy
+++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/ApplicationInfoProperties.groovy
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2016 JetBrains s.r.o.
+ * Copyright 2000-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,6 +35,7 @@ class ApplicationInfoProperties {
*/
final String minorVersionMainPart
final String productName
+ final String edition
final String companyName
final String shortCompanyName
final boolean isEAP
@@ -49,6 +50,7 @@ class ApplicationInfoProperties {
fullVersionFormat = root.version.first().@full ?: "{0}.{1}"
shortProductName = root.names.first().@product
productName = root.names.first().@fullname
+ edition = root.names.first().@edition
companyName = root.company.first().@name
minorVersionMainPart = minorVersion.takeWhile { it != '.' }
isEAP = Boolean.parseBoolean(root.version.first().@eap)
@@ -61,6 +63,10 @@ class ApplicationInfoProperties {
MessageFormat.format(fullVersionFormat, majorVersion, minorVersion, microVersion, patchVersion)
}
+ String getProductNameWithEdition() {
+ edition != null ? productName + ' ' + edition : productName
+ }
+
//copy of ApplicationInfoImpl.shortenCompanyName
private static String shortenCompanyName(String name) {
return StringUtil.trimEnd(StringUtil.trimEnd(name, " s.r.o."), " Inc.");
diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/LinuxDistributionBuilder.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/LinuxDistributionBuilder.groovy
index 543d7e6d21bc..dfbca71ac95f 100644
--- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/LinuxDistributionBuilder.groovy
+++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/LinuxDistributionBuilder.groovy
@@ -197,7 +197,7 @@ class LinuxDistributionBuilder extends OsSpecificDistributionBuilder {
buildContext.messages.progress("Preparing files")
def desktopTemplate = "${buildContext.paths.communityHome}/platform/platform-resources/src/entry.desktop"
- def productName = buildContext.applicationInfo.productName
+ def productName = buildContext.applicationInfo.productNameWithEdition
buildContext.ant.copy(file: desktopTemplate, tofile: "${snapDir}/snap/gui/${customizer.snapName}.desktop") {
filterset(begintoken: '$', endtoken: '$') {
filter(token: "NAME", value: productName)
@@ -267,10 +267,11 @@ class LinuxDistributionBuilder extends OsSpecificDistributionBuilder {
// keep in sync with AppUIUtil#getFrameClass
private String getFrameClass() {
- def name = buildContext.applicationInfo.productName
+ String name = buildContext.applicationInfo.productNameWithEdition
.toLowerCase(Locale.US)
.replace(' ', '-')
- .replace("intellij-idea", "idea").replace("android-studio", "studio").replace("community-edition", "ce")
+ .replace("intellij-idea", "idea").replace("android-studio", "studio")
+ .replace("-community-edition", "-ce").replace("-ultimate-edition", "").replace("-professional-edition", "")
"jetbrains-" + name
}
}
\ No newline at end of file
diff --git a/platform/core-api/src/com/intellij/openapi/application/ApplicationNamesInfo.java b/platform/core-api/src/com/intellij/openapi/application/ApplicationNamesInfo.java
index ed2a87bbb188..fd653a995dc7 100644
--- a/platform/core-api/src/com/intellij/openapi/application/ApplicationNamesInfo.java
+++ b/platform/core-api/src/com/intellij/openapi/application/ApplicationNamesInfo.java
@@ -21,6 +21,7 @@ import com.intellij.util.PlatformUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.Locale;
@@ -37,6 +38,7 @@ public class ApplicationNamesInfo {
private final String myProductName;
private final String myFullProductName;
+ private final String myEditionName;
private final String myScriptName;
private final String myDefaultLauncherName;
@@ -58,6 +60,7 @@ public class ApplicationNamesInfo {
Element names = rootElement.getChild("names", rootElement.getNamespace());
myProductName = names.getAttributeValue("product");
myFullProductName = names.getAttributeValue("fullname");
+ myEditionName = names.getAttributeValue("edition");
myScriptName = names.getAttributeValue("script");
myDefaultLauncherName = names.getAttributeValue("default-launcher-name", myScriptName);
}
@@ -76,12 +79,28 @@ public class ApplicationNamesInfo {
}
/**
- * Returns a product name without a vendor prefix ({@code "IntelliJ IDEA"} for IntelliJ IDEA, {@code "WebStorm"} for WebStorm, etc).
+ * Returns full product name ({@code "IntelliJ IDEA"} for IntelliJ IDEA, {@code "WebStorm"} for WebStorm, etc).
+ * Vendor prefix and edition are not included.
*/
public String getFullProductName() {
return myFullProductName;
}
+ /**
+ * Returns full product name with edition. Vendor prefix is not included. * See {@link #getFullProductName()}, {@link #getEditionName()}.
+ */
+ public String getFullProductNameWithEdition() {
+ return myEditionName != null ? myFullProductName + ' ' + myEditionName : myFullProductName;
+ }
+
+ /**
+ * Returns edition name of the product, if applicable
+ * (e.g. {@code "Ultimate Edition"} or {@code "Community Edition"} for IntelliJ IDEA, {@code null} for WebStorm).
+ */
+ public @Nullable String getEditionName() {
+ return myEditionName;
+ }
+
/**
* Returns a sentence-cased version of {@link #getProductName()} ({@code "Idea"} for IntelliJ IDEA, {@code "Webstorm"} for WebStorm, etc).
* Kept for compatibility; use {@link #getFullProductName()} instead.
diff --git a/platform/platform-impl/src/com/intellij/ide/actions/AboutPopup.java b/platform/platform-impl/src/com/intellij/ide/actions/AboutPopup.java
index 37f58adb4127..095874c02f65 100644
--- a/platform/platform-impl/src/com/intellij/ide/actions/AboutPopup.java
+++ b/platform/platform-impl/src/com/intellij/ide/actions/AboutPopup.java
@@ -23,6 +23,7 @@ import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CustomShortcutSet;
import com.intellij.openapi.application.ApplicationInfo;
+import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.application.ex.ApplicationInfoEx;
import com.intellij.openapi.application.impl.ApplicationInfoImpl;
import com.intellij.openapi.ide.CopyPasteManager;
@@ -147,11 +148,15 @@ public class AboutPopup {
setOpaque(false);
setBackground(myColor);
setFocusable(true);
- Calendar cal = appInfo.getBuildDate();
- myLines.add(new AboutBoxLine(appInfo.getFullApplicationName(), true, null));
+
+ String appName = appInfo.getFullApplicationName();
+ String edition = ApplicationNamesInfo.getInstance().getEditionName();
+ if (edition != null) appName += " (" + edition + ")";
+ myLines.add(new AboutBoxLine(appName, true, null));
appendLast();
String buildInfo = IdeBundle.message("about.box.build.number", appInfo.getBuild().asString());
+ Calendar cal = appInfo.getBuildDate();
String buildDate = "";
if (appInfo.getBuild().isSnapshot()) {
buildDate = new SimpleDateFormat("HH:mm, ").format(cal.getTime());
diff --git a/platform/platform-impl/src/com/intellij/ide/actions/CreateDesktopEntryAction.java b/platform/platform-impl/src/com/intellij/ide/actions/CreateDesktopEntryAction.java
index a81b0860f731..e90b75838eea 100644
--- a/platform/platform-impl/src/com/intellij/ide/actions/CreateDesktopEntryAction.java
+++ b/platform/platform-impl/src/com/intellij/ide/actions/CreateDesktopEntryAction.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2016 JetBrains s.r.o.
+ * Copyright 2000-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -40,7 +40,6 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.AppUIUtil;
import com.intellij.util.ExceptionUtil;
-import com.intellij.util.PlatformUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -160,8 +159,7 @@ public class CreateDesktopEntryAction extends DumbAwareAction {
throw new RuntimeException(ApplicationBundle.message("desktop.entry.script.missing", binPath));
}
- String name = ApplicationNamesInfo.getInstance().getFullProductName();
- if (PlatformUtils.isIdeaCommunity()) name += " Community Edition";
+ String name = ApplicationNamesInfo.getInstance().getFullProductNameWithEdition();
String wmClass = AppUIUtil.getFrameClass();
Map vars = newHashMap(pair("$NAME$", name), pair("$SCRIPT$", execPath), pair("$ICON$", iconPath), pair("$WM_CLASS$", wmClass));
String content = ExecUtil.loadTemplate(CreateDesktopEntryAction.class.getClassLoader(), "entry.desktop", vars);
diff --git a/platform/platform-impl/src/com/intellij/ui/AppUIUtil.java b/platform/platform-impl/src/com/intellij/ui/AppUIUtil.java
index d1ccd57a9dec..428b1bf3b831 100644
--- a/platform/platform-impl/src/com/intellij/ui/AppUIUtil.java
+++ b/platform/platform-impl/src/com/intellij/ui/AppUIUtil.java
@@ -146,10 +146,11 @@ public class AppUIUtil {
// keep in sync with LinuxDistributionBuilder#getFrameClass
public static String getFrameClass() {
- String name = ApplicationNamesInfo.getInstance().getFullProductName()
+ String name = ApplicationNamesInfo.getInstance().getFullProductNameWithEdition()
.toLowerCase(Locale.US)
.replace(' ', '-')
- .replace("intellij-idea", "idea").replace("android-studio", "studio").replace("community-edition", "ce"); // backward compatibility
+ .replace("intellij-idea", "idea").replace("android-studio", "studio") // backward compatibility
+ .replace("-community-edition", "-ce").replace("-ultimate-edition", "").replace("-professional-edition", "");
String wmClass = VENDOR_PREFIX + name;
if (DEBUG_MODE) wmClass += "-debug";
return wmClass;
diff --git a/platform/platform-resources/src/idea/ApplicationInfo.xsd b/platform/platform-resources/src/idea/ApplicationInfo.xsd
index 054a031be985..5b875fef4afb 100644
--- a/platform/platform-resources/src/idea/ApplicationInfo.xsd
+++ b/platform/platform-resources/src/idea/ApplicationInfo.xsd
@@ -58,6 +58,13 @@
+
+
+
+ Edition of the product if applicable (e.g. "Community Edition", "Professional Edition" etc).
+
+
+
diff --git a/python/educational-python/resources/idea/PyCharmEduApplicationInfo.xml b/python/educational-python/resources/idea/PyCharmEduApplicationInfo.xml
index 98e6a88c1114..ba4a7fcdfe71 100644
--- a/python/educational-python/resources/idea/PyCharmEduApplicationInfo.xml
+++ b/python/educational-python/resources/idea/PyCharmEduApplicationInfo.xml
@@ -9,7 +9,7 @@
copyrightForeground="858585" linkColor="589df6"/>
-
+
diff --git a/python/python-community-ide-resources/resources/idea/PyCharmCoreApplicationInfo.xml b/python/python-community-ide-resources/resources/idea/PyCharmCoreApplicationInfo.xml
index 7184297f721c..eddb870a2712 100644
--- a/python/python-community-ide-resources/resources/idea/PyCharmCoreApplicationInfo.xml
+++ b/python/python-community-ide-resources/resources/idea/PyCharmCoreApplicationInfo.xml
@@ -9,7 +9,7 @@
copyrightForeground="313131" linkColor="1f29b2"/>
-
+
@@ -19,7 +19,6 @@
-