public void GetCompairColumnNames(ICommonNode node)
        {
            if (node.Text == "BinaryComparasionPredicate")
            {
                _compairPointer = true;
            }
            if (node.Text == "FullColumnName")
            {
                _columnNamePointer = true;
            }
            if (node.Type == "Leaf" && _columnNamePointer && _compairPointer)
            {
                _compairColumnNames.Add(node.Text);
                _columnNamePointer = false;
                _compairPointer    = false;
            }
            var enumerator = node.Children.GetEnumerator();
            int i          = 0;

            while (enumerator.MoveNext())
            {
                var currentNode = enumerator.Current;
                GetCompairColumnNames(currentNode);
                ++i;
            }
            return;
        }
        public void VisitTree(ICommonNode node)
        {
            var enumerator = node.Children.GetEnumerator();
            int i          = 0;

            while (enumerator.MoveNext())
            {
                var currentNode = enumerator.Current;
                _nodePaths.Add(currentNode.BranchText);
                ++i;
            }

            return;
        }
        public List <ICommonNode> GetTerminalNodes(ICommonNode node)
        {
            if (node.Type == "Leaf")
            {
                _terminalNodes.Add(node);
            }

            var enumerator = node.Children.GetEnumerator();
            int i          = 0;

            while (enumerator.MoveNext())
            {
                var currentNode = enumerator.Current;
                GetTerminalNodes(currentNode);
                ++i;
            }
            return(_terminalNodes);
        }
        public List <string> GetTablesName(ICommonNode node)
        {
            if (node.Text.Contains("TableName"))
            {
                _tablesPointer = true;
            }
            if (node.Count == 0 && _tablesPointer)
            {
                _tablesNames.Add(node.Text);
                _tablesPointer = false;
            }
            var enumerator = node.Children.GetEnumerator();
            int i          = 0;

            while (enumerator.MoveNext())
            {
                var currentNode = enumerator.Current;
                GetTablesName(currentNode);
                ++i;
            }
            return(_tablesNames);
        }
 public TreeVisitor(ICommonNode node)
 {
     CommonNode = node;
 }
        private Image Draw(ICommonNode node, out int center)
        {
            var nodeText = node.Text;
            var nodeSize = TextMeasurer.MeasureString("*" + nodeText + "*", NodeTextFont);

            nodeSize.Width  = Math.Max(MinimumNodeSize.Width, nodeSize.Width);
            nodeSize.Height = Math.Max(MinimumNodeSize.Height, nodeSize.Height);

            var childCentres = new int[node.Count];
            var childImages  = new Image[node.Count];
            var childSizes   = new Size[node.Count];

            var enumerator = node.Children.GetEnumerator();
            int i          = 0;

            while (enumerator.MoveNext())
            {
                var currentNode = enumerator.Current;
                var lCenter     = 0;
                childImages[i]  = Draw(currentNode, out lCenter);
                childCentres[i] = lCenter;
                if (childImages[i] != null)
                {
                    childSizes[i] = childImages[i] != null ? childImages[i].Size : new Size();
                }
                ++i;
            }

            // draw current node and it's children
            var under           = childImages.Any(nodeImg => nodeImg != null);// if true the current node has childs
            var maxHeight       = node.Count > 0 ? childSizes.Max(c => c.Height) : 0;
            var totalFreeWidth  = node.Count > 0 ? NodeGapping.Width * (node.Count - 1) : NodeGapping.Width;
            var totalChildWidth = childSizes.Sum(s => s.Width);

            var nodeImage = CreateNodeImage(nodeSize.ToSize(), nodeText, NodeTextFont);

            var totalSize = new Size
            {
                Width  = Math.Max(nodeImage.Size.Width, totalChildWidth) + totalFreeWidth,
                Height = nodeImage.Size.Height + (under ? maxHeight + NodeGapping.Height : 0)
            };

            var result = new Bitmap(totalSize.Width, totalSize.Height);
            var g      = Graphics.FromImage(result);

            g.SmoothingMode = SmoothingMode.HighQuality;
            g.FillRectangle(Brushes.White, new Rectangle(new Point(0, 0), totalSize));

            var left = (totalSize.Width - nodeImage.Width) / 2;

            g.DrawImage(nodeImage, left, 0);

            center = Math.Max(totalSize.Width / 2, (nodeImage.Width + NodeGapping.Width) / 2);

            var fromLeft = 0;

            for (int j = 0; j < node.Count; ++j)
            {
                float x1       = center;
                float y1       = nodeImage.Height;
                float y2       = nodeImage.Height + NodeGapping.Height;
                float x2       = fromLeft + childCentres[j];
                var   h        = y2 - y1;
                var   w        = x1 - x2;
                var   childImg = childImages[j];
                if (childImg != null)
                {
                    g.DrawImage(childImg, fromLeft, nodeImage.Size.Height + NodeGapping.Height);
                    fromLeft += childImg.Width + NodeGapping.Width; // Prepare next child left starting point
                    var points1 = new List <PointF>
                    {
                        new PointF(x1, y1),
                        new PointF(x1 - w / 6, y1 + h / 3.5f),
                        new PointF(x2 + w / 6, y2 - h / 3.5f),
                        new PointF(x2, y2),
                    };
                    g.DrawCurve(ConnectionPen, points1.ToArray(), 0.5f);
                }

                childImages[j].Dispose(); // Release child image as it aleady drawn on parent node's surface
            }

            g.Dispose();

            return(result);
        }