Browse Source

Speed up folding code a bit.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1981 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
6d85e67099
  1. 57
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/FoldingStrategy/FoldMarker.cs
  2. 152
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/FoldingStrategy/FoldingManager.cs

57
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/FoldingStrategy/FoldMarker.cs

@ -22,48 +22,69 @@ namespace ICSharpCode.TextEditor.Document @@ -22,48 +22,69 @@ namespace ICSharpCode.TextEditor.Document
string foldText = "...";
FoldType foldType = FoldType.Unspecified;
IDocument document = null;
int startLine = -1, startColumn, endLine = -1, endColumn;
static void GetPointForOffset(IDocument document, int offset, out int line, out int column)
{
if (offset < 0) offset = 0;
if (offset >= document.TextLength) offset = document.TextLength - 1;
line = document.GetLineNumberForOffset(offset);
column = offset - document.GetLineSegment(line).Offset;
}
public FoldType FoldType {
get {
return foldType;
}
set {
foldType = value;
}
get { return foldType; }
set { foldType = value; }
}
public int StartLine {
get {
if (offset > document.TextLength) {
return -1;
if (startLine < 0) {
GetPointForOffset(document, offset, out startLine, out startColumn);
}
return document.GetLineNumberForOffset(offset);
return startLine;
}
}
public int StartColumn {
get {
if (offset > document.TextLength) {
return -1;
if (startLine < 0) {
GetPointForOffset(document, offset, out startLine, out startColumn);
}
return offset - document.GetLineSegmentForOffset(offset).Offset ;
return startColumn;
}
}
public int EndLine {
get {
if (offset + length > document.TextLength) {
return document.TotalNumberOfLines + 1;
if (endLine < 0) {
GetPointForOffset(document, offset + length, out endLine, out endColumn);
}
return document.GetLineNumberForOffset(offset + length);
return endLine;
}
}
public int EndColumn {
get {
if (offset + length > document.TextLength) {
return -1;
if (endLine < 0) {
GetPointForOffset(document, offset + length, out endLine, out endColumn);
}
return offset + length - document.GetLineSegmentForOffset(offset + length).Offset;
return endColumn;
}
}
public override int Offset {
get { return base.Offset; }
set {
base.Offset = value;
startLine = -1; endLine = -1;
}
}
public override int Length {
get { return base.Length; }
set {
base.Length = value;
endLine = -1;
}
}

152
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/FoldingStrategy/FoldingManager.cs

@ -15,6 +15,7 @@ namespace ICSharpCode.TextEditor.Document @@ -15,6 +15,7 @@ namespace ICSharpCode.TextEditor.Document
public class FoldingManager
{
List<FoldMarker> foldMarker = new List<FoldMarker>();
List<FoldMarker> foldMarkerByEnd = new List<FoldMarker>();
IFoldingStrategy foldingStrategy = null;
IDocument document;
@ -41,16 +42,16 @@ namespace ICSharpCode.TextEditor.Document @@ -41,16 +42,16 @@ namespace ICSharpCode.TextEditor.Document
// lineTracker.LineCountChanged += new LineManagerEventHandler(LineManagerLineCountChanged);
// lineTracker.LineLengthChanged += new LineLengthEventHandler(LineManagerLineLengthChanged);
// foldMarker.Add(new FoldMarker(0, 5, 3, 5));
//
//
// foldMarker.Add(new FoldMarker(5, 5, 10, 3));
// foldMarker.Add(new FoldMarker(6, 0, 8, 2));
//
//
// FoldMarker fm1 = new FoldMarker(10, 4, 10, 7);
// FoldMarker fm2 = new FoldMarker(10, 10, 10, 14);
//
//
// fm1.IsFolded = true;
// fm2.IsFolded = true;
//
//
// foldMarker.Add(fm1);
// foldMarker.Add(fm2);
// foldMarker.Sort();
@ -81,40 +82,92 @@ namespace ICSharpCode.TextEditor.Document @@ -81,40 +82,92 @@ namespace ICSharpCode.TextEditor.Document
return foldings;
}
public List<FoldMarker> GetFoldingsWithStart(int lineNumber)
class StartComparer : IComparer<FoldMarker>
{
List<FoldMarker> foldings = new List<FoldMarker>();
if (foldMarker != null) {
foreach (FoldMarker fm in foldMarker) {
if (fm.StartLine == lineNumber) {
foldings.Add(fm);
}
}
public readonly static StartComparer Instance = new StartComparer();
public int Compare(FoldMarker x, FoldMarker y)
{
if (x.StartLine < y.StartLine)
return -1;
else if (x.StartLine == y.StartLine)
return x.StartColumn.CompareTo(y.StartColumn);
else
return 1;
}
return foldings;
}
public List<FoldMarker> GetFoldedFoldingsWithStart(int lineNumber)
class EndComparer : IComparer<FoldMarker>
{
public readonly static EndComparer Instance = new EndComparer();
public int Compare(FoldMarker x, FoldMarker y)
{
if (x.EndLine < y.EndLine)
return -1;
else if (x.EndLine == y.EndLine)
return x.EndColumn.CompareTo(y.EndColumn);
else
return 1;
}
}
List<FoldMarker> GetFoldingsByStartAfterColumn(int lineNumber, int column, bool forceFolded)
{
List<FoldMarker> foldings = new List<FoldMarker>();
if (foldMarker != null) {
foreach (FoldMarker fm in foldMarker) {
if (fm.IsFolded && fm.StartLine == lineNumber) {
int index = foldMarker.BinarySearch(
new FoldMarker(document, lineNumber, column, lineNumber, column),
StartComparer.Instance);
if (index < 0) index = ~index;
for (; index < foldMarker.Count; index++) {
FoldMarker fm = foldMarker[index];
if (fm.StartLine > lineNumber)
break;
if (fm.StartColumn <= column)
continue;
if (!forceFolded || fm.IsFolded)
foldings.Add(fm);
}
}
}
return foldings;
}
public List<FoldMarker> GetFoldingsWithStart(int lineNumber)
{
return GetFoldingsByStartAfterColumn(lineNumber, -1, false);
}
public List<FoldMarker> GetFoldedFoldingsWithStart(int lineNumber)
{
return GetFoldingsByStartAfterColumn(lineNumber, -1, true);
}
public List<FoldMarker> GetFoldedFoldingsWithStartAfterColumn(int lineNumber, int column)
{
return GetFoldingsByStartAfterColumn(lineNumber, column, true);
}
List<FoldMarker> GetFoldingsByEndAfterColumn(int lineNumber, int column, bool forceFolded)
{
List<FoldMarker> foldings = new List<FoldMarker>();
if (foldMarker != null) {
foreach (FoldMarker fm in foldMarker) {
if (fm.IsFolded && fm.StartLine == lineNumber && fm.StartColumn > column) {
int index = foldMarkerByEnd.BinarySearch(
new FoldMarker(document, lineNumber, column, lineNumber, column),
EndComparer.Instance);
if (index < 0) index = ~index;
for (; index < foldMarkerByEnd.Count; index++) {
FoldMarker fm = foldMarkerByEnd[index];
if (fm.EndLine > lineNumber)
break;
if (fm.EndColumn <= column)
continue;
if (!forceFolded || fm.IsFolded)
foldings.Add(fm);
}
}
}
return foldings;
@ -122,52 +175,22 @@ namespace ICSharpCode.TextEditor.Document @@ -122,52 +175,22 @@ namespace ICSharpCode.TextEditor.Document
public List<FoldMarker> GetFoldingsWithEnd(int lineNumber)
{
List<FoldMarker> foldings = new List<FoldMarker>();
if (foldMarker != null) {
foreach (FoldMarker fm in foldMarker) {
if (fm.EndLine == lineNumber) {
foldings.Add(fm);
}
}
}
return foldings;
return GetFoldingsByEndAfterColumn(lineNumber, -1, false);
}
public List<FoldMarker> GetFoldedFoldingsWithEnd(int lineNumber)
{
List<FoldMarker> foldings = new List<FoldMarker>();
if (foldMarker != null) {
foreach (FoldMarker fm in foldMarker) {
if (fm.IsFolded && fm.EndLine == lineNumber) {
foldings.Add(fm);
}
}
}
return foldings;
return GetFoldingsByEndAfterColumn(lineNumber, -1, true);
}
public bool IsFoldStart(int lineNumber)
{
if (foldMarker != null) {
foreach (FoldMarker fm in foldMarker) {
if (fm.StartLine == lineNumber) {
return true;
}
}
}
return false;
return GetFoldingsWithStart(lineNumber).Count > 0;
}
public bool IsFoldEnd(int lineNumber)
{
if (foldMarker != null) {
foreach (FoldMarker fm in foldMarker) {
if (fm.EndLine == lineNumber) {
return true;
}
}
}
return false;
return GetFoldingsWithEnd(lineNumber).Count > 0;
}
public List<FoldMarker> GetFoldingsContainsLineNumber(int lineNumber)
@ -185,24 +208,14 @@ namespace ICSharpCode.TextEditor.Document @@ -185,24 +208,14 @@ namespace ICSharpCode.TextEditor.Document
public bool IsBetweenFolding(int lineNumber)
{
if (foldMarker != null) {
foreach (FoldMarker fm in foldMarker) {
if (fm.StartLine < lineNumber && lineNumber < fm.EndLine) {
return true;
}
}
}
return false;
return GetFoldingsContainsLineNumber(lineNumber).Count > 0;
}
public bool IsLineVisible(int lineNumber)
{
if (foldMarker != null) {
foreach (FoldMarker fm in foldMarker) {
if (fm.IsFolded && fm.StartLine < lineNumber && lineNumber < fm.EndLine) {
return false;
}
}
foreach (FoldMarker fm in GetFoldingsContainsLineNumber(lineNumber)) {
if (fm.IsFolded)
return false;
}
return true;
}
@ -254,8 +267,11 @@ namespace ICSharpCode.TextEditor.Document @@ -254,8 +267,11 @@ namespace ICSharpCode.TextEditor.Document
}
if (newFoldings != null) {
foldMarker = newFoldings;
foldMarkerByEnd = new List<FoldMarker>(newFoldings);
foldMarkerByEnd.Sort(EndComparer.Instance);
} else {
foldMarker.Clear();
foldMarkerByEnd.Clear();
}
}
if (oldFoldingsCount != foldMarker.Count) {

Loading…
Cancel
Save