/// <summary> /// Sets a pausable node at the given one-relative index to pause or not pause this machine upon entry. /// </summary> /// <param name="nodeNumber">A 1-relative index for the node to toggle</param> /// <param name="pause">indicates whether to set the node to pause or not</param> public void PauseAtNode(int nodeNumber, bool pause) { if (!SupportsSelfPausing) { return; } var pausable = FindAllPausableNodes(); if (pausable.ContainsKey(nodeNumber)) { // This covers the easy case that the node to be paused is located in this machine. pausable[nodeNumber].PauseParentMachine = pause; } else if (IsPaused) { var behavioralNode = CurrentNode as BehavioralNode; ISubmachineBehavior doBehave = null; if (behavioralNode != null) { doBehave = behavioralNode.DoBehavior as ISubmachineBehavior; } if (doBehave != null && doBehave.Machine is CommandExecutingMachine && doBehave.IsPaused) { // This covers the case that we need to drill down into existing submachines to find the node to pause. (doBehave.Machine as CommandExecutingMachine).PauseAtNode(nodeNumber, pause); } else if (Configuration.HasDataKey("InitialBreakpoints")) { // This covers the case that the node to be paused will exist in a submachine, but hasn't been instantiated yet. var breakpoints = Configuration.Data.InitialBreakpoints as List <int>; if (pause) { if (!breakpoints.Contains(nodeNumber)) { breakpoints.Add(nodeNumber); } } else { breakpoints.Remove(nodeNumber); } } } }
private void SubscribeToSubmachineBehavior(bool subscribe, ISubmachineBehavior behavior) { if (behavior != null) { if (subscribe) { behavior.SubmachinePaused += HandleSubmachinePaused; behavior.SubmachineResumed += HandleSubmachineResumed; behavior.SubmachinePausableNodeEntered += HandleSubmachinePausableNodeEntered; } else { behavior.SubmachinePaused -= HandleSubmachinePaused; behavior.SubmachineResumed -= HandleSubmachineResumed; behavior.SubmachinePausableNodeEntered -= HandleSubmachinePausableNodeEntered; } } }