private string GetSimpleText(HistoryNode node) { if (node == null) { return("null"); } return("command: " + (node.command != null ? node.command + "" : "null")); }
public void Reset() { _tags.Clear(); root = new HistoryNode(null, 0); head = new CommandTag(_nextTagIndex++); head.Prev = root; _tags.Add(head); }
public void Checkout(CommandTag tag) { HistoryNode common = null; { Dictionary <HistoryNode, bool> visited = new Dictionary <HistoryNode, bool>(); HistoryNode nodeI = head.Prev; HistoryNode nodeJ = tag.Prev; while (nodeI != null || nodeJ != null) { if (nodeI != null) { if (visited.ContainsKey(nodeI)) { common = nodeI; break; } visited.Add(nodeI, true); nodeI = nodeI.prev; } if (nodeJ != null) { if (visited.ContainsKey(nodeJ)) { common = nodeJ; break; } visited.Add(nodeJ, true); nodeJ = nodeJ.prev; } } } if (common != null) { for (HistoryNode nodeI = head.Prev; nodeI != common; nodeI = nodeI.prev) { nodeI.main = false; nodeI.command.Undo(); } List <HistoryNode> redos = new List <HistoryNode>(); for (HistoryNode nodeI = tag.Prev; nodeI != common; nodeI = nodeI.prev) { redos.Add(nodeI); } redos.Reverse(); foreach (HistoryNode nodeI in redos) { nodeI.main = true; nodeI.command.Redo(); } head = tag; } }
private void ToDebugString(StringBuilder text, int indent, HistoryNode node) { text.Append(new string(' ', indent * 2)); text.Append(node.command); foreach (CommandTag tag in node.tags) { text.Append(" " + tag); } text.Append('\n'); for (int i = 0; i < node.nexts.Count; i++) { ToDebugString(text, indent + 1, node.nexts[i]); } }
public void Redo() { if (head.redos.Count > 0) { int index = head.redos.Count - 1; HistoryNode node = head.redos[index]; head.redos.RemoveAt(index); head.Prev = node; node.main = true; node.command.Redo(); SetChanged(savedNode != head.Prev); } }
public bool Undo() { if (head.Prev != root) { HistoryNode node = head.Prev; head.Prev = node.prev; head.redos.Add(node); node.main = false; node.command.Undo(); SetChanged(savedNode != head.Prev); return(true); } return(false); }
public void ExecuteInited(Command command) { HistoryNode node0 = head.Prev; while (node0.index + indexOffset >= maxUndosCount) { HistoryNode oldRoot = root; root = oldRoot.nexts[0]; Dictionary <CommandTag, bool> tagsToRemove = new Dictionary <CommandTag, bool>(); foreach (HistoryNode nodeI in oldRoot.nexts) { nodeI.prev = null; if (nodeI.main) { root = nodeI; } else { FindAllTagsOf(nodeI, tagsToRemove); } } oldRoot.nexts.Clear(); root.command = null; indexOffset--; foreach (KeyValuePair <CommandTag, bool> pair in tagsToRemove) { _tags.Remove(pair.Key); } } HistoryNode node = new HistoryNode(command, node0.index + 1); if (node0.nexts.Count > 0) { CommandTag tag = new CommandTag(_nextTagIndex++); tag.Prev = node; _tags.Add(tag); head = tag; } node0.nexts.Add(node); node.prev = node0; head.Prev = node; node.main = true; node.command.Redo(); SetChanged(savedNode != head.Prev); }
private void FindAllTagsOf(HistoryNode root, Dictionary <CommandTag, bool> tags) { Stack <HistoryNode> stack = new Stack <HistoryNode>(); stack.Push(root); while (stack.Count > 0) { HistoryNode nodeI = stack.Pop(); foreach (CommandTag tag in nodeI.tags) { tags.Add(tag, true); } foreach (HistoryNode child in nodeI.nexts) { stack.Push(child); } } }
public void MarkAsFullyUnsaved() { savedNode = null; SetChanged(true); }
public void MarkAsSaved() { savedNode = head.Prev; SetChanged(false); }