private void ExecuteKeyboard(KeyEventArgs keyboardEvent)
        {
            var endingPosition = algorithm.GetSelectionPosition(keyboardEvent);

            if (!selectionView.HasSelection())
            {
                selectionView.Select(new TextPosition(column: caretView.CaretPosition.Column, line: caretView.CaretPosition.Line));
            }

            selectionView.Select(endingPosition);
            caretView.MoveCursor(endingPosition);
        }
        public void Execute(object parameter)
        {
            var          keyboardEvent = parameter as KeyEventArgs;
            var          mouseEvent    = parameter as MouseButtonEventArgs;
            TextPosition newPos        = null;

            if (keyboardEvent != null)
            {
                newPos = caretView.GetNextPosition(keyboardEvent.Key);
                keyboardEvent.Handled = true;
            }
            else if (mouseEvent != null)
            {
                newPos = mouseEvent.GetPosition(caretView).GetDocumentPosition(TextConfiguration.GetCharSize());
            }
            if (newPos == null)
            {
                return;
            }

            int column = -1, line = -1;

            if (newPos.Column > textViewReader.GetLineLength(newPos.Line))
            {
                column = textViewReader.GetLineLength(newPos.Line);
            }
            if (newPos.Line >= textViewReader.LinesCount)
            {
                line = textViewReader.LinesCount - 1;
            }

            var moveDir = GetMoveDirection(newPos, caretView.CaretPosition);

            newPos = new TextPosition(column > -1 ? column : newPos.Column, line > -1 ? line : newPos.Line);
            newPos = textViewReader.AdjustStep(newPos, moveDir);

            caretView.MoveCursor(newPos);
        }