blob: c198af811d652fd1c6a0994fdd436c094b99e2c2 [file] [log] [blame]
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;
}
}