System.err.println("virtualized start is " + start);
	public boolean collapseFoldAt(int line)	{		int initialFoldLevel = getFoldLevel(line);		int start = 0;		int end = lineCount - 1;		if(line != lineCount - 1			&& getFoldLevel(line + 1) > initialFoldLevel)		{			// this line is the start of a fold			start = line + 1;			for(int i = line + 1; i < lineCount; i++)			{				if(getFoldLevel(i) <= initialFoldLevel)				{					end = i - 1;					break;				}			}		}		else		{			boolean ok = false;			// scan backwards looking for the start			for(int i = line - 1; i >= 0; i--)			{				if(getFoldLevel(i) < initialFoldLevel)				{					start = i + 1;					ok = true;					break;				}			}			if(!ok)			{				// no folds in buffer				return false;			}			for(int i = line + 1; i < lineCount; i++)			{				if(getFoldLevel(i) < initialFoldLevel)				{					end = i - 1;					break;				}			}		}		for(int i = start; i <= end; i++)			lineInfo[i].visible = false;		System.err.println("collapse from " + start + " to " + end);		int delta = (end - start + 1);		// I forgot to do this at first and it took me ages to		// figure out		start = physicalToVirtual(start);		System.err.println("virtualized start is " + start);		// update virtual -> physical map		virtualLineCount -= delta;		System.err.println("new virtual line count is " + virtualLineCount);		System.arraycopy(virtualLines,start + delta,virtualLines,start,			virtualLineCount);		System.err.println("copy from " + (start + delta)			+ " to " + start);		// this sucks how we use document changed events		// to notify that the fold structure changed...		// but then, it does make sense		fireChangedUpdate(new DefaultDocumentEvent(0,0,			DocumentEvent.EventType.CHANGE));		return true;	}