improvements for header collapse
diff --git a/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/internal/ui/text/folding/JavaScriptCommentFoldingBlockProvider.java b/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/internal/ui/text/folding/JavaScriptCommentFoldingBlockProvider.java
index af58541..a2acea1 100644
--- a/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/internal/ui/text/folding/JavaScriptCommentFoldingBlockProvider.java
+++ b/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/internal/ui/text/folding/JavaScriptCommentFoldingBlockProvider.java
@@ -11,10 +11,17 @@
*******************************************************************************/
package org.eclipse.dltk.javascript.internal.ui.text.folding;
+import java.util.List;
+
import org.eclipse.dltk.javascript.internal.ui.text.JSPartitioningProvider;
import org.eclipse.dltk.javascript.ui.text.IJavaScriptPartitions;
+import org.eclipse.dltk.ui.text.folding.IFoldingBlockKind;
import org.eclipse.dltk.ui.text.folding.IFoldingContent;
import org.eclipse.dltk.ui.text.folding.PartitioningFoldingBlockProvider;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
public class JavaScriptCommentFoldingBlockProvider extends
PartitioningFoldingBlockProvider {
@@ -38,4 +45,55 @@
JavaScriptFoldingBlockKind.JSDOC, isCollapseDocs());
}
+ @Override
+ protected void reportRegions(Document document, List<IRegion> regions,
+ IFoldingBlockKind kind, boolean collapse)
+ throws BadLocationException {
+ if ((kind == JavaScriptFoldingBlockKind.COMMENT || kind == JavaScriptFoldingBlockKind.JSDOC)
+ && collapse != isCollapseHeaderComment() && !regions.isEmpty()) {
+ final IRegion first = regions.get(0);
+ if (first.getOffset() == 0 && isFileHeader(document, first)) {
+ requestor.acceptBlock(first.getOffset(), first.getOffset()
+ + first.getLength(), kind, null /* no element */,
+ isCollapseHeaderComment());
+ super.reportRegions(document,
+ regions.subList(1, regions.size()), kind, collapse);
+ return;
+ }
+ }
+ super.reportRegions(document, regions, kind, collapse);
+ }
+
+ private boolean isFileHeader(IDocument document, IRegion region)
+ throws BadLocationException {
+ int endPos = region.getOffset() + region.getLength();
+ String txtAfterComment = document.get(endPos,
+ Math.min(20, document.getLength() - endPos));
+ int lineDelimiterCount = 0;
+ for (int i = 0; i < txtAfterComment.length(); i++) {
+ char c = txtAfterComment.charAt(i);
+ if (c == 'f') {
+ if (txtAfterComment.substring(i).startsWith("function"))
+ return false;
+ } else if (c == 'v') {
+ if (txtAfterComment.substring(i).startsWith("var"))
+ return false;
+ } else if (lineDelimiterCount == 1) {
+ // if after 1 line delimiter still no function
+ // or var is found then it is a header.
+ return true;
+ } else if (c == '\n') {
+ lineDelimiterCount++;
+ } else if (c == '\r') {
+ lineDelimiterCount++;
+ if (i + 1 < txtAfterComment.length()
+ && txtAfterComment.charAt(i + 1) == '\n')
+ i++; // skip \r\n
+ }
+ if (lineDelimiterCount == 2) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/ui/JavascriptPreferenceConstants.java b/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/ui/JavascriptPreferenceConstants.java
index d8bc5b4..18b93d3 100644
--- a/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/ui/JavascriptPreferenceConstants.java
+++ b/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/ui/JavascriptPreferenceConstants.java
@@ -78,5 +78,7 @@
true);
store.setDefault(PreferenceConstants.EDITOR_DOCS_FOLDING_ENABLED, true);
store.setDefault(PreferenceConstants.EDITOR_FOLDING_INIT_COMMENTS, true);
+ store.setDefault(
+ PreferenceConstants.EDITOR_FOLDING_INIT_HEADER_COMMENTS, true);
}
}