Example #1
0
bool mitk::EventStateMachine::HandleEvent(InteractionEvent* event, DataNode* dataNode)
{
  if (!FilterEvents(event, dataNode))
  {
    return false;
  }
  // check if the current state holds a transition that works with the given event.
  StateMachineTransition::Pointer transition = m_CurrentState->GetTransition(event->GetNameOfClass(), MapToEventVariant(event));

  if (transition.IsNotNull())
  {
    // iterate over all actions in this transition and execute them
    ActionVectorType actions = transition->GetActions();
    bool success = false;
    for (ActionVectorType::iterator it = actions.begin(); it != actions.end(); ++it)
    {

      success |= ExecuteAction(*it, event); // treat an event as handled if at least one of the actions is executed successfully
    }
    if (success || actions.empty())  // an empty action list is always successful
    {
      // perform state change
      m_CurrentState = transition->GetNextState();
      //MITK_INFO<< "StateChange: " << m_CurrentState->GetName();
    }
    return success;
  }
  else
  {
    return false; // no transition found that matches event
  }
}
bool mitk::EventStateMachine::HandleEvent(InteractionEvent* event, DataNode* dataNode)
{
  if (!m_IsActive)
    return false;

  if (!FilterEvents(event, dataNode))
  {
    return false;
  }

  // Get the transition that can be executed
  mitk::StateMachineTransition::Pointer transition = GetExecutableTransition( event );

  // check if the current state holds a transition that works with the given event.
  if ( transition.IsNotNull() )
  {
    // all conditions are fulfilled so we can continue with the actions
    m_CurrentState = transition->GetNextState();

    // iterate over all actions in this transition and execute them
    ActionVectorType actions = transition->GetActions();
    for (ActionVectorType::iterator it = actions.begin(); it != actions.end(); ++it)
    {
      try
      {
        ExecuteAction(*it, event);
      }
      catch( const std::exception& e )
      {
        MITK_ERROR << "Unhandled excaption caught in ExecuteAction(): " << e.what();
        return false;
      }
      catch( ... )
      {
        MITK_ERROR << "Unhandled excaption caught in ExecuteAction()";
        return false;
      }
    }

    return true;
  }
  return false;
}