internal void Select(Terminal terminalControl)
        {
            GrammarEventArgs eventArgs = new GrammarEventArgs();
            eventArgs.Action = GrammarActions.Click;
            eventArgs.Reference = terminalControl.TerminalV;

            if (TerminalEvent != null)
            {
                TerminalEvent(terminalControl, eventArgs);
            }
        }
        internal void Rename(Terminal terminalControl, string newName)
        {
            GrammarEventArgs eventArgs = new GrammarEventArgs();
            eventArgs.NewName = newName;
            eventArgs.Reference = terminalControl.TerminalV;
            eventArgs.Action = GrammarActions.Rename;

            if (TerminalEvent != null)
            {
                TerminalEvent(terminalControl, eventArgs);
            }
        }
        private void FireEvent(GrammarActions action)
        {
            if (ControlEvent != null)
            {
                GrammarEventArgs eventArgs = new GrammarEventArgs();
                eventArgs.Action = action;
                eventArgs.Reference = terminalControl.TerminalV;
                eventArgs.NewName = nameTextBox.Text;
                eventArgs.setRule(terminalControl.TerminalV);
                eventArgs.SymbolType = SymbolType.Terminal;

                ControlEvent(terminalControl, eventArgs);
            }
        }
 void NonterminalControlEvent(object sender, GrammarEventArgs e)
 {
     try
     {
         if (sender is NonterminalCollapsed)
             NonterminalCollapsedControlEvent(sender, e);
         else if (sender is NonterminalExpanded)
             NonterminalExpandedControlEvent(sender, e);
     }
     catch (Exception ex)
     {
         FireError(ex);
     }
 }
        void setActionBar(object sender, GrammarEventArgs e)
        {
            if (sender is Terminal)
            {
                TerminalActionBar tab = new TerminalActionBar(sender as Terminal);
                actionBarHolder.Content = tab;
                controller.setActionBar(tab);
            }

            if (sender is NonterminalCollapsed)
            {
                NonterminalActionBar tab = new NonterminalActionBar(sender as NonterminalCollapsed);
                actionBarHolder.Content = tab;
                controller.setActionBar(tab);
            }

            if (sender is NonterminalExpanded)
            {
                NonterminalActionBar tab = new NonterminalActionBar(sender as NonterminalExpanded);
                actionBarHolder.Content = tab;
                controller.setActionBar(tab);
            }
        }
        private void AddAfter(GrammarEventArgs eventArgs)
        {
            // add a new undefined item in the model
            UndefinedD undefinedD = model.Functions.AddAfter(eventArgs.Rule, eventArgs.Reference, SymbolType.Undefined) as UndefinedD;

            // traverse the view grammar and add this undefined property everywhere :o
            view.Functions.AddAfter(eventArgs.Reference, undefinedD);

            ReDraw();
        }
        void TerminalControlEvent(object sender, GrammarEventArgs eventArgs)
        {
            try
            {
                if (sender is Terminal)
                {
                    Terminal control = (Terminal)sender;

                    switch (eventArgs.Action)
                    {
                        case GrammarActions.Rename:
                            Rename(control, eventArgs);
                            break;
                        case GrammarActions.Click:
                            SelectedTerminal(control, eventArgs);
                            break;
                        case GrammarActions.Delete:
                            Delete(eventArgs.Reference);
                            break;
                        case GrammarActions.AddAfter:
                            AddAfter(eventArgs);
                            break;
                        case GrammarActions.AddBefore:
                            AddBefore(eventArgs);
                            break;
                        case GrammarActions.AddChoice:
                            AddChoice(eventArgs);
                            break;
                        case GrammarActions.RemoveChoice:
                            RemoveChoice(eventArgs.Reference);
                            break;

                        default: throw new Exception("The action " + eventArgs.Action + " is not supported by the controller");
                    }
                }
            }
            catch (Exception e)
            {
                FireError(e);
            }
        }
        private void SelectedNonterminal(GrammarEventArgs e)
        {
            UnselectAll();

            // set the rule to be selected
            if (e.Reference is NonterminalHeadV)
                (e.Reference as NonterminalHeadV).Reference.IsSelected = true;
            else if (e.Reference is NonterminalTailV)
                (e.Reference as NonterminalTailV).Reference.Reference.IsSelected = true;

            ReDraw();
        }
        private void Replace(Undefined control, GrammarEventArgs eventArgs)
        {
            GrammarNodeD itemToReplace = control.Reference.getReference();

            GrammarNodeD newItem = model.Functions.Replace(itemToReplace, eventArgs.SymbolType, eventArgs.NewName);

            view.Functions.Replace(itemToReplace, newItem);

            ReDraw();
        }
        private void Rename(Terminal terminalControl, GrammarEventArgs e)
        {
            TerminalV terminalV = e.Reference as TerminalV;

            if (terminalV == null)
                throw new Exception("The references visualised item is not of type TerminalV");

            // rename in the model
            model.Functions.Rename(terminalV, e.NewName);

            // rename in the view
            //view.Functions.Rename(terminalControl, e.NewName);

            // the redraw will cause the view to be renamed and updated
            ReDraw();
        }
 void undefined_ControlEvent(object sender, GrammarEventArgs e)
 {
     if (UndefinedControlEvent != null)
         UndefinedControlEvent(sender, e);
 }
 void terminal_ControlEvent(object sender, GrammarEventArgs e)
 {
     if (TerminalControlEvent != null)
         TerminalControlEvent(sender, e);
 }
 internal void nonterminalExpanded_ControlEvent(object sender, GrammarEventArgs e)
 {
     if (NonterminalExpandedControlEvent != null)
         NonterminalExpandedControlEvent(sender, e);
 }
        private void FireEvent(GrammarActions action)
        {
            if (ControlEvent != null)
            {
                GrammarEventArgs eArgs = new GrammarEventArgs();
                eArgs.Action = action;
                eArgs.Reference = getReference();
                eArgs.NewName = nameTextBox.Text;
                eArgs.SymbolType = SymbolType.Nonterminal;

                if (nontExpanded != null)
                {
                    if (nontExpanded.ReferenceTail != null)
                        eArgs.setRule(nontExpanded.ReferenceTail);
                    else
                        eArgs.setRule(nontExpanded.ReferenceHead);

                    ControlEvent(nontExpanded, eArgs);
                }
                else
                {
                    eArgs.setRule(nontCollapsed.Reference);
                    ControlEvent(nontCollapsed, eArgs);
                }
            }
        }
        private void FireEvent(GrammarActions action)
        {
            GrammarEventArgs e = new GrammarEventArgs();
            e.Action = action;
            if (isStartSymbol)
            {
                e.Reference = referenceHead;
                e.setRule(referenceHead);
            }
            else
            {
                e.Reference = referenceTail;
                e.setRule(referenceTail);
            }

            if (ControlEvent != null)
                ControlEvent(this, e);
        }
        void NonterminalExpandedControlEvent(object sender, GrammarEventArgs eventArgs)
        {
            // an event from an expanded nontermianl control
            if (sender is NonterminalExpanded)
            {
                NonterminalExpanded thisSender = (NonterminalExpanded)sender;

                switch (eventArgs.Action)
                {
                    case GrammarActions.Collapse:
                        collapse(thisSender, eventArgs);
                        break;
                    case GrammarActions.Click:
                        SelectedNonterminal(thisSender, eventArgs);
                        break;
                    case GrammarActions.Rename:
                        RenameNonterminal(eventArgs);
                        break;
                    case GrammarActions.Delete:
                        Delete(eventArgs.Reference);
                        break;
                    case GrammarActions.AddAfter:
                        AddAfter(eventArgs);
                        break;
                    case GrammarActions.AddBefore:
                        AddBefore(eventArgs);
                        break;
                    case GrammarActions.AddChoice:
                        AddChoice(eventArgs);
                        break;
                    case GrammarActions.RemoveChoice:
                        RemoveChoice(eventArgs.Reference);
                        break;
                    case GrammarActions.DoubleClick:
                        DoubleClick(eventArgs.Reference);
                        break;
                    default: throw new Exception("The action " + eventArgs.Action + " is not supported by the nont expanded event handler");
                }
            }
        }
        void nontExpanded_Flipping(object sender, GrammarEventArgs e)
        {
            //if (sender is NonterminalExpanded)
            //{
            //    NonterminalExpanded nont = (NonterminalExpanded)sender;
            //    NonterminalTailV nonterminalTailV = (NonterminalTailV)e.Reference;

            //    nonterminalTailV.Flip();

            //    // draw control
            //    GrammarNodeVDrawVisitor drawer = new GrammarNodeVDrawVisitor();
            //    drawer.visit(nonterminalTailV);

            //    // replace child
            //    int index = e.MyParent.Children.IndexOf(nont);
            //    if (index < 0)
            //        throw new Exception("Cant find child in my stack panel, uh oh!");

            //    e.MyParent.Children.RemoveAt(index);
            //    e.MyParent.Children.Insert(index, drawer.DrawnItem);
            //}
        }
 void ViewEvents_TerminalEvent(object sender, GrammarEventArgs e)
 {
     // if the reference is the same
     if (e.Reference == terminalV)
     {
         switch (e.Action)
         {
             case GrammarActions.Rename:
                 SetLabelContent(e.NewName);
                 break;
             default: throw new Exception("The action " + e.Action + " is not supported by the Terminal Control");
         }
     }
 }
        private void RenameNonterminal(GrammarEventArgs eventArgs)
        {
            // get nontHead we're renaming
            NonterminalHeadD nont;
            if (eventArgs.Reference is NonterminalHeadV)
                nont = (eventArgs.Reference as NonterminalHeadV).Reference;
            else
                nont = (eventArgs.Reference as NonterminalTailV).Reference.Reference;

            if (model.getNonterminalNames().Contains(eventArgs.NewName))
            {
                // can't rename to nonterminal already in grammar
                throw new Exception("That nonterminal name already exists in the grammar, choose another one.");
            }

            // rename in model
            model.Functions.Rename(nont, eventArgs.NewName);

            // the redraw will cause the view to be updated
            ReDraw();
        }
        private void FireEvent(GrammarActions action)
        {
            if (ControlEvent != null)
            {
                GrammarEventArgs eArgs = new GrammarEventArgs();
                eArgs.Action = action;
                eArgs.Reference = terminalV;
                eArgs.setRule(terminalV);

                ControlEvent(this, eArgs);
            }
        }
        private void SelectedNonterminal(NonterminalCollapsed control, GrammarEventArgs eventArgs)
        {
            SelectedNonterminal(eventArgs);

            if (ControlSelected != null)
            {
                ControlSelected(control, eventArgs);
            }
        }
 private void expandBtn_Click(object sender, RoutedEventArgs e)
 {
     if (ControlEvent != null)
     {
         GrammarEventArgs eargs = new GrammarEventArgs();
         eargs.Reference = reference;
         //eargs.MyParent = this.Parent as StackPanel;
         eargs.Action = GrammarActions.Expand;
         ControlEvent(this, eargs);
     }
 }
        private void SelectedTerminal(Terminal control, GrammarEventArgs e)
        {
            UnselectAll();

            // set the terminal in the view to be selected
            control.TerminalV.Reference.IsSelected = true;

            ReDraw();

            if (ControlSelected != null)
            {
                ControlSelected(control, e);
            }
        }
        private void AddChoice(GrammarEventArgs eventArgs)
        {
            model.Functions.AddChoice(eventArgs.Reference.getReference());

            view.Functions.AddChoice(eventArgs.Reference);

            ReDraw();
        }
        void UndefinedControlEvent(object sender, GrammarEventArgs eventArgs)
        {
            try
            {
                if (sender is Undefined)
                {
                    Undefined control = (Undefined)sender;

                    switch (eventArgs.Action)
                    {
                        case GrammarActions.Replace:
                            Replace(control, eventArgs);
                            break;
                        case GrammarActions.Delete:
                            Delete(eventArgs.Reference);
                            break;
                        case GrammarActions.AddAfter:
                            AddAfter(eventArgs);
                            break;
                        case GrammarActions.AddBefore:
                            AddBefore(eventArgs);
                            break;
                        case GrammarActions.AddChoice:
                            AddChoice(eventArgs);
                            break;
                        case GrammarActions.RemoveChoice:
                            RemoveChoice(eventArgs.Reference);
                            break;

                        default: throw new Exception("The action " + eventArgs.Action + " is not supported by the controller");
                    }
                }
            }
            catch (Exception e)
            {
                FireError(e);
            }
        }
        private void collapse(NonterminalExpanded nonterminalExpanded, GrammarEventArgs e)
        {
            lock (new System.Object())
            {
                NonterminalTailV nonterminalTailV = (NonterminalTailV)e.Reference;

                if (nonterminalTailV.IsExpanded)
                {
                    // collapse in the model
                    model.Functions.Collapse(nonterminalTailV);

                    // collapse in the view
                    view.Functions.Collapse(nonterminalExpanded);

                    // re draw the view - we do this to reinitialise the controllers - not needed when expanding
                    ReDraw();
                }
            }
        }
 private void FireEvent(GrammarActions action)
 {
     if (ControlEvent != null)
     {
         GrammarEventArgs e = new GrammarEventArgs();
         e.Action = action;
         e.NewName = newName;
         e.SymbolType = symbolType;
         e.Reference = reference;
         e.setRule(reference);
         ControlEvent(this, e);
     }
 }
        private void expand(NonterminalCollapsed nonterminalCollapsed, GrammarEventArgs e)
        {
            lock (new System.Object())
            {
                // the reference to the tail v
                NonterminalTailV nonterminalTailV = (NonterminalTailV)e.Reference;

                if (!nonterminalTailV.IsExpanded)
                {
                    // expand the model (visualised grammar)
                    model.Functions.Expand(nonterminalTailV);

                    // expand the view
                    view.Functions.Expand(nonterminalCollapsed);
                }
            }
        }