/// <summary> /// Creates the unified state machine /// </summary> /// <param name="obj"></param> /// <param name="visitSubNodes"></param> public override void visit(Generated.StateMachine obj, bool visitSubNodes) { StateMachine stateMachine = obj as StateMachine; if (stateMachine != null) { stateMachine.ComputeUnifiedStateMachine(); } base.visit(obj, visitSubNodes); }
/// <summary> /// Computes the unified state machine according to the update information /// </summary> public void ComputeUnifiedStateMachine() { if (Updates != null || UpdatedBy.Count > 0) { State state = null; StateMachine source; if (EnclosingStateMachine == null) { source = (StateMachine)SourceOfUpdateChain; } else { EnclosingStateMachine.ComputeUnifiedStateMachine(); StateMachine enclosingUnifiedStateMachine = EnclosingStateMachine.UnifiedStateMachine; state = enclosingUnifiedStateMachine.FindState(EnclosingState.Name); source = state.StateMachine; } UnifiedStateMachine stateMachine = source.UnifiedStateMachine as UnifiedStateMachine; if (stateMachine == null) { // First time the state machine is unified, create the unified state machine source.UnifiedStateMachine = new UnifiedStateMachine(this); if (state != null) { source.UnifiedStateMachine.setFather(state); } } else { if (this == SourceOfUpdateChain) { stateMachine.Rebuild(source); } } UnifiedStateMachine = source.UnifiedStateMachine; } else { UnifiedStateMachine = this; } }