private static MeasuredRectangle MeasureBackward(TextCaret caret, ITextCaretMeasurer measurer)
        {
            if (caret.IsAtBlockStart || caret.Block?.Tag == null)
            {
                return(MeasuredRectangle.Invalid);
            }

            return(measurer.MeasureTextPosition(caret.GetPreviousPosition()));
        }
        private static MeasuredRectangle MeasureForward(TextCaret caret, ITextCaretMeasurer measurer)
        {
            if (caret.IsAtBlockEnd || caret.Block?.Tag == null)
            {
                Debug.Assert(!caret.IsAtBlockEnd, "This usually indicates an error");
                return(MeasuredRectangle.Invalid);
            }

            return(measurer.MeasureTextPosition(caret));
        }
        /// <summary>
        ///   Get the bounds of the given caret position.
        /// </summary>
        public static MeasuredRectangle Measure(TextCaret caret, ITextCaretMeasurer measurer)
        {
            bool isAtBlockStart = caret.IsAtBlockStart;
            bool isAtBlockEnd   = caret.IsAtBlockEnd;

            if (isAtBlockStart && isAtBlockEnd)
            {
                // if it's empty, there is no character to measure
                return(measurer.MeasureSelectionBounds().FlattenLeft());
            }

            // we want to measure the next character unless the previous character was
            // a space (as the text will most likely appear on the next line anyways)
            // TODO account for more whitespace
            bool shouldMeasureNext = isAtBlockStart ||
                                     (!isAtBlockEnd && caret.GetPreviousPosition().CharacterAfter.Text == " ");

            return(shouldMeasureNext
        ? MeasureForward(caret, measurer).FlattenLeft()
        : MeasureBackward(caret, measurer).FlattenRight());
        }