コード例 #1
0
        /// <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);
                    }
                }
            }
        }
コード例 #2
0
 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;
         }
     }
 }