示例#1
0
        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);
        }
示例#2
0
        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);
            }
        }
示例#3
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);
			}
		}
示例#4
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);
			}
		}
示例#5
0
		internal void AddRedone(UndoRedoStep current)
		{
			undo.Add(current);
			++modifiedSteps;
		}
示例#6
0
		internal void AddUndone(UndoRedoStep current)
		{
			redo.Add(current);
			--modifiedSteps;
		}
示例#7
0
		internal void AddRedone(UndoRedoStep current)
		{
			undo.Add(current);
		}
示例#8
0
 public void AddRedone(UndoRedoStep current)
 {
     undo.Add(current);
 }