/// <summary>
 /// Find this node's finish transition.
 /// Encapsulates a UML spec violation where transition/trigger order matters.
 /// </summary>
 /// <returns></returns>
 protected static UmlTransition FindFinishTransition(UmlNode node)
 {
     if (node != null && node.Connectors.Count > 0)
     {
         // The Finishe transition is always index 0 in ActivityMachine.
         return(node.Connectors[(int)ActivityTransition.Finish] as UmlTransition);
     }
     return(null);
 }
 /// <summary>
 /// Find this node's quit transition, if it has one. Only ConditionalNodes have these.
 /// Encapsulates a UML spec violation where transition/trigger order matters.
 /// </summary>
 /// <returns></returns>
 protected static UmlTransition FindQuitTransition(UmlNode node)
 {
     // Only ConditionalNode will have a quit transition.
     if (node is ConditionalNode)
     {
         return((node as ConditionalNode).QuitTransition);
     }
     return(null);
 }
 protected virtual void AddNode(UmlNode node)
 {
     _nodes.Add(node);
     node.Entered += HandleNodeEntered;
     if (node is BehavioralNode)
     {
         (node as BehavioralNode).EntryBehaviorsFinished += HandleNodeEntryBehaviorsFinished;
     }
 }
 /// <summary>
 /// Find this node's continue transition.
 /// Encapsulates a UML spec violation where transition/trigger order matters.
 /// </summary>
 /// <returns></returns>
 protected static UmlTransition FindContinueTransition(UmlNode node)
 {
     if (node is ConditionalNode)
     {
         return((node as ConditionalNode).ContinueTransition);
     }
     // Only ConditionalNodes have quit transitions, so if node is not conditional then
     // it's continue transition must be the 2nd one.
     if (node != null && node.Connectors.Count > 1)
     {
         return(node.Connectors[(int)ActivityTransition.Continue] as UmlTransition);
     }
     return(null);
 }