[prev in list] [next in list] [prev in thread] [next in thread]
List: jedit-cvs
Subject: [ jEdit-commits ] SF.net SVN: jedit:[16133]
From: shlomy () users ! sourceforge ! net
Date: 2009-08-31 21:07:15
Message-ID: E1MiE5r-0007TC-OF () 3kljzd1 ! ch3 ! sourceforge ! com
[Download RAW message or body]
Revision: 16133
http://jedit.svn.sourceforge.net/jedit/?rev=16133&view=rev
Author: shlomy
Date: 2009-08-31 21:07:15 +0000 (Mon, 31 Aug 2009)
Log Message:
-----------
Fix for patch #2846169: IndentFoldHandler - allow blank lines after start of fold
The previous patch did not work correctly, because the folding code in jEdit assumed \
that a content change in a line cannot affect the fold levels of the preceding lines. \
Hence, it did not recalculate the fold levels of the preceding lines, and did not \
update the fold markers accordingly. The patch for the indent folding mode gives \
whitespace-only lines the same fold level as the first non-whitespace-only line \
following them, so it breaks this assumption, since a change to a line can affect the \
fold level of preceding whitespace-only lines. This commit fixes the assumption by \
adding a new method to the fold handler for returning the fold levels of preceding \
lines. Whenever the fold level of a line is changed, this new method is called and \
the fold levels of the preceding lines get updated correctly. By default, this method \
does not return anything so no overhead (almost) is added.
Modified Paths:
--------------
jEdit/trunk/org/gjt/sp/jedit/buffer/FoldHandler.java
jEdit/trunk/org/gjt/sp/jedit/buffer/IndentFoldHandler.java
jEdit/trunk/org/gjt/sp/jedit/buffer/JEditBuffer.java
Modified: jEdit/trunk/org/gjt/sp/jedit/buffer/FoldHandler.java
===================================================================
--- jEdit/trunk/org/gjt/sp/jedit/buffer/FoldHandler.java 2009-08-31 13:18:50 UTC (rev \
16132)
+++ jEdit/trunk/org/gjt/sp/jedit/buffer/FoldHandler.java 2009-08-31 21:07:15 UTC (rev \
16133) @@ -22,6 +22,8 @@
package org.gjt.sp.jedit.buffer;
+import java.util.List;
+
import javax.swing.text.Segment;
/**
@@ -78,6 +80,25 @@
public abstract int getFoldLevel(JEditBuffer buffer, int lineIndex, Segment seg);
//}}}
+ //{{{ getPrecedingFoldLevels() method
+ /**
+ * Returns the fold levels of the lines preceding the specified line,
+ * which depend on the specified line.
+ * @param buffer The buffer in question
+ * @param lineIndex The line index
+ * @param seg A segment the fold handler can use to obtain any
+ * @param lineFoldLevel The fold level of the specified line
+ * @return The fold levels of the preceding lines, in decreasing line
+ * number order (i.e. bottomost line first).
+ * @since jEdit 4.3pre18
+ */
+ public List<Integer> getPrecedingFoldLevels(JEditBuffer buffer,
+ int lineIndex, Segment seg, int lineFoldLevel)
+ {
+ return null;
+ }
+ //}}}
+
//{{{ equals() method
/**
* Returns if the specified fold handler is equal to this one.
Modified: jEdit/trunk/org/gjt/sp/jedit/buffer/IndentFoldHandler.java
===================================================================
--- jEdit/trunk/org/gjt/sp/jedit/buffer/IndentFoldHandler.java 2009-08-31 13:18:50 \
UTC (rev 16132)
+++ jEdit/trunk/org/gjt/sp/jedit/buffer/IndentFoldHandler.java 2009-08-31 21:07:15 \
UTC (rev 16133) @@ -22,6 +22,9 @@
package org.gjt.sp.jedit.buffer;
+import java.util.ArrayList;
+import java.util.List;
+
import javax.swing.text.Segment;
/**
@@ -37,6 +40,31 @@
super("indent");
}
+ // Returns the width of leading whitespace in the given segment
+ // if it contains non-whitespace characters, or (-1) otherwise.
+ private int getLeadingWhitespaceWidth(Segment seg, int tabSize)
+ {
+ int offset = seg.offset;
+ int count = seg.count;
+ int whitespace = 0;
+
+ for(int i = 0; i < count; i++)
+ {
+ switch(seg.array[offset + i])
+ {
+ case ' ':
+ whitespace++;
+ break;
+ case '\t':
+ whitespace += (tabSize - whitespace % tabSize);
+ break;
+ default:
+ return whitespace;
+ }
+ }
+ return (-1);
+ }
+
//{{{ getFoldLevel() method
/**
* Returns the fold level of the specified line. For a whitespace-only
@@ -58,28 +86,8 @@
for (int index = lineIndex; index < buffer.getLineCount(); index++)
{
buffer.getLineText(index,seg);
- int offset = seg.offset;
- int count = seg.count;
- int whitespace = 0;
- boolean seenNonWhiteSpace = false;
-
-loop: for(int i = 0; i < count; i++)
- {
- switch(seg.array[offset + i])
- {
- case ' ':
- whitespace++;
- break;
- case '\t':
- whitespace += (tabSize - whitespace % tabSize);
- break;
- default:
- seenNonWhiteSpace = true;
- break loop;
- }
- }
-
- if(seenNonWhiteSpace)
+ int whitespace = getLeadingWhitespaceWidth(seg,tabSize);
+ if(whitespace >= 0) // Non-whitespace found on line
return (whitespace > prevLevel) ? whitespace : prevLevel;
if(index == 0)
return 0;
@@ -90,4 +98,39 @@
// level of previous line.
return prevLevel;
} //}}}
+
+ //{{{ getPrecedingFoldLevels() method
+ /**
+ * Returns the fold levels of the lines preceding the specified line,
+ * which depend on the specified line.
+ * @param buffer The buffer in question
+ * @param lineIndex The line index
+ * @param seg A segment the fold handler can use to obtain any
+ * @param lineFoldLevel The fold level of the specified line
+ * @return The fold levels of the preceding lines, in decreasing line
+ * number order (i.e. bottomost line first).
+ * @since jEdit 4.3pre18
+ */
+ public List<Integer> getPrecedingFoldLevels(JEditBuffer buffer,
+ int lineIndex, Segment seg, int lineFoldLevel)
+ {
+ List<Integer> precedingFoldLevels = new ArrayList<Integer>();
+ int tabSize = buffer.getTabSize();
+ int whitespace = 0;
+ int index;
+ // Find previous non-whitespace-only line
+ for (index = lineIndex - 1; index > 0; index--)
+ {
+ buffer.getLineText(index,seg);
+ whitespace = getLeadingWhitespaceWidth(seg,tabSize);
+ if (whitespace >= 0)
+ break;
+ }
+ int max = (lineFoldLevel > whitespace) ? lineFoldLevel : whitespace;
+ for (index++; index < lineIndex; index++)
+ precedingFoldLevels.add(Integer.valueOf(max));
+ return precedingFoldLevels;
+ }
+ //}}}
+
}
Modified: jEdit/trunk/org/gjt/sp/jedit/buffer/JEditBuffer.java
===================================================================
--- jEdit/trunk/org/gjt/sp/jedit/buffer/JEditBuffer.java 2009-08-31 13:18:50 UTC (rev \
16132)
+++ jEdit/trunk/org/gjt/sp/jedit/buffer/JEditBuffer.java 2009-08-31 21:07:15 UTC (rev \
16133) @@ -1887,6 +1887,7 @@
int newFoldLevel = 0;
boolean changed = false;
+ int firstUpdatedFoldLevel = firstInvalidFoldLevel;
for(int i = firstInvalidFoldLevel; i <= line; i++)
{
@@ -1897,6 +1898,21 @@
if(Debug.FOLD_DEBUG)
Log.log(Log.DEBUG,this,i + " fold level changed");
changed = true;
+ // Update preceding fold levels if necessary
+ List<Integer> precedingFoldLevels =
+ foldHandler.getPrecedingFoldLevels(
+ this,i,seg,newFoldLevel);
+ if (precedingFoldLevels != null)
+ {
+ int j = i;
+ for (Integer foldLevel: precedingFoldLevels)
+ {
+ j--;
+ lineMgr.setFoldLevel(j,foldLevel.intValue());
+ }
+ if (j < firstUpdatedFoldLevel)
+ firstUpdatedFoldLevel = j;
+ }
}
lineMgr.setFoldLevel(i,newFoldLevel);
}
@@ -1909,8 +1925,8 @@
if(changed)
{
if(Debug.FOLD_DEBUG)
- Log.log(Log.DEBUG,this,"fold level changed: " + firstInvalidFoldLevel + ',' + \
line);
- fireFoldLevelChanged(firstInvalidFoldLevel,line);
+ Log.log(Log.DEBUG,this,"fold level changed: " + firstUpdatedFoldLevel + ',' + \
line); + fireFoldLevelChanged(firstUpdatedFoldLevel,line);
}
return newFoldLevel;
This was sent by the SourceForge.net collaborative development platform, the world's \
largest Open Source development site.
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
jEdit-CVS mailing list
jEdit-CVS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jedit-cvs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic