internal Span GetAvalonTextElementSpan(Int32 bufferPosition) { if (!this.ContainsPosition(bufferPosition)) { throw new ArgumentOutOfRangeException("bufferPosition"); } if ((bufferPosition < this.LineSpan.Start) || (bufferPosition > this.LineSpan.End)) { throw new ArgumentOutOfRangeException("bufferPosition"); } if (bufferPosition > (this.LineSpan.End - this.NewlineLength)) { return(new Span(this.LineSpan.End, 0)); } if (bufferPosition == (this.LineSpan.End - this.NewlineLength)) { return(new Span(this.LineSpan.End - this.NewlineLength, this.NewlineLength)); } Int32 lineRelativePosition = this.GetLineRelativePosition(bufferPosition); if (lineRelativePosition < 0) { lineRelativePosition = 0; } Int32 indexOfLineContaining = this.GetIndexOfLineContaining(lineRelativePosition); TextLine line = _textLines[indexOfLineContaining]; CharacterHit nextCaretCharacterHit = line.GetNextCaretCharacterHit(new CharacterHit(lineRelativePosition, 0)); Int32 bufferRelativePosition = this.GetBufferRelativePosition(nextCaretCharacterHit.FirstCharacterIndex + nextCaretCharacterHit.TrailingLength); nextCaretCharacterHit = line.GetPreviousCaretCharacterHit(new CharacterHit(this.GetLineRelativePosition(bufferRelativePosition), 0)); Int32 start = this.GetBufferRelativePosition(nextCaretCharacterHit.FirstCharacterIndex); return(new Span(start, bufferRelativePosition - start)); }