Example #1
0
        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);
            }
        }