コード例 #1
0
 private string GetSimpleText(HistoryNode node)
 {
     if (node == null)
     {
         return("null");
     }
     return("command: " + (node.command != null ? node.command + "" : "null"));
 }
コード例 #2
0
ファイル: History.cs プロジェクト: jeason0813/typewriter-net
 public void Reset()
 {
     _tags.Clear();
     root      = new HistoryNode(null, 0);
     head      = new CommandTag(_nextTagIndex++);
     head.Prev = root;
     _tags.Add(head);
 }
コード例 #3
0
ファイル: History.cs プロジェクト: jeason0813/typewriter-net
        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;
            }
        }
コード例 #4
0
ファイル: History.cs プロジェクト: jeason0813/typewriter-net
 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]);
     }
 }
コード例 #5
0
ファイル: History.cs プロジェクト: jeason0813/typewriter-net
        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);
            }
        }
コード例 #6
0
ファイル: History.cs プロジェクト: jeason0813/typewriter-net
        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);
        }
コード例 #7
0
ファイル: History.cs プロジェクト: jeason0813/typewriter-net
        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);
        }
コード例 #8
0
ファイル: History.cs プロジェクト: jeason0813/typewriter-net
        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);
                }
            }
        }
コード例 #9
0
ファイル: History.cs プロジェクト: jeason0813/typewriter-net
 public void MarkAsFullyUnsaved()
 {
     savedNode = null;
     SetChanged(true);
 }
コード例 #10
0
ファイル: History.cs プロジェクト: jeason0813/typewriter-net
 public void MarkAsSaved()
 {
     savedNode = head.Prev;
     SetChanged(false);
 }