diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ExportableTemplateSettings.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ExportableTemplateSettings.java index 4f9a846d5763..3520c6c77453 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ExportableTemplateSettings.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ExportableTemplateSettings.java @@ -35,7 +35,6 @@ import java.util.Collection; ) public class ExportableTemplateSettings implements PersistentStateComponent { private Collection deletedKeys = new SmartList(); - private boolean isLoaded = false; private TemplateSettings parentSettings; @Nullable @@ -51,11 +50,6 @@ public class ExportableTemplateSettings implements PersistentStateComponent { +public class TemplateSettings implements PersistentStateComponent { private static final Logger LOG = Logger.getInstance(TemplateSettings.class); + private static final String FILE_SPEC = StoragePathMacros.ROOT_CONFIG + "/templates"; + @NonNls public static final String USER_GROUP_NAME = "user"; @NonNls private static final String TEMPLATE_SET = "templateSet"; @NonNls private static final String GROUP = "group"; @NonNls private static final String TEMPLATE = "template"; - @NonNls private static final String DELETED_TEMPLATES = "deleted_templates"; private final List myDeletedTemplates = new ArrayList(); public static final char SPACE_CHAR = ' '; @@ -81,7 +84,6 @@ public class TemplateSettings implements PersistentStateComponent { @NonNls private static final String TO_SHORTEN_FQ_NAMES = "toShortenFQNames"; @NonNls private static final String USE_STATIC_IMPORT = "useStaticImport"; - @NonNls private static final String DEFAULT_SHORTCUT = "defaultShortcut"; @NonNls private static final String DEACTIVATED = "deactivated"; @NonNls private static final String RESOURCE_BUNDLE = "resource-bundle"; @@ -94,9 +96,34 @@ public class TemplateSettings implements PersistentStateComponent { private final Map myDefaultTemplates = new LinkedHashMap(); private int myMaxKeyLength = 0; - private char myDefaultShortcutChar = TAB_CHAR; private final SchemesManager mySchemesManager; - private static final String FILE_SPEC = StoragePathMacros.ROOT_CONFIG + "/templates"; + + private State myState = new State(); + + static final class ShortcutConverter extends Converter { + @Nullable + @Override + public Character fromString(@NotNull String shortcut) { + return TAB.equals(shortcut) ? TAB_CHAR : + ENTER.equals(shortcut) ? ENTER_CHAR : + CUSTOM.equals(shortcut) ? CUSTOM_CHAR : + SPACE_CHAR; + } + + @NotNull + @Override + public String toString(@NotNull Character shortcut) { + return shortcut == TAB_CHAR ? TAB : + shortcut == ENTER_CHAR ? ENTER : + shortcut == CUSTOM_CHAR ? CUSTOM : + SPACE; + } + } + + final static class State { + @OptionTag(nameAttribute = "", valueAttribute = "shortcut", converter = ShortcutConverter.class) + public char defaultShortcut = TAB_CHAR; + } public static class TemplateKey { private String groupName; @@ -236,30 +263,19 @@ public class TemplateSettings implements PersistentStateComponent { } @Override - public void loadState(Element parentNode) { - Element element = parentNode.getChild(DEFAULT_SHORTCUT); - if (element != null) { - String shortcut = element.getAttributeValue(SHORTCUT); - myDefaultShortcutChar = TAB.equals(shortcut) ? TAB_CHAR : - ENTER.equals(shortcut) ? ENTER_CHAR : - CUSTOM.equals(shortcut) ? CUSTOM_CHAR : - SPACE_CHAR; - } + public State getState() { + return myState; + } + + @Override + public void loadState(State state) { + myState = state; ExportableTemplateSettings exportableSettings = ServiceManager.getService(ExportableTemplateSettings.class); assert exportableSettings != null : "Can't find required ExportableTemplateSettings service."; exportableSettings.setParentSettings(this); - if (exportableSettings.isLoaded()) { - myDeletedTemplates.addAll(exportableSettings.getDeletedKeys()); - } - else { - Element deleted = parentNode.getChild(DELETED_TEMPLATES); - if (deleted != null) { - for (Element child : deleted.getChildren()) { - myDeletedTemplates.add(new TemplateKey(child.getAttributeValue(GROUP), child.getAttributeValue(NAME))); - } - } - } + myDeletedTemplates.clear(); + myDeletedTemplates.addAll(exportableSettings.getDeletedKeys()); for (TemplateKey templateKey : myDeletedTemplates) { if (templateKey.groupName == null) { @@ -276,19 +292,6 @@ public class TemplateSettings implements PersistentStateComponent { } } - @Override - public Element getState() { - Element parentNode = new Element("TemplateSettings"); - Element element = new Element(DEFAULT_SHORTCUT); - element.setAttribute(SHORTCUT, myDefaultShortcutChar == TAB_CHAR ? TAB : - myDefaultShortcutChar == ENTER_CHAR ? ENTER : - myDefaultShortcutChar == CUSTOM_CHAR ? CUSTOM : - SPACE); - parentNode.addContent(element); - - return parentNode; - } - @Nullable public String getLastSelectedTemplateKey() { return myLastSelectedTemplate != null ? myLastSelectedTemplate.key : null; @@ -314,11 +317,11 @@ public class TemplateSettings implements PersistentStateComponent { } public char getDefaultShortcutChar() { - return myDefaultShortcutChar; + return myState.defaultShortcut; } public void setDefaultShortcutChar(char defaultShortcutChar) { - myDefaultShortcutChar = defaultShortcutChar; + myState.defaultShortcut = defaultShortcutChar; } public Collection getTemplates(@NonNls String key) { diff --git a/platform/util/src/com/intellij/util/xmlb/OptionTagBinding.java b/platform/util/src/com/intellij/util/xmlb/OptionTagBinding.java index d7a14bb32dae..8dec40c854a0 100644 --- a/platform/util/src/com/intellij/util/xmlb/OptionTagBinding.java +++ b/platform/util/src/com/intellij/util/xmlb/OptionTagBinding.java @@ -42,16 +42,21 @@ class OptionTagBinding extends BasePrimitiveBinding { public OptionTagBinding(@NotNull Accessor accessor, @Nullable OptionTag optionTag) { super(accessor, optionTag == null ? null : optionTag.value(), optionTag == null ? null : optionTag.converter()); - if (optionTag != null) { - myTagName = optionTag.tag(); - myNameAttribute = optionTag.nameAttribute(); - myValueAttribute = optionTag.valueAttribute(); - } - else { + if (optionTag == null) { myTagName = Constants.OPTION; myNameAttribute = Constants.NAME; myValueAttribute = Constants.VALUE; } + else { + myNameAttribute = optionTag.nameAttribute(); + myValueAttribute = optionTag.valueAttribute(); + + String tagName = optionTag.tag(); + if (StringUtil.isEmpty(myNameAttribute) && Constants.OPTION.equals(tagName)) { + tagName = myAccessor.getName(); + } + myTagName = tagName; + } } @Override diff --git a/platform/util/src/com/intellij/util/xmlb/XmlSerializerImpl.java b/platform/util/src/com/intellij/util/xmlb/XmlSerializerImpl.java index f001872a1a43..b2f354e1e3a9 100644 --- a/platform/util/src/com/intellij/util/xmlb/XmlSerializerImpl.java +++ b/platform/util/src/com/intellij/util/xmlb/XmlSerializerImpl.java @@ -144,21 +144,38 @@ class XmlSerializerImpl { @Nullable @SuppressWarnings({"unchecked"}) static T convert(Object value, Class type) { - if (value == null) return null; - if (type.isInstance(value)) return (T)value; - if (String.class.isAssignableFrom(type)) return (T)String.valueOf(value); - if (int.class.isAssignableFrom(type) || Integer.class.isAssignableFrom(type)) return (T)Integer.valueOf(String.valueOf(value)); - if (double.class.isAssignableFrom(type) || Double.class.isAssignableFrom(type)) return (T)Double.valueOf(String.valueOf(value)); - if (float.class.isAssignableFrom(type) || Float.class.isAssignableFrom(type)) return (T)Float.valueOf(String.valueOf(value)); - if (long.class.isAssignableFrom(type) || Long.class.isAssignableFrom(type)) return (T)Long.valueOf(String.valueOf(value)); - if (boolean.class.isAssignableFrom(type) || Boolean.class.isAssignableFrom(type)) return (T)Boolean.valueOf(String.valueOf(value)); - + if (value == null) { + return null; + } + if (type.isInstance(value)) { + return (T)value; + } + if (String.class.isAssignableFrom(type)) { + return (T)String.valueOf(value); + } + if (int.class.isAssignableFrom(type) || Integer.class.isAssignableFrom(type)) { + return (T)Integer.valueOf(String.valueOf(value)); + } + if (double.class.isAssignableFrom(type) || Double.class.isAssignableFrom(type)) { + return (T)Double.valueOf(String.valueOf(value)); + } + if (float.class.isAssignableFrom(type) || Float.class.isAssignableFrom(type)) { + return (T)Float.valueOf(String.valueOf(value)); + } + if (long.class.isAssignableFrom(type) || Long.class.isAssignableFrom(type)) { + return (T)Long.valueOf(String.valueOf(value)); + } + if (boolean.class.isAssignableFrom(type) || Boolean.class.isAssignableFrom(type)) { + return (T)Boolean.valueOf(String.valueOf(value)); + } + if (char.class.isAssignableFrom(type) || Character.class.isAssignableFrom(type)) { + return (T)value; + } if (type.isEnum()) { final T[] enumConstants = type.getEnumConstants(); for (T enumConstant : enumConstants) { if (enumConstant.toString().equals(value.toString())) return enumConstant; } - return null; }