void InsertInternal(int offset, string text) { LineSegment segment = lineCollection.GetByOffset(offset); DelimiterSegment ds = NextDelimiter(text, 0); if (ds == null) { // no newline is being inserted, all text is inserted in a single line segment.InsertedLinePart(offset - segment.Offset, text.Length); SetSegmentLength(segment, segment.TotalLength + text.Length); return; } LineSegment firstLine = segment; firstLine.InsertedLinePart(offset - firstLine.Offset, ds.Offset); int lastDelimiterEnd = 0; while (ds != null) { // split line segment at line delimiter int lineBreakOffset = offset + ds.Offset + ds.Length; int segmentOffset = segment.Offset; int lengthAfterInsertionPos = segmentOffset + segment.TotalLength - (offset + lastDelimiterEnd); lineCollection.SetSegmentLength(segment, lineBreakOffset - segmentOffset); LineSegment newSegment = lineCollection.InsertSegmentAfter(segment, lengthAfterInsertionPos); segment.DelimiterLength = ds.Length; segment = newSegment; lastDelimiterEnd = ds.Offset + ds.Length; ds = NextDelimiter(text, lastDelimiterEnd); } firstLine.SplitTo(segment); // insert rest after last delimiter if (lastDelimiterEnd != text.Length) { segment.InsertedLinePart(0, text.Length - lastDelimiterEnd); SetSegmentLength(segment, segment.TotalLength + text.Length - lastDelimiterEnd); } }