From 305455d04deeeb3862cc1fb4c5a01b4c8ff958d8 Mon Sep 17 00:00:00 2001 From: Alexander Zolotov Date: Tue, 31 Jul 2012 13:38:55 +0400 Subject: [PATCH] IDEA-89431: Collapse Inline CSS #IDEA-89431 fixed --- .../intellij/lang/xml/XmlFoldingBuilder.java | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/xml/impl/src/com/intellij/lang/xml/XmlFoldingBuilder.java b/xml/impl/src/com/intellij/lang/xml/XmlFoldingBuilder.java index 32d44782ca7f..d891701596e5 100644 --- a/xml/impl/src/com/intellij/lang/xml/XmlFoldingBuilder.java +++ b/xml/impl/src/com/intellij/lang/xml/XmlFoldingBuilder.java @@ -30,9 +30,11 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiWhiteSpace; import com.intellij.psi.tree.TokenSet; import com.intellij.psi.xml.*; +import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.xml.util.XmlTagUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -43,6 +45,7 @@ import java.util.List; public class XmlFoldingBuilder implements FoldingBuilder, DumbAware { private static final Logger LOG = Logger.getInstance("#com.intellij.lang.xml.XmlFoldingBuilder"); private static final TokenSet XML_ATTRIBUTE_SET = TokenSet.create(XmlElementType.XML_ATTRIBUTE); + private static final String[] XML_FOLDING_ATTRIBUTE_NAMES = new String[] {"style"}; @NotNull public FoldingDescriptor[] buildFoldRegions(@NotNull ASTNode node, @NotNull Document document) { @@ -101,6 +104,9 @@ public class XmlFoldingBuilder implements FoldingBuilder, DumbAware { } } } + else if(child instanceof XmlAttribute && isAttributeShouldBeFolded((XmlAttribute)child)) { + addToFold(foldings, child, document); + } else { final Language language = child.getLanguage(); if (!(language instanceof XMLLanguage) && language != Language.ANY) { @@ -116,6 +122,7 @@ public class XmlFoldingBuilder implements FoldingBuilder, DumbAware { } } + @Nullable public TextRange getRangeToFold(PsiElement element) { if (element instanceof XmlTag) { final ASTNode tagNode = element.getNode(); @@ -172,6 +179,9 @@ public class XmlFoldingBuilder implements FoldingBuilder, DumbAware { return null; } } + else if (element instanceof XmlAttribute) { + return element.getTextRange(); + } else { return null; } @@ -180,7 +190,7 @@ public class XmlFoldingBuilder implements FoldingBuilder, DumbAware { protected int getCommentStartOffset(final XmlComment element) { return 4; } - + protected int getCommentStartEnd(final XmlComment element) { return 3; } @@ -189,25 +199,27 @@ public class XmlFoldingBuilder implements FoldingBuilder, DumbAware { LOG.assertTrue(elementToFold.isValid()); TextRange range = getRangeToFold(elementToFold); if (range == null) return false; - - if(range.getStartOffset() >= 0 && + + if(range.getStartOffset() >= 0 && range.getEndOffset() <= elementToFold.getContainingFile().getTextRange().getEndOffset() && range.getEndOffset() <= document.getTextLength() // psi and document maybe not in sync after error ) { - int startLine = document.getLineNumber(range.getStartOffset()); - int endLine = document.getLineNumber(range.getEndOffset() - 1); - if (startLine < endLine) { + if (range.getStartOffset() + 1 < range.getEndOffset()) { foldings.add(new FoldingDescriptor(elementToFold.getNode(), range)); return true; - } + } } - + return false; } public String getPlaceholderText(@NotNull ASTNode node) { final PsiElement psi = node.getPsi(); + if(psi instanceof XmlAttribute) { + final String attributeName = ((XmlAttribute)psi).getName(); + return attributeName.isEmpty() ? "..." : attributeName; + } if (psi instanceof XmlTag || psi instanceof XmlComment || psi instanceof XmlConditionalSection @@ -217,6 +229,11 @@ public class XmlFoldingBuilder implements FoldingBuilder, DumbAware { public boolean isCollapsedByDefault(@NotNull ASTNode node) { final PsiElement psi = node.getPsi(); - return psi instanceof XmlTag && XmlFoldingSettings.getInstance().isCollapseXmlTags(); + return psi instanceof XmlTag && XmlFoldingSettings.getInstance().isCollapseXmlTags() + || psi instanceof XmlAttribute; + } + + private static boolean isAttributeShouldBeFolded(XmlAttribute child) { + return ArrayUtil.contains(((XmlAttribute)child).getName(), XML_FOLDING_ATTRIBUTE_NAMES); } }