diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/FoldingStrategy/FoldMarker.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/FoldingStrategy/FoldMarker.cs index 2ad0d14225..9f1b89b0d9 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/FoldingStrategy/FoldMarker.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/FoldingStrategy/FoldMarker.cs @@ -26,10 +26,16 @@ namespace ICSharpCode.TextEditor.Document 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; + if (offset > document.TextLength) { + line = document.TotalNumberOfLines + 1; + column = 1; + } else if (offset < 0) { + line = -1; + column = -1; + } else { + line = document.GetLineNumberForOffset(offset); + column = offset - document.GetLineSegment(line).Offset; + } } public FoldType FoldType { @@ -82,7 +88,7 @@ namespace ICSharpCode.TextEditor.Document } public override int Length { get { return base.Length; } - set { + set { base.Length = value; endLine = -1; } diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/FoldMargin.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/FoldMargin.cs index 4438e9d0cd..ec51d329f4 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/FoldMargin.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/FoldMargin.cs @@ -68,8 +68,10 @@ namespace ICSharpCode.TextEditor g.FillRectangle(BrushRegistry.GetBrush(textArea.Enabled ? lineNumberPainterColor.BackgroundColor : SystemColors.InactiveBorder), markerRectangle); } - int currentLine = textArea.Document.GetFirstLogicalLine(textArea.Document.GetVisibleLine(textArea.TextView.FirstVisibleLine) + y); - PaintFoldMarker(g, currentLine, markerRectangle); + int currentLine = textArea.Document.GetFirstLogicalLine(textArea.TextView.FirstPhysicalLine + y); + if (currentLine < textArea.Document.TotalNumberOfLines) { + PaintFoldMarker(g, currentLine, markerRectangle); + } } } } @@ -95,7 +97,7 @@ namespace ICSharpCode.TextEditor List foldingsBetween = textArea.Document.FoldingManager.GetFoldingsContainsLineNumber(lineNumber); List foldingsWithEnd = textArea.Document.FoldingManager.GetFoldingsWithEnd(lineNumber); - bool isFoldStart = foldingsWithStart.Count > 0; + bool isFoldStart = foldingsWithStart.Count > 0; bool isBetween = foldingsBetween.Count > 0; bool isFoldEnd = foldingsWithEnd.Count > 0; @@ -124,16 +126,16 @@ namespace ICSharpCode.TextEditor foreach (FoldMarker foldMarker in foldingsWithEnd) { if (foldMarker.EndLine > foldMarker.StartLine && !foldMarker.IsFolded) { isFoldEndFromUpperFold = true; - } + } } DrawFoldMarker(g, new RectangleF(drawingRectangle.X + (drawingRectangle.Width - foldMarkerSize) / 2, foldMarkerYPos, foldMarkerSize, foldMarkerSize), - isVisible, - isStartSelected - ); + isVisible, + isStartSelected + ); // draw line above fold marker if (isBetween || isFoldEndFromUpperFold) { @@ -155,19 +157,22 @@ namespace ICSharpCode.TextEditor } else { if (isFoldEnd) { int midy = drawingRectangle.Top + drawingRectangle.Height / 2; + + // draw fold end marker + g.DrawLine(BrushRegistry.GetPen(isEndSelected ? selectedFoldLine.Color : foldLineColor.Color), + xPos, + midy, + xPos + foldMarkerSize / 2, + midy); + // draw line above fold end marker + // must be drawn after fold marker because it might have a different color than the fold marker g.DrawLine(BrushRegistry.GetPen(isBetweenSelected || isEndSelected ? selectedFoldLine.Color : foldLineColor.Color), xPos, drawingRectangle.Top, xPos, midy); - // draw fold end marker - g.DrawLine(BrushRegistry.GetPen(isBetweenSelected || isEndSelected ? selectedFoldLine.Color : foldLineColor.Color), - xPos, - midy, - xPos + foldMarkerSize / 2, - midy); // draw line below fold end marker if (isBetween) { g.DrawLine(BrushRegistry.GetPen(isBetweenSelected ? selectedFoldLine.Color : foldLineColor.Color), @@ -237,7 +242,7 @@ namespace ICSharpCode.TextEditor } } -#region Drawing functions + #region Drawing functions void DrawFoldMarker(Graphics g, RectangleF rectangle, bool isOpened, bool isSelected) { HighlightColor foldMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("FoldMarker"); @@ -249,22 +254,22 @@ namespace ICSharpCode.TextEditor g.DrawRectangle(BrushRegistry.GetPen(isSelected ? selectedFoldLine.Color : foldMarkerColor.Color), intRect); int space = (int)Math.Round(((double)rectangle.Height) / 8d) + 1; - int mid = intRect.Height / 2 + intRect.Height % 2; + int mid = intRect.Height / 2 + intRect.Height % 2; - g.DrawLine(BrushRegistry.GetPen(foldLineColor.BackgroundColor), - rectangle.X + space, - rectangle.Y + mid, - rectangle.X + rectangle.Width - space, + g.DrawLine(BrushRegistry.GetPen(foldLineColor.BackgroundColor), + rectangle.X + space, + rectangle.Y + mid, + rectangle.X + rectangle.Width - space, rectangle.Y + mid); if (!isOpened) { - g.DrawLine(BrushRegistry.GetPen(foldLineColor.BackgroundColor), - rectangle.X + mid, - rectangle.Y + space, - rectangle.X + mid, + g.DrawLine(BrushRegistry.GetPen(foldLineColor.BackgroundColor), + rectangle.X + mid, + rectangle.Y + space, + rectangle.X + mid, rectangle.Y + rectangle.Height - space); } } -#endregion + #endregion } }