From 317877d67a0ad20f2a98deb529f3656de7c53472 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 15 Jun 2011 19:02:56 +0200 Subject: [PATCH] some folding --- idea/src/META-INF/plugin.xml | 1 + .../jet/plugin/JetFoldingBuilder.java | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 idea/src/org/jetbrains/jet/plugin/JetFoldingBuilder.java diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index cdc1c7371ba..aac36d31f2d 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -23,6 +23,7 @@ + diff --git a/idea/src/org/jetbrains/jet/plugin/JetFoldingBuilder.java b/idea/src/org/jetbrains/jet/plugin/JetFoldingBuilder.java new file mode 100644 index 00000000000..f36545242dd --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/JetFoldingBuilder.java @@ -0,0 +1,53 @@ +package org.jetbrains.jet.plugin; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.folding.FoldingBuilder; +import com.intellij.lang.folding.FoldingDescriptor; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.util.TextRange; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.JetNodeTypes; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author yole + */ +public class JetFoldingBuilder implements FoldingBuilder, DumbAware { + @NotNull + @Override + public FoldingDescriptor[] buildFoldRegions(@NotNull ASTNode node, @NotNull Document document) { + List descriptors = new ArrayList(); + appendDescriptors(node, document, descriptors); + return descriptors.toArray(new FoldingDescriptor[descriptors.size()]); + } + + private void appendDescriptors(ASTNode node, Document document, List descriptors) { + TextRange textRange = node.getTextRange(); + if ((node.getElementType() == JetNodeTypes.BLOCK || node.getElementType() == JetNodeTypes.CLASS_BODY) && + !isOneLine(textRange, document)) { + descriptors.add(new FoldingDescriptor(node, textRange)); + } + ASTNode child = node.getFirstChildNode(); + while (child != null) { + appendDescriptors(child, document, descriptors); + child = child.getTreeNext(); + } + } + + private boolean isOneLine(TextRange textRange, Document document) { + return document.getLineNumber(textRange.getStartOffset()) == document.getLineNumber(textRange.getEndOffset()); + } + + @Override + public String getPlaceholderText(@NotNull ASTNode astNode) { + return "{...}"; + } + + @Override + public boolean isCollapsedByDefault(@NotNull ASTNode astNode) { + return false; + } +} -- GitLab