private static IEnumerable<Tuple<int, int>> GetOffsetForLinesInSegmentOnScreen(TextView textView, ISegment segment,
bool extendToFullWidthAtLineEnd = false)
{
var segmentStart = segment.Offset;
var segmentEnd = segment.Offset + segment.Length;
if (segmentStart > textView.TextDocument.TextLength)
{
segmentStart = textView.TextDocument.TextLength;
}
if (segmentEnd > textView.TextDocument.TextLength)
{
segmentEnd = textView.TextDocument.TextLength;
}
var start = new TextViewPosition(textView.TextDocument.GetLocation(segmentStart));
var end = new TextViewPosition(textView.TextDocument.GetLocation(segmentEnd));
foreach (var line in textView.VisualLines)
{
if (!line.DocumentLine.IsDeleted)
{
if (line.Offset > segmentEnd)
{
break;
}
if (line.EndOffset < segmentStart)
{
continue;
}
// find start and begining in current line.
var lineStartOffset = line.Offset;
if (segment.Offset > line.Offset)
{
lineStartOffset = line.Offset + (segment.Offset - line.Offset);
}
var lineEndOffset = line.EndOffset;
if (segment.EndOffset < line.EndOffset)
{
lineEndOffset = line.EndOffset - (line.EndOffset - segment.EndOffset);
}
// generate rect for section in this line.
yield return new Tuple<int, int>(lineStartOffset, lineEndOffset);
}
}
}