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(); }
public void GetParaAndSpan(RtPosition pos, out IRtParagraph para, out IRtSpan span) { para = Paragraphs[pos.ParaIndex]; span = para.Spans[pos.SpanIndex]; }