IDEA-153585 File Templates can't be exported/imported via Export/Import settings
authorDmitry Avdeev <dmitry.avdeev@jetbrains.com>
Wed, 13 Jul 2016 16:01:12 +0000 (19:01 +0300)
committerDmitry Avdeev <dmitry.avdeev@jetbrains.com>
Wed, 13 Jul 2016 16:02:51 +0000 (19:02 +0300)
platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/ExportableFileTemplateSettings.java
platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateManagerImpl.java
platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateSettings.java [new file with mode: 0644]
platform/platform-resources/src/META-INF/LangExtensions.xml
platform/platform-tests/testSrc/com/intellij/ide/fileTemplates/impl/LightFileTemplatesTest.java

index 586c34343ef64ae6e08339734605cce0c64e962c..62f5c3790d2e8dc316f205f63a7d93738d44b99a 100644 (file)
 package com.intellij.ide.fileTemplates.impl;
 
 import com.intellij.openapi.components.PersistentStateComponent;
-import com.intellij.openapi.components.ServiceManager;
 import com.intellij.openapi.components.State;
 import com.intellij.openapi.components.Storage;
-import com.intellij.openapi.project.Project;
+import com.intellij.openapi.project.ProjectManager;
 import org.jdom.Element;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.List;
-import java.util.Locale;
-
 /**
- * Exportable part of file template settings. User-specific (local) settings are handled by FileTemplateManagerImpl.
- *
- * @author Rustam Vishnyakov
+ * @author Dmitry Avdeev
  */
 @State(
   name = "ExportableFileTemplateSettings",
-  storages = @Storage(ExportableFileTemplateSettings.EXPORTABLE_SETTINGS_FILE),
+  storages = @Storage(FileTemplateSettings.EXPORTABLE_SETTINGS_FILE),
   additionalExportFile = FileTemplatesLoader.TEMPLATES_DIR
 )
 public class ExportableFileTemplateSettings implements PersistentStateComponent<Element> {
-  public final static String EXPORTABLE_SETTINGS_FILE = "file.template.settings.xml";
-
-  static final String ELEMENT_TEMPLATE = "template";
-  static final String ATTRIBUTE_NAME = "name";
-  static final String ATTRIBUTE_REFORMAT = "reformat";
-  static final String ATTRIBUTE_LIVE_TEMPLATE = "live-template-enabled";
-  static final String ATTRIBUTE_ENABLED = "enabled";
-  private final Project myProject;
-
-  public ExportableFileTemplateSettings(Project project) {
-    myProject = project;
-  }
-
-
-  static ExportableFileTemplateSettings getInstance(Project project) {
-    return ServiceManager.getService(project, ExportableFileTemplateSettings.class);
-  }
-
   @Nullable
   @Override
   public Element getState() {
-    Element element = null;
-    for (FTManager manager : getAllManagers()) {
-      Element templatesGroup = null;
-      for (FileTemplateBase template : manager.getAllTemplates(true)) {
-        // save only those settings that differ from defaults
-        boolean shouldSave = template.isReformatCode() != FileTemplateBase.DEFAULT_REFORMAT_CODE_VALUE ||
-                             template.isLiveTemplateEnabled() != template.isLiveTemplateEnabledByDefault();
-        if (template instanceof BundledFileTemplate) {
-          shouldSave |= ((BundledFileTemplate)template).isEnabled() != FileTemplateBase.DEFAULT_ENABLED_VALUE;
-        }
-        if (!shouldSave) {
-          continue;
-        }
-        final Element templateElement = new Element(ELEMENT_TEMPLATE);
-        templateElement.setAttribute(ATTRIBUTE_NAME, template.getQualifiedName());
-        templateElement.setAttribute(ATTRIBUTE_REFORMAT, Boolean.toString(template.isReformatCode()));
-        templateElement.setAttribute(ATTRIBUTE_LIVE_TEMPLATE, Boolean.toString(template.isLiveTemplateEnabled()));
-        if (template instanceof BundledFileTemplate) {
-          templateElement.setAttribute(ATTRIBUTE_ENABLED, Boolean.toString(((BundledFileTemplate)template).isEnabled()));
-        }
-
-        if (templatesGroup == null) {
-          templatesGroup = new Element(getXmlElementGroupName(manager));
-          if (element == null) {
-            element = new Element("fileTemplateSettings");
-          }
-          element.addContent(templatesGroup);
-        }
-        templatesGroup.addContent(templateElement);
-      }
-    }
-    return element;
-  }
-
-  private FTManager[] getAllManagers() {
-    return FileTemplateManagerImpl.getInstanceImpl(myProject).getAllManagers();
+    return getSettingInstance().getState();
   }
 
   @Override
   public void loadState(Element state) {
-    doLoad(state);
-  }
-
-  private void doLoad(Element element) {
-    for (final FTManager manager : getAllManagers()) {
-      final Element templatesGroup = element.getChild(getXmlElementGroupName(manager));
-      if (templatesGroup == null) {
-        continue;
-      }
-      final List children = templatesGroup.getChildren(ELEMENT_TEMPLATE);
-
-      for (final Object elem : children) {
-        final Element child = (Element)elem;
-        final String qName = child.getAttributeValue(ATTRIBUTE_NAME);
-        final FileTemplateBase template = manager.getTemplate(qName);
-        if (template == null) {
-          continue;
-        }
-        template.setReformatCode(Boolean.TRUE.toString().equals(child.getAttributeValue(ATTRIBUTE_REFORMAT)));
-        template.setLiveTemplateEnabled(Boolean.TRUE.toString().equals(child.getAttributeValue(ATTRIBUTE_LIVE_TEMPLATE)));
-        if (template instanceof BundledFileTemplate) {
-          final boolean enabled = Boolean.parseBoolean(child.getAttributeValue(ATTRIBUTE_ENABLED, "true"));
-          ((BundledFileTemplate)template).setEnabled(enabled);
-        }
-      }
-    }
+    getSettingInstance().loadState(state);
   }
 
-  private static String getXmlElementGroupName(FTManager manager) {
-    return manager.getName().toLowerCase(Locale.US) + "_templates";
+  private static FileTemplateSettings getSettingInstance() {
+    return FileTemplateSettings.getInstance(ProjectManager.getInstance().getDefaultProject());
   }
 }
index 9d491685c85e85a1af8ee3cd69acb944872bac2a..2673b736ad4292bbd52c49846183b63b2388859e 100644 (file)
@@ -459,7 +459,7 @@ public class FileTemplateManagerImpl extends FileTemplateManager implements Pers
   public void loadState(State state) {
     XmlSerializerUtil.copyBean(state, myState);
     FileTemplatesScheme scheme = myProjectScheme != null && myProjectScheme.getName().equals(state.SCHEME) ? myProjectScheme : FileTemplatesScheme.DEFAULT;
-    ExportableFileTemplateSettings.getInstance(scheme.getProject());
+    FileTemplateSettings.getInstance(scheme.getProject());
     setScheme(scheme);
   }
 
diff --git a/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateSettings.java b/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateSettings.java
new file mode 100644 (file)
index 0000000..af0ddb1
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2000-2016 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.ide.fileTemplates.impl;
+
+import com.intellij.openapi.components.PersistentStateComponent;
+import com.intellij.openapi.components.ServiceManager;
+import com.intellij.openapi.components.State;
+import com.intellij.openapi.components.Storage;
+import com.intellij.openapi.project.Project;
+import org.jdom.Element;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Exportable part of file template settings. User-specific (local) settings are handled by FileTemplateManagerImpl.
+ *
+ * @author Rustam Vishnyakov
+ */
+@State(
+  name = "ExportableFileTemplateSettings",
+  storages = @Storage(FileTemplateSettings.EXPORTABLE_SETTINGS_FILE),
+  additionalExportFile = FileTemplatesLoader.TEMPLATES_DIR
+)
+public class FileTemplateSettings implements PersistentStateComponent<Element> {
+  public final static String EXPORTABLE_SETTINGS_FILE = "file.template.settings.xml";
+
+  static final String ELEMENT_TEMPLATE = "template";
+  static final String ATTRIBUTE_NAME = "name";
+  static final String ATTRIBUTE_REFORMAT = "reformat";
+  static final String ATTRIBUTE_LIVE_TEMPLATE = "live-template-enabled";
+  static final String ATTRIBUTE_ENABLED = "enabled";
+  private final Project myProject;
+
+  public FileTemplateSettings(Project project) {
+    myProject = project;
+  }
+
+
+  static FileTemplateSettings getInstance(Project project) {
+    return ServiceManager.getService(project, FileTemplateSettings.class);
+  }
+
+  @Nullable
+  @Override
+  public Element getState() {
+    Element element = null;
+    for (FTManager manager : getAllManagers()) {
+      Element templatesGroup = null;
+      for (FileTemplateBase template : manager.getAllTemplates(true)) {
+        // save only those settings that differ from defaults
+        boolean shouldSave = template.isReformatCode() != FileTemplateBase.DEFAULT_REFORMAT_CODE_VALUE ||
+                             template.isLiveTemplateEnabled() != template.isLiveTemplateEnabledByDefault();
+        if (template instanceof BundledFileTemplate) {
+          shouldSave |= ((BundledFileTemplate)template).isEnabled() != FileTemplateBase.DEFAULT_ENABLED_VALUE;
+        }
+        if (!shouldSave) {
+          continue;
+        }
+        final Element templateElement = new Element(ELEMENT_TEMPLATE);
+        templateElement.setAttribute(ATTRIBUTE_NAME, template.getQualifiedName());
+        templateElement.setAttribute(ATTRIBUTE_REFORMAT, Boolean.toString(template.isReformatCode()));
+        templateElement.setAttribute(ATTRIBUTE_LIVE_TEMPLATE, Boolean.toString(template.isLiveTemplateEnabled()));
+        if (template instanceof BundledFileTemplate) {
+          templateElement.setAttribute(ATTRIBUTE_ENABLED, Boolean.toString(((BundledFileTemplate)template).isEnabled()));
+        }
+
+        if (templatesGroup == null) {
+          templatesGroup = new Element(getXmlElementGroupName(manager));
+          if (element == null) {
+            element = new Element("fileTemplateSettings");
+          }
+          element.addContent(templatesGroup);
+        }
+        templatesGroup.addContent(templateElement);
+      }
+    }
+    return element;
+  }
+
+  private FTManager[] getAllManagers() {
+    return FileTemplateManagerImpl.getInstanceImpl(myProject).getAllManagers();
+  }
+
+  @Override
+  public void loadState(Element state) {
+    doLoad(state);
+  }
+
+  private void doLoad(Element element) {
+    for (final FTManager manager : getAllManagers()) {
+      final Element templatesGroup = element.getChild(getXmlElementGroupName(manager));
+      if (templatesGroup == null) {
+        continue;
+      }
+      final List children = templatesGroup.getChildren(ELEMENT_TEMPLATE);
+
+      for (final Object elem : children) {
+        final Element child = (Element)elem;
+        final String qName = child.getAttributeValue(ATTRIBUTE_NAME);
+        final FileTemplateBase template = manager.getTemplate(qName);
+        if (template == null) {
+          continue;
+        }
+        template.setReformatCode(Boolean.TRUE.toString().equals(child.getAttributeValue(ATTRIBUTE_REFORMAT)));
+        template.setLiveTemplateEnabled(Boolean.TRUE.toString().equals(child.getAttributeValue(ATTRIBUTE_LIVE_TEMPLATE)));
+        if (template instanceof BundledFileTemplate) {
+          final boolean enabled = Boolean.parseBoolean(child.getAttributeValue(ATTRIBUTE_ENABLED, "true"));
+          ((BundledFileTemplate)template).setEnabled(enabled);
+        }
+      }
+    }
+  }
+
+  private static String getXmlElementGroupName(FTManager manager) {
+    return manager.getName().toLowerCase(Locale.US) + "_templates";
+  }
+}
index 5a3e3d9b91a424b0e6597bd9bcd794f03a19af30..d619f4a31135b99555e66f3d29e386f0b48637b9 100644 (file)
@@ -28,7 +28,8 @@
 
     <projectService serviceInterface="com.intellij.ide.fileTemplates.FileTemplateManager"
                     serviceImplementation="com.intellij.ide.fileTemplates.impl.FileTemplateManagerImpl"/>
-    <projectService serviceImplementation="com.intellij.ide.fileTemplates.impl.ExportableFileTemplateSettings"/>
+    <projectService serviceImplementation="com.intellij.ide.fileTemplates.impl.FileTemplateSettings"/>
+    <applicationService serviceImplementation="com.intellij.ide.fileTemplates.impl.ExportableFileTemplateSettings"/>
     <applicationService serviceImplementation="com.intellij.ide.fileTemplates.impl.FileTemplatesLoader"/>
 
     <applicationService serviceInterface="com.intellij.ide.PsiCopyPasteManager"
index c438f369b7640666ffc1140f39fad9a612c58354..41d737c0751de1a9f65028ccf4a00c3b7fcd9439 100644 (file)
@@ -168,7 +168,7 @@ public class LightFileTemplatesTest extends LightPlatformTestCase {
     assertTrue(template.isReformatCode());
     template.setReformatCode(false);
 
-    ExportableFileTemplateSettings settings = ExportableFileTemplateSettings.getInstance(getProject());
+    FileTemplateSettings settings = FileTemplateSettings.getInstance(getProject());
     Element state = settings.getState();
     assertNotNull(state);
     Element element = state.getChildren().get(0).getChildren().get(0);
@@ -180,7 +180,7 @@ public class LightFileTemplatesTest extends LightPlatformTestCase {
     assertFalse(((FileTemplateBase)myTemplateManager.getTemplate(TEST_TEMPLATE_TXT)).isLiveTemplateEnabledByDefault());
     FileTemplateBase template = (FileTemplateBase)myTemplateManager.getTemplate("templateWithLiveTemplate.txt");
     assertTrue(template.isLiveTemplateEnabledByDefault());
-    ExportableFileTemplateSettings settings = ExportableFileTemplateSettings.getInstance(getProject());
+    FileTemplateSettings settings = FileTemplateSettings.getInstance(getProject());
     assertNull(settings.getState());
     template.setLiveTemplateEnabled(false);
     Element state = settings.getState();