private RtPosition ToRelPos(int absPos, out IRtParagraph para, out IRtSpan span)
        {
            para = text.Paragraphs[0];
            span = para.Spans[0];

            var toSkip = absPos;

            for (var paraIndex = 0; paraIndex < text.Paragraphs.Count; paraIndex++)
            {
                para = text.Paragraphs[paraIndex];
                for (var spanIndex = 0; spanIndex < para.Spans.Count; spanIndex++)
                {
                    span = para.Spans[spanIndex];
                    if (span.LayoutTextLength > toSkip)
                    {
                        return(new RtPosition(paraIndex, spanIndex, toSkip));
                    }
                    toSkip -= span.LayoutTextLength;
                }

                if (toSkip == 0)
                {
                    var lastSpanIndex = para.Spans.Count - 1;
                    var lastSpan      = para.Spans[lastSpanIndex];
                    return(new RtPosition(paraIndex, lastSpanIndex, lastSpan.LayoutTextLength));
                }

                toSkip--;
            }

            throw new ArgumentOutOfRangeException();
        }
        private void InsertSpanAt(int absPos, IRtSpan span)
        {
            var relPos = ToRelPos(absPos, out var para, out _);

            text.SplitSpan(relPos, out var nextSpanIndex);
            para.Spans.Insert(nextSpanIndex, span);
            Normalize();
        }
Пример #3
0
 public void GetParaAndSpan(RtPosition pos, out IRtParagraph para, out IRtSpan span)
 {
     para = Paragraphs[pos.ParaIndex];
     span = para.Spans[pos.SpanIndex];
 }