diff --git a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/PropertiesElementFactory.java b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/PropertiesElementFactory.java
index a3959081a7a7..74d09f10d7a5 100644
--- a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/PropertiesElementFactory.java
+++ b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/PropertiesElementFactory.java
@@ -56,7 +56,7 @@ public class PropertiesElementFactory {
@Nullable Project project,
boolean escape) {
if (delimiter == null) {
- delimiter = project == null ? PropertiesCodeStyleSettings.DEFAULT_KEY_VALUE_DELIMITER : PropertiesCodeStyleSettings.getInstance(project).KEY_VALUE_DELIMITER;
+ delimiter = project == null ? '=' : PropertiesCodeStyleSettings.getInstance(project).getDelimiter();
}
return (escape ? escape(name) : name) + String.valueOf(delimiter) + (escape ? escapeValue(value) : value);
}
diff --git a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettings.java b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettings.java
index 1ba1422ff3a4..17885b20b498 100644
--- a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettings.java
+++ b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettings.java
@@ -17,15 +17,17 @@ package com.intellij.lang.properties.psi.codeStyle;
import com.intellij.lang.properties.PropertiesLanguage;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.InvalidDataException;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.psi.codeStyle.CustomCodeStyleSettings;
+import org.jdom.Element;
/**
* @author Dmitry Batkovich
*/
public class PropertiesCodeStyleSettings extends CustomCodeStyleSettings {
- public final static char DEFAULT_KEY_VALUE_DELIMITER = '=';
+ public final static char[] DELIMITERS = new char[]{'=', ':', ' '};
public PropertiesCodeStyleSettings(CodeStyleSettings container) {
super(PropertiesLanguage.INSTANCE.getID(), container);
@@ -35,5 +37,41 @@ public class PropertiesCodeStyleSettings extends CustomCodeStyleSettings {
return CodeStyleSettingsManager.getSettings(project).getCustomSettings(PropertiesCodeStyleSettings.class);
}
- public char KEY_VALUE_DELIMITER = DEFAULT_KEY_VALUE_DELIMITER;
+ public boolean SPACES_AROUND_KEY_VALUE_DELIMITER = false;
+ public int KEY_VALUE_DELIMITER_CODE = 0;
+
+ public char getDelimiter() {
+ return DELIMITERS[KEY_VALUE_DELIMITER_CODE];
+ }
+
+ @Override
+ public void readExternal(Element parentElement) throws InvalidDataException {
+ super.readExternal(parentElement);
+ parentElement = parentElement.getChild(getTagName());
+ if (parentElement != null) {
+ Character delimiter = null;
+ for (final Object o : parentElement.getChildren("option")) {
+ Element e = (Element)o;
+ String fieldName = e.getAttributeValue("name");
+ if ("KEY_VALUE_DELIMITER".equals(fieldName)) {
+ final String value = e.getAttributeValue("value");
+ delimiter = value.charAt(0);
+ break;
+ }
+ }
+ if (delimiter != null) {
+ switch (delimiter) {
+ case '=':
+ KEY_VALUE_DELIMITER_CODE = 0;
+ break;
+ case ':':
+ KEY_VALUE_DELIMITER_CODE = 1;
+ break;
+ case ' ':
+ KEY_VALUE_DELIMITER_CODE = 2;
+ break;
+ }
+ }
+ }
+ }
}
diff --git a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.form b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.form
deleted file mode 100644
index 1c2c50f97d1b..000000000000
--- a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.form
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
diff --git a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.java b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.java
index 6c9819b77695..c78a980720ad 100644
--- a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.java
+++ b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.java
@@ -15,63 +15,48 @@
*/
package com.intellij.lang.properties.psi.codeStyle;
-import com.intellij.application.options.CodeStyleAbstractPanel;
+import com.intellij.application.options.codeStyle.OptionTableWithPreviewPanel;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.highlighter.EditorHighlighter;
+import com.intellij.openapi.editor.highlighter.EditorHighlighterFactory;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.StdFileTypes;
-import com.intellij.openapi.options.ConfigurationException;
-import com.intellij.openapi.ui.ComboBox;
import com.intellij.psi.codeStyle.CodeStyleSettings;
+import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider;
+import com.intellij.testFramework.LightVirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import javax.swing.*;
-
/**
* @author Dmitry Batkovich
*/
-public class PropertiesCodeStyleSettingsPanel extends CodeStyleAbstractPanel {
- private final static String WHITESPACE_ELEMENT = "Whitespace symbol";
-
- private ComboBox myDelimiterCombo;
- private JPanel myPanel;
-
+public class PropertiesCodeStyleSettingsPanel extends OptionTableWithPreviewPanel {
public PropertiesCodeStyleSettingsPanel(CodeStyleSettings settings) {
super(settings);
- final DefaultComboBoxModel model = new DefaultComboBoxModel();
- model.addElement(':');
- model.addElement('=');
- model.addElement(WHITESPACE_ELEMENT);
- myDelimiterCombo.setModel(model);
- selectChar(settings.getCustomSettings(PropertiesCodeStyleSettings.class));
- }
-
- private void selectChar(PropertiesCodeStyleSettings settings) {
- myDelimiterCombo.setSelectedItem(settings.KEY_VALUE_DELIMITER == ' ' ? WHITESPACE_ELEMENT : settings.KEY_VALUE_DELIMITER);
- }
-
- private char getSelectedChar() {
- final Object item = myDelimiterCombo.getModel().getSelectedItem();
- if (item instanceof Character) {
- return (Character)item;
- }
- assert item == WHITESPACE_ELEMENT;
- return ' ';
- }
-
- private void createUIComponents() {
+ init();
}
@Override
- protected int getRightMargin() {
- return 0;
+ public LanguageCodeStyleSettingsProvider.SettingsType getSettingsType() {
+ return LanguageCodeStyleSettingsProvider.SettingsType.BLANK_LINES_SETTINGS;
+ }
+
+ @Override
+ protected void initTables() {
+ addOption("ALIGN_GROUP_FIELD_DECLARATIONS", "Align properties in column");
+ showStandardOptions("SPACE_AROUND_ASSIGNMENT_OPERATORS", "ALIGN_GROUP_FIELD_DECLARATIONS");
+ showCustomOption(PropertiesCodeStyleSettings.class, "SPACES_AROUND_KEY_VALUE_DELIMITER",
+ "Insert space around key-value delimiter", null);
+ showCustomOption(PropertiesCodeStyleSettings.class,
+ "KEY_VALUE_DELIMITER_CODE",
+ "Key-value delimiter", null,
+ new String[]{"=", ":", "whitespace symbol"}, new int[]{0, 1, 2});
}
@Nullable
@Override
protected EditorHighlighter createHighlighter(EditorColorsScheme scheme) {
- return null;
+ return EditorHighlighterFactory.getInstance().createEditorHighlighter(new LightVirtualFile("p.properties"), scheme, null);
}
@NotNull
@@ -83,29 +68,9 @@ public class PropertiesCodeStyleSettingsPanel extends CodeStyleAbstractPanel {
@Nullable
@Override
protected String getPreviewText() {
- return null;
- }
-
- @Override
- public void apply(CodeStyleSettings settings) throws ConfigurationException {
- final PropertiesCodeStyleSettings propertiesCodeStyleSettings = settings.getCustomSettings(PropertiesCodeStyleSettings.class);
- propertiesCodeStyleSettings.KEY_VALUE_DELIMITER = getSelectedChar();
- }
-
- @Override
- public boolean isModified(CodeStyleSettings settings) {
- final PropertiesCodeStyleSettings propertiesCodeStyleSettings = settings.getCustomSettings(PropertiesCodeStyleSettings.class);
- return propertiesCodeStyleSettings.KEY_VALUE_DELIMITER != getSelectedChar();
- }
-
- @Nullable
- @Override
- public JComponent getPanel() {
- return myPanel;
- }
-
- @Override
- protected void resetImpl(CodeStyleSettings settings) {
- selectChar(settings.getCustomSettings(PropertiesCodeStyleSettings.class));
+ return "key1=value\n" +
+ "some_key=some_value\n" +
+ "#commentaries\n" +
+ "last.key=some text here";
}
}
diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/WrongPropertyKeyValueDelimiterInspection.java b/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/WrongPropertyKeyValueDelimiterInspection.java
index f99284e13f59..a37e2bdb2f6b 100644
--- a/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/WrongPropertyKeyValueDelimiterInspection.java
+++ b/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/WrongPropertyKeyValueDelimiterInspection.java
@@ -39,7 +39,7 @@ public class WrongPropertyKeyValueDelimiterInspection extends PropertySuppressab
return PsiElementVisitor.EMPTY_VISITOR;
}
final PropertiesCodeStyleSettings codeStyleSettings = PropertiesCodeStyleSettings.getInstance(holder.getProject());
- final char codeStyleKeyValueDelimiter = codeStyleSettings.KEY_VALUE_DELIMITER;
+ final char codeStyleKeyValueDelimiter = codeStyleSettings.getDelimiter();
return new PsiElementVisitor() {
@Override
public void visitElement(PsiElement element) {
diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unsorted/AlphaUnsortedPropertiesFileInspection.java b/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unsorted/AlphaUnsortedPropertiesFileInspection.java
index feab80c38ada..7fe5a6d8ffab 100644
--- a/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unsorted/AlphaUnsortedPropertiesFileInspection.java
+++ b/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unsorted/AlphaUnsortedPropertiesFileInspection.java
@@ -129,7 +129,7 @@ public class AlphaUnsortedPropertiesFileInspection extends LocalInspectionTool {
return Comparing.compare(p1.getKey(), p2.getKey(), String.CASE_INSENSITIVE_ORDER);
}
});
- final char delimiter = PropertiesCodeStyleSettings.getInstance(file.getProject()).KEY_VALUE_DELIMITER;
+ final char delimiter = PropertiesCodeStyleSettings.getInstance(file.getProject()).getDelimiter();
final StringBuilder rawText = new StringBuilder();
for (int i = 0; i < properties.size(); i++) {
IProperty property = properties.get(i);
diff --git a/plugins/properties/src/META-INF/plugin.xml b/plugins/properties/src/META-INF/plugin.xml
index 4937e63a1006..a41aa11884ce 100644
--- a/plugins/properties/src/META-INF/plugin.xml
+++ b/plugins/properties/src/META-INF/plugin.xml
@@ -112,6 +112,7 @@
+
diff --git a/plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesFormattingModelBuilder.java b/plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesFormattingModelBuilder.java
new file mode 100644
index 000000000000..c03bcbba791d
--- /dev/null
+++ b/plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesFormattingModelBuilder.java
@@ -0,0 +1,85 @@
+/*
+ * 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.lang.properties.formatting;
+
+import com.intellij.formatting.*;
+import com.intellij.lang.ASTNode;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.codeStyle.CodeStyleSettings;
+import com.intellij.psi.formatter.FormattingDocumentModelImpl;
+import com.intellij.psi.impl.source.SourceTreeToPsiMap;
+import com.intellij.psi.impl.source.tree.TreeElement;
+import com.intellij.psi.impl.source.tree.TreeUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author Dmitry Batkovich
+ */
+public class PropertiesFormattingModelBuilder implements FormattingModelBuilder {
+ @NotNull
+ @Override
+ public PropertiesFormattingModel createModel(PsiElement element, CodeStyleSettings settings) {
+ final ASTNode root = TreeUtil.getFileElement((TreeElement)SourceTreeToPsiMap.psiElementToTree(element));
+ final FormattingDocumentModelImpl documentModel = FormattingDocumentModelImpl.createOn(element.getContainingFile());
+ return new PropertiesFormattingModel(root, documentModel, settings);
+ }
+
+ @Nullable
+ @Override
+ public TextRange getRangeAffectingIndent(PsiFile file, int offset, ASTNode elementAtOffset) {
+ return null;
+ }
+
+ private static class PropertiesFormattingModel implements FormattingModel {
+ private final FormattingDocumentModelImpl myDocumentModel;
+ private PropertiesRootBlock myRoot;
+
+ public PropertiesFormattingModel(ASTNode root, FormattingDocumentModelImpl documentModel, CodeStyleSettings settings) {
+ myRoot = new PropertiesRootBlock(root, null, settings);
+ myDocumentModel = documentModel;
+ }
+
+ @NotNull
+ @Override
+ public Block getRootBlock() {
+ return myRoot;
+ }
+
+ @NotNull
+ @Override
+ public FormattingDocumentModel getDocumentModel() {
+ return myDocumentModel;
+ }
+
+ @Override
+ public TextRange replaceWhiteSpace(TextRange textRange, String whiteSpace) {
+ return textRange;
+ }
+
+ @Override
+ public TextRange shiftIndentInsideRange(ASTNode node, TextRange range, int indent) {
+ return null;
+ }
+
+ @Override
+ public void commitChanges() {
+
+ }
+ }
+}
diff --git a/plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesRootBlock.java b/plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesRootBlock.java
new file mode 100644
index 000000000000..371eb06d0df4
--- /dev/null
+++ b/plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesRootBlock.java
@@ -0,0 +1,109 @@
+/*
+ * 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.lang.properties.formatting;
+
+import com.intellij.formatting.Alignment;
+import com.intellij.formatting.Block;
+import com.intellij.formatting.Spacing;
+import com.intellij.formatting.Wrap;
+import com.intellij.lang.ASTNode;
+import com.intellij.lang.properties.parsing.PropertiesTokenTypes;
+import com.intellij.lang.properties.parsing.PropertyListStubElementType;
+import com.intellij.lang.properties.parsing.PropertyStubElementType;
+import com.intellij.lang.properties.psi.codeStyle.PropertiesCodeStyleSettings;
+import com.intellij.lang.properties.psi.impl.PropertyKeyImpl;
+import com.intellij.lang.properties.psi.impl.PropertyValueImpl;
+import com.intellij.psi.PsiWhiteSpace;
+import com.intellij.psi.codeStyle.CodeStyleSettings;
+import com.intellij.psi.formatter.common.AbstractBlock;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Dmitry Batkovich
+ */
+public class PropertiesRootBlock extends AbstractBlock {
+
+ private final CodeStyleSettings mySettings;
+ private Alignment mySeparatorAlignment;
+
+ protected PropertiesRootBlock(@NotNull ASTNode node,
+ @Nullable Wrap wrap, CodeStyleSettings settings) {
+ super(node, wrap, Alignment.createAlignment());
+ mySettings = settings;
+ mySeparatorAlignment = Alignment.createAlignment(true, Alignment.Anchor.LEFT);
+ }
+
+ @Override
+ protected List buildChildren() {
+ final List result = new ArrayList<>();
+ ASTNode child = myNode.getFirstChildNode();
+ while (child != null) {
+ if (!(child instanceof PsiWhiteSpace)) {
+ if (child.getElementType() instanceof PropertyListStubElementType) {
+ ASTNode propertyNode = child.getFirstChildNode();
+ while (propertyNode != null) {
+ if (propertyNode.getElementType() instanceof PropertyStubElementType) {
+ collectPropertyBlock(propertyNode, result);
+ }
+ else if (PropertiesTokenTypes.END_OF_LINE_COMMENT.equals(propertyNode.getElementType())) {
+ result.add(new PropertyBlock(propertyNode, null));
+ }
+ propertyNode = propertyNode.getTreeNext();
+ }
+ break;
+ }
+ }
+ if (PropertiesTokenTypes.END_OF_LINE_COMMENT.equals(child.getElementType())) {
+ result.add(new PropertyBlock(child, null));
+ }
+ child = child.getTreeNext();
+ }
+ return result;
+ }
+
+ private void collectPropertyBlock(ASTNode propertyNode, List collector) {
+ final ASTNode key = propertyNode.getFirstChildNode();
+ if (key instanceof PropertyKeyImpl) {
+ collector.add(new PropertyBlock(key, null));
+ final ASTNode separator = key.getTreeNext();
+ if (separator != null && PropertiesTokenTypes.KEY_VALUE_SEPARATOR.equals(separator.getElementType())) {
+ collector.add(new SeparatorBlock(separator, mySettings.ALIGN_GROUP_FIELD_DECLARATIONS ? mySeparatorAlignment : null));
+ final ASTNode value = separator.getTreeNext();
+ if (value instanceof PropertyValueImpl) {
+ collector.add(new PropertyBlock(value, null));
+ }
+ }
+ }
+ }
+
+ @Nullable
+ @Override
+ public Spacing getSpacing(@Nullable Block child1, @NotNull Block child2) {
+ return mySettings.getCustomSettings(PropertiesCodeStyleSettings.class).SPACES_AROUND_KEY_VALUE_DELIMITER &&
+ (child1 instanceof SeparatorBlock || child2 instanceof SeparatorBlock)
+ ? Spacing.createSpacing(1, 1, 0, true, 0)
+ : Spacing.createSpacing(0, 0, 0, true, 0);
+ }
+
+ @Override
+ public boolean isLeaf() {
+ return false;
+ }
+}
diff --git a/plugins/properties/src/com/intellij/lang/properties/formatting/PropertyBlock.java b/plugins/properties/src/com/intellij/lang/properties/formatting/PropertyBlock.java
new file mode 100644
index 000000000000..a7dd751b95c7
--- /dev/null
+++ b/plugins/properties/src/com/intellij/lang/properties/formatting/PropertyBlock.java
@@ -0,0 +1,56 @@
+/*
+ * 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.lang.properties.formatting;
+
+import com.intellij.formatting.*;
+import com.intellij.lang.ASTNode;
+import com.intellij.psi.formatter.common.AbstractBlock;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Dmitry Batkovich
+ */
+public class PropertyBlock extends AbstractBlock {
+ protected PropertyBlock(@NotNull ASTNode node,
+ @Nullable Alignment alignment) {
+ super(node, null, alignment);
+ }
+
+ @Override
+ protected List buildChildren() {
+ return Collections.emptyList();
+ }
+
+ @Nullable
+ @Override
+ public Spacing getSpacing(@Nullable Block child1, @NotNull Block child2) {
+ return null;
+ }
+
+ @Override
+ public boolean isLeaf() {
+ return true;
+ }
+
+ @Override
+ public Indent getIndent() {
+ return Indent.getAbsoluteNoneIndent();
+ }
+}
diff --git a/plugins/properties/src/com/intellij/lang/properties/formatting/SeparatorBlock.java b/plugins/properties/src/com/intellij/lang/properties/formatting/SeparatorBlock.java
new file mode 100644
index 000000000000..4a5e87623d89
--- /dev/null
+++ b/plugins/properties/src/com/intellij/lang/properties/formatting/SeparatorBlock.java
@@ -0,0 +1,55 @@
+/*
+ * 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.lang.properties.formatting;
+
+import com.intellij.formatting.Alignment;
+import com.intellij.formatting.Block;
+import com.intellij.formatting.Indent;
+import com.intellij.formatting.Spacing;
+import com.intellij.lang.ASTNode;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.openapi.util.text.StringUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Dmitry Batkovich
+ */
+public class SeparatorBlock extends PropertyBlock {
+ private final static Logger LOG = Logger.getInstance(SeparatorBlock.class);
+
+ protected SeparatorBlock(@NotNull ASTNode node,
+ @Nullable Alignment alignment) {
+ super(node, alignment);
+ }
+
+ @NotNull
+ @Override
+ public TextRange getTextRange() {
+ final String nodeText = myNode.getText();
+ int separatorLocalOffset = StringUtil.indexOfAny(nodeText, "=:");
+ if (separatorLocalOffset == -1 && !nodeText.isEmpty() && nodeText.charAt(0) == ' ') {
+ separatorLocalOffset = 0;
+ }
+ LOG.assertTrue(separatorLocalOffset > -1, "Invalid separator \"" + myNode.getText() + "\'");
+ final int separatorOffset = myNode.getStartOffset() + separatorLocalOffset;
+ return new TextRange(separatorOffset, separatorOffset + 1);
+ }
+}
diff --git a/plugins/properties/testSrc/com/intellij/lang/properties/PropertiesFileTest.java b/plugins/properties/testSrc/com/intellij/lang/properties/PropertiesFileTest.java
index ce479b88c18e..93c519058709 100644
--- a/plugins/properties/testSrc/com/intellij/lang/properties/PropertiesFileTest.java
+++ b/plugins/properties/testSrc/com/intellij/lang/properties/PropertiesFileTest.java
@@ -182,12 +182,12 @@ public class PropertiesFileTest extends LightPlatformCodeInsightFixtureTestCase
public void testNonDefaultKeyValueDelimiter() {
final PropertiesCodeStyleSettings codeStyleSettings = PropertiesCodeStyleSettings.getInstance(getProject());
- codeStyleSettings.KEY_VALUE_DELIMITER = ':';
+ codeStyleSettings.KEY_VALUE_DELIMITER_CODE = 1;
final PropertyImpl property = (PropertyImpl)PropertiesElementFactory.createProperty(getProject(), "xxx", "yyy");
final Character delimiter = property.getKeyValueDelimiter();
assertNotNull(delimiter);
assertEquals(':', (char)delimiter);
assertEquals("xxx:yyy", property.getPsiElement().getText());
- codeStyleSettings.KEY_VALUE_DELIMITER = PropertiesCodeStyleSettings.DEFAULT_KEY_VALUE_DELIMITER;
+ codeStyleSettings.KEY_VALUE_DELIMITER_CODE = 0;
}
}