restored ability to mark plugin as essential
authornik <Nikolay.Chashnikov@jetbrains.com>
Tue, 23 Jun 2015 11:11:52 +0000 (14:11 +0300)
committernik <Nikolay.Chashnikov@jetbrains.com>
Tue, 23 Jun 2015 11:11:52 +0000 (14:11 +0300)
(it's needed for Android Studio, also it may be useful for Php plugin in PhpStorm)

platform/core-impl/src/com/intellij/openapi/application/ex/ApplicationInfoEx.java
platform/core-impl/src/com/intellij/openapi/application/impl/ApplicationInfoImpl.java
platform/platform-impl/src/com/intellij/diagnostic/IdeErrorsDialog.java
platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsTableModel.java

index a00310347ac4d36e2d95c1395dc14e195074e477..df37787719e1414f3b5213de740055d214938250 100644 (file)
@@ -100,6 +100,11 @@ public abstract class ApplicationInfoEx extends ApplicationInfo {
 
   public abstract List<PluginChooserPage> getPluginChooserPages();
 
+  /**
+   * @return {@code true} if the specified plugin is an essential part of the IDE so it cannot be disabled and isn't shown in Settings | Plugins
+   */
+  public abstract boolean isEssentialPlugin(String pluginId);
+
   @Nullable
   public abstract String getCustomizeIDEWizardStepsProvider();
 }
index e408b2dc56760e8a2f4cf53396c6d5e885e3cde1..7714b585193cb7e49566c89efa2a0106bd3149ab 100644 (file)
@@ -24,7 +24,10 @@ import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.util.*;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.ui.JBColor;
+import com.intellij.util.ArrayUtil;
+import com.intellij.util.Function;
 import com.intellij.util.PlatformUtils;
+import com.intellij.util.containers.ContainerUtil;
 import org.jdom.Document;
 import org.jdom.Element;
 import org.jetbrains.annotations.NotNull;
@@ -95,6 +98,7 @@ public class ApplicationInfoImpl extends ApplicationInfoEx implements JDOMExtern
   private String myHelpRootName = "idea";
   private String myWebHelpUrl = "https://www.jetbrains.com/idea/webhelp/";
   private List<PluginChooserPage> myPluginChooserPages = new ArrayList<PluginChooserPage>();
+  private String[] myEssentialPluginsIds;
   private String myStatisticsSettingsUrl;
   private String myStatisticsServiceUrl;
   private String myStatisticsServiceKey;
@@ -175,6 +179,7 @@ public class ApplicationInfoImpl extends ApplicationInfoEx implements JDOMExtern
   private static final String STEPS_PROVIDER = "provider";
   private static final String ELEMENT_EVALUATION = "evaluation";
   private static final String ATTRIBUTE_EVAL_LICENSE_URL = "license-url";
+  private static final String ESSENTIAL_PLUGIN = "essential-plugin";
 
   private static final String DEFAULT_PLUGINS_HOST = "http://plugins.jetbrains.com";
 
@@ -751,6 +756,16 @@ public class ApplicationInfoImpl extends ApplicationInfoEx implements JDOMExtern
       myPluginChooserPages.add(new PluginChooserPageImpl((Element) child));
     }
 
+    List<Element> essentialPluginsElements = JDOMUtil.getChildren(parentNode, ESSENTIAL_PLUGIN);
+    Collection<String> essentialPluginsIds = ContainerUtil.mapNotNull(essentialPluginsElements, new Function<Element, String>() {
+      @Override
+      public String fun(Element element) {
+        String id = element.getTextTrim();
+        return StringUtil.isNotEmpty(id) ? id : null;
+      }
+    });
+    myEssentialPluginsIds = ArrayUtil.toStringArray(essentialPluginsIds);
+
     Element statisticsElement = parentNode.getChild(ELEMENT_STATISTICS);
     if (statisticsElement != null) {
       myStatisticsSettingsUrl = statisticsElement.getAttributeValue(ATTRIBUTE_STATISTICS_SETTINGS);
@@ -820,6 +835,11 @@ public class ApplicationInfoImpl extends ApplicationInfoEx implements JDOMExtern
     return myPluginChooserPages;
   }
 
+  @Override
+  public boolean isEssentialPlugin(@NotNull String pluginId) {
+    return PluginManagerCore.CORE_PLUGIN_ID.equals(pluginId) || ArrayUtil.contains(pluginId, myEssentialPluginsIds);
+  }
+
   @Override
   @NotNull
   public String getComponentName() {
index 1a20a2b90150efb78350c0df8f2b5997469b9c4d..1fcc9818d23088ecab599199f714c34e21ce630f 100644 (file)
@@ -32,6 +32,7 @@ import com.intellij.openapi.application.Application;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.application.ApplicationNamesInfo;
 import com.intellij.openapi.application.ex.ApplicationEx;
+import com.intellij.openapi.application.ex.ApplicationInfoEx;
 import com.intellij.openapi.application.ex.ApplicationManagerEx;
 import com.intellij.openapi.diagnostic.*;
 import com.intellij.openapi.extensions.ExtensionException;
@@ -497,7 +498,7 @@ public class IdeErrorsDialog extends DialogWrapper implements MessagePoolListene
     }
 
     PluginId pluginId = findPluginId(message.getThrowable());
-    return pluginId != null;
+    return pluginId != null && !ApplicationInfoEx.getInstanceEx().isEssentialPlugin(pluginId.getIdString());
   }
 
   private void updateCountLabel() {
index dd1d039b96a71ec5a52e85d414dfdf4183c8fce5..4acb2da0c4063ae1ba4c72574669eade54253490 100644 (file)
@@ -15,6 +15,7 @@
  */
 package com.intellij.ide.plugins;
 
+import com.intellij.openapi.application.ex.ApplicationInfoEx;
 import com.intellij.openapi.extensions.PluginId;
 import com.intellij.openapi.ui.Messages;
 import com.intellij.openapi.util.Condition;
@@ -60,10 +61,11 @@ public class InstalledPluginsTableModel extends PluginTableModel {
     final EnabledPluginInfo enabledColumn = new EnabledPluginInfo();
     columns = SystemInfo.isMac ? new ColumnInfo[]{infoColumn, enabledColumn, new Spacer()} : new ColumnInfo[]{infoColumn, enabledColumn};
 
+    final ApplicationInfoEx appInfo = ApplicationInfoEx.getInstanceEx();
     view.addAll(ContainerUtil.filter(PluginManagerCore.getPlugins(), new Condition<IdeaPluginDescriptor>() {
       @Override
       public boolean value(IdeaPluginDescriptor descriptor) {
-        return !PluginManagerCore.CORE_PLUGIN_ID.equals(descriptor.getPluginId().getIdString());
+        return !appInfo.isEssentialPlugin(descriptor.getPluginId().getIdString());
       }
     }));
     view.addAll(ourState.getInstalledPlugins());