Exemplo n.º 1
0
        // --- insert ---
        public void Insert(string s)
        {
            if (!_selection.IsEmpty)
            {
                var index = _selection.Offset;
                var cmd   = new RemoveCommand(_target, _selection.Offset, _selection.Length);
                _executor.Execute(cmd);
                ReflectExecutedRange(cmd);
            }

            if (_nextInputInline != null)
            {
                _nextInputInline.Text = s;
                var cmd = new InsertInlineCommand(_target, _caretIndex, _nextInputInline);
                _executor.Execute(cmd);
                ReflectExecutedRange(cmd);
                _nextInputInline = null;
            }
            else
            {
                var cmd = new InsertStringCommand(_target, _caretIndex, s);
                _executor.Execute(cmd);
                ReflectExecutedRange(cmd);
            }
        }
Exemplo n.º 2
0
            public void WhenPosIsLessThanZero_ShouldInsertAtPositionZero()
            {
                var classUnderTest = new InsertStringCommand(-1, "first ");

                classUnderTest.Execute("my original string");

                Assert.That(classUnderTest.Result, Is.EqualTo("first my original string"));
            }
Exemplo n.º 3
0
            public void WhenPosIsGreaterThanLengthOfString_ShouldInsertAtEnd()
            {
                var classUnderTest = new InsertStringCommand(OriginalText.Length + 1, " was best");

                classUnderTest.Execute(OriginalText);

                Assert.That(classUnderTest.Result, Is.EqualTo("my original string was best"));
            }
Exemplo n.º 4
0
            public void WhenPositionWithinBounds_ShouldInsert()
            {
                var classUnderTest = new InsertStringCommand(3, "first ");

                classUnderTest.Execute("my original string");

                Assert.That(classUnderTest.Result, Is.EqualTo("my first original string"));
            }
Exemplo n.º 5
0
            public void WhenOriginalStringIsEmpty_ShouldntInsert()
            {
                var classUnderTest = new InsertStringCommand(3, OriginalText);

                classUnderTest.Execute(string.Empty);

                Assert.That(classUnderTest.Result, Is.EqualTo(OriginalText));
            }
Exemplo n.º 6
0
        public InsertStringForm(InsertStringCommand insertStringCommand, int id)
        {
            InitializeComponent();

            _insertStringCommand = insertStringCommand;
            _id = id;

            UpdateUiFromOperation();
        }
        public void ApplyShouldInsertStringInDifferentPositions(int position)
        {
            state.CurrentPosition = position;
            command = new InsertStringCommand("1");

            var result = command.Apply(state);

            result.Should().BeTrue();
            state.Text[position].Should().Be('1');
            state.CurrentPosition.Should().Be(position + 1);
        }
        public void ApplyShouldInsertStringWithDifferentLength(string insertString)
        {
            var insertPosition = 3;

            state.CurrentPosition = insertPosition;
            command = new InsertStringCommand(insertString);

            var result = command.Apply(state);

            result.Should().BeTrue();
            state.Text.ToString().Substring(insertPosition, insertString.Length).Should().BeEquivalentTo(insertString);
            state.CurrentPosition.Should().Be(insertPosition + insertString.Length);
        }
        public void RevertShouldRestoreStateInDifferentPositions(int position)
        {
            state.CurrentPosition = position;
            command = new InsertStringCommand("1");
            var oldState    = new ControllerState(state);
            var applyResult = command.Apply(state);

            applyResult.Should().BeTrue();

            var result = command.Revert(state);

            result.Should().BeTrue();
            state.Should().Be(oldState);
        }
        public void RevertShouldRestoreStateWithDifferentLength(string insertString)
        {
            var insertPosition = 3;

            state.CurrentPosition = insertPosition;
            command = new InsertStringCommand(insertString);
            var oldState    = new ControllerState(state);
            var applyResult = command.Apply(state);

            applyResult.Should().BeTrue();

            var result = command.Revert(state);

            result.Should().BeTrue();
            state.Should().Be(oldState);
        }
Exemplo n.º 11
0
        public void KeyDown(UKeyEvents e)
        {
            if (mIsBlankWindow)
            {
                return;
            }

            switch (e.KeyCode)
            {
            case UKeys.Left:
                mCodeRenderer.DecreaseCursorCol();
                mIntelligentSence.Reset();
                return;

            case UKeys.Right:
                mCodeRenderer.IncreaseCursorCol();
                mIntelligentSence.Reset();
                return;

            case UKeys.Up:
                if (mIntelligentSence.HasMatching)
                {
                    mIntelligentSence.DecreaseIndex();
                }
                else
                {
                    mCodeRenderer.DecreaseCursorRow();
                }
                return;

            case UKeys.Down:
                if (mIntelligentSence.HasMatching)
                {
                    mIntelligentSence.IncreaseIndex();
                }
                else
                {
                    mCodeRenderer.IncreaseCursorRow();
                }
                return;

            case UKeys.Back:
                // 删除键是删除鼠标前一个位置的字符
                if (mSelection.HasSelection)
                {
                    RemoveSelection();
                    return;
                }

                if (mCodeRenderer.CursorCol == 0)     // 在行首删除,合并当上一行
                {
                    if (mCodeRenderer.CursorRow > 0)
                    {
                        RemoveNewlineByteCommand rnc = new RemoveNewlineByteCommand(
                            mCodeManager,
                            new URank(mCodeRenderer.CursorRow - 1,
                                      mCodeManager.GetCodeLength(mCodeRenderer.CursorRow - 1) - 1));

                        mCodeManager.Execute(rnc);
                    }
                }
                else
                {
                    RemoveCharacterCommand rcc = new RemoveCharacterCommand(
                        mCodeManager,
                        new URank(mCodeRenderer.CursorRow, mCodeRenderer.CursorCol - 1));

                    mCodeManager.Execute(rcc);
                }
                return;

            case UKeys.Space:
            {
                // 这里不要return,留到下面处理space添加一个空格
                if (mIntelligentSence.HasMatching)
                {
                    mIntelligentSence.Selected();
                }
                else if (mSelection.HasSelection)
                {
                    RemoveSelection();
                }
            }
            break;

            case UKeys.Enter:
            {
                if (mIntelligentSence.HasMatching)
                {
                    mIntelligentSence.Selected();
                    return;
                }

                URank pos = mCodeRenderer.GetCursorPos();

                InsertNewLineByteCommand inc = new InsertNewLineByteCommand(mCodeManager, pos);

                mCodeManager.Execute(inc);

                // 缩进处理
                // 计算新的一行需要额外填充的空格
                // 从上一行的可见字符开始
                int padSpaceCount = mCodeManager.GetCodeLine(pos.Row).VisibleStartCol;

                // 按回车后,检查是否是在“{”或“}”后按的回车
                if (pos.Col - 1 >= 0)
                {
                    byte lastByte = mCodeManager.GetCodeData(pos.Row)[pos.Col - 1];         // 最后一个字符是回车,所以应该减一

                    // 如果是左括号“{”
                    if (lastByte == UConfig.LBracket)
                    {
                        padSpaceCount += UConfig.TabNumberOfSpace;
                    }
                }

                if (padSpaceCount > 0)
                {
                    // 如果只是在一行的空白部分中间按下回车
                    // 那么padSpaceCount = 上一行的空白部分
                    // 并且新的一行本身就包含了一部分
                    // 加起来刚好
                    byte[] spaceBytes = new byte[padSpaceCount];

                    for (int i = 0; i < padSpaceCount; i++)
                    {
                        spaceBytes[i] = UConfig.Space;
                    }

                    InsertStringCommand isc = new InsertStringCommand(mCodeManager, new URank(pos.Row + 1, 0), UHelper.GetStringByBytes(spaceBytes));

                    mCodeManager.Execute(isc);
                }

                return;
            }

            case UKeys.A:
                if (e.Ctrl)
                {
                    SelectAll();
                    return;
                }
                break;

            case UKeys.C:
                if (e.Ctrl)
                {
                    Copy();
                    return;
                }
                break;

            case UKeys.V:
                if (e.Ctrl)
                {
                    Paste();
                    return;
                }
                break;

            case UKeys.X:
                if (e.Ctrl)
                {
                    Cut();
                    return;
                }
                break;

            case UKeys.Y:
                if (e.Ctrl)
                {
                    mCodeManager.Redo();
                    return;
                }
                break;

            case UKeys.Z:
                if (e.Ctrl)
                {
                    mCodeManager.Undo();
                    return;
                }
                break;

            default:
                break;
            }

            char ch = UHelper.ParseKey(e);

            if (ch == (char)0)
            {
                return;
            }

            if (mSelection.HasSelection)
            {
                RemoveSelection();
            }

            InsertCharacterCommand iccd = new InsertCharacterCommand(mCodeManager, mCodeRenderer.GetCursorPos(), (byte)ch);

            mCodeManager.Execute(iccd);

            // 如果输入的字符是“}”,那么缩进一个Tab
            // 处理输入字符“{”,是在按回车处理
            if ((byte)ch == UConfig.RBracket)
            {
                URank pos             = mCodeRenderer.GetCursorPos();
                int   visibleStartCol = mCodeManager.GetCodeLine(pos.Row).VisibleStartCol;

                if (visibleStartCol >= UConfig.TabNumberOfSpace)
                {
                    // 缩进一个Tab,先找到最靠近第一个可见字符的空白字符,然后删除往前的空格
                    RemoveStringCommand rsc = new RemoveStringCommand(
                        mCodeManager,
                        new URank(pos.Row, visibleStartCol - UConfig.TabNumberOfSpace),
                        UConfig.TabNumberOfSpace);

                    mCodeManager.Execute(rsc);

                    mCodeRenderer.SetCursorPos(
                        new URank(
                            pos.Row,
                            mCodeManager.GetCodeLength(pos.Row) - 1));
                }
            }
        }