private void CalculateLayout(int preferredWidth, int preferredHeight, int minHDistance, int minVDistance)
        {
            layoutEngine.NodeWidth         = preferredWidth;
            layoutEngine.NodeHeight        = preferredHeight;
            layoutEngine.HorizontalSpacing = minHDistance;
            layoutEngine.VerticalSpacing   = minVDistance;

            var actualRoot = tree.Root;

            if (actualRoot.Symbol is ProgramRootSymbol && actualRoot.SubtreeCount == 1)
            {
                actualRoot = tree.Root.GetSubtree(0);
            }

            var visualNodes = layoutEngine.CalculateLayout(actualRoot, Width, Height).ToList();

            visualTreeNodes = visualNodes.ToDictionary(x => x.Content, x => x);
            visualLines     = new Dictionary <Tuple <ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualTreeNodeConnection>();
            foreach (var node in visualNodes.Select(n => n.Content))
            {
                foreach (var subtree in node.Subtrees)
                {
                    visualLines.Add(new Tuple <ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>(node, subtree), new VisualTreeNodeConnection());
                }
            }
        }