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);
            }
        }
Esempio n. 2
0
        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);
            }
        }