private protected virtual string GetFocusedText(IFocusTextFocus textCellFocus)
        {
            string Text = null;

            if (Focus is IFocusStringContentFocus AsTextFocus)
            {
                Text = GetFocusedStringContent(AsTextFocus);
            }
            else if (Focus is IFocusCommentFocus AsCommentFocus)
            {
                Text = GetFocusedCommentText(AsCommentFocus);
                if (Text == null)
                {
                    Text = string.Empty;
                }
            }

            Debug.Assert(Text != null);
            return(Text);
        }
        private protected virtual void SetTextFullSelection(IFocusTextFocus textFocus)
        {
            bool IsHandled = false;

            if (textFocus is IFocusStringContentFocus AsStringContentFocus)
            {
                string Text = GetFocusedStringContent(AsStringContentFocus);
                IFocusStringContentFocusableCellView CellView = AsStringContentFocus.CellView;
                SelectStringContent(CellView.StateView, CellView.PropertyName, 0, Text.Length);
                IsHandled = true;
            }
            else if (textFocus is IFocusCommentFocus AsCommentFocus)
            {
                string Text = GetFocusedCommentText(AsCommentFocus);
                IFocusCommentCellView CellView = AsCommentFocus.CellView;
                SelectComment(CellView.StateView, 0, Text.Length);
                IsHandled = true;
            }

            Debug.Assert(IsHandled);
        }
        private protected virtual void SetTextSelection(IFocusTextFocus textFocus)
        {
            bool IsHandled = false;

            int Start = CaretAnchorPosition >= 0 ? CaretAnchorPosition : 0;
            int End   = CaretPosition;

            if (textFocus is IFocusStringContentFocus AsStringContentFocus)
            {
                IFocusStringContentFocusableCellView CellView = AsStringContentFocus.CellView;
                SelectStringContent(CellView.StateView, CellView.PropertyName, Start, End);
                IsHandled = true;
            }
            else if (textFocus is IFocusCommentFocus AsCommentFocus)
            {
                IFocusCommentCellView CellView = AsCommentFocus.CellView;
                SelectComment(CellView.StateView, Start, End);
                IsHandled = true;
            }

            Debug.Assert(IsHandled);
        }
        private protected virtual void SetTextCaretPosition(string text, int position, bool resetAnchor, out bool isMoved)
        {
            int OldPosition = CaretPosition;

            if (position <= 0)
            {
                CaretPosition = 0;
            }
            else if (position >= text.Length)
            {
                CaretPosition = text.Length;
            }
            else
            {
                CaretPosition = position;
            }

            if (resetAnchor)
            {
                ResetSelection();
                CaretAnchorPosition = CaretPosition;
            }
            else if (Selection == EmptySelection)
            {
                IFocusTextFocus AsTextFocus = Focus as IFocusTextFocus;
                Debug.Assert(AsTextFocus != null);

                SetTextSelection(AsTextFocus);
            }
            else if (Selection is IFocusTextSelection AsTextSelection)
            {
                AsTextSelection.Update(CaretAnchorPosition, CaretPosition);
            }

            CheckCaretInvariant(text);

            isMoved = CaretPosition != OldPosition;
        }