/// <summary> /// Adds the final transitions for the given node. The node's first final transition is /// a Finish transition. The second one is a Quit transition that gets a default guard so /// that it will never fire. /// </summary> /// <param name="node"></param> protected void AddFinalTransitions(UmlNode node) { // Set up the finish transition first so that it is triggered first. var finishTransition = node.TransitionTo(FinalNode); finishTransition.Fired += HandleTransitionFired; // Every node gets an finish transition pointing to Final using the Finish Constraint, Effect and Trigger. // Use a copy of the default constraint in case one transition needs to modify it uniquely. finishTransition.Guard = DefaultFinishConstraint.Copy(); finishTransition.Effect = FinishTransitionEffect; // Use a copy of the finish trigger since it will likely be reused many times. finishTransition.UseTrigger(FinishTransitionTrigger.Copy()); // Next, set up the quit transition with a default to never quit. if (node is ConditionalNode) { var conditionalNode = node as ConditionalNode; conditionalNode.QuitTransition = conditionalNode.TransitionTo(FinalNode); conditionalNode.QuitTransition.Guard = new DynamicConstraint <object>("Never True", new object(), (o) => false); conditionalNode.QuitTransition.Fired += HandleTransitionFired; conditionalNode.QuitTransition.Effect = new DynamicActivity("SetCompletionCauseInterrupted", RunQuitTransitionEffect) { LogType = LogType }; } }
protected override void Dispose(bool disposing) { if (disposing) { _executionSyncEvent.Dispose(); foreach (var trigger in RuntimeTriggers) { trigger.Dispose(); } RuntimeTriggers.Clear(); RuntimeTriggers = null; if (FinishTransitionTrigger != null) { FinishTransitionTrigger.Dispose(); } FinishTransitionEffect = null; } base.Dispose(disposing); }