// --- 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); } }
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")); }
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")); }
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")); }
public void WhenOriginalStringIsEmpty_ShouldntInsert() { var classUnderTest = new InsertStringCommand(3, OriginalText); classUnderTest.Execute(string.Empty); Assert.That(classUnderTest.Result, Is.EqualTo(OriginalText)); }
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); }
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)); } } }