|
|
|
@ -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) { |
|
|
|
|