IDEA-89431: Collapse Inline CSS

#IDEA-89431 fixed
This commit is contained in:
Alexander Zolotov
2012-07-31 13:43:27 +04:00
parent 3a4eeb8d56
commit 305455d04d
@@ -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);
}
}