///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Copyright (c) 2000-2019 Ericsson Telecom AB                               //
//                                                                           //
// All rights reserved. This program and the accompanying materials          //
// are made available under the terms of the Eclipse Public License v2.0     //
// which accompanies this distribution, and is available at                  //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                 //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////
//  Module: EPTF_CLL_LGenBaseStatsUI_Functions
// 
//  Purpose:
//    This module provides functions for TitanSim load generator statistics display
// 
//  Module Parameters:
//    -
// 
//  Module depends on:
//    <EPTF_CLL_Common_Definitions>
//    <EPTF_CLL_Base_Functions>
//    <EPTF_CLL_LGenBase_Definitions>
//    <EPTF_CLL_LGenBase_Functions>
//    <EPTF_CLL_LGenBase_ConfigFunctions>
//    <EPTF_CLL_LGenBase_TrafficFunctions>
//    <EPTF_CLL_LGenBaseStatsUI_Definitions>
//    <EPTF_CLL_LGenBaseStats_Definitions>
//    <EPTF_CLL_LGenBaseStats_Functions>
//    <EPTF_CLL_UIHandlerClient_Functions>
//    <EPTF_CLL_UIHandler_Definitions>
//    <EPTF_CLL_UIHandler_MsgDefinitions>
//    <EPTF_CLL_Variable_Definitions>
//    <EPTF_CLL_Variable_Functions>
//    <XTDP_PDU_Defs>
//
//  Current Owner:    ELSZSKU
// 
//  Last Review Date:
//    2008-02-26
// 
//  Detailed Comments:
// 
///////////////////////////////////////////////////////////
module EPTF_CLL_LGenBaseStatsUI_Functions

// identified_organization(127) ericsson(5) testing(0)
// <put further nodes here if needed>}]
{
//=========================================================================
// Import Part
//=========================================================================
import from EPTF_CLL_Common_Definitions all;
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_LGenBase_Definitions all;
import from EPTF_CLL_LGenBase_ConfigFunctions all;
import from EPTF_CLL_LGenBase_ConfigDefinitions all;
import from EPTF_CLL_LGenBase_TrafficFunctions all;
import from EPTF_CLL_LGenBaseStatsUI_Definitions all;
import from EPTF_CLL_LGenBaseStats_Definitions all;
import from EPTF_CLL_LGenBaseStats_Functions all;
import from EPTF_CLL_UIHandlerClient_Functions all;
import from EPTF_CLL_UIHandler_Definitions all;
import from EPTF_CLL_UIHandler_MsgDefinitions all;
import from EPTF_CLL_Variable_Definitions all;
import from EPTF_CLL_Variable_Functions all;

///////////////////////////////////////////////////////////
// Module parameter: 
//   tsp_LGenBaseStatsUI_columnDescriptorList
//
// Detailed description:
//    This parameter describes the contents of the traffic case tree
//    on the GUI if the pl_columnDescriptorList parameter of 
//    the function <f_EPTF_LGenBaseStatsUI_init> has no value.
///////////////////////////////////////////////////////////
modulepar EPTF_LGenBaseStatsUI_columnDescriptorList tsp_LGenBaseStatsUI_columnDescriptorList := {
  {"Tc", c_EPTF_LGenBaseStatsUI_tcColTcName, false},
  {"En.", c_EPTF_LGenBaseStatsUI_tcColEnabled, false},
  {"State", c_EPTF_LGenBaseStatsUI_tcColStateName, false},
  {"Info", c_EPTF_LGenBaseStatsUI_tcColUserData, false},
  {"Start", c_EPTF_LGenBaseStatsUI_tcColStartBtn, true},
  {"Stop", c_EPTF_LGenBaseStatsUI_tcColStopBtn, true},
  {"Pause", c_EPTF_LGenBaseStatsUI_tcColPauseBtn, true},
  {"Abort", c_EPTF_LGenBaseStatsUI_tcColAbortBtn, true},
  {"Single shot", c_EPTF_LGenBaseStatsUI_tcColSingleShotBtn, true},
  {"Traffic type", c_EPTF_LGenBaseStatsUI_tcColTrafficType, false},
  {"CPS", c_EPTF_LGenBaseStatsUI_tcColCpsToReach, true},
  {"Weight", c_EPTF_LGenBaseStatsUI_tcColWeight, true},
  {"Last CPS", c_EPTF_LGenBaseStatsUI_tcColLastCps, false},
  {"Running", c_EPTF_LGenBaseStatsUI_tcColNrOfRunningEntities, false},
  {"Available", c_EPTF_LGenBaseStatsUI_tcColNrOfAvailableEntities, false},
  {"Not finished", c_EPTF_LGenBaseStatsUI_tcColNrOfNotFinishedEntities, false},
  {"Starts",  c_EPTF_LGenBaseStatsUI_tcColNrOfStarts, false},
  {"Success",  c_EPTF_LGenBaseStatsUI_tcColNrOfSuccesses, false},
  {"Fail",  c_EPTF_LGenBaseStatsUI_tcColNrOfFails, false},
  {"Erroneous",  c_EPTF_LGenBaseStatsUI_tcColNrOfErrors, false},
  {"Timeout",  c_EPTF_LGenBaseStatsUI_tcColNrOfTimeouts, false},
  {"Max.running",  c_EPTF_LGenBaseStatsUI_tcColMaxRunning, false},
  {"Min.available",  c_EPTF_LGenBaseStatsUI_tcColMinAvailable, false},
  {"Max.busy",  c_EPTF_LGenBaseStatsUI_tcColMaxBusy, false},
  {"Fin.traffic",  c_EPTF_LGenBaseStatsUI_tcColReceivedAnswers, false},
  {"Range loops",  c_EPTF_LGenBaseStatsUI_tcColRangeLoops, false}
}

///////////////////////////////////////////////////////////
// Module parameter: 
//   tsp_LGenBaseStatsUI_columnDescriptorList
//
// Detailed description:
//    This parameter describes the contents of the scenario panel
//    on the GUI if the pl_scColumnDescriptorList parameter of 
//    the function <f_EPTF_LGenBaseStatsUI_init> has no value.
///////////////////////////////////////////////////////////
modulepar EPTF_LGenBaseStatsUI_scColumnDescriptorList tsp_LGenBaseStatsUI_scColumnDescriptorList := {
  {"Scenario", c_EPTF_LGenBaseStatsUI_scColName, false},
  {"En.", c_EPTF_LGenBaseStatsUI_scColEnabled, true},
  {"State", c_EPTF_LGenBaseStatsUI_scColStateName, false},
  {"Start", c_EPTF_LGenBaseStatsUI_scColStartBtn, true},
  {"Stop", c_EPTF_LGenBaseStatsUI_scColStopBtn, true},
  {"Pause", c_EPTF_LGenBaseStatsUI_scColPauseBtn, true},
  {"Abort", c_EPTF_LGenBaseStatsUI_scColAbortBtn, true},
  {"Restore", c_EPTF_LGenBaseStatsUI_scColRestoreBtn, true},
  {"Single shot", c_EPTF_LGenBaseStatsUI_scColSingleShotBtn, true},
  {"CPS", c_EPTF_LGenBaseStatsUI_scColCPS, true},
  {"Traffic type", c_EPTF_LGenBaseStatsUI_scColTrafficType, false},
  {"Lock CPS", c_EPTF_LGenBaseStatsUI_scColLockCPS, true}
}

group public_functions{
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_LGenBaseStatsUI_init
  // 
  //  Purpose:
  //    Inits EPTF_LGenBaseStatsUI feature
  //
  //  Parameters:
  //    - pl_selfName - *in charstring* - the name of the component
  //    - entityNamePrefix - *in charstring* -  the name prefix for the entities in the LGenBase
  //    - pl_DefaultUIHandler - *in EPTF_UIHandler_CT* - the UIHandler component to communicate with
  //    - pl_scColumnDescriptorList - *in* <EPTF_LGenBaseStatsUI_scColumnDescriptorList> - descriptor of the scenario tree
  //    - pl_columnDescriptorList - *in* <EPTF_LGenBaseStatsUI_tcColumnDescriptorList> - descriptor of the traffic case tree
  ///////////////////////////////////////////////////////////
  public function f_EPTF_LGenBaseStatsUI_init(
    in charstring pl_selfName,
    in charstring pl_entityNamePrefix,
    in EPTF_UIHandler_CT pl_DefaultUIHandler,
    in EPTF_LGenBaseStatsUI_scColumnDescriptorList pl_scColumnDescriptorList := tsp_LGenBaseStatsUI_scColumnDescriptorList,
    in EPTF_LGenBaseStatsUI_columnDescriptorList pl_columnDescriptorList := tsp_LGenBaseStatsUI_columnDescriptorList
  )
  runs on EPTF_LGenBaseStatsUI_Private_CT{
    if (v_LGenBaseStatsUI_initialized) {return}
    f_EPTF_Base_assert(%definitionId&": The default UIHandler component must not be null.",null != pl_DefaultUIHandler);
    f_EPTF_LGenBaseStats_init(pl_selfName, pl_entityNamePrefix);
    f_EPTF_UIHandlerClient_init_CT(pl_selfName, pl_DefaultUIHandler)
    v_LGenBaseStatsUI_tcColumnDescriptorList := pl_columnDescriptorList;
    v_LGenBaseStatsUI_scColumnDescriptorList := pl_scColumnDescriptorList;
    var integer vl_createdWidgetsCountM := sizeof(c_EPTF_LGenBaseStatsUI_tcVarDescriptor)-1;
    v_LGenBaseStatsUI_createdTcWidgets[vl_createdWidgetsCountM ] := false;
    for ( var integer vl_i := 0; vl_i < vl_createdWidgetsCountM ; vl_i := vl_i+1 )
    {
      v_LGenBaseStatsUI_createdTcWidgets[vl_i] := false;
      v_LGenBaseStatsUI_enabledTcWidgets[vl_i] := false;
    }
    var integer vl_colCount := sizeof(v_LGenBaseStatsUI_tcColumnDescriptorList);
    for ( var integer vl_col := 0; vl_col < vl_colCount ; vl_col := vl_col+1 )
    {
      v_LGenBaseStatsUI_createdTcWidgets[v_LGenBaseStatsUI_tcColumnDescriptorList[vl_col].tcColId] := true;
      v_LGenBaseStatsUI_enabledTcWidgets[v_LGenBaseStatsUI_tcColumnDescriptorList[vl_col].tcColId] := v_LGenBaseStatsUI_tcColumnDescriptorList[vl_col].enableIfAvailable;
    }
    for ( var integer vl_i := 0; vl_i < c_EPTF_LGenBaseStatsUI_scLastColId + 1 ; vl_i := vl_i+1 )
    {
      v_LGenBaseStatsUI_createdScWidgets[vl_i] := false;
      v_LGenBaseStatsUI_enabledScWidgets[vl_i] := false;
    }
    for ( var integer vl_i := 0; vl_i < sizeof(v_LGenBaseStatsUI_scColumnDescriptorList) ; vl_i := vl_i+1 )
    {
      v_LGenBaseStatsUI_createdScWidgets[v_LGenBaseStatsUI_scColumnDescriptorList[vl_i].scColId] := true;
      v_LGenBaseStatsUI_enabledScWidgets[v_LGenBaseStatsUI_scColumnDescriptorList[vl_i].scColId] := v_LGenBaseStatsUI_scColumnDescriptorList[vl_i].enableIfAvailable;
    }
    v_LGenBaseStatsUI_subGUIPrefix := f_EPTF_Base_selfName()&tsp_LGenBase_nameSeparator&c_LGenBaseStatsUI_subGUIPrefix;
    v_LGenBaseStatsUI_initialized := true;
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_LGenBaseStatsUI_prepareGUI
  // 
  //  Purpose:
  //    Creates the statistical variables, adds the widgets to the GUI,
  //    and connects them to the widgets
  //
  //  Parameters:
  //    - pl_parentWidgetId - *in charstring* - the name of the parent widget
  //
  //  Detailed Comments:
  //    The function must be called after creating all the scenarios
  ///////////////////////////////////////////////////////////
  public function f_EPTF_LGenBaseStatsUI_prepareGUI(
    in EPTF_UIHandler_WidgetIdString pl_parentWidgetId
  )
  runs on EPTF_LGenBaseStatsUI_Private_CT{
    f_EPTF_LGenBaseStats_createVars();
    f_EPTF_LGenBaseStatsUI_joinWidgets();
  }
}

public function f_EPTF_LGenBaseStatsUI_scenarioPrefix(
  in charstring pl_eGrpName,
  in charstring pl_scName
)
runs on EPTF_LGenBaseStatsUI_Private_CT
return charstring{
  return f_EPTF_Base_selfName()&c_EPTF_LGenBaseStatsUI_widgetIdSeparator&pl_eGrpName&c_EPTF_LGenBaseStatsUI_widgetIdSeparator&pl_scName&c_EPTF_LGenBaseStatsUI_widgetIdSeparator;
}

private function f_EPTF_LGenBaseStatsUI_treeName(
  in charstring pl_eGrpName,
  in charstring pl_scName
)
runs on EPTF_LGenBaseStatsUI_Private_CT
return charstring{
  return f_EPTF_LGenBaseStatsUI_scenarioPrefix(pl_eGrpName, pl_scName)&"tree";
}

private function f_EPTF_LGenBaseStatsUI_cellNamePrefix(
  in charstring pl_eGrpName,
  in charstring pl_scName,
  in charstring pl_tcName
)
runs on EPTF_LGenBaseStatsUI_Private_CT
return charstring{
  return f_EPTF_LGenBaseStatsUI_scenarioPrefix(pl_eGrpName, pl_scName)&pl_tcName&c_EPTF_LGenBaseStatsUI_widgetIdSeparator;
}

private function f_EPTF_LGenBaseStatsUI_joinWidgets()
runs on EPTF_LGenBaseStatsUI_Private_CT {
  for ( var integer vl_eGrpIdx := 0; vl_eGrpIdx < f_EPTF_LGenBase_getEGrpCount() ; vl_eGrpIdx := vl_eGrpIdx+1 )
  {
    f_EPTF_LGenBaseStatsUI_joinEGroupWidgets(vl_eGrpIdx);
  }
  f_EPTF_LGenBase_registerTcStateChangedCallback(refers(f_EPTF_LGenBaseStatsUI_tcStateChanged));
  f_EPTF_LGenBase_registerScenarioStateChangedCallback(refers(f_EPTF_LGenBaseStatsUI_scenarioStateChanged))
  f_EPTF_LGenBaseStatsUI_initBtnStates();
}


private function f_EPTF_LGenBaseStatsUI_initBtnStates()
runs on EPTF_LGenBaseStatsUI_Private_CT {
  for ( var integer vl_eGrp := 0; vl_eGrp < f_EPTF_LGenBase_getEGrpCount() ; vl_eGrp := vl_eGrp+1 )
  {
    for ( var integer vl_sc := 0; vl_sc < f_EPTF_LGenBase_getScCountOfEGrp(vl_eGrp) ; vl_sc := vl_sc+1 )
    {
      f_EPTF_LGenBaseStatsUI_scenarioStateChanged(vl_eGrp, vl_sc);
      for ( var integer vl_tc := 0; vl_tc < f_EPTF_LGenBase_getTcCountOfSc(vl_eGrp, vl_sc) ; vl_tc := vl_tc+1 )
      {
        f_EPTF_LGenBaseStatsUI_tcStateChanged(f_EPTF_LGenBase_trafficCaseAbsIdx(vl_eGrp, vl_sc, vl_tc));
      }
    }
  }
}
private function f_EPTF_LGenBaseStatsUI_joinEGroupWidgets(
  in integer pl_eGrpIdx
)
runs on EPTF_LGenBaseStatsUI_Private_CT {
  var charstring vl_eGrpName := f_EPTF_LGenBaseStats_eGrpName(pl_eGrpIdx);
  //var charstring vl_prefix := pl_prefix&vl_eGrpName&c_EPTF_LGenBase_widgetIdSeparator;
  for ( var integer vl_sc := 0; vl_sc < f_EPTF_LGenBase_getScCountOfEGrp(pl_eGrpIdx) ; vl_sc := vl_sc+1 )
  {
    f_EPTF_LGenBaseStatsUI_joinScenarioWidgets(pl_eGrpIdx, vl_sc, vl_eGrpName);
  }
}

private function f_EPTF_LGenBaseStatsUI_getScVarNamePrefix(
  in charstring pl_eGrpName,
  in charstring pl_scName
) runs on EPTF_LGenBaseStats_CT return charstring {
  return pl_eGrpName&tsp_LGenBase_nameSeparator&pl_scName&tsp_LGenBase_nameSeparator;
}

private function f_EPTF_LGenBaseStatsUI_joinScenarioWidgets(
  in integer pl_eGrpIdx,
  in integer pl_scIdx,
  in charstring pl_eGrpName
)
runs on EPTF_LGenBaseStatsUI_Private_CT {
  var integer vl_tcCount := f_EPTF_LGenBase_getTcCountOfSc(pl_eGrpIdx, pl_scIdx)
  var charstring vl_scName := f_EPTF_LGenBaseStats_scenarioName(pl_eGrpIdx, pl_scIdx);
  //var charstring vl_tcVarName := f_EPTF_LGenBaseStats_getScNamePrefix(pl_eGrpName,vl_scName)&c_EPTF_LGenBaseStats_nameOfTcRunningTcsInSc;
  //var integer vl_varIdx := f_EPTF_Var_getId(vl_tcVarName);
  //f_EPTF_Base_assert(%definitionId&": Invalid variable index for scenario "&vl_scName&" of entity group "&pl_eGrpName,-1 != vl_varIdx);
  //f_EPTF_Var_addPostProcFn(vl_varIdx, {refers(f_EPTF_LGenBaseStatsUI_tcStartedOrStopped),{pl_eGrpIdx, pl_scIdx}});
  var boolean vl_weighted := f_EPTF_LGenBase_isWeightedScenario(pl_eGrpIdx, pl_scIdx);
  for ( var integer vl_tc := 0; vl_tc < vl_tcCount ; vl_tc := vl_tc+1 )
  {
    var integer vl_tcAbsIdx := f_EPTF_LGenBase_trafficCaseAbsIdx(pl_eGrpIdx, pl_scIdx, vl_tc)
    var charstring vl_tcName := f_EPTF_LGenBase_getTcNameByTcIdx(vl_tcAbsIdx);//f_EPTF_LGenBase_getTcUniqueNameByTcIdx(vl_tcAbsIdx)
    var charstring vl_varNamePrefix := f_EPTF_LGenBaseStats_getNamePrefix(pl_eGrpName,vl_scName,vl_tcName);
    var charstring vl_widgetPrefix := f_EPTF_LGenBaseStatsUI_cellNamePrefix(pl_eGrpName,vl_scName,vl_tcName);
    //var charstring vl_widgetPrefix := f_EPTF_LGenBaseStatsUI_widgetPrefix(pl_prefix, pl_eGrpName, pl_scName);
    //var integer vl_colCounter := 0;
    for ( var integer vl_col := 0; vl_col < sizeof(v_LGenBaseStatsUI_tcColumnDescriptorList) ; vl_col := vl_col+1 )
    {
      if( (vl_weighted and match(c_EPTF_LGenBaseStatsUI_tcVarDescriptor[v_LGenBaseStatsUI_tcColumnDescriptorList[vl_col].tcColId].displayOn, EPTF_LGenBaseStatsUI_displayOnScTypeWeighted))or
        (not vl_weighted and match(c_EPTF_LGenBaseStatsUI_tcVarDescriptor[v_LGenBaseStatsUI_tcColumnDescriptorList[vl_col].tcColId].displayOn, EPTF_LGenBaseStatsUI_displayOnScTypeCps)))
      {
        select( v_LGenBaseStatsUI_tcColumnDescriptorList[vl_col].tcColId )
        {
          case ( c_EPTF_LGenBaseStatsUI_tcColStartBtn )
          {
            var charstring vl_startTcVarName := vl_varNamePrefix&c_EPTF_LGenBaseStatsUI_nameOfStartBtn;
            f_EPTF_UIHandlerClient_subscribeMe(vl_startTcVarName, v_LGenBaseStatsUI_subGUIPrefix&vl_startTcVarName, 
              vl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfStartBtn,
              realtime); 
          }
          case ( c_EPTF_LGenBaseStatsUI_tcColStopBtn )
          {
            var charstring vl_stopTcVarName := vl_varNamePrefix&c_EPTF_LGenBaseStatsUI_nameOfStopBtn;
            f_EPTF_UIHandlerClient_subscribeMe(vl_stopTcVarName, v_LGenBaseStatsUI_subGUIPrefix&vl_stopTcVarName, 
              vl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfStopBtn,
              realtime); 
          }
          case ( c_EPTF_LGenBaseStatsUI_tcColAbortBtn )
          {
            var charstring vl_abortTcVarName := vl_varNamePrefix&c_EPTF_LGenBaseStatsUI_nameOfAbortBtn;
            f_EPTF_UIHandlerClient_subscribeMe(vl_abortTcVarName, v_LGenBaseStatsUI_subGUIPrefix&vl_abortTcVarName, 
              vl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfAbortBtn,
              realtime); 
          }
          case ( c_EPTF_LGenBaseStatsUI_tcColPauseBtn )
          {
            var charstring vl_pauseTcVarName := vl_varNamePrefix&c_EPTF_LGenBaseStatsUI_nameOfPauseBtn;
            f_EPTF_UIHandlerClient_subscribeMe(vl_pauseTcVarName, v_LGenBaseStatsUI_subGUIPrefix&vl_pauseTcVarName, 
              vl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfPauseBtn,
              realtime); 
          }
          case ( c_EPTF_LGenBaseStatsUI_tcColSingleShotBtn )
          {
            var charstring vl_varName := vl_varNamePrefix&c_EPTF_LGenBaseStatsUI_nameOfSingleShotBtn;
            f_EPTF_UIHandlerClient_subscribeMe(vl_varName, v_LGenBaseStatsUI_subGUIPrefix&vl_varName, 
              vl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfSingleShotBtn,
              realtime); 
          }
          case ( c_EPTF_LGenBaseStatsUI_tcColCpsToReach )
          {
            var charstring vl_varName := c_EPTF_LGenBaseStatsUI_tcVarDescriptor[v_LGenBaseStatsUI_tcColumnDescriptorList[vl_col].tcColId].varName;
            f_EPTF_UIHandlerClient_subscribeMe(vl_varNamePrefix&vl_varName, v_LGenBaseStatsUI_subGUIPrefix&vl_varNamePrefix&vl_varName,
              //tcPrefix&c_EPTF_LGenBaseStatsUI_tcVarNames[v_LGenBaseStatsUI_tcColumnDescriptorList[vl_col].tcColId],
              vl_widgetPrefix&vl_varName,
              realtime); 
          }
          case ( c_EPTF_LGenBaseStatsUI_tcColWeight )
          {
            var charstring vl_varName := c_EPTF_LGenBaseStatsUI_tcVarDescriptor[v_LGenBaseStatsUI_tcColumnDescriptorList[vl_col].tcColId].varName;
            f_EPTF_UIHandlerClient_subscribeMe(vl_varNamePrefix&vl_varName, v_LGenBaseStatsUI_subGUIPrefix&vl_varNamePrefix&vl_varName,
              //tcPrefix&c_EPTF_LGenBaseStatsUI_tcVarNames[v_LGenBaseStatsUI_tcColumnDescriptorList[vl_col].tcColId],
              vl_widgetPrefix&vl_varName,
              realtime); 
          }
          case else
          {
            var charstring vl_varName := c_EPTF_LGenBaseStatsUI_tcVarDescriptor[v_LGenBaseStatsUI_tcColumnDescriptorList[vl_col].tcColId].varName;
            f_EPTF_UIHandlerClient_subscribeMe(vl_varNamePrefix&vl_varName, v_LGenBaseStatsUI_subGUIPrefix&vl_varNamePrefix&vl_varName,
              //tcPrefix&c_EPTF_LGenBaseStatsUI_tcVarNames[v_LGenBaseStatsUI_tcColumnDescriptorList[vl_col].tcColId],
              vl_widgetPrefix&vl_varName,
              sampledAtSync)
          }
        }
        //vl_colCounter := vl_colCounter + 1;
      }
    }
  }
  //vl_colCounter := 0;
  var charstring vl_scVarPrefix := f_EPTF_LGenBaseStatsUI_getScVarNamePrefix(pl_eGrpName, vl_scName);
  var charstring vl_scWidgetPrefix := f_EPTF_LGenBaseStatsUI_scenarioPrefix(pl_eGrpName, vl_scName);
  for ( var integer vl_col := 0; vl_col < sizeof(v_LGenBaseStatsUI_scColumnDescriptorList) ; vl_col := vl_col+1 )
  {
    if( (vl_weighted and match(c_EPTF_LGenBaseStatsUI_scVarDescriptor[v_LGenBaseStatsUI_scColumnDescriptorList[vl_col].scColId].displayOn, EPTF_LGenBaseStatsUI_displayOnScTypeWeighted))or
      (not vl_weighted and match(c_EPTF_LGenBaseStatsUI_scVarDescriptor[v_LGenBaseStatsUI_scColumnDescriptorList[vl_col].scColId].displayOn, EPTF_LGenBaseStatsUI_displayOnScTypeCps))){
      var charstring vl_varName := vl_scVarPrefix&c_EPTF_LGenBaseStatsUI_scVarDescriptor[v_LGenBaseStatsUI_scColumnDescriptorList[vl_col].scColId].varName;
      var charstring vl_widgetName := vl_scWidgetPrefix&c_EPTF_LGenBaseStatsUI_scVarDescriptor[v_LGenBaseStatsUI_scColumnDescriptorList[vl_col].scColId].varName;
      select( v_LGenBaseStatsUI_scColumnDescriptorList[vl_col].scColId)
      {
        case ( c_EPTF_LGenBaseStatsUI_scColStartBtn )
        {
          //Start
          f_EPTF_UIHandlerClient_subscribeMe(vl_varName, v_LGenBaseStatsUI_subGUIPrefix&vl_varName,
            vl_widgetName,
            realtime);
        }
        case ( c_EPTF_LGenBaseStatsUI_scColStopBtn )
        {
          //Stop 
          f_EPTF_UIHandlerClient_subscribeMe(vl_varName, v_LGenBaseStatsUI_subGUIPrefix&vl_varName,
            vl_widgetName,
            realtime);
        }
        case ( c_EPTF_LGenBaseStatsUI_scColPauseBtn )
        {
          //Pause 
          f_EPTF_UIHandlerClient_subscribeMe(vl_varName, v_LGenBaseStatsUI_subGUIPrefix&vl_varName,
            vl_widgetName,
            realtime);
        }
        case ( c_EPTF_LGenBaseStatsUI_scColAbortBtn )
        {
          //Abort 
          f_EPTF_UIHandlerClient_subscribeMe(vl_varName, v_LGenBaseStatsUI_subGUIPrefix&vl_varName,
            vl_widgetName,
            realtime);
        }
        case ( c_EPTF_LGenBaseStatsUI_scColRestoreBtn )
        {
          //Restore 
          f_EPTF_UIHandlerClient_subscribeMe(vl_varName, v_LGenBaseStatsUI_subGUIPrefix&vl_varName,
            vl_widgetName,
            realtime);
        }
        case ( c_EPTF_LGenBaseStatsUI_scColSingleShotBtn )
        {
          //SingleShot 
          f_EPTF_UIHandlerClient_subscribeMe(vl_varName, v_LGenBaseStatsUI_subGUIPrefix&vl_varName,
            vl_widgetName,
            realtime);
        }
        case else
        {
          f_EPTF_UIHandlerClient_subscribeMe(vl_varName, v_LGenBaseStatsUI_subGUIPrefix&vl_varName,
            vl_widgetName,
            sampledAtSync)
        }
      }
    }
  }
}

private function f_EPTF_LGenBaseStatsUI_scenarioStateChanged(
  in integer pl_eGrpIdx, 
  in integer pl_scIdx)
runs on EPTF_LGenBaseStatsUI_Private_CT {
  var charstring vl_eGrpName := f_EPTF_LGenBase_getEGrpName(pl_eGrpIdx)
  f_EPTF_Base_assert(%definitionId&": "&"Entity group name "&vl_eGrpName&" contains the separator "&tsp_LGenBase_nameSeparator,f_EPTF_LGenBase_checkName(vl_eGrpName)); 
  var charstring vl_scName := f_EPTF_LGenBase_scenarioName(pl_eGrpIdx, pl_scIdx)
  f_EPTF_Base_assert(%definitionId&": Scenario name "&vl_scName&" contains the separator "&tsp_LGenBase_nameSeparator,f_EPTF_LGenBase_checkName(vl_scName));
  f_EPTF_LGenBaseStatsUI_setScButtonsState(
    f_EPTF_LGenBase_getScState(pl_eGrpIdx, pl_scIdx), 
    f_EPTF_LGenBaseStatsUI_scenarioPrefix(vl_eGrpName,vl_scName),
    f_EPTF_LGenBase_isWeightedScenario(pl_eGrpIdx, pl_scIdx),
    f_EPTF_LGenBase_getScTrafficType(pl_eGrpIdx, pl_scIdx))
}

private function f_EPTF_LGenBaseStatsUI_tcStateChanged(in integer pl_tcIdx)
runs on EPTF_LGenBaseStatsUI_Private_CT {
  var charstring vl_eGrpName;
  var charstring vl_scName;
  var charstring vl_tcName;
  f_EPTF_LGenBase_trafficCaseIdNames(pl_tcIdx, vl_eGrpName, vl_scName, vl_tcName);
  var charstring vl_widgetPrefix := f_EPTF_LGenBaseStatsUI_cellNamePrefix(vl_eGrpName, vl_scName, vl_tcName);//&
  var charstring vl_varPrefix := f_EPTF_LGenBaseStats_getNamePrefix(vl_eGrpName, vl_scName, vl_tcName);
  var integer vl_eGrpIdx := f_EPTF_LGenBase_getEGrpIdxOfTc(pl_tcIdx)
  var integer vl_scIdx := f_EPTF_LGenBase_getScIdxOfTc(pl_tcIdx)
  //"."&int2str(v_LGenBase_trafficCases[pl_tcIdx].eTcRelIdx)&".";
  f_EPTF_LGenBaseStatsUI_setTcButtonsState(
    f_EPTF_LGenBase_getTcState(pl_tcIdx), 
    vl_widgetPrefix, 
    vl_varPrefix,
    f_EPTF_LGenBase_isWeightedScenario(vl_eGrpIdx, vl_scIdx),
    f_EPTF_LGenBase_getTcTrafficType(pl_tcIdx))
}

type enumerated EPTF_LGenBaseStatsUI_tcOrSc {tc, sc}
private function f_EPTF_LGenBaseStatsUI_setTcButtons(
  in EPTF_LGenBaseStatsUI_widgetSetDescriptorList pl_btnDesc,
  in charstring pl_widgetPrefix,
  in charstring pl_varNamePrefix,
  in EPTF_BooleanList pl_createdList,
  in EPTF_BooleanList pl_enabledList,
  in EPTF_LGenBaseStatsUI_tcOrSc pl_tcOrSc,
  in boolean pl_weighted)
runs on EPTF_LGenBaseStatsUI_Private_CT {
  var EPTF_Var_DirectContent vl_false := { boolVal := false };
  var template EPTF_LGenBaseStatsUI_displayOnScType vl_dsTemplate;
  if(pl_weighted){
    vl_dsTemplate := EPTF_LGenBaseStatsUI_displayOnScTypeWeighted;
  }else{
    vl_dsTemplate := EPTF_LGenBaseStatsUI_displayOnScTypeCps;
  }
  for ( var integer vl_i := 0; vl_i < sizeof(pl_btnDesc) ; vl_i := vl_i+1 )
  {
    var EPTF_LGenBaseStatsUI_displayOnScType vl_displayOn;
    if ( tc == pl_tcOrSc ){
      vl_displayOn := c_EPTF_LGenBaseStatsUI_tcVarDescriptor[pl_btnDesc[vl_i].column].displayOn;
    }else{
      vl_displayOn := c_EPTF_LGenBaseStatsUI_scVarDescriptor[pl_btnDesc[vl_i].column].displayOn;
    }
    if(pl_createdList[pl_btnDesc[vl_i].column] and
      match(vl_displayOn,vl_dsTemplate)
    ){
      var charstring vl_varShortName;
      if(tc == pl_tcOrSc){
        vl_varShortName := c_EPTF_LGenBaseStatsUI_tcVarDescriptor[pl_btnDesc[vl_i].column].varName;
      }else{
        vl_varShortName := c_EPTF_LGenBaseStatsUI_scVarDescriptor[pl_btnDesc[vl_i].column].varName;
      }
      var charstring vl_widgetName := pl_widgetPrefix&vl_varShortName;
      if ( pl_btnDesc[vl_i].enable and pl_enabledList[pl_btnDesc[vl_i].column]){
        f_EPTF_UIHandlerClient_enableGUIElement(vl_widgetName);
      }else{
        f_EPTF_UIHandlerClient_disableGUIElement(vl_widgetName);
      }
      if(pl_btnDesc[vl_i].clearIt){
        var integer vl_varIdx := f_EPTF_Var_getId(pl_varNamePrefix&vl_varShortName);
        f_EPTF_Base_assert(%definitionId&": Invalid variable name: "&pl_varNamePrefix&vl_varShortName,-1 < vl_varIdx);
        f_EPTF_Var_adjustContent(vl_varIdx, vl_false);
      }
    }
  }
}
private function f_EPTF_LGenBaseStatsUI_setTcButtonsState(
  in EPTF_LGenBase_tcState pl_state,
  in charstring pl_widgetPrefix,
  in charstring pl_varNamePrefix,
  in boolean pl_weighted,
  in EPTF_LGenBase_TrafficType pl_trafficType)
runs on EPTF_LGenBaseStatsUI_Private_CT {
  /*var charstring vl_tcStartBtnName;
  var charstring vl_tcStopBtnName;
  var charstring vl_tcAbortBtnName;
  var charstring vl_tcRestoreBtnName;
  var charstring vl_tcPauseBtnName;
  
  //vl_tcStartBtnName := pl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfStartBtn;
  //vl_tcStopBtnName := pl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfStopBtn;
  //vl_tcAbortBtnName := pl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfAbortBtn;
  //vl_tcRestoreBtnName := pl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfRestoreBtn;
  //vl_tcPauseBtnName := pl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfPauseBtn;
  */
  var EPTF_LGenBaseStatsUI_widgetSetDescriptorList vl_btnDesc := {}
  if(terminating == pl_trafficType){
    vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_tcColStartBtn, false, false}
    vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_tcColStopBtn, false, false}
    vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_tcColAbortBtn, false, false}
    vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_tcColPauseBtn, false, false}
    vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_tcColEnabled, false, false}
    vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_tcColSingleShotBtn, false, false}
  }else{
    select( pl_state )
    {
      case ( c_EPTF_LGenBase_tcStateIdle )
      {
        vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_tcColStartBtn, true, true}
        vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_tcColStopBtn, false, true}
        vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_tcColAbortBtn, false, true}
        vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_tcColPauseBtn, false, true}
        vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_tcColEnabled, true, false}
        vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_tcColSingleShotBtn, true, true}
      }
      case ( c_EPTF_LGenBase_tcStateRunning )
      {
        vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_tcColStartBtn, false, true}
        vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_tcColStopBtn, true, true}
        vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_tcColAbortBtn, true, true}
        vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_tcColPauseBtn, true, true}
        vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_tcColEnabled, false, false}
        vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_tcColSingleShotBtn, false, true}
      }
      case ( c_EPTF_LGenBase_tcStatePaused )
      {
        vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_tcColStartBtn, true, true}
        vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_tcColStopBtn, true, true}
        vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_tcColAbortBtn, true, true}
        vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_tcColPauseBtn, false, true}
        vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_tcColEnabled, false, false}
        vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_tcColSingleShotBtn, false, true}
      }
      case ( c_EPTF_LGenBase_tcStateStopping )
      {
        vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_tcColStartBtn, false, true}
        vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_tcColStopBtn, false, false}
        vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_tcColAbortBtn, false, true}
        vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_tcColPauseBtn, false, true}
        vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_tcColEnabled, false, false}
        vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_tcColSingleShotBtn, false, true}
      }
      case ( c_EPTF_LGenBase_tcStateAborting )
      {
        vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_tcColStartBtn, false, true}
        vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_tcColStopBtn, false, true}
        vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_tcColAbortBtn, false, false}
        vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_tcColPauseBtn, false, true}
        vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_tcColEnabled, false, false}
        vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_tcColSingleShotBtn, false, true}
      }
      case ( c_EPTF_LGenBase_tcStateStopped, 
        c_EPTF_LGenBase_tcStateAborted, 
        c_EPTF_LGenBase_tcStateTerminated)
      {
        vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_tcColStartBtn, true, true}
        vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_tcColStopBtn, false, true}
        vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_tcColAbortBtn, false, true}
        vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_tcColPauseBtn, false, true}
        vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_tcColEnabled, true, false}
        vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_tcColSingleShotBtn, false, true}
      }
      case ( c_EPTF_LGenBase_tcStateFinished )
      {
        vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_tcColStartBtn, false, true}
        vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_tcColStopBtn, true, true}
        vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_tcColAbortBtn, true, true}
        vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_tcColPauseBtn, false, true}
        vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_tcColEnabled, false, false}
        vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_tcColSingleShotBtn, false, true}
      }
      case else
      {
        f_EPTF_Base_assert(%definitionId&": Invalid state: "&int2str(pl_state),false);
      }
    }
  }
  f_EPTF_LGenBaseStatsUI_setTcButtons(
    vl_btnDesc, 
    pl_widgetPrefix, 
    pl_varNamePrefix,
    v_LGenBaseStatsUI_createdTcWidgets, 
    v_LGenBaseStatsUI_enabledTcWidgets,
    tc,
    pl_weighted);
}

private function f_EPTF_LGenBaseStatsUI_setScButtonsState(
  in EPTF_LGenBase_tcState pl_state,
  in charstring pl_widgetPrefix,
  in boolean pl_weighted,
  in EPTF_LGenBase_TrafficType pl_trafficType)
runs on EPTF_LGenBaseStatsUI_Private_CT {
  //  if ( pl_isSc ){
  /*
  var charstring vl_scStartBtnName := pl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfStartBtn;
  var charstring vl_scStopBtnName := pl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfStopBtn;
  var charstring vl_scAbortBtnName := pl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfAbortBtn;
  var charstring vl_scRestoreBtnName := pl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfRestoreBtn;
  var charstring vl_scPauseBtnName := pl_widgetPrefix&c_EPTF_LGenBaseStatsUI_nameOfPauseBtn;
  var charstring vl_scEnabledName :=  pl_widgetPrefix&c_EPTF_LGenBaseStats_nameOfScEnabled;
  */
  var EPTF_LGenBaseStatsUI_widgetSetDescriptorList vl_btnDesc := {}
  if(terminating == pl_trafficType){
    vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_scColStartBtn, false, false}
    vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_scColStopBtn, false, false}
    vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_scColAbortBtn, false, false}
    vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_scColRestoreBtn, false, false}
    vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_scColEnabled, false, false}
    vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_scColPauseBtn, false, false}
    vl_btnDesc[6] := {c_EPTF_LGenBaseStatsUI_scColSingleShotBtn, false, false}
  }else{
    select( pl_state )
    {
      case ( c_EPTF_LGenBase_tcStateIdle )
      {
        vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_scColStartBtn, true, false}
        vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_scColStopBtn, false, false}
        vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_scColAbortBtn, false, false}
        vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_scColRestoreBtn, false, false}
        vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_scColEnabled, true, false}
        vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_scColPauseBtn, false, false}
        vl_btnDesc[6] := {c_EPTF_LGenBaseStatsUI_scColSingleShotBtn, true, false}
      }
      case ( c_EPTF_LGenBase_tcStateRunning )
      {
        vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_scColStartBtn, false, false}
        vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_scColStopBtn, true, false}
        vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_scColAbortBtn, true, false}
        vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_scColRestoreBtn, false, false}
        vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_scColEnabled, false, false}
        vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_scColPauseBtn, true, false}
        vl_btnDesc[6] := {c_EPTF_LGenBaseStatsUI_scColSingleShotBtn, false, false}
      }
      case ( c_EPTF_LGenBase_tcStatePaused )
      {
        vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_scColStartBtn, true, false}
        vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_scColStopBtn, true, false}
        vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_scColAbortBtn, true, false}
        vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_scColRestoreBtn, false, false}
        vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_scColEnabled, false, false}
        vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_scColPauseBtn, false, false}
        vl_btnDesc[6] := {c_EPTF_LGenBaseStatsUI_scColSingleShotBtn, false, false}
      }
      case ( c_EPTF_LGenBase_tcStateStopping, c_EPTF_LGenBase_tcStateAborting )
      {
        vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_scColStartBtn, false, false}
        vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_scColStopBtn, false, false}
        vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_scColAbortBtn, false, false}
        vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_scColRestoreBtn, false, false}
        vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_scColEnabled, false, false}
        vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_scColPauseBtn, false, false}
        vl_btnDesc[6] := {c_EPTF_LGenBaseStatsUI_scColSingleShotBtn, false, false}
      }
      case ( c_EPTF_LGenBase_tcStateStopped, 
        c_EPTF_LGenBase_tcStateAborted,
        c_EPTF_LGenBase_tcStateTerminated)
      {
        vl_btnDesc[0] := {c_EPTF_LGenBaseStatsUI_scColStartBtn, false, false}
        vl_btnDesc[1] := {c_EPTF_LGenBaseStatsUI_scColStopBtn, false, false}
        vl_btnDesc[2] := {c_EPTF_LGenBaseStatsUI_scColAbortBtn, false, false}
        vl_btnDesc[3] := {c_EPTF_LGenBaseStatsUI_scColRestoreBtn, true, false}
        vl_btnDesc[4] := {c_EPTF_LGenBaseStatsUI_scColEnabled, false, false}
        vl_btnDesc[5] := {c_EPTF_LGenBaseStatsUI_scColPauseBtn, false, false}
        vl_btnDesc[6] := {c_EPTF_LGenBaseStatsUI_scColSingleShotBtn, false, false}
      }
      case ( c_EPTF_LGenBase_tcStateFinished )
      {
        vl_btnDesc := {
          {c_EPTF_LGenBaseStatsUI_scColStartBtn, false, false},
          {c_EPTF_LGenBaseStatsUI_scColStopBtn, true, false},
          {c_EPTF_LGenBaseStatsUI_scColAbortBtn, true, false},
          {c_EPTF_LGenBaseStatsUI_scColRestoreBtn, false, false},
          {c_EPTF_LGenBaseStatsUI_scColEnabled, false, false},
          {c_EPTF_LGenBaseStatsUI_scColPauseBtn, false, false},
          {c_EPTF_LGenBaseStatsUI_scColSingleShotBtn, false, false}
        }
      }
      case else
      {
        f_EPTF_Base_assert(%definitionId&": Invalid state: "&int2str(pl_state),false);
      }
    }
  }
  f_EPTF_LGenBaseStatsUI_setTcButtons(
    vl_btnDesc, 
    pl_widgetPrefix, 
    "", 
    v_LGenBaseStatsUI_createdScWidgets, 
    v_LGenBaseStatsUI_enabledScWidgets,
    sc,
    pl_weighted);
}

template EPTF_LGenBaseStatsUI_displayOnScType EPTF_LGenBaseStatsUI_displayOnScTypeWeighted := (dsBoth, dsWeight);
template EPTF_LGenBaseStatsUI_displayOnScType EPTF_LGenBaseStatsUI_displayOnScTypeCps := (dsBoth, dsCps);

private function f_EPTF_LGenBaseStatsUI_tcAbsIdx(
  in integer pl_eGrpIdx,
  in integer pl_scIdx,
  in integer pl_tcRelIdx
)
runs on EPTF_LGenBaseStatsUI_Private_CT
return integer{
  return f_EPTF_LGenBase_trafficCaseAbsIdx(pl_eGrpIdx, pl_scIdx, pl_tcRelIdx)
}

}
