Ejemplo n.º 1
0
        public static int TreeMaxWidth(AnnotatedTreeNode node)
        {
            if (node.Children == null)
            {
                return(1);
            }

            int branchWidth = 0;

            for (int i = 0; i < node.Children.Count; i++)
            {
                branchWidth += TreeMaxWidth(node.Children[i]);
            }

            return(branchWidth);
        }
        private void PrepareNode
        (
            AnnotatedTreeNode node,
            int level = 0,
            AnnotatedTreeNode parentNode  = null,
            AnnotatedTreeNode LeftSibling = null,
            Dictionary <int, AnnotatedTreeNode> rightLimits = null
        )
        {
            if (rightLimits == null)
            {
                rightLimits = new Dictionary <int, AnnotatedTreeNode>();
            }

            node.Level       = level;
            node.Parent      = parentNode;
            node.LeftSibling = LeftSibling;

            if (node.HasChildren)
            {
                for (var i = 0; i < node.Children.Count; i++)
                {
                    AnnotatedTreeNode left = null;

                    if (i == 0 && rightLimits.ContainsKey(level))
                    {
                        left = rightLimits[level];
                    }

                    if (i > 0)
                    {
                        left = node.Children[i - 1];
                    }

                    if (i == (node.Children.Count - 1))
                    {
                        if (rightLimits.ContainsKey(level))
                        {
                            rightLimits.Remove(level);
                        }
                        rightLimits.Add(level, node.Children[i]);
                    }

                    PrepareNode(node.Children[i], level + 1, node, left, rightLimits);
                }
            }
        }
Ejemplo n.º 3
0
        public static AnnotatedTreeNode ToAnnotatedBinaryTree(BinaryNode node)
        {
            var annotatedNode = new AnnotatedTreeNode()
            {
                Payload         = node.Payload,
                IsCompareSource = node.IsCompareSource,
                IsCompareTarget = node.IsCompareTarget
            };

            if (node.LeftNode != null || node.RightNode != null)
            {
                annotatedNode.Children = new List <AnnotatedTreeNode>();

                if (node.LeftNode != null)
                {
                    var leftNode = ToAnnotatedBinaryTree(node.LeftNode);

                    annotatedNode.Children.Add(leftNode);
                }

                if (node.RightNode != null)
                {
                    var rightNode = ToAnnotatedBinaryTree(node.RightNode);

                    annotatedNode.Children.Add(rightNode);
                }

                // Push an invisible node
                if (node.LeftNode != null && node.RightNode == null)
                {
                    annotatedNode.Children.Add(new AnnotatedTreeNode()
                    {
                        IsInvisibleNode = true
                    });
                }
                else if (node.LeftNode == null && node.RightNode != null)
                {
                    annotatedNode.Children.Insert(0, new AnnotatedTreeNode()
                    {
                        IsInvisibleNode = true
                    });
                }
            }

            return(annotatedNode);
        }
        private void DrawNode(AnnotatedTreeNode node)
        {
            if (node.IsInvisibleNode)
            {
                return;
            }

            var ellipse = new Ellipse();

            ellipse.Fill            = node.IsCompareSource ? Brushes.Green : (node.IsCompareTarget ? Brushes.Yellow : Brushes.White);
            ellipse.StrokeThickness = 2;
            ellipse.Stroke          = Brushes.Black;
            ellipse.Width           = node.Width;
            ellipse.Height          = node.Height;

            var text = new TextBlock();

            text.Text              = string.Format("{0}", node.Payload.Value1);
            text.TextAlignment     = TextAlignment.Center;
            text.VerticalAlignment = VerticalAlignment.Center;

            var grid = new Grid();

            grid.Width  = node.Width;
            grid.Height = node.Height;
            grid.Children.Add(ellipse);
            grid.Children.Add(text);
            Canvas.SetTop(grid, node.Top);
            Canvas.SetLeft(grid, node.Left);

            DrawingArea.Children.Add(grid);

            // Draw children
            if (node.HasChildren)  // Has Children and is Expanded
            {
                for (var i = 0; i < node.Children.Count; i++)
                {
                    DrawNode(node.Children[i]);
                }
            }
        }
        private void DrawLines(AnnotatedTreeNode node)
        {
            if (node.IsInvisibleNode)
            {
                return;
            }

            if (node.HasChildren)
            { // Has children and Is Expanded
                for (var j = 0; j < node.Children.Count; j++)
                {
                    if (!node.Children[j].IsInvisibleNode)
                    {
                        DrawLine(node.ChildrenConnectorPoint, node.Children[j].ParentConnectorPoint);
                    }

                    // Children
                    DrawLines(node.Children[j]);
                }
            }
        }
Ejemplo n.º 6
0
        public static AnnotatedTreeNode ToAnnotatedTree(TreeNode node)
        {
            var annotatedNode = new AnnotatedTreeNode()
            {
                Payload         = node.Payload,
                IsCompareSource = node.IsCompareSource,
                IsCompareTarget = node.IsCompareTarget
            };

            if (node.Children != null)
            {
                annotatedNode.Children = new List <AnnotatedTreeNode>();

                for (int i = 0; i < node.Children.Count; i++)
                {
                    var child = ToAnnotatedTree(node.Children[i]);

                    annotatedNode.Children.Add(child);
                }
            }

            return(annotatedNode);
        }
Ejemplo n.º 7
0
        public static int TreeMaxHeight(AnnotatedTreeNode node)
        {
            if (node == null)
            {
                return(0);
            }

            int maxHeight = 0;

            if (node.Children != null)
            {
                for (int i = 0; i < node.Children.Count; i++)
                {
                    int branchHeight = TreeMaxHeight(node.Children[i]);

                    if (maxHeight < branchHeight)
                    {
                        maxHeight = branchHeight;
                    }
                }
            }

            return(maxHeight + 1);
        }
        private void PerformLayout(AnnotatedTreeNode node)
        {
            double nodeHeight     = 40;
            double nodeWidth      = 40;
            double nodeMarginLeft = 10;
            double nodeMarginTop  = 20;

            double nodeLeft = 0; // defaultValue

            // Before Layout this Node, Layout its children
            if (node.HasChildren)
            {
                for (var i = 0; i < node.Children.Count; i++)
                {
                    PerformLayout(node.Children[i]);
                }
            }

            if (node.HasChildren)  // If Has Children and Is Expanded
            {
                // My left is in the center of my children
                var childrenWidth = (node.Children[node.Children.Count - 1].Left + node.Children[node.Children.Count - 1].Width) - node.Children[0].Left;
                nodeLeft = (node.Children[0].Left + (childrenWidth / 2)) - (nodeWidth / 2);

                // Is my left over my left node?
                // Move it to the right
                if (node.LeftSibling != null && ((node.LeftSibling.Left + node.LeftSibling.Width + nodeMarginLeft) > nodeLeft))
                {
                    double newLeft = node.LeftSibling.Left + node.LeftSibling.Width + nodeMarginLeft;
                    double diff    = newLeft - nodeLeft;
                    /// Move also my children
                    MoveRigth(node.Children, diff);
                    nodeLeft = newLeft;
                }
            }
            else
            {
                // My left is next to my left sibling
                if (node.LeftSibling != null)
                {
                    nodeLeft = node.LeftSibling.Left + node.LeftSibling.Width + nodeMarginLeft;
                }
            }

            node.Left = nodeLeft;

            // The top depends only on the level
            node.Top = (nodeMarginTop * (node.Level + 1)) + (nodeHeight * (node.Level + 1));
            // Size is constant
            node.Height = nodeHeight;
            node.Width  = nodeWidth;

            // Calculate Connector Points
            // Child: Where the lines get out from to connect this node with its children
            var pointX = nodeLeft + (nodeWidth / 2);
            var pointY = node.Top + nodeHeight;

            node.ChildrenConnectorPoint = new Point {
                X = pointX, Y = pointY
            };
            // Parent: Where the line that connect this node with its parent end
            pointX = nodeLeft + (nodeWidth / 2);
            pointY = node.Top;
            node.ParentConnectorPoint = new Point {
                X = pointX, Y = pointY
            };
        }