private DocumentLine SetLineLength(DocumentLine line, int newTotalLength)
{
// changedLines.Add(line);
// deletedOrChangedLines.Add(line);
var delta = newTotalLength - line.TotalLength;
if (delta != 0)
{
foreach (var lt in lineTrackers)
lt.SetLineLength(line, newTotalLength);
line.TotalLength = newTotalLength;
DocumentLineTree.UpdateAfterChildrenChange(line);
}
// determine new DelimiterLength
if (newTotalLength == 0)
{
line.DelimiterLength = 0;
}
else
{
var lineOffset = line.Offset;
var lastChar = document.GetCharAt(lineOffset + newTotalLength - 1);
if (lastChar == '\r')
{
line.DelimiterLength = 1;
}
else if (lastChar == '\n')
{
if (newTotalLength >= 2 && document.GetCharAt(lineOffset + newTotalLength - 2) == '\r')
{
line.DelimiterLength = 2;
}
else if (newTotalLength == 1 && lineOffset > 0 && document.GetCharAt(lineOffset - 1) == '\r')
{
// we need to join this line with the previous line
var previousLine = line.PreviousLine;
RemoveLine(line);
return SetLineLength(previousLine, previousLine.TotalLength + 1);
}
else
{
line.DelimiterLength = 1;
}
}
else
{
line.DelimiterLength = 0;
}
}
return line;
}