private void InsertInternal(int offset, string text) { LineSegment byOffset = this.lineCollection.GetByOffset(offset); LineManager.DelimiterSegment delimiterSegment = this.NextDelimiter(text, 0); if (delimiterSegment == null) { byOffset.InsertedLinePart(offset - byOffset.Offset, text.Length); this.SetSegmentLength(byOffset, byOffset.TotalLength + text.Length); return; } LineSegment lineSegment = byOffset; lineSegment.InsertedLinePart(offset - lineSegment.Offset, delimiterSegment.Offset); int num = 0; while (delimiterSegment != null) { int num1 = offset + delimiterSegment.Offset + delimiterSegment.Length; int num2 = byOffset.Offset; int totalLength = num2 + byOffset.TotalLength - (offset + num); this.lineCollection.SetSegmentLength(byOffset, num1 - num2); LineSegment lineSegment1 = this.lineCollection.InsertSegmentAfter(byOffset, totalLength); byOffset.DelimiterLength = delimiterSegment.Length; byOffset = lineSegment1; num = delimiterSegment.Offset + delimiterSegment.Length; delimiterSegment = this.NextDelimiter(text, num); } lineSegment.SplitTo(byOffset); if (num != text.Length) { byOffset.InsertedLinePart(0, text.Length - num); this.SetSegmentLength(byOffset, byOffset.TotalLength + text.Length - num); } }
void InsertInternal(int offset, string text, bool editLineState) { 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); if (editLineState) { newSegment.State = LineState.Modified; } 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, editLineState); } }