private TreeNode CreateTreeNode(IOptimizer optimizer) { TreeNode node = new TreeNode(optimizer.ToString()); node.Tag = optimizer; var algorithm = optimizer as IAlgorithm; if (algorithm != null) { foreach (TreeNode childNode in CreateAlgorithmChildNodes(algorithm)) node.Nodes.Add(childNode); } var batchRun = optimizer as BatchRun; if (batchRun != null) { node.Text += string.Format(" {0}/{1}", batchRun.RepetitionsCounter, batchRun.Repetitions); } List<TreeNode> nodes; if (!treeNodeTagMapping.TryGetValue(optimizer, out nodes)) { nodes = new List<TreeNode>(); treeNodeTagMapping.Add(optimizer, nodes); RegisterNamedItemEvents(optimizer); } nodes.Add(node); foreach (TreeNode childNode in node.Nodes) { INamedItem namedItem = childNode.Tag as INamedItem; if (namedItem != null) { if (!treeNodeTagMapping.TryGetValue(namedItem, out nodes)) { nodes = new List<TreeNode>(); treeNodeTagMapping.Add(namedItem, nodes); RegisterNamedItemEvents(namedItem); } nodes.Add(childNode); } } return node; }