From 080f1697e97e13461ec6df4d31c8924d01257a1b Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Tue, 9 Apr 2019 01:47:48 +0300 Subject: MERGE --- .../Rendering/HeightTreeNode.cs | 155 +++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/HeightTreeNode.cs (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/HeightTreeNode.cs') diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/HeightTreeNode.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/HeightTreeNode.cs new file mode 100644 index 000000000..42661edeb --- /dev/null +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/HeightTreeNode.cs @@ -0,0 +1,155 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using System.Diagnostics; + +using Tango.Scripting.Editors.Document; + +namespace Tango.Scripting.Editors.Rendering +{ + /// + /// A node in the text view's height tree. + /// + sealed class HeightTreeNode + { + internal readonly DocumentLine documentLine; + internal HeightTreeLineNode lineNode; + + internal HeightTreeNode left, right, parent; + internal bool color; + + internal HeightTreeNode() + { + } + + internal HeightTreeNode(DocumentLine documentLine, double height) + { + this.documentLine = documentLine; + this.totalCount = 1; + this.lineNode = new HeightTreeLineNode(height); + this.totalHeight = height; + } + + internal HeightTreeNode LeftMost { + get { + HeightTreeNode node = this; + while (node.left != null) + node = node.left; + return node; + } + } + + internal HeightTreeNode RightMost { + get { + HeightTreeNode node = this; + while (node.right != null) + node = node.right; + return node; + } + } + + /// + /// Gets the inorder successor of the node. + /// + internal HeightTreeNode Successor { + get { + if (right != null) { + return right.LeftMost; + } else { + HeightTreeNode node = this; + HeightTreeNode oldNode; + do { + oldNode = node; + node = node.parent; + // go up until we are coming out of a left subtree + } while (node != null && node.right == oldNode); + return node; + } + } + } + + /// + /// The number of lines in this node and its child nodes. + /// Invariant: + /// totalCount = 1 + left.totalCount + right.totalCount + /// + internal int totalCount; + + /// + /// The total height of this node and its child nodes, excluding directly collapsed nodes. + /// Invariant: + /// totalHeight = left.IsDirectlyCollapsed ? 0 : left.totalHeight + /// + lineNode.IsDirectlyCollapsed ? 0 : lineNode.Height + /// + right.IsDirectlyCollapsed ? 0 : right.totalHeight + /// + internal double totalHeight; + + /// + /// List of the sections that hold this node collapsed. + /// Invariant 1: + /// For each document line in the range described by a CollapsedSection, exactly one ancestor + /// contains that CollapsedSection. + /// Invariant 2: + /// A CollapsedSection is contained either in left+middle or middle+right or just middle. + /// Invariant 3: + /// Start and end of a CollapsedSection always contain the collapsedSection in their + /// documentLine (middle node). + /// + internal List collapsedSections; + + internal bool IsDirectlyCollapsed { + get { + return collapsedSections != null; + } + } + + internal void AddDirectlyCollapsed(CollapsedLineSection section) + { + if (collapsedSections == null) { + collapsedSections = new List(); + totalHeight = 0; + } + Debug.Assert(!collapsedSections.Contains(section)); + collapsedSections.Add(section); + } + + + internal void RemoveDirectlyCollapsed(CollapsedLineSection section) + { + Debug.Assert(collapsedSections.Contains(section)); + collapsedSections.Remove(section); + if (collapsedSections.Count == 0) { + collapsedSections = null; + totalHeight = lineNode.TotalHeight; + if (left != null) + totalHeight += left.totalHeight; + if (right != null) + totalHeight += right.totalHeight; + } + } + + #if DEBUG + public override string ToString() + { + return "[HeightTreeNode " + + documentLine.LineNumber + " CS=" + GetCollapsedSections(collapsedSections) + + " Line.CS=" + GetCollapsedSections(lineNode.collapsedSections) + + " Line.Height=" + lineNode.height + + " TotalHeight=" + totalHeight + + "]"; + } + + static string GetCollapsedSections(List list) + { + if (list == null) + return "{}"; + return "{" + + string.Join(",", + list.ConvertAll(cs=>cs.ID).ToArray()) + + "}"; + } + #endif + } +} -- cgit v1.3.1