public virtual InlineSpan getSpanForPosition(TextPosition position) { D.assert(debugAssertIsValid()); Accumulator offset = new Accumulator(); InlineSpan result = null; visitChildren((InlineSpan span) => { result = span.getSpanForPositionVisitor(position, offset); return(result == null); }); return(result); }
public int?codeUnitAt(int index) { if (index < 0) { return(null); } Accumulator offset = new Accumulator(); int? result = null; visitChildren((InlineSpan span) => { result = span.codeUnitAtVisitor(index, offset); return(result == null); }); return(result); }
protected override int?codeUnitAtVisitor(int index, Accumulator offset) { if (text == null) { return(null); } if (index - offset.value < text.Length) { return(text[index - offset.value]); } offset.increment(text.Length); return(null); }
protected abstract int?codeUnitAtVisitor(int index, Accumulator offset);
protected abstract InlineSpan getSpanForPositionVisitor(TextPosition position, Accumulator offset);
protected override InlineSpan getSpanForPositionVisitor(TextPosition position, Accumulator offset) { if (text == null) { return(null); } TextAffinity affinity = position.affinity; int targetOffset = position.offset; int endOffset = offset.value + text.Length; if (offset.value == targetOffset && affinity == TextAffinity.downstream || offset.value < targetOffset && targetOffset < endOffset || endOffset == targetOffset && affinity == TextAffinity.upstream) { return(this); } offset.increment(text.Length); return(null); }