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()); } } }