public void TestUndoRedo() { var step = new UndoRedoStep("Test"); var s = string.Empty; step.Undo(); Assert.AreEqual(string.Empty, s); step.Redo(); Assert.AreEqual(string.Empty, s); step.AddAction(new UndoRedoActionTest.UndoRedoAction4Test(string.Empty, () => s += "x", () => s += "X")); step.Undo(); Assert.AreEqual("x", s); step.Redo(); Assert.AreEqual("xX", s); step.AddAction(new UndoRedoActionTest.UndoRedoAction4Test(string.Empty, () => s += "y", () => s += "Y")); s = string.Empty; step.Undo(); Assert.AreEqual("yx", s); step.Redo(); Assert.AreEqual("yxXY", s); }
public void AddUndo(UndoRedoStep current, bool modified) { redo.Clear(); // See if we can add this one to the last one var done = false; if ((current.tryJoinLast) && (modified) && (undo.Count != 0)) { var last = undo.Last(); if ((last.tryJoinLast) && (last.ranges.Count == current.ranges.Count)) { var change = 0; done = true; for (var num = 0; num < last.ranges.Count; ++num) { if (last.ranges[num].End + change != current.ranges[num].Start) { done = false; break; } change += current.ranges[num].Length - current.text[num].Length; } if (done) { change = 0; for (var num = 0; num < last.ranges.Count; ++num) { last.ranges[num] = new Range(last.ranges[num].Start + change, last.ranges[num].End + current.ranges[num].Length + change); last.text[num] += current.text[num]; change += current.ranges[num].Length - current.text[num].Length; } } } } if (!done) { undo.Add(current); } // Limit undo buffer while (true) { var totalChars = undo.Sum(undoItem => undoItem.text.Sum(textItem => textItem.Length)); if (totalChars <= maxUndo) { break; } undo.RemoveAt(0); } }
internal void AddUndo(UndoRedoStep current, bool modified) { redo.Clear(); // See if we can add this one to the last one var done = false; if ((current.tryJoinLast) && (modified) && (undo.Count != 0)) { var last = undo.Last(); if ((last.tryJoinLast) && (last.ranges.Count == current.ranges.Count)) { var change = 0; done = true; for (var num = 0; num < last.ranges.Count; ++num) { if (last.ranges[num].End + change != current.ranges[num].Start) { done = false; break; } change += current.ranges[num].Length - current.text[num].Length; } if (done) { change = 0; for (var num = 0; num < last.ranges.Count; ++num) { last.ranges[num] = new Range(last.ranges[num].Start + change, last.ranges[num].End + current.ranges[num].Length + change); last.text[num] += current.text[num]; change += current.ranges[num].Length - current.text[num].Length; } } } } if (!done) { undo.Add(current); } // Limit undo buffer while (true) { var totalChars = undo.Sum(undoItem => undoItem.text.Sum(textItem => textItem.Length)); if (totalChars <= maxUndo) break; undo.RemoveAt(0); } }
internal void AddUndo(UndoRedoStep current) { if (modifiedSteps < 0) modifiedSteps = int.MinValue / 2; // Never reach 0 again redo.Clear(); // See if we can add this one to the last one var done = false; if ((modifiedSteps != 0) && (undo.Count != 0)) { var last = undo.Last(); if (last.index + last.count == current.index) { last.count += current.count; var oldSize = last.bytes.LongLength; Array.Resize(ref last.bytes, (int)(last.bytes.LongLength + current.bytes.LongLength)); Array.Copy(current.bytes, 0, last.bytes, oldSize, current.bytes.LongLength); done = true; } } if (!done) { undo.Add(current); ++modifiedSteps; } // Limit undo buffer while (true) { var totalChars = undo.Sum(undoItem => undoItem.bytes.LongLength); if (totalChars <= maxUndo) break; undo.RemoveAt(0); } }
internal void AddRedone(UndoRedoStep current) { undo.Add(current); ++modifiedSteps; }
internal void AddUndone(UndoRedoStep current) { redo.Add(current); --modifiedSteps; }
internal void AddRedone(UndoRedoStep current) { undo.Add(current); }
public void AddRedone(UndoRedoStep current) { undo.Add(current); }