static void UpdateAugmentedData(HeightTreeNode node, UpdateAfterChildrenChangeRecursionMode mode)
        {
            int    totalCount  = 1;
            double totalHeight = node.lineNode.TotalHeight;

            if (node.left != null)
            {
                totalCount  += node.left.totalCount;
                totalHeight += node.left.totalHeight;
            }
            if (node.right != null)
            {
                totalCount  += node.right.totalCount;
                totalHeight += node.right.totalHeight;
            }
            if (node.IsDirectlyCollapsed)
            {
                totalHeight = 0;
            }
            if (totalCount != node.totalCount ||
                !totalHeight.IsClose(node.totalHeight) ||
                mode == UpdateAfterChildrenChangeRecursionMode.WholeBranch)
            {
                node.totalCount  = totalCount;
                node.totalHeight = totalHeight;
                if (node.parent != null && mode != UpdateAfterChildrenChangeRecursionMode.None)
                {
                    UpdateAugmentedData(node.parent, mode);
                }
            }
        }
		static void UpdateAugmentedData(HeightTreeNode node, UpdateAfterChildrenChangeRecursionMode mode)
		{
			int totalCount = 1;
			double totalHeight = node.lineNode.TotalHeight;
			if (node.left != null) {
				totalCount += node.left.totalCount;
				totalHeight += node.left.totalHeight;
			}
			if (node.right != null) {
				totalCount += node.right.totalCount;
				totalHeight += node.right.totalHeight;
			}
			if (node.IsDirectlyCollapsed)
				totalHeight = 0;
			if (totalCount != node.totalCount
			    || !totalHeight.IsClose(node.totalHeight)
			    || mode == UpdateAfterChildrenChangeRecursionMode.WholeBranch)
			{
				node.totalCount = totalCount;
				node.totalHeight = totalHeight;
				if (node.parent != null && mode != UpdateAfterChildrenChangeRecursionMode.None)
					UpdateAugmentedData(node.parent, mode);
			}
		}