private void insertNodeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (currSelected == null || currSelected.Content is SymbolicExpressionTreeTerminalNode)
            {
                return;
            }
            var parent = currSelected.Content;

            using (var dialog = new InsertNodeDialog()) {
                dialog.SetAllowedSymbols(grammar.Symbols.Where(s => !(s is ProgramRootSymbol || s is StartSymbol || s is Defun || s is GroupSymbol))); // allow everything
                dialog.ShowDialog(this);
                if (dialog.DialogResult != DialogResult.OK)
                {
                    return;
                }

                var symbol = dialog.SelectedSymbol;
                var node   = symbol.CreateTreeNode();
                if (node is ConstantTreeNode)
                {
                    var constant = node as ConstantTreeNode;
                    constant.Value = double.Parse(dialog.constantValueTextBox.Text);
                }
                else if (node is VariableTreeNode)
                {
                    var variable = node as VariableTreeNode;
                    variable.Weight       = double.Parse(dialog.variableWeightTextBox.Text);
                    variable.VariableName = dialog.SelectedVariableName;
                }
                else if (node.Symbol.MinimumArity <= parent.SubtreeCount && node.Symbol.MaximumArity >= parent.SubtreeCount)
                {
                    for (int i = parent.SubtreeCount - 1; i >= 0; --i)
                    {
                        var child = parent.GetSubtree(i);
                        parent.RemoveSubtree(i);
                        node.AddSubtree(child);
                    }
                }
                // the if condition will always be true for the final else clause above
                if (parent.Symbol.MaximumArity > parent.SubtreeCount)
                {
                    ModifyTree(Tree, parent, null, node);
                }
            }
            currSelected = null;
        }
    private void insertNodeToolStripMenuItem_Click(object sender, EventArgs e) {
      if (currSelected == null || currSelected.Content is SymbolicExpressionTreeTerminalNode) return;
      var parent = currSelected.Content;

      using (var dialog = new InsertNodeDialog()) {
        dialog.SetAllowedSymbols(grammar.Symbols.Where(s => !(s is ProgramRootSymbol || s is StartSymbol || s is Defun || s is GroupSymbol))); // allow everything
        dialog.ShowDialog(this);
        if (dialog.DialogResult != DialogResult.OK) return;

        var symbol = dialog.SelectedSymbol();
        var node = symbol.CreateTreeNode();
        if (node is ConstantTreeNode) {
          var constant = node as ConstantTreeNode;
          constant.Value = double.Parse(dialog.constantValueTextBox.Text);
        } else if (node is VariableTreeNode) {
          var variable = node as VariableTreeNode;
          variable.Weight = double.Parse(dialog.variableWeightTextBox.Text);
          variable.VariableName = dialog.variableNamesCombo.Text;
        } else if (node.Symbol.MinimumArity <= parent.SubtreeCount && node.Symbol.MaximumArity >= parent.SubtreeCount) {
          for (int i = parent.SubtreeCount - 1; i >= 0; --i) {
            var child = parent.GetSubtree(i);
            parent.RemoveSubtree(i);
            node.AddSubtree(child);
          }
        }
        // the if condition will always be true for the final else clause above
        if (parent.Symbol.MaximumArity > parent.SubtreeCount) {
          ModifyTree(Tree, parent, null, node);
        }
      }
      currSelected = null;
    }