private void RecreateNodesOnDiagram(Diagram diagram, Diagram outerDiagram, DiagramState diagramState, DiagramNode diagramNode)
 {
     AddNodesToDiagram(diagram, diagramState.Nodes);
     RewireNodes(diagram, diagramState.InternalWireStates);
     CreateInputs(diagram, outerDiagram, diagramState.InputWireStates, diagramNode);
     CreateOutputs(diagram, outerDiagram, diagramState.OutputWireStates, diagramNode);
 }
        public virtual IEnumerator <ccr.ITask> ReplaceHandler(Replace replace)
        {
            _state = replace.Body;

            replace.ResponsePort.Post(dssp.DefaultReplaceResponseType.Instance);
            base.SendNotification <Replace>(_subMgr, replace);

            yield break;
        }
        protected override void Start()
        {
            // If there was no initial state partner, then the service state will be null.
            if (_state == null)
            {
                // The state MUST be created before the service starts processing messages.
                _state = new DiagramState();
            }

            // The rest of the start process requires the ability to wait for responses from
            // services and from the start handler (if any). So execution now proceeds in an
            // iterator function.
            SpawnIterator(DoStart);
        }
        /// <inheritdoc/>
        public override void StopInteraction(DiagramInteractionEventArguments interaction)
        {
            var          diagram = interaction.Diagram;
            var          interactionRectangle = GetDiagramPontsInteractionRectangle(diagram);
            DiagramState diagramState         = SaveDiagramState(diagram, interactionRectangle);

            DeleteNodes(diagram, diagramState.Nodes);

            var diagramNode = _nodeProvider.CreateNodeFromName(typeof(DiagramNode).FullName) as DiagramNode;

            diagram.AddNode(diagramNode);
            diagramNode.WhenResolved(d => RecreateNodesOnDiagram(d, diagram, diagramState, diagramNode));
            Point nodePosition = CalculateNodePositionToCenterInLasso(interactionRectangle, diagramNode);

            diagramNode.X = nodePosition.X;
            diagramNode.Y = nodePosition.Y;
        }