private void UnselectAll()
 {
     // unselect all
     GrammarNodeDUnselectVisitor visitor = new GrammarNodeDUnselectVisitor();
     foreach (NonterminalHeadD nont in model.DefinitiveGrammar.Nonterminals)
     {
         visitor.visit(nont);
     }
 }
        private void previewButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                this.Cursor = Cursors.Wait;

                Factorisation factorisation = analysisOptions.SelectedItem as Factorisation;

                if (factorisation == null)
                    throw new Exception("You did not select a factorisation option");

                String newRule = "NewRule_" + new Random().Next(0, 9999).ToString();

                String currentGrammarStr = model.DefinitiveGrammar.PrintGrammar();
                String newGrammarStr = factorisation.applyRule(currentGrammarStr, newRule);

                GrammarModel newModel = new GrammarModel(newGrammarStr);
                newGrammar = new GrammarModel(newModel.DefinitiveGrammar);

                // highlight rules that are being factorised
                // first unselect any rules selected
                GrammarNodeDUnselectVisitor visitor = new GrammarNodeDUnselectVisitor();
                model.DefinitiveGrammar.StartSymbol.accept(visitor);
                newModel.DefinitiveGrammar.StartSymbol.accept(visitor);

                foreach (NonterminalHeadD nont in factorisation.NontHeads)
                {
                    model.DefinitiveGrammar.getNonterminal(nont.Name).IsSelected = true;
                    newModel.DefinitiveGrammar.getNonterminal(nont.Name).IsSelected = true;
                }

                newModel.DefinitiveGrammar.getNonterminal(newRule).IsSelected = true;

                // print grammars
                currentGrammar.Document = model.DefinitiveGrammar.PrintGrammarRich();
                previewGrammar.Document = newModel.DefinitiveGrammar.PrintGrammarRich();

                this.Cursor = Cursors.Arrow;
            }
            catch (Exception ex)
            {
                this.Cursor = Cursors.Arrow;
                MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                this.Close();
            }
        }