[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