private void FixOnPreviewTextInput(TextCompositionEventArgs e)
        {
            var index = this.CaretOffset;
            var input = e.Text;

            var prev = this.PreviousChar.ToString();
            var next = this.NextChar.ToString();

            e.Handled = false;

            switch (input)
            {
            case "'":
            case "\"":
                if (this.IsSelectedSingleLine ||
                    (this.IsSelectedMultiLine && this.ExtendedOptions.EncloseMultiLine))
                {
                    if (this.ExtendedOptions.EncloseSelection)
                    {
                        e.Handled = true;
                        this.BeginChange();
                        this.Document.Insert(this.SelectionStart, input);
                        this.Document.Insert(this.SelectionStart + this.SelectionLength, input);
                        this.EndChange();
                    }
                    break;
                }
                if (this.IsSelectedMultiLine && !this.ExtendedOptions.EncloseMultiLine)
                {
                    break;
                }
                if (next == input &&
                    prev == input)
                {
                    e.Handled = true;
                    this.CaretOffset++;
                    break;
                }
                if (this.ExtendedOptions.BracketCompletion &&
                    ("\t\r\n \0".Contains(next) ||
                     ("({[".Contains(prev) && "]})".Contains(next))))
                {
                    e.Handled = true;
                    this.Document.Insert(index, input + input);
                    if (this.IsSelectedMultiLine)
                    {
                        this.CaretOffset++;
                    }
                    else
                    {
                        this.CaretOffset--;
                    }
                    break;
                }
                break;

            case "(":
            case "{":
            case "[":
                var closeBracket = StringChecker.GetCloseBracket(input).ToString();
                if (this.IsSelectedSingleLine ||
                    (this.IsSelectedMultiLine && this.ExtendedOptions.EncloseMultiLine))
                {
                    if (this.ExtendedOptions.EncloseSelection)
                    {
                        e.Handled = true;
                        this.BeginChange();
                        this.Document.Insert(this.SelectionStart, input);
                        this.Document.Insert(this.SelectionStart + this.SelectionLength, closeBracket);
                        this.EndChange();
                    }
                    break;
                }
                if (this.IsSelectedMultiLine && !this.ExtendedOptions.EncloseMultiLine)
                {
                    break;
                }
                if (this.ExtendedOptions.BracketCompletion &&
                    ("\t\r\n \0".Contains(next) ||
                     ("({[".Contains(prev) && "]})".Contains(next))))
                {
                    e.Handled = true;
                    this.Document.Insert(index, input + closeBracket);
                    if (this.IsSelectedMultiLine)
                    {
                        this.CaretOffset++;
                    }
                    else
                    {
                        this.CaretOffset--;
                    }
                    break;
                }
                break;

            case ")":
            case "}":
            case "]":
                if (next == input &&
                    prev == StringChecker.GetOpenBracket(input).ToString())
                {
                    e.Handled = true;
                    this.CaretOffset++;
                    break;
                }
                break;

            default:
                break;
            }
        }