Browse Source

Fixed SD2-1190: Exception is thrown selecting all text and then cutting/deleting it.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2063 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
c838ffb4ad
  1. 16
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/FoldingStrategy/FoldMarker.cs
  2. 53
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/FoldMargin.cs

16
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) static void GetPointForOffset(IDocument document, int offset, out int line, out int column)
{ {
if (offset < 0) offset = 0; if (offset > document.TextLength) {
if (offset >= document.TextLength) offset = document.TextLength - 1; line = document.TotalNumberOfLines + 1;
line = document.GetLineNumberForOffset(offset); column = 1;
column = offset - document.GetLineSegment(line).Offset; } else if (offset < 0) {
line = -1;
column = -1;
} else {
line = document.GetLineNumberForOffset(offset);
column = offset - document.GetLineSegment(line).Offset;
}
} }
public FoldType FoldType { public FoldType FoldType {
@ -82,7 +88,7 @@ namespace ICSharpCode.TextEditor.Document
} }
public override int Length { public override int Length {
get { return base.Length; } get { return base.Length; }
set { set {
base.Length = value; base.Length = value;
endLine = -1; endLine = -1;
} }

53
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); g.FillRectangle(BrushRegistry.GetBrush(textArea.Enabled ? lineNumberPainterColor.BackgroundColor : SystemColors.InactiveBorder), markerRectangle);
} }
int currentLine = textArea.Document.GetFirstLogicalLine(textArea.Document.GetVisibleLine(textArea.TextView.FirstVisibleLine) + y); int currentLine = textArea.Document.GetFirstLogicalLine(textArea.TextView.FirstPhysicalLine + y);
PaintFoldMarker(g, currentLine, markerRectangle); if (currentLine < textArea.Document.TotalNumberOfLines) {
PaintFoldMarker(g, currentLine, markerRectangle);
}
} }
} }
} }
@ -95,7 +97,7 @@ namespace ICSharpCode.TextEditor
List<FoldMarker> foldingsBetween = textArea.Document.FoldingManager.GetFoldingsContainsLineNumber(lineNumber); List<FoldMarker> foldingsBetween = textArea.Document.FoldingManager.GetFoldingsContainsLineNumber(lineNumber);
List<FoldMarker> foldingsWithEnd = textArea.Document.FoldingManager.GetFoldingsWithEnd(lineNumber); List<FoldMarker> foldingsWithEnd = textArea.Document.FoldingManager.GetFoldingsWithEnd(lineNumber);
bool isFoldStart = foldingsWithStart.Count > 0; bool isFoldStart = foldingsWithStart.Count > 0;
bool isBetween = foldingsBetween.Count > 0; bool isBetween = foldingsBetween.Count > 0;
bool isFoldEnd = foldingsWithEnd.Count > 0; bool isFoldEnd = foldingsWithEnd.Count > 0;
@ -124,16 +126,16 @@ namespace ICSharpCode.TextEditor
foreach (FoldMarker foldMarker in foldingsWithEnd) { foreach (FoldMarker foldMarker in foldingsWithEnd) {
if (foldMarker.EndLine > foldMarker.StartLine && !foldMarker.IsFolded) { if (foldMarker.EndLine > foldMarker.StartLine && !foldMarker.IsFolded) {
isFoldEndFromUpperFold = true; isFoldEndFromUpperFold = true;
} }
} }
DrawFoldMarker(g, new RectangleF(drawingRectangle.X + (drawingRectangle.Width - foldMarkerSize) / 2, DrawFoldMarker(g, new RectangleF(drawingRectangle.X + (drawingRectangle.Width - foldMarkerSize) / 2,
foldMarkerYPos, foldMarkerYPos,
foldMarkerSize, foldMarkerSize,
foldMarkerSize), foldMarkerSize),
isVisible, isVisible,
isStartSelected isStartSelected
); );
// draw line above fold marker // draw line above fold marker
if (isBetween || isFoldEndFromUpperFold) { if (isBetween || isFoldEndFromUpperFold) {
@ -155,19 +157,22 @@ namespace ICSharpCode.TextEditor
} else { } else {
if (isFoldEnd) { if (isFoldEnd) {
int midy = drawingRectangle.Top + drawingRectangle.Height / 2; 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 // 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), g.DrawLine(BrushRegistry.GetPen(isBetweenSelected || isEndSelected ? selectedFoldLine.Color : foldLineColor.Color),
xPos, xPos,
drawingRectangle.Top, drawingRectangle.Top,
xPos, xPos,
midy); 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 // draw line below fold end marker
if (isBetween) { if (isBetween) {
g.DrawLine(BrushRegistry.GetPen(isBetweenSelected ? selectedFoldLine.Color : foldLineColor.Color), 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) void DrawFoldMarker(Graphics g, RectangleF rectangle, bool isOpened, bool isSelected)
{ {
HighlightColor foldMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("FoldMarker"); HighlightColor foldMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("FoldMarker");
@ -249,22 +254,22 @@ namespace ICSharpCode.TextEditor
g.DrawRectangle(BrushRegistry.GetPen(isSelected ? selectedFoldLine.Color : foldMarkerColor.Color), intRect); g.DrawRectangle(BrushRegistry.GetPen(isSelected ? selectedFoldLine.Color : foldMarkerColor.Color), intRect);
int space = (int)Math.Round(((double)rectangle.Height) / 8d) + 1; 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), g.DrawLine(BrushRegistry.GetPen(foldLineColor.BackgroundColor),
rectangle.X + space, rectangle.X + space,
rectangle.Y + mid, rectangle.Y + mid,
rectangle.X + rectangle.Width - space, rectangle.X + rectangle.Width - space,
rectangle.Y + mid); rectangle.Y + mid);
if (!isOpened) { if (!isOpened) {
g.DrawLine(BrushRegistry.GetPen(foldLineColor.BackgroundColor), g.DrawLine(BrushRegistry.GetPen(foldLineColor.BackgroundColor),
rectangle.X + mid, rectangle.X + mid,
rectangle.Y + space, rectangle.Y + space,
rectangle.X + mid, rectangle.X + mid,
rectangle.Y + rectangle.Height - space); rectangle.Y + rectangle.Height - space);
} }
} }
#endregion #endregion
} }
} }

Loading…
Cancel
Save