Example #1
0
        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));
        }