/// <summary> /// init the position to start a new chain of search /// </summary> internal void init(RunTimeEvent rtEvent) { _rtEvt = rtEvent; _task = _rtEvt.getTask(); if (_task.isMainProg()) { //phase = PHASE_CONTROL_NON_SPECIFIC; _prevTask = _rtEvt.getMainPrgCreator(); if (_prevTask != null && _prevTask.isMainProg()) { _prevTask = null; } } if (rtEvent.getType() == ConstInterface.EVENT_TYPE_USER_FUNC) { _phase = PHASE_CONTROL_NON_SPECIFIC; } else { if (rtEvent.getType() == ConstInterface.EVENT_TYPE_USER_FUNC) { _phase = PHASE_CONTROL_NON_SPECIFIC; } else { _phase = PHASE_CONTROL_SPECIFIC; } } _orgTask = _task; _orgPrevTask = _prevTask; _handlersTab = _task.getHandlersTab(); if (_handlersTab == null) { goUpTaskChain(); } _handlerIdx = -1; }
/// <summary> /// returns the next event handler /// </summary> internal EventHandler getNext() { EventHandler handler; if (_handlersTab == null) { return(null); } if (_rtEvt.getType() == ConstInterface.EVENT_TYPE_INTERNAL && _rtEvt.getInternalCode() != InternalInterface.MG_ACT_VARIABLE) { // special treatment for TASK, RECORD and CONTROL level Prefix/Suffix events switch (_rtEvt.getInternalCode()) { case InternalInterface.MG_ACT_TASK_PREFIX: case InternalInterface.MG_ACT_TASK_SUFFIX: case InternalInterface.MG_ACT_REC_PREFIX: case InternalInterface.MG_ACT_REC_SUFFIX: case InternalInterface.MG_ACT_CTRL_PREFIX: case InternalInterface.MG_ACT_CTRL_SUFFIX: case InternalInterface.MG_ACT_CTRL_VERIFICATION: if (_handlerIdx == -1) { for (_handlerIdx = _handlersTab.getSize() - 1; _handlerIdx >= 0; _handlerIdx--) { handler = _handlersTab.getHandler(_handlerIdx); if (handler.isNonSpecificHandlerOf(_rtEvt) || handler.isSpecificHandlerOf(_rtEvt)) { return(handler); } } } // an event handler was not found or was returned in a previous call to this method return(null); default: // other internal events should continue break; } } while (setNextHandlerIdx()) { handler = _handlersTab.getHandler(_handlerIdx); switch (_phase) { case PHASE_CONTROL_SPECIFIC: if (handler.isSpecificHandlerOf(_rtEvt)) { return(handler); } continue; case PHASE_CONTROL_NON_SPECIFIC: if (handler.isNonSpecificHandlerOf(_rtEvt)) { return(handler); } continue; case PHASE_GLOBAL_SPECIFIC: if (handler.isGlobalSpecificHandlerOf(_rtEvt)) { return(handler); } continue; case PHASE_GLOBAL: if (handler.isGlobalHandlerOf(_rtEvt)) { return(handler); } continue; default: Logger.Instance.WriteExceptionToLog("in EventHandlerPosition.getNext() invalid phase: " + _phase); break; } } return(null); }