package org.jetbrains.android.formatter; import com.android.SdkConstants; import com.intellij.ide.highlighter.XmlFileType; import com.intellij.lang.xml.XMLLanguage; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.codeStyle.PredefinedCodeStyle; import com.intellij.psi.codeStyle.arrangement.group.ArrangementGroupingRule; import com.intellij.psi.codeStyle.arrangement.match.StdArrangementMatchRule; import com.intellij.psi.codeStyle.arrangement.std.StdArrangementSettings; import com.intellij.psi.formatter.xml.XmlCodeStyleSettings; import com.intellij.util.containers.ContainerUtil; import java.util.ArrayList; import java.util.List; import static com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.Order.BY_NAME; import static com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.Order.KEEP; import static com.intellij.xml.arrangement.XmlRearranger.attrArrangementRule; /** * @author Eugene.Kudelevsky */ public class AndroidXmlPredefinedCodeStyle extends PredefinedCodeStyle { public AndroidXmlPredefinedCodeStyle() { super("Android", XMLLanguage.INSTANCE); } @Override public void apply(CodeStyleSettings settings) { final CommonCodeStyleSettings.IndentOptions indentOptions = settings.getIndentOptions(XmlFileType.INSTANCE); indentOptions.CONTINUATION_INDENT_SIZE = indentOptions.INDENT_SIZE; XmlCodeStyleSettings xmlSettings = settings.getCustomSettings(XmlCodeStyleSettings.class); xmlSettings.XML_ALIGN_ATTRIBUTES = false; xmlSettings.XML_SPACE_INSIDE_EMPTY_TAG = true; xmlSettings.XML_KEEP_LINE_BREAKS = false; final AndroidXmlCodeStyleSettings androidSettings = AndroidXmlCodeStyleSettings.getInstance(settings); androidSettings.USE_CUSTOM_SETTINGS = true; androidSettings.LAYOUT_SETTINGS = new AndroidXmlCodeStyleSettings.LayoutSettings(); androidSettings.MANIFEST_SETTINGS = new AndroidXmlCodeStyleSettings.ManifestSettings(); androidSettings.VALUE_RESOURCE_FILE_SETTINGS = new AndroidXmlCodeStyleSettings.ValueResourceFileSettings(); androidSettings.OTHER_SETTINGS = new AndroidXmlCodeStyleSettings.OtherSettings(); // arrangement final List<StdArrangementMatchRule> rules = new ArrayList<StdArrangementMatchRule>(); rules.add(attrArrangementRule("xmlns:android", "", KEEP)); rules.add(attrArrangementRule("xmlns:.*", "", BY_NAME)); rules.add(attrArrangementRule(".*:id", SdkConstants.NS_RESOURCES, KEEP)); rules.add(attrArrangementRule(".*:name", SdkConstants.NS_RESOURCES, KEEP)); rules.add(attrArrangementRule("name", "^$", KEEP)); rules.add(attrArrangementRule("style", "^$", KEEP)); rules.add(attrArrangementRule(".*", "^$", BY_NAME)); rules.add(attrArrangementRule(".*:layout_width", SdkConstants.NS_RESOURCES, KEEP)); rules.add(attrArrangementRule(".*:layout_height", SdkConstants.NS_RESOURCES, KEEP)); rules.add(attrArrangementRule(".*:layout_.*", SdkConstants.NS_RESOURCES, BY_NAME)); rules.add(attrArrangementRule(".*:width", SdkConstants.NS_RESOURCES, BY_NAME)); rules.add(attrArrangementRule(".*:height", SdkConstants.NS_RESOURCES, BY_NAME)); rules.add(attrArrangementRule(".*", SdkConstants.NS_RESOURCES, BY_NAME)); rules.add(attrArrangementRule(".*", ".*", BY_NAME)); // TODO: Should sort name:"color",namespace:"" to the end (primarily for color state lists) final CommonCodeStyleSettings xmlCommonSettings = settings.getCommonSettings(XMLLanguage.INSTANCE); xmlCommonSettings.setArrangementSettings( StdArrangementSettings.createByMatchRules(ContainerUtil.<ArrangementGroupingRule>emptyList(), rules)); xmlCommonSettings.FORCE_REARRANGE_MODE = CommonCodeStyleSettings.REARRANGE_ALWAYS; } }