private void symbolicExpressionTreeChart_DragDrop(object sender, DragEventArgs e) { Point coordinates = symbolicExpressionTreeChart.PointToClient(new Point(e.X, e.Y)); var node = symbolicExpressionTreeChart.FindVisualSymbolicExpressionTreeNodeAt(coordinates.X, coordinates.Y); var root = symbolicExpressionTreeChart.Tree.Root; var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat); var symbol = data as ISymbol; var symbols = data as IEnumerable <ISymbol>; if (node.Content == root) { if (symbol != null) { Grammar.AddAllowedChildSymbol(root.Symbol, symbol); } else if (symbols != null) { foreach (var s in symbols) { Grammar.AddAllowedChildSymbol(root.Symbol, s); } } } else { int argumentIndex = root.IndexOfSubtree(node.Content); if (symbol != null) { Grammar.AddAllowedChildSymbol(root.Symbol, symbol, argumentIndex); } else if (symbols != null) { foreach (var s in symbols) { Grammar.AddAllowedChildSymbol(root.Symbol, s, argumentIndex); } } } BuildAllowedChildSymbolsTree(); }