private void StatePort_Disconnected(Connection connection) { if (!object.ReferenceEquals(connection.SourcePort, this)) { return; } StateMachineTransition transition = (StateMachineTransition)connection; StateMachineChip stateMachine; StateChip targetState = (StateChip)transition.TargetStatePort.Node; targetState.Active = false; if (transition.SourceStatePort.IsStateRootPort) { stateMachine = (StateMachineChip)transition.SourceStatePort.Node; } else { StateChip sourceState = (StateChip)transition.SourceStatePort.Node; stateMachine = sourceState.StateMachineUnchecked; } DebugUtils.Assert(object.ReferenceEquals(stateMachine, targetState.StateMachineUnchecked)); if (stateMachine == null) { if (!transition.SourceStatePort.IsStateRootPort) { ((StateChip)transition.SourceStatePort.Node).CheckStateMachine(); } targetState.CheckStateMachine(); return; } if (transition.TargetStatePort.connections.Count > 0) { stateMachine.UpdateConnectedStates(); } else { stateMachine.connectedStates.Remove(targetState); targetState.StateMachine = null; } if (!transition.SourceStatePort.IsStateRootPort) { ((StateChip)transition.SourceStatePort.Node).CheckStateMachine(); } targetState.CheckStateMachine(); }
private void StatePort_Connected(Connection connection) { DebugUtils.Assert(object.ReferenceEquals(connection.SourcePort, this)); DebugUtils.Assert(!connection.TargetPort.IsStateRootPort); StateMachineTransition transition = (StateMachineTransition)connection; StateMachineChip stateMachine; StateChip targetState = (StateChip)transition.TargetStatePort.Node; if (transition.SourceStatePort.IsStateRootPort) { stateMachine = (StateMachineChip)transition.SourceStatePort.Node; } else { StateChip sourceState = (StateChip)transition.SourceStatePort.Node; stateMachine = sourceState.StateMachineUnchecked; if (stateMachine == null) { stateMachine = targetState.StateMachineUnchecked; } } if (stateMachine == null) { if (!transition.SourceStatePort.IsStateRootPort) { ((StateChip)transition.SourceStatePort.Node).CheckStateMachine(); } targetState.CheckStateMachine(); return; } StateChip newState; if (targetState.StateMachineUnchecked == null) { newState = targetState; } else { newState = (StateChip)transition.SourceStatePort.Node; } if (newState.StateMachineUnchecked == null) { DebugUtils.Assert(newState.statePort.connections.Count > 0); if (newState.statePort.connections.Count > 1) { stateMachine.UpdateConnectedStates(); } else { DebugUtils.Assert(!stateMachine.connectedStates.Contains(newState)); stateMachine.connectedStates.Add(newState); newState.StateMachine = stateMachine; } } else { DebugUtils.Assert(object.ReferenceEquals(targetState.StateMachine, stateMachine)); } if (!transition.SourceStatePort.IsStateRootPort) { ((StateChip)transition.SourceStatePort.Node).CheckStateMachine(); } targetState.CheckStateMachine(); }