///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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_UIHandler_WidgetFunctions
//
//  Purpose:
//    This module contains widget manipulation functions of EPTF_UIHandler_CT.
//
//  Module Parameters:
//    charstring tsp_EPTF_GUI_Main_Window_WidgetId := "EPTF_Main_Window"; used in
//       <f_EPTF_UIHandler_addWindow> creating a new window
//    charstring tsp_EPTF_GUI_Main_Toolbar_WidgetId := "EPTF_Main_Toolbar";
//    float tsp_EPTF_GUI_Main_Window_Width := 820.0; used in
//       <f_EPTF_UIHandler_addWindow> creating a new window
//    float tsp_EPTF_GUI_Main_Window_Height := 386.0; used in
//       <f_EPTF_UIHandler_addWindow> creating a new window
//    charstring tsp_EPTF_GUI_Main_Window_Title := "TTCN constructed window"; used in
//       <f_EPTF_UIHandler_addWindow> creating a new window
//    charstring tsp_xtdp_listen_addr := "127.0.0.1";
//    integer    tsp_xtdp_listen_port := 11420;
//    charstring tsp_EPTF_savedGUIPrefix := "GUI"; used to create a snapshot
//       config file about the GUI
//    charstring tsp_EPTF_GUI_DefaultWindow := ""; If it isn't empty, the
//       EPTF_UIHandler_CT tries to create a window by this string. It
//       can be created by the <f_EPTF_UIHandler_snapshot> and
//       <f_EPTF_UIHandler_saveLayout> functions.
//    charstring tsp_EPTF_UIHandler_Authmsg := "Enter password" This is the question
//       for XTDP authentication that the user of the RuntimeGUI has to answer.
//       If it is empty, no authentication performed
//    charstring tsp_EPTF_UIHandler_Authresp := ""; This is the expected
//       answer for the question <tsp_EPTF_UIHandler_Authmsg> during XTDP
//       authentication. If the answer given on RuntimeGUI does not match this
//       parameter, the authentication fails and XTDP session will be closed.
//       UIHander will enter into headless mode.
//       If it is empty, no authentication performed
//    float tsp_EPTF_UIHandler_handshakeMaxTimer := 1.0; This is the max handshake
//       time for the XDTP protocol. The handshake response should arrive less than
//       this time. (See the XTDP protocol module FS for more details)
//    float tsp_EPTF_UIHandler_authMaxTimer := 1.0; This is the max authentication time.
//       for the XDTP protocol. The authentication response should arrive less than
//       this time.  (See the XTDP protocol module FS for more details)
//    float tsp_EPTF_UIHandler_byeMaxTimer := 1.0; This is the max bye time.
//       for the XDTP protocol. The bye response should arrive less than
//       this time.  (See the XTDP protocol module FS for more details)
//    float tsp_EPTF_UIHandler_maxGUIWaitTime := 30.0; The max wait time in the
//       init function of the UIhandler (<f_EPTF_UIHandler_init_CT>) to wait
//       until Runtime GUI is connected.
//
//  Module depends on:
//    <XTDPasp_Types>
//    <XTDP_PDU_Defs>
//    <XUL_XTDL language>
//    <EPTF_CLL_UIHandler_MsgDefinitions>
//    <EPTF_CLL_UIHandler_Definitions>
//    <EPTF_CLL_UIHandler_PrivateFunctions>
//    <EPTF_CLL_Base_Definitions>
//    <EPTF_CLL_Base_Functions>
//    <EPTF_CLL_UIHandler_XTDPTemplateDefinitions>
//    <EPTF_CLL_Variable_Definitions>
//    <EPTF_CLL_Variable_Functions>
//    <EPTF_CLL_UIHandler_ConvertFunctions>
//    <EPTF_CLL_Common_Definitions>
//    <EPTF_CLL_HashMapStr2Int_Functions>
//    <EPTF_CLL_HashMapInt2Int_Functions>
//    <EPTF_CLL_Logging_Definitions>
//    <EPTF_CLL_Logging_Functions>
//    <TCCFileIO_Functions>
//    <TCCDateTime_Functions>
//    <EPTF_CLL_TransportIPL4_Functions>
//    <EPTF_CLL_Transport_CommonDefinitions>
//    <EPTF_CLL_Semaphore_Functions>
//    <EPTF_CLL_UIHandler_CLIClientDefinitions>
//    <EPTF_CLL_UIHandlerCLI_CommandDefinitions>
//    <EPTF_CLL_CLI_Functions>
//    <EPTF_CLL_CLI_Definitions>
//    <Socket_API_Definitions>
//    <EPTF_CLL_HashMap_Functions>
//
//  Current Owner:
//    EFLOATT
//
//  Last Review Date:
//    2010-xx-xx
//
//  Detailed Comments:
//    -
//
///////////////////////////////////////////////////////////////
module EPTF_CLL_UIHandler_WidgetFunctions
// [.objid{ itu_t(0) identified_organization(4) etsi(0)
// identified_organization(127) ericsson(5) testing(0)
// <put further nodes here if needed>}]
{

//=========================================================================
// Import Part
//=========================================================================
import from EPTF_CLL_UIHandler_MsgDefinitions all;
import from EPTF_CLL_UIHandler_Definitions all;
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_UIHandler_XSD_XTDPTemplateDefinitions all;
import from EPTF_CLL_Variable_Definitions all;
import from EPTF_CLL_Variable_Functions all;
import from EPTF_CLL_UIHandler_ConvertFunctions all;
import from EPTF_CLL_Common_Definitions all;
import from EPTF_CLL_Common_Functions all;
import from EPTF_CLL_HashMapStr2Int_Functions all;
import from EPTF_CLL_HashMapInt2Int_Functions all;
import from EPTF_CLL_Logging_Definitions all;
import from EPTF_CLL_Logging_Functions all;
import from TCCFileIO_Functions all;
import from TCCDateTime_Functions all;
import from TCCConversion_Functions all;
import from EPTF_CLL_TransportIPL4_Functions all;
import from EPTF_CLL_Transport_CommonDefinitions all;
import from EPTF_CLL_TransportMessageBufferManager_Functions all;
import from EPTF_CLL_Semaphore_Functions all;

import from EPTF_CLL_UIHandler_CLIClientDefinitions all;
import from EPTF_CLL_CLI_Functions all;
import from EPTF_CLL_CLI_Definitions all;
import from Socket_API_Definitions all

import from XTDP_EncDecFunctions all;
import from ttcn_ericsson_se_protocolModules_xtdp_xtdl all;
import from ttcn_ericsson_se_protocolModules_xtdp_xtdp all;
import from EPTF_CLL_DataSource_Definitions all;
import from EPTF_CLL_DataSource_Functions all;
import from EPTF_CLL_UIHandler_DS_Definitions all;
import from EPTF_CLL_UIHandler_DS_Functions all;
import from EPTF_CLL_DataSourceClient_Functions all;
import from EPTF_CLL_HashMap_Functions all;
import from EPTF_CLL_StatManager_Functions all;
import from EPTF_CLL_UIHandler_BrowserFunctions all;

import from EPTF_CLL_UIHandler_ChartDataTypeRingBuffer_Functions all;

//=========================================================================
// Module Parameters
//=========================================================================
modulepar {
  charstring tsp_EPTF_GUI_Main_Window_WidgetId := "EPTF_Main_Window";
  charstring tsp_EPTF_GUI_Main_Toolbar_WidgetId := "EPTF_Main_Toolbar";
  charstring tsp_EPTF_GUI_Main_Tabbox_WidgetId := "EPTF_Main_Tabbox";
  float tsp_EPTF_GUI_Main_Window_Width := 820.0;
  float tsp_EPTF_GUI_Main_Window_Height := 386.0;
  charstring tsp_EPTF_GUI_Main_Window_Title := "TTCN constructed window";
  charstring tsp_xtdp_listen_addr := "127.0.0.1";
  integer    tsp_xtdp_listen_port := 11420;
  integer    tsp_EPTF_UIHandler_udp_port := 3333; // remote port number for pinger port
  charstring tsp_EPTF_UIHandler_localPingerAddr := c_ipv4AnyAddr;
  integer    tsp_EPTF_UIHandler_localPingerPort := c_anyPort; // 0-> let the kernel choose a local port number automatically
  charstring tsp_EPTF_savedGUIPrefix := "GUI";
  charstring tsp_EPTF_GUI_DefaultWindow := "";  // OUTDATED, remove it from any config
  charstring tsp_EPTF_GUI_DefaultWindowXTDL := "";
  boolean tsp_EPTF_UIHandler_headlessmode := true;
  boolean tsp_EPTF_UIHandler_servermode := false;
  charstring tsp_EPTF_UIHandler_Authmsg := "Enter password";
  charstring tsp_EPTF_UIHandler_Authresp := "";
  float tsp_EPTF_UIHandler_handshakeMaxTimer := 1.0;
  float tsp_EPTF_UIHandler_authMaxTimer := 1.0;
  float tsp_EPTF_UIHandler_byeMaxTimer := 1.0;
  float tsp_EPTF_UIHandler_bufferedXTDP := 0.5;
  float tsp_EPTF_UIHandler_connecttimer := 5.0;
  float tsp_EPTF_UIHandler_maxWaitTimer := 5.0;
  integer tsp_EPTF_UIHandler_CommPortIPL4_minBufferSize := 2000;
  boolean tsp_debug_EPTF_UIHandler_Functions := false;
  float tsp_EPTF_UIHandler_maxGUIWaitTime := 30.0;
  boolean tsp_EPTF_UIHandler_enableBrowserGUI := true;
  EPTF_Var_SubscriptionMode tsp_EPTF_UIHandler_subscriptionMode := sampled; // sampled is the default for tsp_EPTF_DataSource_subscriptionMode, with pull widgets on RuntimeGUI do not update
}

friend module EPTF_CLL_UIHandlerVariableUI_Functions, EPTF_CLL_UIHandlerCLI_Functions,EPTF_CLL_UIHandler_XULFunctions;
friend module EPTF_UIHandler_Test_Testcases, EPTF_CLL_UIHandler_BrowserFunctions;
friend module EPTF_UIHandler_Test_Functions;

const charstring cg_ExternalVariableSign := "__ExternalValue";

//=========================================================================
// Public functions
//=========================================================================
group PublicFunctions {

  public external function f_EPTF_UIHandler_init_XML();
  public external function f_EPTF_UIHandler_cleanup_XML();

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_init_CT
  //
  //  Purpose:
  //    Initialises the EPTF_UIHandler_CT
  //
  //  Parameters:
  //    pl_selfName - *in* *charstring* - the name used in the initialization
  //      of the f_EPTF_Base_CT
  //    pl_CLI_compRef - *in* <EPTF_CLI_CT> - the CLI to use.
  //      Default: null (== local CLI ports are disabled)
  //    pl_connectGUI - *in* *boolean* - default: true. If it is true
  //      UIHandler will try to connect to the RuntimeGUI and will perform
  //      the XTDP handshake and authentication. The init function will
  //      exit after the XTDP session is connected. If the transport connection
  //      failed but the headless mode is true, the init function will exit
  //      with XTDP session not established and the UIHandler will enter
  //      into headless mode.
  //    pl_windowLayout - *in template* *charstring* - This parameter defines the initial
  //      gui layout in xml format. Must fit the XTDL.xsd. If it is omit (default value),
  //      UIHandler gets the <tsp_EPTF_GUI_DefaultWindowXTDL> module parameter, which can
  //      describe the GUI true. If it contains an empty string, there is no initial GUI.
  //    pl_prefix - *in* *charstring* - (default:tsp_EPTF_UIHandler_CLIPrefix) -
  //      common prefix for the UIHandler Command-Line Interface commands
  //    pl_simulationMode - *in* *boolean* - (default:false) -
  //      If this parameter is true, UIHandler will be initialized in simulation mode
  //    pl_simulation_buildDB_file - *in* *charstring* - (default:"") -
  //      The parameter is definies the file, what will be used to save the database
  //      or load the database in simulation mode
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    Error occurs in client mode (i.e. if tsp_EPTF_UIHandler_servermode is false)
  //    if
  //     - pl_connectGUI true, headless mode is false, and it is not possible
  //       to connect to the RuntimeGUI.
  //     - pl_connectGUI false and headless mode is false
  //     - pl_connectGUI true but XTDP handshake&authentication is not
  //       performed in time (during tsp_EPTF_UIHandler_maxGUIWaitTime seconds)
  //
  //  Detailed Comments:
  //    This function should be called before using the EPTF_UIHandler_CT
  //    component.
  //    Currently simulation mode is not supported, so do not change the values of
  //    the following parameters:
  //       pl_simulationMode
  //       pl_simulation_buildDB_file
  //    To get it (simulation mode) working nonblocking version of the f_EPTF_UIHandler_simulation_getData
  //    function needs to be implemented.
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_init_CT(
    in charstring pl_selfName,
    in boolean pl_connectGUI := true,
    in template charstring pl_windowLayout := "",
    in EPTF_CLI_CT pl_CLI_compRef := null,
    in charstring pl_prefix := tsp_EPTF_UIHandler_CLIPrefix,
    in boolean pl_simulationMode := false,
    in charstring pl_simulation_buildDB_file := "",
    in boolean pl_headlessmode := tsp_EPTF_UIHandler_headlessmode,
    in boolean pl_servermode := tsp_EPTF_UIHandler_servermode,
    in charstring pl_authresp := tsp_EPTF_UIHandler_Authresp )
  runs on EPTF_UIHandler_Private_CT {
    if (not v_UIHandler_initialized) {
      v_EPTF_UIHandler_simulatonMode := pl_simulationMode;
      v_EPTF_UIHandler_simulation_buildDB_file := pl_simulation_buildDB_file;
      v_UIHandler_simulation_directContentDB := {};

      if(isvalue(pl_windowLayout)){
        v_UIHandler_windowLayout := valueof(pl_windowLayout);
        v_UIHandler_emptyGUI := false;
      }else{
        v_UIHandler_windowLayout := "";
        v_UIHandler_emptyGUI := true;
      }
      v_EPTF_UIHandler_createLayoutCallback := refers(f_EPTF_UIHandler_newCreateInitialLayout);
      f_EPTF_UIHandler_init_XML();
      f_EPTF_UIHandler_initComponent(pl_selfName, pl_CLI_compRef, pl_prefix, pl_headlessmode, pl_servermode, pl_authresp);
      f_EPTF_UIHandler_connect(pl_connectGUI);
      f_EPTF_UIHandler_simulation_Subscribe2saveDBButton_vars();

      if(v_EPTF_UIHandler_simulatonMode == true) {
        f_EPTF_UIHandler_simulation_createDBFromFile(pl_simulation_buildDB_file, v_UIHandler_simulation_directContentDB);
        var integer vl_directContentDBSize := sizeof(v_UIHandler_simulation_directContentDB);
        for(var integer vl_i := 0; vl_i < vl_directContentDBSize; vl_i := vl_i + 1) {
          f_EPTF_str2int_HashMap_Insert(v_UIHandler_simulation_varsHashMapId, v_UIHandler_simulation_directContentDB[vl_i].key, vl_i);
          f_EPTF_Var_newVar(v_UIHandler_simulation_directContentDB[vl_i].key, v_UIHandler_simulation_directContentDB[vl_i].directContent)
        }
      }
      v_EPTF_UIHandler_WidgetFunctions_XTDP_XSD_filepath := "";
    }
  }

  friend function f_EPTF_UIHandler_initComponent(
    in charstring pl_selfName,
    in EPTF_CLI_CT pl_CLI_compRef := null,
    in charstring pl_prefix := tsp_EPTF_UIHandler_CLIPrefix,
    in boolean pl_headlessmode := tsp_EPTF_UIHandler_headlessmode,
    in boolean pl_servermode := tsp_EPTF_UIHandler_servermode,
    in charstring pl_authresp := tsp_EPTF_UIHandler_Authresp)
  runs on EPTF_UIHandler_Private_CT {
    v_EPTF_UIHandler_headlessmode := pl_headlessmode;
    v_EPTF_UIHandler_servermode := pl_servermode;
    v_EPTF_UIHandler_Authresp := pl_authresp;

    v_UIHandler_initToGUIClient := false;
    v_UIHandler_createGUIRunning := false;
    t_UIHandler_initGUIToClientTimer.start;

    v_UIHandler_cleanupCalled := false;
    v_UIHandler_openSubscriptions := {};
    v_UIHandler_subscriptions := {};
    v_UIHandler_guiLayoutReady := false;
    v_UIHandler_guiItemList := {};
    v_UIHandler_tracePointers := {};
    v_UIHandler_windowIndex := -1;

    //KI - 2013.11.04. - ez kimehetne, most kikotom a hasznalatat
    v_UIHandler_GUI_DescriptionDB := {};
    v_UIHandler_GUI_DescriptionDB_Idx := -1;

    v_UIHandler_nofRunning_processExternalData_handlers := 0;
    v_UIHandler_GUIFunctions_nofRunning_processExternalData_handlers := {}; // used to wait for all EPTF_CLL_UIHandler_GUIFunctions.cc[expand_current_node] functions to finish

    f_EPTF_HashMap_init_CT (pl_selfName);
    v_EPTF_UIHandler_Config_ConnectVarToWidgets := {};

    v_handshakeMaxTime := tsp_EPTF_UIHandler_handshakeMaxTimer;
    v_handshakeErrorMsg := "";

    v_authMaxTime := tsp_EPTF_UIHandler_authMaxTimer;
    v_byeMaxTime := tsp_EPTF_UIHandler_byeMaxTimer;
    v_UIHandler_byeTimer := -1;

    f_EPTF_Var_init_CT(pl_selfName);
    f_EPTF_Logging_init_CT(pl_selfName);
    f_EPTF_DataSource_init_CT(pl_selfName);
    f_EPTF_StatManager_init_CT(pl_selfName);
    if(self == pl_CLI_compRef) {
      // if I am the CLI: initialize it (with telnet ports enabled):
      f_EPTF_CLI_init_CT(pl_selfName)
    } else {
      // if remote or null CLI is used, disable all telnet ports in the CLI:
      f_EPTF_CLI_init_CT(pl_selfName,*,*);
    }
    // NOTE:
    // If pl_CLI_compRef is null: the CLI client will be initialized with self as CLI
    // and the commands will be registered also.
    // This is because if f_EPTF_UIHandler_CLI_init_CT is called later,
    // that will enable the telnet ports, so the commands should be there.
    if(null == pl_CLI_compRef){pl_CLI_compRef := self}
    f_EPTF_CLI_Client_init_CT(pl_selfName, pl_CLI_compRef)
    f_EPTF_UIHandler_CLIClient_init_CT(pl_prefix);
    f_EPTF_DataSource_CLI_init_CT(pl_selfName, pl_CLI_compRef);
    v_UIHandler_loggingMaskId := f_EPTF_Logging_registerComponentMasks(tsp_EPTF_UIHandler_loggingComponentMask, c_EPTF_UIHandler_loggingEventClasses, EPTF_Logging_CLL);
    if(tsp_debug_EPTF_UIHandler_Functions) {
      f_EPTF_Logging_enableLocalMask(v_UIHandler_loggingMaskId, c_EPTF_UIHandler_loggingClassIdx_Debug);
    } else {
      f_EPTF_Logging_disableLocalMask(v_UIHandler_loggingMaskId, c_EPTF_UIHandler_loggingClassIdx_Debug);
    }

    v_UIHandler_widgetHashMapId := f_EPTF_str2int_HashMap_New(c_EPTF_UIHandler_widgetIdHashMapName);
    v_UIHandler_tracePointerHashMapId := f_EPTF_int2int_HashMap_New(c_EPTF_UIHandler_tracePointerHashMapName);
    v_UIHandler_subscriptionHashMapId := f_EPTF_str2int_HashMap_New(c_EPTF_UIHandler_subscriptionHashMapName);
    v_UIHandler_subscriptionHashMapIdVar := f_EPTF_str2int_HashMap_New(c_EPTF_UIHandler_subscriptionHashMapNameVar);
    v_UIHandler_simulation_varsHashMapId := f_EPTF_str2int_HashMap_New(c_EPTF_UIHandler_simulation_varsHashMapName);

    f_EPTF_Semaphore_init_CT(pl_selfName);
    v_UIHandler_xtdpReceivedMessageSemaphore_r := f_EPTF_Semaphore_new();
    f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
    v_UIHandler_layoutResponseReceivedSemaphore := f_EPTF_Semaphore_new();
    v_UIHandler_exitButtonPressedSemaphore := f_EPTF_Semaphore_new();

    v_UIHandler_progressEnabled := true;

    f_EPTF_UIHandler_initProgressBar();

    f_EPTF_Transport_init(IPL4, pl_selfName)
    //FIXME use the new API
    f_EPTF_Transport_registerMsgLenCallback4LGenType(IPL4, refers(f_EPTF_UIHandler_getMsgLen_XTDP), {}, c_EPTF_UIHandler_XTDPType);
    f_EPTF_Transport_registerMsgCallback(IPL4, c_EPTF_UIHandler_XTDPType, refers(f_EPTF_UIHandler_HandleMsgs_XTDP), refers(f_EPTF_UIHandler_HandleEvent_XTDP));

    f_EPTF_MessageBufferManager_MaxBufferSize_setMinValue(tsp_EPTF_UIHandler_CommPortIPL4_minBufferSize);
    f_EPTF_Base_registerCleanup(refers(f_EPTF_UIHandler_cleanup_CT));
    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug("----EPTF_UIHandler 0.8610 INIT DONE----");
    }

    f_EPTF_DataSourceClient_init_CT(f_EPTF_Base_selfName(), self);
    f_EPTF_DataSourceClient_registerData(c_UIHandler_DS_sourceId, f_EPTF_Base_selfName(), refers(f_EPTF_UIhandler_DSProcessData), self);
    f_EPTF_DataSourceClient_registerDataValue(c_UIHandler_DS_sourceId, f_EPTF_Base_selfName(), refers(f_EPTF_UIHandler_DSProcessDataValue), self);
    f_EPTF_DataSourceClient_sendReady(c_UIHandler_DS_sourceId, f_EPTF_Base_selfName());

    if(tsp_EPTF_UIHandler_enableBrowserGUI){
      f_EPTF_UIHandler_Browser_init_CT( );
    }

    v_EPTF_UIHandler_Traces_HashmapId := f_EPTF_str2int_HashMap_New("TracesHashMap");

    v_UIHandler_initialized := true;
    if(f_EPTF_UIHandler_layoutReady()) {
      //f_EPTF_UIHandler_createInitialLayout(pl_windowLayout); // initial window is created in internal DB before trying to connect to GUI
      if(null != v_EPTF_UIHandler_createLayoutCallback){
        v_EPTF_UIHandler_createLayoutCallback.apply();
      }
    }
    f_EPTF_UIHandler_updateOwnProgress("Initializing: Done.");
    f_EPTF_Base_waitForCondition(refers(f_EPTF_UIHandler_checkDataSourceReady))
  }

  private function f_EPTF_UIHandler_checkDataSourceReady()
  runs on EPTF_UIHandler_Private_CT return boolean{
      var charstring vl_varName := "";
      var integer vl_returnVal := f_EPTF_DataSource_checkData(
       pl_dataVarName := vl_varName,
       pl_source := c_UIHandler_DS_sourceId,
       pl_ptcName := "",
       pl_element := c_UIHandler_dataElement_progressBar,
       pl_params := {});
       return vl_returnVal == 0;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_updateProgress
  //
  //  Purpose:
  //    Update the value of the dataSource containing the progress information
  //
  //  Parameters:
  //    pl_progressInfo - *in* *charstring* - the new progress information to show
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    The progress history is updated automatically
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_updateProgress(in charstring pl_progressInfo, in float vl_progressPercent := -1.0) runs on EPTF_UIHandler_Private_CT {
    if (not v_UIHandler_initialized){ return }
    var charstring vl_progressPercentStr := "";
    if (vl_progressPercent>=0.0) {
      vl_progressPercentStr := ": "&int2str(float2int(vl_progressPercent))&"%";
    }
    f_EPTF_Var_adjustContent(f_EPTF_Var_getId(c_UIHandler_DS_var_prefix&c_UIHandler_dataElement_progressBar),{charstringVal := pl_progressInfo&vl_progressPercentStr});
  }

  private function f_EPTF_UIHandler_initProgressBar() runs on EPTF_UIHandler_Private_CT {
    // create progress bar variable:
    var integer vl_progressBar_Idx, vl_progressBarHistory_Idx;
    f_EPTF_Var_newCharstring(c_UIHandler_DS_var_prefix&c_UIHandler_dataElement_progressBar,"",vl_progressBar_Idx);
    f_EPTF_Var_newCharstring(c_UIHandler_DS_var_prefix&c_UIHandler_dataElement_progressBarHistory,"",vl_progressBarHistory_Idx);
    f_EPTF_Var_addPostProcFn(vl_progressBar_Idx,{
      refers(f_EPTF_UIHandler_progressBarHistory_PostProc),
      {vl_progressBarHistory_Idx}
    });
    f_EPTF_Var_setSubsCanAdjust(vl_progressBarHistory_Idx,false);
    f_EPTF_UIHandler_updateOwnProgress("Initializing...");
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_enableOwnProgress
  //
  //  Purpose:
  //    Enables UIHandler's own progress information updates
  //
  //  Parameters:
  //    pl_enableOwnProgress - *in* *boolean* - true: enable, false: disable
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_enableOwnProgress(in boolean pl_enableOwnProgress) runs on EPTF_UIHandler_Private_CT {
    v_UIHandler_progressEnabled := pl_enableOwnProgress;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_updateOwnProgress
  //
  //  Purpose:
  //    Update the value of the dataSource containing the progress information with the UIHandler's own progress info
  //
  //  Parameters:
  //    pl_progressInfo - *in* *charstring* - the new progress information to show
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    The progress history is updated automatically
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_updateOwnProgress(in charstring pl_progressInfo, in float vl_progressPercent := -1.0) runs on EPTF_UIHandler_Private_CT {
    if (v_UIHandler_progressEnabled) {
      f_EPTF_UIHandler_updateProgress(c_UIHandler_DS_sourceId&": "&pl_progressInfo,vl_progressPercent);
    }
  }

  // appends the progressBar var content to the progressBarHistory var:
  private function f_EPTF_UIHandler_progressBarHistory_PostProc(in integer pl_idx, in EPTF_IntegerList pl_argList) runs on EPTF_UIHandler_Private_CT {
    // content of the progressBar var:
    var integer vl_progressBarHistory_Idx := pl_argList[0];
    f_EPTF_Var_adjustContent(
      vl_progressBarHistory_Idx,
      {
        charstringVal := f_EPTF_Var_getCharstringValue(vl_progressBarHistory_Idx)&"\n"&f_EPTF_Var_getCharstringValue(pl_idx)
      }
    );
  }

  friend function f_EPTF_UIHandler_connect(in boolean pl_connectGUI)
  runs on EPTF_UIHandler_Private_CT {
    var ConnectionId vl_connId := -1;
    var boolean vl_UIHandler_transportConnectionFailed := false;
    if (v_EPTF_UIHandler_servermode){
      // server mode
      f_EPTF_UIHandler_headlessmode();
    } else {

      // client mode
      f_EPTF_Transport_registerMsgCallback(IPL4, c_EPTF_UIHandler_pingerTransport, refers(f_EPTF_UIHandler_pingerReceive));
      var Result vl_result
      f_EPTF_Transport_listen(IPL4, { udp := {} }, tsp_EPTF_UIHandler_localPingerAddr, tsp_EPTF_UIHandler_localPingerPort, c_EPTF_UIHandler_pingerTransport, vl_result, false)
      if (ispresent(vl_result.errorCode) and (vl_result.errorCode != ERROR_TEMPORARILY_UNAVAILABLE)) {
        f_EPTF_UIHandler_error("Could not open pinger port: " & log2str(vl_result));
      }
      v_UIHandler_pingerConnectionId := vl_result.connId;
      v_UIHandler_udp_port := tsp_EPTF_UIHandler_udp_port;
      // Checks for GUI address that is set by the user.
      // If not use the address from module parameter.
      if (v_UIHandler_GUI_Host == c_EPTF_UIHandler_Invalid_GUI_Host or
        v_UIHandler_GUI_Port == c_EPTF_UIHandler_Invalid_GUI_Port) {
        v_UIHandler_GUI_Host := tsp_xtdp_listen_addr;
        v_UIHandler_GUI_Port := tsp_xtdp_listen_port;
      }
      if(pl_connectGUI){
        // try to connect to GUI
        var EPTF_UIHandler_connectionResult vl_res := f_EPTF_UIHandler_connectAndInitGui(vl_connId);
        if(connected != vl_res){
          if (v_EPTF_UIHandler_headlessmode) {
            // connect to GUI failed -> switch to headless mode
            if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
              f_EPTF_UIHandler_debug("initGUI failed, switch to headless mode");
            }
            f_EPTF_UIHandler_headlessmode();
            vl_UIHandler_transportConnectionFailed := vl_res != temporarilyUnavailable;
          } else {
            // connecting to GUI failed and headless mode not enabled -> stop running
            f_EPTF_UIHandler_error("initGUI failed!");
          }
        }
      } else if (v_EPTF_UIHandler_headlessmode) {
        // headless mode enabled -> switch to headless mode
        if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
          f_EPTF_UIHandler_debug("UIHandler started in headless mode");
        }
        f_EPTF_UIHandler_headlessmode();
      } else {
        // uncorrect starrtup configuration: client mode, not to connect to GUI, headless mode disabled -> stop running
        f_EPTF_UIHandler_error("Uncorrect UIHandler configuration for startup: client mode, not to connect to GUI, headless mode disabled");
      }

    }
    if (tsp_EPTF_UIHandler_bufferedXTDP != 0.0){
      //v_UIHandler_Requestbuffer.data.noNamespaceSchemaLocation := omit;
      v_UIHandler_Requestbuffer.data.transactionID := omit;
      v_UIHandler_Requestbuffer.data.choice.xTDP_Requests.ackRequested := omit;
      f_EPTF_UIHandler_requestBuffer_clear();
      t_UIHandler_bufferedXTDP.start(tsp_EPTF_UIHandler_bufferedXTDP);
    }
    v_UIHandler_def := activate(as_handle_main_EPTF_UIHandler_MgmtIf());
    // wait for gui connect (handshake and authentication) if transport is already connected
    if ((pl_connectGUI and not v_EPTF_UIHandler_servermode) and not vl_UIHandler_transportConnectionFailed) {
      timer t_wait_for_connectGUI := 0.0;
      timer t_max_wait_for_connectGUI := tsp_EPTF_UIHandler_maxGUIWaitTime;
      t_max_wait_for_connectGUI.start;
      t_wait_for_connectGUI.start;
      alt {
        [v_UIHandler_guiConnected or (vl_connId != -1 and not f_EPTF_UIHandler_isConnectedClientid(vl_connId))] t_wait_for_connectGUI.timeout {
          // connection established, or lost
        }
        [] t_max_wait_for_connectGUI.timeout {
          // bugfix_HR17649 - error => warning
          f_EPTF_UIHandler_warning("In client mode connecting to the RuntimeGUI on " & v_UIHandler_GUI_Host & ":" & log2str(v_UIHandler_GUI_Port) & " failed: Timeout during handshake&authentication. RuntimeGUI is not responding. Please correct the tsp_xtdp_listen_addr / tsp_xtdp_listen_port parameter(s) or restart the RuntimeGUI! ");
          f_EPTF_UIHandler_headlessmode();
        }
      }
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_newCreateInitialLayout
  //
  //  Purpose:
  //    Create initial layout based on settings
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_newCreateInitialLayout()
  runs on EPTF_UIHandler_Private_CT
  {
    var boolean vl_ret := false;
    if(not v_UIHandler_emptyGUI){
      // If no window is given neither from parameter nor from tsp, parameter is not given, or contains the default value ->
      // create a simple window and a main tabbox
      // This is the backward compatible way
      if("" == v_UIHandler_windowLayout and "" == tsp_EPTF_GUI_DefaultWindow){
        // no window is given -> create a simple window and a main tabbox
        if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
          f_EPTF_UIHandler_debug(%definitionId&": Creating a window and a main tabbox");
        }
        vl_ret := f_EPTF_UIHandler_addWindow();
        vl_ret := vl_ret and f_EPTF_UIHandler_addMainTabbox();
      }
      else {
        if ("" != v_UIHandler_windowLayout) {
          // create window given in parameter
          if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
            f_EPTF_UIHandler_debug(%definitionId&": Creating window specified by function parameter: "&log2str(v_UIHandler_windowLayout));
          }
          f_EPTF_UIHandler_createGUIFromWindow(v_UIHandler_windowLayout);
          //vl_wndXul := f_EPTF_UIHandler_XSD_decodeXUL(pl_windowLayout);
        }
        else if ("" != tsp_EPTF_GUI_DefaultWindow) {
          // create window from specified in tsp
          if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
            f_EPTF_UIHandler_debug(%definitionId&": Creating window specified by tsp_EPTF_GUI_DefaultWindowXTDL: "&log2str(tsp_EPTF_GUI_DefaultWindowXTDL));
          }
          f_EPTF_UIHandler_createGUIFromWindow(tsp_EPTF_GUI_DefaultWindowXTDL);
          //vl_wndXul := f_EPTF_UIHandler_XSD_decodeXUL(tsp_EPTF_GUI_DefaultWindow);
        }
        if (not vl_ret) {
          if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
            f_EPTF_UIHandler_debug(%definitionId&" failed, could not create initial GUI");
          }
        }
      }
    }
  }

  private function f_EPTF_UIHandler_createGUIFromWindow(in charstring pl_window)
  runs on EPTF_UIHandler_Private_CT{
    var Widgets vl_widgets := f_EPTF_UIHandler_XSD_decodeXUL(pl_window);
    if(not ischosen(vl_widgets.window)){
      f_EPTF_UIHandler_error(%definitionId&": The received XUL is invalid, not window or it can not be decoded fully.\n"&
        "For further detailes see the log file above.")
    }
    f_EPTF_UIHandler_createGUI(pl_window);
  }
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_cleanup_CT
  //
  //  Purpose:
  //    Destructs the EPTF_UIHandler_CT
  //
  //  Parameters:
  //    -
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    none
  //
  //  Detailed Comments:
  //    This function mustn't be called directly. You must call f_EPTF_Base_cleanup_CT instead.
  ///
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_cleanup_CT() runs on EPTF_UIHandler_Private_CT {
    //  f_EPTF_Logging_debug(true, "v_UIHandler_initialized: "& v_UIHandler_initialized &" v_UIHandler_guiConnected: "& v_UIHandler_guiConnected);
    if (v_UIHandler_initialized)
    {
      v_UIHandler_cleanupCalled := true;
      if(t_UIHandler_pingtimer.running) {
        t_UIHandler_pingtimer.stop;
      }
      if(t_UIHandler_initGUIToClientTimer.running) {
        t_UIHandler_initGUIToClientTimer.stop;
      }
      if(v_UIHandler_guiConnected)
      {
        for (var integer i := 0; i<sizeof(v_UIHandler_GUIClientId); i:= i+1)
        {
          f_EPTF_UIHandler_closeXTDPSession(v_UIHandler_GUIClientId[i].clientId);
          //var Result vl_result
          //f_EPTF_Transport_send(IPL4, v_UIHandler_GUIClientId[i], char2oct("bye\r\n"), vl_result, false)
        }
      }

      f_EPTF_Semaphore_delete(v_UIHandler_xtdpReceivedMessageSemaphore_r);
      f_EPTF_Semaphore_delete(v_UIHandler_layoutResponseReceivedSemaphore);
      f_EPTF_Semaphore_delete(v_UIHandler_exitButtonPressedSemaphore);

      v_UIHandler_openSubscriptions := {};
      v_UIHandler_subscriptions := {}
      f_EPTF_str2int_HashMap_Delete(c_EPTF_UIHandler_subscriptionHashMapName);
      f_EPTF_str2int_HashMap_Delete(c_EPTF_UIHandler_subscriptionHashMapNameVar);
      f_EPTF_str2int_HashMap_Delete(c_EPTF_UIHandler_simulation_varsHashMapName);
      v_UIHandler_subscriptionHashMapId := -1;
      v_UIHandler_subscriptionHashMapIdVar := -1;
      v_UIHandler_simulation_varsHashMapId := -1;
      v_UIHandler_guiItemList := {};
      v_UIHandler_windowIndex := -1;
      v_UIHandler_initialized := false;
      f_EPTF_str2int_HashMap_Delete(c_EPTF_UIHandler_widgetIdHashMapName);
      v_UIHandler_widgetHashMapId := -1;

      f_EPTF_int2int_HashMap_Delete(c_EPTF_UIHandler_tracePointerHashMapName);
      v_UIHandler_tracePointerHashMapId := -1;
      v_UIHandler_tracePointers := {};

      f_EPTF_str2int_HashMap_DeleteById(v_EPTF_UIHandler_Traces_HashmapId);
      v_EPTF_UIHandler_TraceRingBuffers := {};

      v_UIHandler_initToGUIClient := false;
      v_UIHandler_createGUIRunning := false;

      v_EPTF_UIHandler_headlessmode := true;
      v_EPTF_UIHandler_servermode := false;
      v_EPTF_UIHandler_Authresp := "";
    }

    // Reset the GUI address because we don't want to affect the
    // subsequence UIHandler initializations.
    v_UIHandler_GUI_Host := c_EPTF_UIHandler_Invalid_GUI_Host;
    v_UIHandler_GUI_Port := c_EPTF_UIHandler_Invalid_GUI_Port;

    v_UIHandler_guiConnected := false;
    // clearing registered callbacks (also registered callbacks exit if not v_UIHandler_initialized):
    //f_EPTF_CommPort_IPL4_setMsgLen4LGenType(null, {}, c_EPTF_UIHandler_XTDPType);
    f_EPTF_Transport_registerMsgCallback(IPL4, c_EPTF_UIHandler_XTDPType, null, null);

    deactivate(v_UIHandler_def); v_UIHandler_def := null;
    // WORKAROUND for some GUI bug, remove it ASAP!
    timer t_x := 0.5;t_x.start;t_x.timeout;
    if (not v_EPTF_UIHandler_servermode){
      var Result vl_result
      f_EPTF_Transport_close(IPL4, v_UIHandler_pingerConnectionId, vl_result)
      v_UIHandler_pingerConnectionId := -1;
    }
    f_EPTF_UIHandler_CLIClient_cleanup_CT()
    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug("----EPTF_UIHandler cleanup DONE----");
    }
    f_EPTF_UIHandler_cleanup_XML();
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_clearGUI
  //
  //  Purpose:
  //    Sends a message to user interface via XTDP port to remove
  //    all the elements and also clears UIHandler's internal DB.
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_clearGUI(in boolean pl_clearDb := true) runs on EPTF_UIHandler_Private_CT {
    if (not v_UIHandler_initialized){ return }
    f_EPTF_UIHandler_waitForLayoutReady();
    // remove all
    for(var integer clientindex:=0;clientindex<sizeof(v_UIHandler_GUIClientId);clientindex := clientindex+1){
      var ASP_XSD_XTDP vl_msg :={
        v_UIHandler_GUIClientId[clientindex].clientId,
        {
          choice := {
            xTDP_RemoveRequests:= {
              xTDP_RemoveRequest_list := {
                {
                  requestId := 1,
                  widgetId := omit
                }
              }
            }
          }
        }
      };
      f_EPTF_UIHandler_send_XTDP(vl_msg);
    }
    if (pl_clearDb) {
      // make internal widget DB empty
      f_EPTF_UIHandler_clearInternalWidgetDB();
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_addWindow
  //
  //  Purpose:
  //    Tries to add a new window to the RuntimeGUI
  //
  //  Detailed Comments:
  //    The parameters of the new window can be controlled via
  //    the tsp_EPTF_GUI_Main_Window_... module parameters
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_addWindow()
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    if (not v_UIHandler_initialized){ return false }
    f_EPTF_UIHandler_waitForLayoutReady();
    var Widgets vl_xul := {
      window := {
        about  := omit,
        height := tsp_EPTF_GUI_Main_Window_Height,
        help   := omit,
        id     := tsp_EPTF_GUI_Main_Window_WidgetId,
        orientation := vertical,
        title  := tsp_EPTF_GUI_Main_Window_Title,
        width  := tsp_EPTF_GUI_Main_Window_Width,
        image_list := {},
        embeddedwidgets := {
          /*  {tabbox := { */
          /*    id := tsp_EPTF_GUI_Main_Tabbox_WidgetId, */
          /*    flex := omit, */
          /*customclass := omit, */
          /*    disabled := omit, */
          /*disabledongui := omit, */
          /*    tabs := {}, */
          /*    tabpanels := {} */
          /*  } */
          /*  }, */
          embeddedwidget_list := {
            /*{
            toolbar := {
            customclass := omit,
            disabled := false,
            disabledongui := omit,
            id := tsp_EPTF_GUI_Main_Toolbar_WidgetId,
            placement := south,
            choice_list := {}
            }
            }*/
          }
        }
      }
    };
    var boolean vl_dummy := false;
    return f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "", vl_dummy);
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_addMainTabbox
  //
  //  Purpose:
  //    Tries to add the main tabbox to the RuntimeGUI
  //
  //  Detailed Comments:
  //    The id of the tabbox is spesified by
  //    tsp_EPTF_GUI_Main_Tabbox_WidgetId module parameter
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_addMainTabbox()
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    if (not v_UIHandler_initialized){ return false }
    var boolean vl_succ := f_EPTF_UIHandler_addMainTabpages();
    return vl_succ;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_addMainTabpages
  //
  //  Purpose:
  //    Tries to add the main tabbox to the RuntimeGUI
  //
  //  Detailed Comments:
  //    The id of the tabbox is spesified by
  //    tsp_EPTF_GUI_Main_Tabbox_WidgetId module parameter
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_addMainTabpages()
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    if (not v_UIHandler_initialized){ return false }
    f_EPTF_UIHandler_waitForLayoutReady();
    var Widgets vl_xul := {
      tabpages := {
        //In case of named fields the compiler won't warn if
        //there are uninitializad elements
        /*customclass :=*/ omit,
        /*disabled :=*/ omit,
        /*disabledongui :=*/ omit,
        /*flex :=*/ omit,
        /*id :=*/ tsp_EPTF_GUI_Main_Tabbox_WidgetId,
        /*layout :=*/ omit,
        /*tabpage :=*/ { {  }  }
      }
    };
    var boolean vl_dummy:=false;
    return f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, tsp_EPTF_GUI_Main_Window_WidgetId, vl_dummy);
  }



  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_removeElementFromGui
  //
  //  Purpose:
  //    Remove an element from the GUI.
  //
  //  Parameters:
  //    pl_widgetId - *in* *EPTF_UIHandler_WidgetIdString* -  element to be removed
  //    pl_sendToRTG - *in* *boolean* - if true: request is sent to runtime GUI, otherwise not
  //
  //  Return Value:
  //    Returns the result of f_EPTF_UIHandler_removeWidgetRecByIdx.
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_removeElementFromGui_old(in EPTF_UIHandler_WidgetIdString pl_widgetId, in boolean pl_sendToRTG := true, in boolean pl_appendTo_GUI_DescriptionDB := true)
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    if (not v_UIHandler_initialized){ return false }
    if(pl_appendTo_GUI_DescriptionDB) {
      v_UIHandler_GUI_DescriptionDB[sizeof(v_UIHandler_GUI_DescriptionDB)] := {pl_widgetId, "removed"};
    }
    f_EPTF_UIHandler_waitForLayoutReady();
    var integer vl_idx := f_EPTF_UIHandler_widgetRecIndex(pl_widgetId);
    if(-1 == vl_idx){
      f_EPTF_UIHandler_warning("There is no widget with name "&pl_widgetId&" to remove!");
      return false;
    }
    //remove the element from the GUI
    if (pl_sendToRTG) {
      f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRemoveElementFromGUI(pl_widgetId));
    }
    if(tsp_EPTF_UIHandler_enableBrowserGUI == true){
       f_EPTF_UIHandler_Browser_reportGUIChanged(pl_widgetId);
    }
    //remove it and its children from the widgetlist and the connectionlist
    return f_EPTF_UIHandler_removeWidgetRecByIdx(vl_idx);
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_removeElementFromGui
  //
  //  Purpose:
  //    Remove an element from the GUI.
  //
  //  Parameters:
  //    pl_widgetId - *in* *EPTF_UIHandler_WidgetIdString* -  element to be removed
  //    pl_sendToRTG - *in* *boolean* - if true: request is sent to runtime GUI, otherwise not
  //
  //  Return Value:
  //    Returns the result of f_EPTF_UIHandler_removeWidgetRecByIdx.
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_removeElementFromGui(in EPTF_UIHandler_WidgetIdString pl_widgetId, in boolean pl_sendToRTG := true, in boolean pl_appendTo_GUI_DescriptionDB := true)
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    if (not v_UIHandler_initialized){ return false }
    var boolean vl_ret := true;
    if(pl_appendTo_GUI_DescriptionDB) {
      v_UIHandler_GUI_DescriptionDB[sizeof(v_UIHandler_GUI_DescriptionDB)] := {pl_widgetId, "removed"};
    }
    f_EPTF_UIHandler_waitForLayoutReady();
    var integer vl_idx := f_EPTF_UIHandler_widgetRecIndex(pl_widgetId);
    if(-1 == vl_idx){
      f_EPTF_UIHandler_warning("There is no widget with name "&pl_widgetId&" to remove!");
      return false;
    }
    //remove the element from the GUI
    if (pl_sendToRTG) {
      f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRemoveElementFromGUI(pl_widgetId));
    }
    if(tsp_EPTF_UIHandler_enableBrowserGUI == true){
       f_EPTF_UIHandler_Browser_reportGUIChanged(pl_widgetId);
    }
    //remove it and its children from the widgetlist and the connectionlist
    vl_ret := f_EPTF_UIHandler_removeWidgetRecByIdx(vl_idx)
    if(vl_ret == true) {
      // Remove it from document
      vl_ret := f_EPTF_UIHandler_removeXML(pl_widgetId);
    }
    return vl_ret;
  }

  public function f_EPTF_UIHandler_printAllXMLfor_Tests( )
  runs on EPTF_UIHandler_Private_CT  {
    if (not v_UIHandler_initialized){ return }
    f_EPTF_UIHandler_printAllXML();
    return;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_removeElementFromGuiByIdx
  //
  //  Purpose:
  //    Remove an element from the GUI.
  //
  //  Parameters:
  //    pl_widgetIdx - *in* *integer* -  element to be removed
  //    pl_sendToRTG - *in* *boolean* - if true: request is sent to runtime GUI, otherwise not
  //
  //  Return Value:
  //    Returns the result of f_EPTF_UIHandler_removeWidgetRecByIdx.
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_removeElementFromGuiByIdx(in integer pl_widgetIdx, in boolean pl_sendToRTG := true, in boolean pl_appendTo_GUI_DescriptionDB := true)
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    var charstring vl_widgetId := v_UIHandler_guiItemList[pl_widgetIdx].id;
    if(pl_appendTo_GUI_DescriptionDB) {
      v_UIHandler_GUI_DescriptionDB[sizeof(v_UIHandler_GUI_DescriptionDB)] := {vl_widgetId, "removed"};
    }
    f_EPTF_UIHandler_waitForLayoutReady();
    if(-1 == pl_widgetIdx){
      f_EPTF_UIHandler_warning("There is no widget with name "&vl_widgetId&" to remove!");
      return false;
    }
    //remove the element from the GUI
    if (pl_sendToRTG) {
      f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRemoveElementFromGUI(vl_widgetId));
    }
    if(tsp_EPTF_UIHandler_enableBrowserGUI == true){
       f_EPTF_UIHandler_Browser_reportGUIChanged(vl_widgetId, pl_widgetIdx);
    }
    //remove it and its children from the widgetlist and the connectionlist
    return f_EPTF_UIHandler_removeWidgetRecByIdx(pl_widgetIdx);
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_snapshot
  //
  //  Purpose:
  //    Makes a snapshot of the GUI as a charstring.
  //
  //  Return Value:
  //    The returned charstring describes a XUL. It can be saved with
  //      <f_EPTF_UIHandler_saveLayout> to a config file.
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_snapshot()
  runs on EPTF_UIHandler_Private_CT
  return charstring{
    if (not v_UIHandler_initialized){ return "" }
    f_EPTF_UIHandler_waitForLayoutReady();
    var charstring vl_layout := "";
    if(v_UIHandler_guiConnected)
    {
      f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_layoutRequest);

      if(f_EPTF_Semaphore_waitForUnlock(v_UIHandler_layoutResponseReceivedSemaphore, tsp_EPTF_UIHandler_maxWaitTimer))
      {
        f_EPTF_UIHandler_warning("Timer timeout! No layout response received!");
        f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
        v_UIHandler_layoutResponseReceivedSemaphore := f_EPTF_Semaphore_new();
        return vl_layout;
      }
      v_UIHandler_layoutResponseReceivedSemaphore := f_EPTF_Semaphore_new();
      //f_EPTF_Semaphore_lock(v_UIHandler_layoutResponseReceivedSemaphore);
      vl_layout := f_EPTF_UIHandler_XSD_encodeXUL(v_UIHandler_receivedMessage.choice.xTDP_LayoutResponse.widgets);
    }else{
      var Widgets vl_xul;
      f_EPTF_UIHandler_buildXUL(vl_xul);
      vl_layout := f_EPTF_UIHandler_XSD_encodeXUL(vl_xul)
    }
    f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
    return vl_layout;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_snapshotWindow
  //
  //  Purpose:
  //    Makes a snapshot of the GUI's root widget (windowelem) as a charstring.
  //
  //  Return Value:
  //    The returned charstring describes a XUL that can be passed to
  //    the runtime GUI as a command line parameter if saved as a file.
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_snapshotWindow()
  runs on EPTF_UIHandler_Private_CT
  return charstring{
    if (not v_UIHandler_initialized){ return "" }
    f_EPTF_UIHandler_waitForLayoutReady();
    var charstring vl_layout := "";
    if(v_UIHandler_guiConnected)
    {
      f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_layoutRequest);

      if(f_EPTF_Semaphore_waitForUnlock(v_UIHandler_layoutResponseReceivedSemaphore, tsp_EPTF_UIHandler_maxWaitTimer))
      {
        f_EPTF_UIHandler_warning("Timer timeout! No layout response received!");
        f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
        v_UIHandler_layoutResponseReceivedSemaphore := f_EPTF_Semaphore_new();
        return vl_layout;
      }
      v_UIHandler_layoutResponseReceivedSemaphore := f_EPTF_Semaphore_new();
      //f_EPTF_Semaphore_lock(v_UIHandler_layoutResponseReceivedSemaphore);
      if(ischosen(v_UIHandler_receivedMessage.choice.xTDP_LayoutResponse.widgets.window)) {
        vl_layout := f_EPTF_UIHandler_XSD_encodeWindowXUL(v_UIHandler_receivedMessage.choice.xTDP_LayoutResponse.widgets.window);
      } else {
        f_EPTF_UIHandler_warning(%definitionId&": Unexpected XTDP LayoutResponse (not window)!");
      }
    }else{
      var Widgets vl_xul;
      f_EPTF_UIHandler_buildXUL(vl_xul);
      if(ischosen(vl_xul.window)) {
        vl_layout := f_EPTF_UIHandler_XSD_encodeWindowXUL(vl_xul.window);
      } else {
        f_EPTF_UIHandler_warning(%definitionId&": Unexpected layout (not window)!");
      }
    }
    f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
    return vl_layout;
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_XSD_encodeXUL
  //
  //  Purpose:
  //    Encodes a XUL record to its charstring representation
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_XSD_encodeXUL(in Widgets pl_widgets)
  return charstring{

    var octetstring vl_ret := enc_Widgets(pl_widgets);
    return oct2char(vl_ret)
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_XSD_encodeWindowXUL
  //
  //  Purpose:
  //    Encodes a XUL Window record to its charstring representation
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_XSD_encodeWindowXUL(in Window pl_windowelem)
  return charstring{
    var octetstring vl_ret := enc_Window(pl_windowelem);
    return oct2char(vl_ret)
  }

  public external function dec_Widgets (in octetstring p_oct, out Widgets p_widgets) return integer
  with {extension "prototype(backtrack) decode (XER:XER_EXTENDED) errorbehavior(ALL:WARNING)"}

  public external function enc_Widgets (in Widgets p_widgets) return octetstring
  with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}

  public external function enc_Window (in Window p_windowelem) return octetstring
  with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_XSD_encodeXULEm
  //
  //  Purpose:
  //    Encodes an Embedded XUL record to its charstring representation
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_XSD_encodeXULEm(in Embeddedwidget pl_widgets)
  return charstring{
    var octetstring vl_ret := enc_EmbeddedWidget(pl_widgets);
    return oct2char(vl_ret)
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_preprocessAliasXUL
  //
  //  Purpose:
  //    Preprocess alias items in XUL charstring
  //
  ///////////////////////////////////////////////////////////
  // 02.04.2012	made for first version of externalvalue
  // 					handling. not dropped becouse it will be useful once.
  type record EPTF_UIHandler_alias {
    charstring    fromStr,
    charstring 	  toStr
  };
  type record of EPTF_UIHandler_alias EPTF_UIHandler_aliasList;

  public function f_EPTF_UIHandler_preprocessAliasXUL(in charstring pl_xul)
  runs on EPTF_UIHandler_Private_CT return charstring {
    var EPTF_UIHandler_aliasList vl_aliasList:= {/*{ fromStr := "externalvalue", toStr := "iterator" }*/};
    var charstring vl_preprocessed := pl_xul;
    if(0 < sizeof(vl_aliasList)) {
      for (var integer vl_idx := 0; vl_idx < sizeof(vl_aliasList); vl_idx := vl_idx + 1) {

        var charstring vl_startFromValue := "<"&vl_aliasList[vl_idx].fromStr;
        var charstring vl_startToValue := "<"&vl_aliasList[vl_idx].toStr;
        var charstring vl_endFromValue := "</"&vl_aliasList[vl_idx].fromStr;
        var charstring vl_endToValue := "</"&vl_aliasList[vl_idx].toStr;

        // replace start tag
        vl_preprocessed := pl_xul;
        var charstring vl_tempStr:= pl_xul;
        var charstring vl_LoverStr := f_putInLowercase(pl_xul), vl_tempLowerStr:= vl_LoverStr;
        var integer vl_i := f_strstr(vl_LoverStr,vl_startFromValue);

        while (vl_i!=-1) {
          vl_preprocessed :=
          substr(vl_tempStr,0,vl_i)&vl_startToValue&
          substr(vl_tempStr,vl_i+lengthof(vl_startFromValue),
            lengthof(vl_tempStr)-vl_i-lengthof(vl_startFromValue));
          vl_LoverStr := substr(vl_tempLowerStr,0,vl_i)&vl_startToValue&
          substr(vl_tempLowerStr,vl_i+lengthof(vl_startFromValue),
            lengthof(vl_tempLowerStr)-vl_i-lengthof(vl_startFromValue));
          //continue from saved pointer offset with the length of replacement string
          vl_i := vl_i+lengthof(vl_startToValue);
          vl_tempStr := vl_preprocessed;
          vl_tempLowerStr := vl_LoverStr;
          vl_i := f_strstr(vl_LoverStr,vl_startFromValue,vl_i);
        }

        // replace end  tag
        vl_tempStr:= vl_preprocessed;
        vl_tempLowerStr:= vl_LoverStr;
        vl_i := f_strstr(vl_LoverStr,vl_endFromValue);
        while (vl_i!=-1) {
          vl_preprocessed :=
          substr(vl_tempStr,0,vl_i)&vl_endToValue&
          substr(vl_tempStr,vl_i+lengthof(vl_endFromValue),
            lengthof(vl_tempStr)-vl_i-lengthof(vl_endFromValue));
          vl_LoverStr := substr(vl_tempLowerStr,0,vl_i)&vl_endToValue&
          substr(vl_tempLowerStr,vl_i+lengthof(vl_endFromValue),
            lengthof(vl_tempLowerStr)-vl_i-lengthof(vl_endFromValue));
          //continue from saved pointer offset with the length of replacement string
          vl_i := vl_i+lengthof(vl_endToValue);
          vl_tempStr := vl_preprocessed;
          vl_tempLowerStr := vl_LoverStr;
          vl_i := f_strstr(vl_LoverStr,vl_endFromValue,vl_i);
        }
      }
    }

    return vl_preprocessed;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_XSD_decodeXULEm
  //
  //  Purpose:
  //    Decodes a XUL record to its charstring representation
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_XSD_decodeXULEm(in charstring pl_widgets)
  return Embeddedwidget{
    var Embeddedwidget vl_ret;
    var integer vl_dummy;
    vl_dummy := dec_EmbeddedWidget(char2oct(pl_widgets), vl_ret);
    return vl_ret;
  }

  private external function dec_EmbeddedWidget (in octetstring p_oct, out Embeddedwidget p_widgets) return integer
  with {extension "prototype(backtrack) decode (XER:XER_EXTENDED) errorbehavior(ALL:WARNING)"}

  private external function enc_EmbeddedWidget (in Embeddedwidget p_widgets) return octetstring
  with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_XSD_decodeXUL
  //
  //  Purpose:
  //    Decodes a XUL record to its charstring representation
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_XSD_decodeXUL(in charstring pl_widgets)
  runs on EPTF_UIHandler_Private_CT
  return Widgets{
    var Widgets vl_ret;
    var integer vl_retval;
    vl_retval := dec_Widgets(char2oct(pl_widgets), vl_ret);
    if(0 != vl_retval){
      f_EPTF_UIHandler_error(%definitionId&": The received XML is invalid, it can not be decoded fully.\n"&
        "For further detailes see the log file above.")
    }
    return vl_ret;
  }
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_saveLayout
  //
  //  Purpose:
  //    Saves the parameter charstring as a window layout.
  //
  //  Detailed Comments:
  //    The layout of the window can be retreived with the function
  //      <f_EPTF_UIHandler_snapshot>.
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_saveLayout(in charstring pl_layout)
  runs on EPTF_UIHandler_Private_CT{
    f_EPTF_UIHandler_waitForLayoutReady();
    var charstring vl_currentConfig := "\n// saved by EPTF GUI\n\n[MODULE_PARAMETERS]\n\ntsp_EPTF_GUI_DefaultWindow := """ & f_EPTF_UIHandler_convertLayout(pl_layout) & """";
    var charstring vl_FileName := f_getTimeFormatted(f_time(),tsp_EPTF_savedGUIPrefix & "_%d%m%Y_%H_%M.cfg");
    var integer vl_file := f_FIO_open_trunc_wronly(vl_FileName);
    if(-1 != vl_file){
      if(-1 == f_FIO_write_text(vl_file, vl_currentConfig)){
        f_EPTF_UIHandler_warning("Couldn't write file "&vl_FileName&".");
        var integer int := f_FIO_close(vl_file);
        if (int == -1){
          f_EPTF_UIHandler_warning("Could not close the file!");
        }
        //      f_EPTF_Base_stop();
      }else{
        var integer int := f_FIO_close(vl_file);
        if (int == -1){
          f_EPTF_UIHandler_warning("Could not close the file!");
        }
      }
    }else{
      f_EPTF_UIHandler_warning("Couldn't open file "&vl_FileName&" for writing.");
      //    f_EPTF_Base_stop();
    }
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_logAll
  //
  //  Purpose:
  //    Logs all internal variables in EPTF_UIHandler_CT.
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_logAll() runs on EPTF_UIHandler_Private_CT {
    log("------Content of EPTF_UIHandler_CT: -------");
    //log("v_UIHandler_CLI_initialized: ", v_UIHandler_CLI_initialized);
    log("v_UIHandler_initialized: ", v_UIHandler_initialized);
    log("v_UIHandler_lastRequest: ", v_UIHandler_lastRequest);
    log("v_UIHandler_guiConnected: ",v_UIHandler_guiConnected);
    log("v_UIHandler_windowLayout: ", v_UIHandler_windowLayout);
    log("v_UIHandler_guiLayoutReady: ", v_UIHandler_guiLayoutReady);
    log("v_UIHandler_guiItemList: ",v_UIHandler_guiItemList);
    log("t_UIHandler_pingtimer: ",t_UIHandler_pingtimer);
    log("v_UIHandler_succpingcounter: ",v_UIHandler_succpingcounter);
    log("v_UIHandler_pingcounter", v_UIHandler_pingcounter);
    log("v_UIHandler_prevpingcounter: ", v_UIHandler_prevpingcounter);
    log("v_UIHandler_def: ",v_UIHandler_def);
    log("v_UIHandler_openSubscriptions: ",v_UIHandler_openSubscriptions);
    log("v_UIHandler_subscriptions: ", v_UIHandler_subscriptions);
    log("v_UIHandler_windowIndex: ",v_UIHandler_windowIndex);
    log("v_UIHandler_GUIClientId: ",v_UIHandler_GUIClientId);
    log("v_UIHandler_lastRowId: ",v_UIHandler_lastRowId);
    log("v_UIHandler_subscriptInProcess: ", v_UIHandler_subscriptInProcess);
    log("t_UIHandler_bufferedXTDP: ",t_UIHandler_bufferedXTDP );
    log("t_UIHandler_initGUIToClientTimer: ",t_UIHandler_initGUIToClientTimer );
    log("------Finished Content of EPTF_UIHandler_CT -------");
  }//f_

  public function f_EPTF_UIHandler_logWidgetDB(in boolean pl_verbose := false)
  runs on EPTF_UIHandler_Private_CT
  return charstring{
    if (not v_UIHandler_initialized){ return "" }
    var charstring vl_log := ""
    for ( var integer i := 0, s := sizeof(v_UIHandler_guiItemList); i < s ; i := i+1 ){
      f_EPTF_UIHandler_log2strWidgetRec(i,vl_log, pl_verbose)
      vl_log := vl_log & "\n";
    }
    return vl_log;
  }

  public function f_EPTF_UIHandler_log2strWidgetRec(
    in integer pl_recIdx,
    inout charstring pl_ret,
    in boolean pl_verbose := false)
  runs on EPTF_UIHandler_Private_CT{
    if (not v_UIHandler_initialized){ return }
    pl_ret := pl_ret&"Idx:\t"&log2str(pl_recIdx)&
    "\nID:\t"&v_UIHandler_guiItemList[pl_recIdx].id&
    "\nType:\t"&log2str(v_UIHandler_guiItemList[pl_recIdx].widgetType)
    if(pl_verbose){
      pl_ret := pl_ret & "\nData type\t"&log2str(v_UIHandler_guiItemList[pl_recIdx].widgetDataType)
    }
    pl_ret := pl_ret & "\nParent:\t"&log2str(v_UIHandler_guiItemList[pl_recIdx].parentIdx)&
    "\nChildren:\t";
    for ( var integer j:=0, sc := sizeof(v_UIHandler_guiItemList[pl_recIdx].children); j < sc ; j := j+1 ){
      pl_ret := pl_ret & int2str(v_UIHandler_guiItemList[pl_recIdx].children[j])&", ";
    }

    if(pl_verbose){
      pl_ret := pl_ret & log2str(v_UIHandler_guiItemList[pl_recIdx].widgetData);
    }
    //Widgets XULformat optional

  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_GUIConnected
  //
  //  Purpose:
  //    Returns whether the GUI is connected (authenticated)
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_GUIConnected() runs on EPTF_UIHandler_Private_CT return boolean {
    return v_UIHandler_guiConnected
  }

  public function f_EPTF_UIHandler_initialized() runs on EPTF_UIHandler_Private_CT return boolean {
    return v_UIHandler_initialized;
  }//f_

  friend function f_EPTF_UIHandler_guiItemList() runs on EPTF_UIHandler_Private_CT return EPTF_UIHandler_GuiItemRecList {
    return v_UIHandler_guiItemList;
  }

  friend function f_EPTF_UIHandler_openSubscriptions() runs on EPTF_UIHandler_Private_CT return EPTF_UIHandler_OpenSubscriptions {
    return v_UIHandler_openSubscriptions;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_exitButtonPressed
  //
  //  Purpose:
  //    Handles the pressing of the exit button. Only for TESTING purposes!
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_exitButtonPressed(in float pl_timeout := tsp_EPTF_UIHandler_maxWaitTimer) runs on EPTF_UIHandler_Private_CT {
    if (not v_UIHandler_initialized){ return }
    {
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": Waiting for the exit button to be pressed.");
      }
      if(f_EPTF_Semaphore_waitForUnlock(v_UIHandler_exitButtonPressedSemaphore, pl_timeout))
      {
        f_EPTF_UIHandler_warning(%definitionId&": Timer timeout! Exit button was not pressed!");
      }
      v_UIHandler_exitButtonPressedSemaphore := f_EPTF_Semaphore_new();
      //f_EPTF_Semaphore_lock(v_UIHandler_exitButtonPressedSemaphore);
    };
  }

} // group PublicFunctions

//=========================================================================
// Private functions
//=========================================================================
group PrivateFunctions {

  private function f_EPTF_UIHandler_requestBuffer_clear()
  runs on EPTF_UIHandler_Private_CT
  {
    v_UIHandler_RequestbufferIsEmpty := true;
    v_UIHandler_Requestbuffer.data.choice.xTDP_Requests.xTDP_Request_list := { c_UIHandler_XSD_emptyXTDPRequest };
  }

  private function f_EPTF_UIHandler_requestBuffer_size()
  runs on EPTF_UIHandler_Private_CT
  return integer
  {
    if (v_UIHandler_RequestbufferIsEmpty) {
      return 0;
    } else {
      return sizeof(v_UIHandler_Requestbuffer.data.choice.xTDP_Requests.xTDP_Request_list);
    }
  }

  private function f_EPTF_UIHandler_requestBuffer_add(in ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Request pl_request)
  runs on EPTF_UIHandler_Private_CT
  {
    var integer i := 0;
    if (not v_UIHandler_RequestbufferIsEmpty) {
      i := sizeof(v_UIHandler_Requestbuffer.data.choice.xTDP_Requests.xTDP_Request_list);
    }
    v_UIHandler_Requestbuffer.data.choice.xTDP_Requests.xTDP_Request_list[i] := pl_request;
    v_UIHandler_RequestbufferIsEmpty := false;
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_convertLayout
  //
  //  Purpose:
  //    Converts the charstring retreived by the <f_EPTF_UIHandler_snapshot>
  //    function to a storeable format. (Changes the ", \n and \ characters.)
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_convertLayout(in charstring pl_layout)
  runs on EPTF_UIHandler_Private_CT
  return charstring{
    var charstring vl_ret := "";
    var integer vl_len := lengthof(pl_layout);
    for(var integer vl_i := 0; vl_i < vl_len; vl_i := vl_i + 1){
      select(substr(pl_layout,vl_i,1)){
        case(""""){ vl_ret := vl_ret & "\\""";}
        case("\n"){ vl_ret := vl_ret & "\\n";}
        case("\\"){ vl_ret := vl_ret & "\\\\";}
        case else {vl_ret := vl_ret & pl_layout[vl_i];}
      }
    }
    return vl_ret;
  }

  //  ///////////////////////////////////////////////////////////
  //  //  Function: f_EPTF_UIHandler_saveXul
  //  //
  //  //  Purpose:
  //  //    Saves the parameter charstring as a window layout.
  //  //
  //  //  Detailed Comments:
  //  //    The layout of the window can be retreived with the function
  //  //      <f_EPTF_UIHandler_snapshot>.
  //  ///////////////////////////////////////////////////////////
  //  private function f_EPTF_UIHandler_saveXul(in Widgets pl_xul)
  //  runs on EPTF_UIHandler_Private_CT{
  //    var charstring vl_layout := f_EPTF_UIHandler_XSD_encodeXUL(pl_xul);
  ////    var charstring vl_currentConfig := f_EPTF_UIHandler_convertLayout(vl_layout);
  //    var charstring vl_FileName := f_getTimeFormatted(f_time(),tsp_EPTF_savedGUIPrefix & "_%d%m%Y_%H_%M.xml");
  //    var integer vl_file := f_FIO_open_trunc_wronly(vl_FileName);
  //    if(-1 != vl_file){
  ////      if(-1 == f_FIO_write_text(vl_file, vl_currentConfig)){
  //      if(-1 == f_FIO_write_text(vl_file, vl_layout)){
  //        f_EPTF_UIHandler_warning("Couldn't write file "&vl_FileName&".");
  //        var integer vl_dummy := f_FIO_close(vl_file);
  //        if (vl_dummy == -1){
  //          f_EPTF_UIHandler_warning("Could not close the file!");
  //        }
  //        //      f_EPTF_Base_stop();
  //      }else{
  //        var integer vl_dummy := f_FIO_close(vl_file);
  //        if (vl_dummy == -1){
  //          f_EPTF_UIHandler_warning("Could not close the file!");
  //        }
  //      }
  //    }else{
  //      f_EPTF_UIHandler_warning("Couldn't open file "&vl_FileName&" for writing.");
  //      //    f_EPTF_Base_stop();
  //    }
  //  }
  //
  //  ///////////////////////////////////////////////////////////
  //  //  Function: f_EPTF_UIHandler_saveWidgets
  //  //
  //  //  Purpose:
  //  //    Saves content of the GUI database.
  //  //
  //  //  Detailed Comments:
  //  //    -
  //  ///////////////////////////////////////////////////////////
  //  private function f_EPTF_UIHandler_saveWidgets()
  //  runs on EPTF_UIHandler_Private_CT{
  //
  //    var charstring vl_widget_info := "";
  //    var integer limit := sizeof(v_UIHandler_guiItemList);
  //    for (var integer i := 0; i < limit ; i := i+1 )
  //    {
  //      vl_widget_info := vl_widget_info&"\n"&int2str(i)&" widget= "&log2str(v_UIHandler_guiItemList[i]);
  //    }
  //
  //    var charstring vl_FileName := f_getTimeFormatted(f_time(),"widgetList" & "_%d%m%Y_%H_%M.xml");
  //    var integer vl_file := f_FIO_open_trunc_wronly(vl_FileName);
  //    if(-1 != vl_file){
  ////      if(-1 == f_FIO_write_text(vl_file, vl_currentConfig)){
  //      if(-1 == f_FIO_write_text(vl_file, vl_widget_info)){
  //        f_EPTF_UIHandler_warning("Couldn't write file "&vl_FileName&".");
  //        var integer vl_dummy := f_FIO_close(vl_file);
  //        if (vl_dummy == -1){
  //          f_EPTF_UIHandler_warning("Could not close the file!");
  //        }
  //        //      f_EPTF_Base_stop();
  //      }else{
  //        var integer vl_dummy := f_FIO_close(vl_file);
  //        if (vl_dummy == -1){
  //          f_EPTF_UIHandler_warning("Could not close the file!");
  //        }
  //      }
  //    }else{
  //      f_EPTF_UIHandler_warning("Couldn't open file "&vl_FileName&" for writing.");
  //      //    f_EPTF_Base_stop();
  //    }
  //  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_revertLayout
  //
  //  Purpose:
  //    Restores the charstring converted by the <f_EPTF_UIHandler_convertLayout>
  //    to a charstring that can be given to
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_revertLayout(in charstring pl_layout)
  runs on EPTF_UIHandler_Private_CT
  return charstring{
    var charstring vl_ret := "";
    var integer vl_len := lengthof(pl_layout);
    for(var integer vl_i := 0; vl_i < vl_len; vl_i := vl_i + 1){
      if("\\" == substr(pl_layout,vl_i,1) and vl_i < vl_len-1){
        select(substr(pl_layout,vl_i+1,1)){
          case(""""){
            vl_ret := vl_ret & """";
            vl_i := vl_i + 1;
          }
          case("n"){
            vl_ret := vl_ret & "\n";
            vl_i := vl_i + 1;
          }
          case("\\"){
            vl_ret := vl_ret & "\\";
            vl_i := vl_i + 1;
          }
          case else {
            f_EPTF_UIHandler_warning("Invalid \\ character in layout string at "&int2str(vl_i));
          }
        }
      }else{
        vl_ret := vl_ret & pl_layout[vl_i];
      }
    }
    return vl_ret;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_send_XTDP
  //
  //  Purpose:
  //    function to send a message to user interface via XTDP port
  //
  //  Parameters:
  //    pl_msg - *in* *template ASP_XTDP* -  XTDP message template ONLY one message!
  //
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_send_XTDP(in template ASP_XSD_XTDP pl_msg) runs on EPTF_UIHandler_Private_CT
  {
    if (v_UIHandler_guiConnected)
    {
      v_UIHandler_lastRequest := v_UIHandler_lastRequest + 1;
      pl_msg.data.transactionID := v_UIHandler_lastRequest;

      if(ischosen(pl_msg.data.choice.xTDP_Requests))
      {
        pl_msg.data.choice.xTDP_Requests.xTDP_Request_list[0].requestId := v_UIHandler_lastRequest;

        if (tsp_EPTF_UIHandler_bufferedXTDP != 0.0)
        {
          v_UIHandler_Requestbuffer.client_id := omit;

          for (var integer i := 0; i < sizeof(pl_msg.data.choice.xTDP_Requests.xTDP_Request_list); i := i + 1)
          {
            //            v_UIHandler_Requestbuffer.data.choice.xTDP_Requests.xTDP_Request_list[sizeof(v_UIHandler_Requestbuffer.data.choice.xTDP_Requests.xTDP_Request_list)] :=
            //            valueof(pl_msg.data.choice.xTDP_Requests.xTDP_Request_list[i]);
            f_EPTF_UIHandler_requestBuffer_add(valueof(pl_msg.data.choice.xTDP_Requests.xTDP_Request_list[i]));
          }
        }
      }
      else if (ischosen(pl_msg.data.choice.xTDP_Responses))
      {
        pl_msg.data.choice.xTDP_Responses.xTDP_Response_list[0].requestId := v_UIHandler_lastRequest;
      }
      else if (ischosen(pl_msg.data.choice.xTDP_AddRequests))
      {
        pl_msg.data.choice.xTDP_AddRequests.xTDP_AddRequest_list[0].requestId := v_UIHandler_lastRequest;
      }
      else if (ischosen(pl_msg.data.choice.xTDP_RemoveRequests))
      {
        pl_msg.data.choice.xTDP_RemoveRequests.xTDP_RemoveRequest_list[0].requestId := v_UIHandler_lastRequest;
      }
      else if (ischosen(pl_msg.data.choice.xTDP_LayoutRequest))
      {
        //pl_msg.data.choice.xTDP_LayoutRequest.requestId := v_UIHandler_lastRequest;
      }
      else if (ischosen(pl_msg.data.choice.xTDP_LayoutResponse))
      {
        //pl_msg.data.choice.xTDP_LayoutResponse.requestId := v_UIHandler_lastRequest;
      }
      else if (ischosen(pl_msg.data.choice.xTDP_AuthChallenge) or ischosen(pl_msg.data.choice.xTDP_AuthResponse))
      {
      }
      else
      {
        f_EPTF_UIHandler_warning("Unknown XTDP message to send!");
        return;
      }

      if(tsp_EPTF_UIHandler_bufferedXTDP == 0.0 or ( tsp_EPTF_UIHandler_bufferedXTDP != 0.0 and not ischosen(pl_msg.data.choice.xTDP_Requests)))
      {
        for(var integer i := 0; i < sizeof(v_UIHandler_GUIClientId); i := i + 1)
        {
          var Result vl_result
          f_EPTF_Transport_send(
            IPL4, v_UIHandler_GUIClientId[i].clientId, f_EPTF_UIHandler_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(valueof(pl_msg.data))), vl_result, false)
        }
      }
    }
  }

  ///////////////////////////////////////////////////////////
  //  Templates: t_UIHandler_Authmsg
  //
  //  Purpose:
  //    Send template for authenticating the GUI
  //
  //  Parameters:
  //    pl_client -- the GUI client
  //
  ///////////////////////////////////////////////////////////
  /*private template ASP_XTDP t_UIHandler_Authmsg(in integer pl_clientid) := {
  pl_clientid,
  {omit,
  {xtdp_AuthChallenge := tsp_EPTF_UIHandler_Authmsg}
  }
  }

  ///////////////////////////////////////////////////////////
  //  Templates: t_UIHandler_Authresp
  //
  //  Purpose:
  //    Receinving template for authenticating the GUI
  //
  ///////////////////////////////////////////////////////////
  private template ASP_XTDP t_UIHandler_Authresp := {
  *,
  {omit,
  {xtdp_AuthResponse := ?}
  }
  }
  */
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_authclient
  //
  //  Purpose:
  //    Authenticates the client.
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_authclient(in integer pl_clientid) runs on EPTF_UIHandler_Private_CT return boolean{
    if (tsp_EPTF_UIHandler_Authmsg=="" or v_EPTF_UIHandler_Authresp == "") {
      // no authentication needed
      f_EPTF_UIHandler_setClientAuthenticationSuccessful(pl_clientid);
      return true;
    }
    v_UIHandler_lastRequest := v_UIHandler_lastRequest +1;
    var integer vl_UIHandler_authResponseReceivedSemaphore := f_EPTF_Semaphore_new();
    var ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Message vl_messageToSend :=
    {
      vl_UIHandler_authResponseReceivedSemaphore+1000*v_UIHandler_lastRequest,
      {xTDP_AuthChallenge := tsp_EPTF_UIHandler_Authmsg}
    }

    var Result vl_result
    f_EPTF_Transport_send(IPL4, pl_clientid, f_EPTF_UIHandler_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(vl_messageToSend)), vl_result, false)

    if(f_EPTF_Semaphore_waitForUnlock(vl_UIHandler_authResponseReceivedSemaphore, v_authMaxTime))
    {
      f_EPTF_UIHandler_warning(%definitionId&": Timer timeout! No auth response received!");
      f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
      return false;
    }
    //f_EPTF_Semaphore_lock(v_UIHandler_authResponseReceivedSemaphore);
    f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
    if(v_UIHandler_receivedMessage.choice.xTDP_AuthResponse == v_EPTF_UIHandler_Authresp)
    {
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": Authentication successful for client: "&log2str(pl_clientid));
      }
      f_EPTF_UIHandler_setClientAuthenticationSuccessful(pl_clientid);
      return true;
    }
    else
    {
      f_EPTF_UIHandler_warning("Authentication failed for client: "&log2str(pl_clientid));
      return false;
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_headlessmode
  //
  //  Purpose:
  //    Sets the enviroment for the headless mode
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_headlessmode() runs on EPTF_UIHandler_Private_CT{
    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug("******** HeadlessMode*******");
    }
    if (not v_EPTF_UIHandler_servermode){
      v_UIHandler_pingcounter := 0;
      v_UIHandler_prevpingcounter := 0;
      v_UIHandler_succpingcounter := 0;
      if(not t_UIHandler_pingtimer.running) {
        t_UIHandler_pingtimer.start;
      }
    } else {
      f_EPTF_UIHandler_startserverxtdp();
    }
    v_UIHandler_guiConnected := false;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_headlessmodeover
  //
  //  Purpose:
  //    Restores the enviroment returning back from headless mode
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_headlessmodeover() runs on EPTF_UIHandler_Private_CT{
    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug("*********HeadlessModeOVER********")
    }
    if (not v_EPTF_UIHandler_servermode){
      if (t_UIHandler_pingtimer.running) {
        t_UIHandler_pingtimer.stop;
      }
      v_UIHandler_pingcounter := 0;
      v_UIHandler_prevpingcounter := 0;
      v_UIHandler_succpingcounter := 0;
      var ConnectionId vl_connId;
      f_EPTF_UIHandler_connectAndInitGui(vl_connId);
      //In case of v_EPTF_UIHandler_servermode, the f_EPTF_UIHandler_connectAndInitGui
      //simply returns true
      //} else {
      //  if (not f_EPTF_UIHandler_connectAndInitGui()){
      //    f_EPTF_UIHandler_error("Failed to initialize the GUI!");
      //  }
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_sendSubscAck
  //
  //  Purpose:
  //    Sends acknowladgement message about a succesfully completed subscription note
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_sendSubscAck(
    in integer pl_requestId,
    in integer pl_varIdx,
    in EPTF_Var_CT pl_sender,
    in boolean pl_ack := true)
  runs on EPTF_UIHandler_Private_CT {
    v_UIHandler_subscriptInProcess := false;
    var EPTF_UIHandler_WidgetMsg vl_EPTF_CLL_UISubscMgmtMsg := {
      subscribeAck := {
        requestId := pl_requestId,
        varIdx := pl_varIdx}};
    EPTF_adminPort_CP.send(vl_EPTF_CLL_UISubscMgmtMsg) to pl_sender
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_sendSubscNAck
  //
  //  Purpose:
  //    Sends an refusion message about a subscription note
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_sendSubscNAck(
    in integer pl_requestId,
    in EPTF_Var_CT pl_sender)
  runs on EPTF_UIHandler_Private_CT {
    v_UIHandler_subscriptInProcess := false;
    var EPTF_UIHandler_WidgetMsg vl_EPTF_CLL_UISubscMgmtMsg := {
      subscribeNAck := {
        requestId := pl_requestId,
        varIdx := -1
      }
    };
    EPTF_adminPort_CP.send(vl_EPTF_CLL_UISubscMgmtMsg) to pl_sender;
  }

  ///////////////////////////////////////////////////////////
  //  Group: EPTF_SubscriptionAdministrationFunctions
  ///////////////////////////////////////////////////////////
  group EPTF_SubscriptionAdministrationFunctions{

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_newSubscription
    //
    //  Purpose:
    //    Appends an EPTF_UIHandler_OpenSubscription record to the <EPTF_UIHandler_OpenSubscriptions> list.
    //
    //  Parameters:
    //    pl_subscription - *in* *EPTF_UIHandler_OpenSubscription* -  The record to append.
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_newSubscription(in EPTF_UIHandler_OpenSubscription pl_subscription)
    runs on EPTF_UIHandler_Private_CT
    {
      var integer vl_newIdx := sizeof(v_UIHandler_openSubscriptions);
      v_UIHandler_openSubscriptions[vl_newIdx] := pl_subscription;
      f_EPTF_UIHandler_addSubscription(pl_subscription.varIdx, vl_newIdx);

      if (pl_subscription.providedParamName != "") {
        f_EPTF_str2int_HashMap_Insert(v_UIHandler_subscriptionHashMapIdVar, pl_subscription.providedParamName, pl_subscription.varIdx);
      }

      if (pl_subscription.widgetId != "") {
        f_EPTF_str2int_HashMap_Insert(v_UIHandler_subscriptionHashMapId, pl_subscription.widgetId, vl_newIdx);
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_getSubscriptionsByVarIdx
    //
    //  Purpose:
    //    Retrieves a list of open subscriptions that are affected by the specified variable.
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_getSubscriptionsByVarIdx(in integer pl_varIdx, out EPTF_UIHandler_OpenSubscriptions pl_ret)
    runs on EPTF_UIHandler_Private_CT
    return boolean{

      var EPTF_IntegerList vl_subs := f_EPTF_UIHandler_getSubscriptions(pl_varIdx);

      pl_ret := {};
      for(var integer vl_i := 0; vl_i < sizeof(vl_subs); vl_i := vl_i+1){
        pl_ret[sizeof(pl_ret)] := v_UIHandler_openSubscriptions[vl_subs[vl_i]];
      }
      return sizeof(pl_ret) > 0;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_getSubscriptionIdxByWidgetId
    //
    //  Return Value:
    //    The index of the open subscription that contains the specified widgetId or -1.
    //
    ///////////////////////////////////////////////////////////
    friend function f_EPTF_UIHandler_getSubscriptionIdxByWidgetId(in EPTF_UIHandler_WidgetIdString pl_widgetId)
    runs on EPTF_UIHandler_Private_CT
    return integer{
      if("" == pl_widgetId){
        if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
          f_EPTF_UIHandler_debug(%definitionId&": No subscription belongs to empty ID!");
        }
        return -1;
      }
      // find id in subscription hashmap
      var integer vl_idx;
      if (f_EPTF_str2int_HashMap_Find(v_UIHandler_subscriptionHashMapId, pl_widgetId, vl_idx)) {
        return vl_idx;
      }
      return -1;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_getVarIdxByProvidedVarName
    //
    //  Return Value:
    //    The index of the open subscription that contains the
    //    specified client variable name.
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_getVarIdxByProvidedVarName(in charstring pl_varName)
    runs on EPTF_UIHandler_Private_CT
    return integer{
      if("" == pl_varName){
        if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
          f_EPTF_UIHandler_debug(%definitionId&": No subscription belongs to empty variable name!");
        }
        return -1;
      }
      // find id in subscription hashmap
      var integer vl_idx;
      if (f_EPTF_str2int_HashMap_Find(v_UIHandler_subscriptionHashMapIdVar, pl_varName, vl_idx)) {
        return vl_idx;
      }
      return -1;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_addSubscription
    //
    //  Purpose:
    //    Adds a subscription item to a variable
    //
    //  Parameters:
    //    pl_idx - *in* *integer* - the idx of the EPTF_Var
    //    pl_subsIdx - *in* *integer* - subscription identifier index
    //
    //  Return Value:
    //    -
    //
    //  Errors:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_addSubscription(in integer pl_idx, in integer pl_subsIdx)
    runs on EPTF_UIHandler_Private_CT
    {
      if(sizeof(v_UIHandler_subscriptions) <= pl_idx or not isbound(v_UIHandler_subscriptions[pl_idx])) {
        v_UIHandler_subscriptions[pl_idx] := {};
      }
      v_UIHandler_subscriptions[pl_idx][sizeof(v_UIHandler_subscriptions[pl_idx])] := pl_subsIdx;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_removeSubscription
    //
    //  Purpose:
    //    Removes a subscription item from a variable
    //
    //  Parameters:
    //    pl_idx - *in* *integer* - the idx of the EPTF_Var
    //    pl_subsIdx - *in* *integer* - subscription identifier index
    //
    //  Return Value:
    //    -
    //
    //  Errors:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_removeSubscription(in integer pl_idx, in integer pl_subsIdx)
    runs on EPTF_UIHandler_Private_CT
    {
      f_EPTF_Base_assert(%definitionId&": not a local subscription.",
        sizeof(v_UIHandler_subscriptions) > pl_idx and isbound(v_UIHandler_subscriptions[pl_idx]));
      var integer vl_subIdx := -1;
      for (var integer i := 0; i < sizeof(v_UIHandler_subscriptions[pl_idx]); i := i + 1)
      {
        if (v_UIHandler_subscriptions[pl_idx][i] == pl_subsIdx)
        {
          vl_subIdx := i;
          break;
        }
      }

      if (vl_subIdx != -1)
      {
        var EPTF_IntegerList vl_newSubs := {};
        for (var integer i := 0; i < sizeof(v_UIHandler_subscriptions[pl_idx]); i := i + 1)
        {
          if (vl_subIdx != i) { vl_newSubs[sizeof(vl_newSubs)] := v_UIHandler_subscriptions[pl_idx][i]; }
        }
        v_UIHandler_subscriptions[pl_idx] := vl_newSubs;
        return;
      }

      f_EPTF_UIHandler_warning(log2str("The variable: ", f_EPTF_Var_getName(pl_idx), " has no subscription: ", pl_subsIdx));
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_getSubscriptions
    //
    //  Purpose:
    //    Gets the subscription indices of a variable
    //
    //  Parameters:
    //    pl_idx - *in* *integer* - the idx of the EPTF_Var
    //
    //  Return Value:
    //    <EPTF_IntegerList> - the list of subscripton indices of the variable
    //
    //  Errors:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_getSubscriptions(in integer pl_idx)
    runs on EPTF_UIHandler_Private_CT return EPTF_IntegerList
    {
      if (sizeof(v_UIHandler_subscriptions) <= pl_idx or
        not isbound(v_UIHandler_subscriptions[pl_idx])) {
        return {};

      }

      return v_UIHandler_subscriptions[pl_idx];
    }

  } //EPTF_SubscriptionAdministrationFunctions group

  ///////////////////////////////////////////////////////////
  //  Group: EPTF_WidgetAdministrationFunctions
  ///////////////////////////////////////////////////////////
  group EPTF_WidgetAdministrationFunctions{

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_widgetTypeFromId
    //
    //  Purpose:
    //    Gets the type of a widget
    //  Detailed Comments:
    //    There are two main cases:
    //       the widget ID describes a cell of a tree in form "name of the tree".[row].[column], or
    //       the ID is the widget's own ID
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_widgetTypeFromId(
      in EPTF_UIHandler_WidgetIdString pl_id,
      inout EPTF_UIHandler_OpenSubscription pl_subs)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      // cehck if id refers a table cell in format "treeId.[row].[col]"
      var integer vl_row, vl_col;
      var EPTF_UIHandler_WidgetIdString vl_treeId;
      if (f_EPTF_UIHandler_isTreeCellIdFormat(pl_id, vl_treeId, vl_row, vl_col)) {
        var EPTF_UIHandler_GuiItemRec widgetRec;
        if(f_EPTF_UIHandler_getWidgetRec(vl_treeId, widgetRec)){
          if(vl_col <= sizeof(widgetRec.widgetData.treeData.columns)){
            pl_subs.widgetType := wtTreecell;
            pl_subs.widgetDataType := v_UIHandler_guiItemList[widgetRec.widgetData.treeData.columns[vl_col]].widgetDataType;
            return true;
          }
        }
      }else{
        var EPTF_UIHandler_GuiItemRec widgetRec;
        if(f_EPTF_UIHandler_getWidgetRec(pl_id, widgetRec)){
          pl_subs.widgetType := widgetRec.widgetType;
          //The cell also contains widgetDataType
          pl_subs.widgetDataType := widgetRec.widgetDataType;
          return true;
        }
      }
      return false;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_checkSubscriptCompatibility
    //  Purpose:
    //    Checks whether the subscriptable variable and the widget
    //    are compatible
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_checkSubscriptCompatibility(
      in EPTF_UIHandler_WidgetIdString pl_widgetid,
      in integer pl_varIdx,
      in EPTF_Var_DirectContent pl_currentContent := {unknownVal:={omit}})
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      var integer vl_index := f_EPTF_UIHandler_widgetRecIndex(pl_widgetid);
      if (vl_index==-1) {
        f_EPTF_UIHandler_error("The specified '"&pl_widgetid&"' widget can not be connected to variable["&f_EPTF_Var_getName(pl_varIdx)&"]: widget not found!");
        return false;
      }
      var EPTF_Var_DirectContent vl_currentContent := pl_currentContent;
      var boolean vl_retval;
      var boolean vl_checkReverse := false;
      if (ischosen(vl_currentContent.unknownVal)) {
        f_EPTF_Var_getContent(pl_varIdx,vl_currentContent);
      }

      select(v_UIHandler_guiItemList[vl_index].widgetType){
        case(wtWindow,		// nothing to check NOW
          wtTabbox,
          wtTabs,
          wtTab,
          wtTabpanels,
          wtTabpanel,
          wtTabpages,
          wtTabpage,
          wtTree,
          wtTreecols,
          wtTreecol,
          wtTreechildren,
          wtTreeitem,
          wtTreerow,
          wtHbox,
          wtLabel,
          wtSpacer,

          wtChart,
          wtTraceList,

          wtToolbar,
          wtToolbarbuttons,

          wtSeparator,
          wtListbox,
          wtListitem,

          wtNumericalwidget,

          wtMenulist,
          wtMenuitem,
          wtDistributionchart,
          wtIntervallimits,
          wtValuelist,
          wtImage,
          wtUnknown){
          vl_retval := true;
        }
        case(wtTreecell){
          vl_checkReverse := true;
          select(v_UIHandler_guiItemList[vl_index].widgetDataType){
            case(checkBox){vl_retval := ischosen(vl_currentContent.boolVal)}
            case(toggleButton){vl_retval := ischosen(vl_currentContent.boolVal)}
            case(floatField){vl_retval := ischosen(vl_currentContent.floatVal)}
            case(pushButton, integerField){vl_retval := ischosen(vl_currentContent.intVal)}
            case(string){ vl_retval := ischosen(vl_currentContent.charstringVal)
              or ischosen(vl_currentContent.floatVal)
              or ischosen(vl_currentContent.intVal)
              /* string forever */
              or ischosen(vl_currentContent.bitstringVal) or ischosen(vl_currentContent.hexstringVal) or ischosen(vl_currentContent.octetstringVal)
              or ischosen(vl_currentContent.boolVal)
              or ischosen(vl_currentContent.statusLEDVal)
              or ischosen(vl_currentContent.integerlistVal) or ischosen(vl_currentContent.floatlistVal) or ischosen(vl_currentContent.charstringlistVal)
            }
            case(statusLED){vl_retval := ischosen(vl_currentContent.statusLEDVal)
              /* its not equal, because type without are make errror on runtime gui if returned with text,
              text but better if this equal this time just no returned text on request
              and (ispresent(vl_currentContent.statusLEDVal.text)==false or vl_currentContent.statusLEDVal.text == "") */; }
            case(statusLEDWithText){vl_retval := ischosen(vl_currentContent.statusLEDVal)}
            case else { }
          }
        }
        case (wtButton){
          vl_retval := ischosen(vl_currentContent.intVal);
        }
        case (wtPushbutton){
          vl_retval := ischosen(vl_currentContent.intVal);
        }
        case(wtTextbox){vl_retval := true; }	// string forever
        case(wtHtmlcode){vl_retval := true; }  // string forever
        case(wtTrace){
          vl_retval := (ischosen(vl_currentContent.floatVal) or ischosen(vl_currentContent.intVal));
        }
        case (wtToolbarbutton, wtTogglebutton){
          vl_retval := ischosen(vl_currentContent.boolVal);
        }
        case else {
          vl_retval := true; 		// all other are true now
        }
      }
      if(isbound(vl_retval)==false) {
        f_EPTF_UIHandler_error("The specified '"&pl_widgetid&"' widget with data("&log2str(v_UIHandler_guiItemList[vl_index])&") not match to variable["&f_EPTF_Var_getName(pl_varIdx)&"]: type incompatibility!");
      } else if(vl_retval == false) {
        f_EPTF_UIHandler_error("The specified '"&pl_widgetid&"' widget with data("&log2str(v_UIHandler_guiItemList[vl_index])&") can not be connected to variable["&f_EPTF_Var_getName(pl_varIdx)&"]: type incompatibility!");
      }
      else {
        if(vl_checkReverse == true and ispresent( v_UIHandler_guiItemList[vl_index].widgetDataType)) {
          vl_retval :=  f_EPTF_UIHandler_checkVariableCompatibility(vl_currentContent, v_UIHandler_guiItemList[vl_index].widgetDataType);
        }
        if(vl_retval == false) {
          f_EPTF_UIHandler_error("The specified variable["&f_EPTF_Var_getName(pl_varIdx)&"]  can not be connected to specified '"&pl_widgetid&"' widget with data("&log2str(v_UIHandler_guiItemList[vl_index])&"): type incompatibility!");
        }
      }

      return vl_retval;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_checkVariableCompatibility
    //  Purpose:
    //    Checks whether the the requeted variable and the widget
    //    type are compatible
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_checkVariableCompatibility(
      in EPTF_Var_DirectContent pl_currentContent,
      in Widgettype pl_currentwidgetDataType)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      var boolean vl_retval := false;

      if(ischosen(pl_currentContent.intVal)) {
        vl_retval := (pl_currentwidgetDataType == integerField)
        or (pl_currentwidgetDataType == pushButton)
        or (pl_currentwidgetDataType == trace)
        or (pl_currentwidgetDataType == string);	// string forever
      }
      else
      if(ischosen(pl_currentContent.floatVal)) {
        vl_retval := (pl_currentwidgetDataType == floatField)
        or (pl_currentwidgetDataType == string);	// string forever
      }
      else
      if(ischosen(pl_currentContent.charstringVal)) {
        vl_retval := (pl_currentwidgetDataType == string)
        or (pl_currentwidgetDataType == image);
      }
      else
      if(ischosen(pl_currentContent.bitstringVal) or ischosen(pl_currentContent.hexstringVal) or ischosen(pl_currentContent.octetstringVal)) {
        vl_retval := (pl_currentwidgetDataType == string);
      }
      else
      if(ischosen(pl_currentContent.boolVal)) {
        vl_retval := (pl_currentwidgetDataType == checkBox)
        or (pl_currentwidgetDataType == toggleButton)
        or (pl_currentwidgetDataType == string);	// string forever
      }
      else
      if(ischosen(pl_currentContent.statusLEDVal)) {
        vl_retval := (pl_currentwidgetDataType == statusLED)
        or (pl_currentwidgetDataType == statusLEDWithText)
        or (pl_currentwidgetDataType == string);	// string forever
      }
      else
      if(ischosen(pl_currentContent.integerlistVal) or ischosen(pl_currentContent.floatlistVal) or ischosen(pl_currentContent.charstringlistVal)) {
        vl_retval := (pl_currentwidgetDataType == valueList)
        or (pl_currentwidgetDataType == string);	// string forever
      }
      // If not matched
      if(vl_retval == false) {
        vl_retval := (pl_currentwidgetDataType == image)
        or (pl_currentwidgetDataType == none_);
      }
      return vl_retval;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_handleSubscriptNote
    //  Purpose:
    //    Handles te subscription note message
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_handleSubscriptNote(
      in EPTF_UIHandler_SubscribeNoteMsg pl_msg,
      in EPTF_Var_CT pl_sender)
    runs on EPTF_UIHandler_Private_CT {
      v_UIHandler_subscriptInProcess := true;
      var EPTF_UIHandler_OpenSubscription vl_subs := c_UIHandler_defOpenSubscription;
      var integer vl_varIdx := -1;
      if(ispresent(pl_msg.destParamName) and "" != pl_msg.destParamName){
        //we must create a new variable and subscribe it to a provided param
        //check if it already exists
        if(not f_EPTF_Var_checkName(pl_msg.destParamName,vl_varIdx)) // i.e. vl_varIdx != -1
        {
          f_EPTF_UIHandler_warning("CLL_UIHandler: the destination variable already exists: " & pl_msg.destParamName);
          f_EPTF_UIHandler_sendSubscNAck(pl_msg.messageId, pl_sender);
          return;
        }
        //log("DEBUG: ","------- subscribeRemote ------- ",pl_msg.providedParamName);
        //In case of error the remote variable stops the test
        f_EPTF_Var_subscribeRemote(
          pl_msg.remoteCompRef,
          pl_msg.providedParamName,
          pl_msg.subsMode,
          vl_varIdx,
          pl_msg.destParamName,
          pl_msg.refreshRate);
        f_EPTF_Var_addPostProcFn(vl_varIdx, {refers(f_EPTF_UIHandler_refreshVar),{}});

        // FIXME: test
        // FIXME: This should be put back if old gui build using SubsCanAdjust is working:
        //f_EPTF_Var_addSubsCanAdjustNotifyFn(vl_varIdx, {refers(f_EPTF_UIHandler_updateDisableStateByVarIdx), {}});

      }else{
        //There is no destParamName, so it's an ealrier subscription
        //Get the index of the variable
        vl_varIdx := f_EPTF_UIHandler_getVarIdxByProvidedVarName(pl_msg.providedParamName);
        if(-1 == vl_varIdx){
          f_EPTF_UIHandler_warning("CLL_UIHandler: there is no subscription to the variable: " & pl_msg.providedParamName);
          f_EPTF_UIHandler_sendSubscNAck(pl_msg.messageId, pl_sender);
          return;
        }
      }
      if(ispresent(pl_msg.widgetId)){
        if (f_EPTF_UIHandler_Config_connectToWidget(pl_msg.widgetId,vl_varIdx,pl_msg.remoteCompRef,pl_msg.providedParamName)) {
          // FIXME: This should be put back if old gui build using SubsCanAdjust is working:
          //f_EPTF_UIHandler_updateDisableStateByVarIdx(vl_varIdx, {});
          f_EPTF_UIHandler_sendSubscAck(pl_msg.messageId, vl_varIdx, pl_sender);
        } else {
          f_EPTF_UIHandler_sendSubscNAck(pl_msg.messageId, pl_sender);
        }
        return;
      } else {
        vl_subs.widgetId := "";
      }
      vl_subs.provider := pl_msg.remoteCompRef;
      vl_subs.varIdx := vl_varIdx;
      vl_subs.providedParamName:=pl_msg.providedParamName;
      //FIXME!!!Check compatibility
      f_EPTF_UIHandler_newSubscription(vl_subs);
      f_EPTF_UIHandler_sendSubscAck(pl_msg.messageId, vl_varIdx, pl_sender);
      if(ispresent(pl_msg.widgetId)){
        f_EPTF_UIHandler_refreshWidget(vl_subs, true);
        // FIXME: This should be put back if old gui build using SubsCanAdjust is working:
        //f_EPTF_UIHandler_updateDisableStateByVarIdx(vl_varIdx, {});
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_refreshVar
    //
    //  Purpose:
    //    Postproc. The component refreshes the content of the GUI
    //    when the content of the variable changes
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_refreshVar(in integer pl_idx, in EPTF_IntegerList pl_argList)
    runs on EPTF_UIHandler_Private_CT {
      if (not v_UIHandler_initialized) {
        return;
      }

      var EPTF_UIHandler_OpenSubscriptions vl_subsList;
      if (not f_EPTF_UIHandler_getSubscriptionsByVarIdx(pl_idx, vl_subsList)){
        f_EPTF_UIHandler_warning("The subscriptionlist is empty for this variable!");
      }
      for(var integer vl_i := 0; vl_i < sizeof(vl_subsList); vl_i := vl_i+1){
        //Put the received value to the screen. It can differ from the typed value.
        //log("DEBUG: ","---- postproc - ",vl_subsList[vl_i].widgetId, " - ", v_EPTF_Vars[vl_subsList[vl_i].varIdx].content.direct);
        f_EPTF_UIHandler_refreshWidget(vl_subsList[vl_i]);
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_removeWidgetFromSubscription
    //  Purpose:
    //    Clears the widgetId member of the open subscription associated
    //    with the specified widget.
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_removeWidgetFromSubscription(in EPTF_UIHandler_WidgetIdString pl_widgetId)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      var integer vl_idx := f_EPTF_UIHandler_getSubscriptionIdxByWidgetId(pl_widgetId);
      if(-1 == vl_idx){
        return false;
      }
      f_EPTF_str2int_HashMap_Erase(v_UIHandler_subscriptionHashMapId, pl_widgetId);
      v_UIHandler_openSubscriptions[vl_idx].widgetId := "";
      return true;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_removeIdFromIdList
    //  Purpose:
    //    Removes an integer from an integer list.
    //
    //  Return Value:
    //    A new list of integers without gaps and the specified integer.
    //
    //  Detailed Comments:
    //    The function handles only unique integers.
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_removeIdFromIdList(in EPTF_IntegerList pl_in, in integer pl_idx)
    return EPTF_IntegerList{
      var EPTF_IntegerList vl_ret := {};
      var integer vl_i := 0;
      while(vl_i < sizeof(pl_in)){
        if(pl_in[vl_i] != pl_idx){
          vl_ret[sizeof(vl_ret)] := pl_in[vl_i];
        }
        vl_i := vl_i + 1;
      }
      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_addIdx2IdxList
    //  Purpose:
    //    Simply append an integer to an integer list.
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_addIdx2IdxList(inout EPTF_IntegerList pl_in, in integer pl_idx){
      pl_in[sizeof(pl_in)] := pl_idx;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_insertIdx2IdxList
    //  Purpose:
    //    Insert a new integer into an integer list in a specific index
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_insertIdx2IdxList(inout EPTF_IntegerList pl_in, in integer pl_idx, in integer pl_value){
      for ( var integer i := sizeof(pl_in)-1; i >= pl_idx ; i := i-1 ) {
        pl_in[i+1] := pl_in[i];
      }
      pl_in[pl_idx] := pl_value;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_IdxListContains
    //  Return Value:
    //    True if the integerlist contains the specified value.
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_IdxListContains(in EPTF_IntegerList pl_in, in integer pl_idx)
    return boolean{
      for(var integer vl_i := 0; vl_i < sizeof(pl_in); vl_i := vl_i + 1){
        if(pl_in[vl_i] == pl_idx){return true;}
      }
      return false;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_parentColOfCell
    //  Purpose:
    //    Retrieves the GUI index of the column into which the cell is placed
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_parentColOfCell(in integer pl_parent)
    runs on EPTF_UIHandler_Private_CT
    return integer{
      if(-1 == pl_parent){return -1;}
      var integer vl_i := pl_parent;
      while(vl_i != -1 and v_UIHandler_guiItemList[vl_i].widgetType != wtTreecol){
        vl_i := v_UIHandler_guiItemList[vl_i].parentIdx;
      }
      if(vl_i != -1 and v_UIHandler_guiItemList[vl_i].widgetType == wtTreecol){
        return vl_i;
      }
      return -1;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_addWidgetRec
    //  Purpose:
    //    Adds the specified record about a widget to the list
    //    of the widgets.
    //
    //  Return Value:
    //    The index of the new record if succes, or -1
    //
    //  Detailed Comments:
    //    If there is already a widget with the same id with the
    //    same type under the same parent, the function returns
    //    the index of the previous widget, and sets the pl_widgetExists to true.
    //    If pl_indexInParent parameter is given (not -1), widgetrec is placed
    //    to that position in parents' childrenlist.
    //    This is needed for tree column insertion.
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_addWidgetRec(
      in EPTF_UIHandler_GuiItemRec pl_widgetRec,
      inout boolean pl_widgetExists/*,
      in integer pl_indexInParent := -1*/)
    runs on EPTF_UIHandler_Private_CT
    return integer{
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": "&log2str(pl_widgetRec));
      }
      pl_widgetExists := false;
      //Checking the index of the parent item. Less than 0 is valid for the main window.
      if(pl_widgetRec.parentIdx> sizeof(v_UIHandler_guiItemList) or
        (pl_widgetRec.parentIdx < 0 and (pl_widgetRec.widgetType != wtWindow))){
        f_EPTF_UIHandler_warning("Invalid parent index for the widget "&pl_widgetRec.id&".");
        return -1;
      }

      //If the parent widget from the pl_widgetRec.parentIdx is a tabpages, then pl_widgetRec.widgetType can only be a tabpage,
      //else warning and return -1
      if( ((pl_widgetRec.parentIdx > -1) and pl_widgetRec.widgetType != wtTabpage and pl_widgetRec.widgetType != wtMetaIterator) and v_UIHandler_guiItemList[pl_widgetRec.parentIdx].widgetType == wtTabpages){
        f_EPTF_UIHandler_warning("Under a tabpages widget only widgets with type tabpage is allowed: "&pl_widgetRec.id&".");
        return -1;
      }

      var boolean vl_xuldisabled := false;
      if(ispresent(pl_widgetRec.xuldisabled)){
        vl_xuldisabled := pl_widgetRec.xuldisabled;
      }
      var EPTF_UIHandler_GuiItemRec vl_newRec := {
        id := pl_widgetRec.id,
        widgetType := pl_widgetRec.widgetType,
        widgetDataType := pl_widgetRec.widgetDataType,
        parentIdx := pl_widgetRec.parentIdx,
        children := {},
        widgetData := pl_widgetRec.widgetData,
        XULformat := pl_widgetRec.XULformat,
        xuldisabled := vl_xuldisabled
      };
      //Checking ID
      var integer vl_idx;
      var boolean vl_isexisting := (pl_widgetRec.id != "" and f_EPTF_str2int_HashMap_Find(v_UIHandler_widgetHashMapId, pl_widgetRec.id, vl_idx));
      var integer vl_prevIdx := -1;
      if(pl_widgetRec.XULformat != omit and ischosen(pl_widgetRec.XULformat.treecell)){
        var Treecell vl_treecell := pl_widgetRec.XULformat.treecell;
        vl_treecell.id := omit;
        vl_prevIdx := f_EPTF_UIHandler_widgetRecIndex(pl_widgetRec.id, f_EPTF_UIHandler_deleteChildrenFromTreecell(vl_treecell));
      } else {
        vl_prevIdx := f_EPTF_UIHandler_widgetRecIndex(pl_widgetRec.id);
      }

      if(vl_isexisting == true){	// old  -1 != vl_prevIdx
        f_EPTF_UIHandler_setWidgetOriginalDisabled(vl_prevIdx);	// Set original [xul] disabled state
        if(v_UIHandler_customGUIProcess){
            f_EPTF_UIHandler_error(%definitionId&": Duplicate widget ID: "& pl_widgetRec.id&"\nThe GUI descriptor is: "&log2str("v_UIHandler_widgetslist"));
        }else{
          var integer vl_row, vl_col;
          var EPTF_UIHandler_WidgetIdString vl_treeId;
          if (not f_EPTF_UIHandler_isTreeCellIdFormat(pl_widgetRec.id, vl_treeId, vl_row, vl_col)){
            pl_widgetExists := true;
          }
          if(v_UIHandler_guiItemList[vl_prevIdx].widgetType != pl_widgetRec.widgetType or
            v_UIHandler_guiItemList[vl_prevIdx].parentIdx != pl_widgetRec.parentIdx){
            if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
              f_EPTF_UIHandler_debug(%definitionId&": Duplicate widget ID: "& pl_widgetRec.id);
            }
            return -1;
          }else{
            //There is a similar widget
            return vl_prevIdx;
          }
        }
      }

      if(-1 == vl_prevIdx){
        var integer vl_newIdx := sizeof(v_UIHandler_guiItemList);
        v_UIHandler_guiItemList[vl_newIdx] := vl_newRec;
        if(vl_newRec.widgetType != wtMetaIterator) {
           if( v_UIHandler_actualParentIdxIsFilled == false) {
             //window's parent is -1, but getNonMeta gives 0 back, because window has 0 id
             if(vl_newRec.widgetType != wtWindow){
               v_UIHandler_actualParentIdx := f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(vl_newIdx);
             } else {
               v_UIHandler_actualParentIdx := pl_widgetRec.parentIdx;
             }
             v_UIHandler_actualParentIdxIsFilled := true
             v_UIHandler_widgetIdxList[sizeof(v_UIHandler_widgetIdxList)] := vl_newIdx;
           } else if( v_UIHandler_actualParentIdx == f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(vl_newIdx) or
                       /*because tabpagelist: put all tabpagelist element, if same it has parent as the first tabpage element*/
                      ( v_UIHandler_actualParentIdx != -1 and vl_newRec.widgetType == wtTabpage and
                        f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(v_UIHandler_guiItemList[vl_newIdx].parentIdx) ==
                        f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(v_UIHandler_guiItemList[v_UIHandler_actualParentIdx].parentIdx)
                      )
                     ) {
             v_UIHandler_widgetIdxList[sizeof(v_UIHandler_widgetIdxList)] := vl_newIdx;
           }
        }

        // add widget id to the widgetId map
        if (vl_newRec.id != "") {
          f_EPTF_str2int_HashMap_Insert(v_UIHandler_widgetHashMapId, vl_newRec.id, vl_newIdx);
        }
        //Add to its parent's childrenlist
        if(-1 != vl_newRec.parentIdx){
          //if (pl_indexInParent <0) {
          v_UIHandler_guiItemList[vl_newRec.parentIdx].children[sizeof(v_UIHandler_guiItemList[vl_newRec.parentIdx].children)] := vl_newIdx;
          //}
          //else {
          //  f_EPTF_UIHandler_insertIdx2IdxList(v_UIHandler_guiItemList[vl_newRec.parentIdx].children, pl_indexInParent, vl_newIdx);
          // }
        }
        f_EPTF_UIHandler_setWidgetOriginalDisabled(vl_newIdx);	// Set original [xul] disabled state
        return vl_newIdx;
      } else {
        return vl_prevIdx;
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_removeWidgetRecByName
    //  Purpose:
    //    Removes the specified record about a widget from the list
    //    of the widgets. See <f_EPTF_UIHandler_removeWidgetRecByIdx>.
    //
    //  Return Value:
    //    True if succes, false otherwise.
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_removeWidgetRecByName(in EPTF_UIHandler_WidgetIdString pl_widgetId)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      var integer vl_recIdx := f_EPTF_UIHandler_widgetRecIndex(pl_widgetId);
      if(-1 == vl_recIdx){
        return false;
      }
      return f_EPTF_UIHandler_removeWidgetRecByIdx(vl_recIdx);
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_removeWidgetRecByIdx
    //  Purpose:
    //    Removes the specified record about a widget from the list
    //    of the widgets.
    //
    //  Return Value:
    //    True if succes, false otherwise.
    //
    //  Detailed Comments:
    //    Removes also the children of the widget from the list.
    //    Removes the index of the widget too from the children's list
    //    of the parent of the specified widget.
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_removeWidgetRecByIdx(in integer pl_recIdx)
    runs on EPTF_UIHandler_Private_CT
    return boolean {
      f_EPTF_Base_assert(%definitionId&": Boundary check failed - invalid  widget record index",
        pl_recIdx >= 0 and pl_recIdx < sizeof(v_UIHandler_guiItemList));
      var boolean vl_ret := true;
      //Check if there was an open connection
      var integer vl_connIdx := f_EPTF_UIHandler_getSubscriptionIdxByWidgetId(v_UIHandler_guiItemList[pl_recIdx].id);
      if(-1 != vl_connIdx){
        f_EPTF_str2int_HashMap_Erase(v_UIHandler_subscriptionHashMapId, v_UIHandler_openSubscriptions[vl_connIdx].widgetId);
        v_UIHandler_openSubscriptions[vl_connIdx].widgetId := "";
      }
      //parse children
      var EPTF_IntegerList vl_children := v_UIHandler_guiItemList[pl_recIdx].children;
      for(var integer vl_i := 0; vl_i < sizeof(vl_children); vl_i := vl_i + 1){
        if(vl_children[vl_i]> -1){
          vl_ret := vl_ret and f_EPTF_UIHandler_removeWidgetRecByIdx(vl_children[vl_i]);
        }
      }
      //remove from the childlist of its parent
      if(-1 != v_UIHandler_guiItemList[pl_recIdx].parentIdx){
        v_UIHandler_guiItemList[v_UIHandler_guiItemList[pl_recIdx].parentIdx].children :=
        f_EPTF_UIHandler_removeIdFromIdList(v_UIHandler_guiItemList[v_UIHandler_guiItemList[pl_recIdx].parentIdx].children,pl_recIdx);
      }
      // delete widgetId from hashmap
      if (v_UIHandler_guiItemList[pl_recIdx].id != "") {
        f_EPTF_str2int_HashMap_Erase(v_UIHandler_widgetHashMapId, v_UIHandler_guiItemList[pl_recIdx].id);
      }
      //clear record
      v_UIHandler_guiItemList[pl_recIdx] := c_UIHandler_emptyGUIItem;
      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_widgetRecIndex
    //  Return Value:
    //    The index of the <EPTF_UIHandler_GuiItemRec> that describes the
    //    specified widget, or -1.
    ///////////////////////////////////////////////////////////
    friend function f_EPTF_UIHandler_widgetRecIndex(
      in EPTF_UIHandler_WidgetIdString pl_id, //The ID of the widget
      in Treecell pl_treecell := {omit, omit, omit, omit, omit, omit, omit, omit}
    )
    runs on EPTF_UIHandler_Private_CT
    return integer{
      var integer vl_idx := 0;
      // check if empty id
      if("" == pl_id){
        if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
          f_EPTF_UIHandler_debug(%definitionId&": widgetRecIndex with empty ID!");
        }
        return -1;
      }
      // try to find id in internal database
      if (f_EPTF_str2int_HashMap_Find(v_UIHandler_widgetHashMapId, pl_id, vl_idx)) {
        return vl_idx;
      }

//       // check if id refers a table cell in format "treeId.[row].[col]"
//       var integer vl_row, vl_col;
//       var EPTF_UIHandler_WidgetIdString vl_treeId;
//       if (f_EPTF_UIHandler_isTreeCellIdFormat(pl_id, vl_treeId, vl_row, vl_col)) {
//         if (f_EPTF_str2int_HashMap_Find(v_UIHandler_widgetHashMapId, vl_treeId, vl_idx) and
//           v_UIHandler_guiItemList[vl_idx].widgetType == wtTree)
//         {
//           var integer vl_colNum := sizeof(v_UIHandler_guiItemList[vl_idx].widgetData.treeData.columns);
//           if (vl_col < vl_colNum) {
//             var EPTF_UIHandler_GuiItemRec vl_newRec := {
//               pl_id,
//               wtTreecell,
//               v_UIHandler_guiItemList[v_UIHandler_guiItemList[vl_idx].widgetData.treeData.columns[vl_col]].widgetDataType,
//               vl_idx,
//               {},
//               {cellData := {v_UIHandler_guiItemList[vl_idx].widgetData.treeData.columns[vl_col], omit}},
//               { treecell := pl_treecell}};
//             var integer vl_newIdx := sizeof(v_UIHandler_guiItemList);
//             v_UIHandler_guiItemList[vl_newIdx] := vl_newRec;
//             if (vl_newRec.id != "") {
//               f_EPTF_str2int_HashMap_Insert(v_UIHandler_widgetHashMapId, vl_newRec.id, vl_newIdx);
//             }
//             f_EPTF_UIHandler_setWidgetOriginalDisabled(vl_newIdx);	// Set original [xul] disabled state
//             //Add to its parent's childrenlist
//             if(-1 != vl_newRec.parentIdx){
//               v_UIHandler_guiItemList[vl_newRec.parentIdx].children[sizeof(v_UIHandler_guiItemList[vl_newRec.parentIdx].children)] := vl_newIdx;
//             }
//             return vl_newIdx;
//           }
//         }
//       }
      return -1;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_isTreeCellIdFormat
    //
    //  Purpose:
    //    Private function to check whether a widgetId is given in specail table cell format (treeId.[row].[column]),
    //    and gives back treeId, row, column if possible
    //  Parameters:
    //    pl_widgetRec - *out* EPTF_UIHandler_GuiItemRec - The <EPTF_UIHandler_GuiItemRec> that describes the specified widget
    //    pl_id - *in* EPTF_UIHandler_WidgetIdString - The input widget Id string
    //    pl_treeId - *out* EPTF_UIHandler_WidgetIdString - The id of the table
    //    pl_row - *out* integer pl_row - The row number of the cell
    //    pl_col - *out* integer - The column number of the cell
    //  Return Value:
    //    True if widgetId is in special format, false otherwise
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_isTreeCellIdFormat(
      in EPTF_UIHandler_WidgetIdString pl_id,
      out EPTF_UIHandler_WidgetIdString pl_treeId,
      out integer pl_row,
      out integer pl_col )
    return boolean {
      // this function matches pattern "*.[0-9]+.[0-9]+" but without using the unefficient regexp

      // reset out parameters
      pl_treeId := "";
      pl_row := 0;
      pl_col := 0;

      var integer i := lengthof(pl_id)-1, vl_limiterIdx1 := -1, vl_limiterIdx2 := -1;
      // check last char is a number
      if ( char2int(pl_id[i])<char2int("0") or char2int(pl_id[i])>char2int("9") ) {
        return false;
      }
      // find first '.' from back in Id
      for (i := i-1; pl_id[i] != "." and i>=3; i := i-1) {
        if (char2int(pl_id[i])<char2int("0") or char2int(pl_id[i])>char2int("9")) {
          return false;
        }
      }
      if (i<3) {
        return false;
      }
      vl_limiterIdx1 := i;
      // check next char is a number
      i := i-1;
      if ( char2int(pl_id[i])<char2int("0") or char2int(pl_id[i])>char2int("9") ) {
        return false;
      }
      // find second '.' from back in Id
      for (i := i-1; pl_id[i] != "." and i>=1; i := i-1) {
        if (char2int(pl_id[i])<char2int("0") or char2int(pl_id[i])>char2int("9")) {
          return false;
        }
      }
      if (i<1) {
        return false;
      }
      vl_limiterIdx2 := i;

      // obtain column number
      pl_col := str2int(substr(pl_id, vl_limiterIdx1+1, lengthof(pl_id)-vl_limiterIdx1-1));
      // obtain row number
      pl_row := str2int(substr(pl_id, vl_limiterIdx2 + 1, vl_limiterIdx1 - vl_limiterIdx2 - 1));
      // obtain tree id
      pl_treeId := substr(pl_id, 0, vl_limiterIdx2);
      return true;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_getWidgetRec
    //  Parameters:
    //    pl_widgetRec - *out* EPTF_UIHandler_GuiItemRec - The <EPTF_UIHandler_GuiItemRec> that describes the specified widget
    //
    //  Return Value:
    //    True if success, false otherwise.
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_getWidgetRec(
      in EPTF_UIHandler_WidgetIdString pl_widgetId,
      out EPTF_UIHandler_GuiItemRec pl_widgetRec)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      var integer vl_idx := f_EPTF_UIHandler_widgetRecIndex(pl_widgetId);
      pl_widgetRec := c_UIHandler_emptyGUIItem;
      if(-1 < vl_idx){
        pl_widgetRec := v_UIHandler_guiItemList[vl_idx];
        return true;
      }
      return false;
    }
  } //EPTF_WidgetAdministrationFunctions group

  ///////////////////////////////////////////////////////////
  //  Group: EPTF_WidgetAddInternalFunctions
  ///////////////////////////////////////////////////////////
  group EPTF_WidgetAddInternalFunctions{

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_addElementToTree
    //
    //  Purpose:
    //    Private function to look through a Tree when adding an column or item or row or cell to it.
    //
    //  Parameters:
    //    pl_parentWidgetId *integer*
    //    pl_xul *XTDP_XML_Tag*
    //    pl_currentTree <Tree>
    //
    //  Return Value:
    //    *boolean*
    //
    //  Errors:
    //    none
    //
    //  Detailed Comments:
    //    Returns true if pl_xul has been added to pl_currentTree.
    //
    ///////////////////////////////////////////////////////////
    /*private function f_EPTF_UIHandler_addElementToTree(
    in EPTF_UIHandler_WidgetIdString pl_parentWidgetId,
    in Widgets pl_xul,
    inout ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tree pl_currentTree)
    runs on EPTF_UIHandler_Private_CT
    return boolean {
    if(pl_currentTree.id == pl_parentWidgetId) {
    // init the one-and-only treeitem (treechildren[0]):
    if(sizeof(pl_currentTree.treechildren.treeitemgroups.treeitemgroup_list) == 0) {
    pl_currentTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list := {};
    }

    select( true )
    {
    case (ischosen (pl_xul.treecol)) {
    pl_currentTree.treecols.treecolgroups.treecolgroup_list[sizeof(pl_currentTree.treecols.treecolgroups.treecolgroup_list)].treecol := pl_xul.treecol;
    return true;
    }
    case (ischosen (pl_xul.treecols)) {
    for(var integer col := 0; col < sizeof(pl_xul.treecols.treecolgroups.treecolgroup_list); col := col + 1) {
    if(ischosen(pl_xul.treecols.treecolgroups.treecolgroup_list[col].treecol)){
    pl_currentTree.treecols.treecolgroups.treecolgroup_list[sizeof(pl_currentTree.treecols.treecolgroups.treecolgroup_list)].treecol := pl_xul.treecols.treecolgroups.treecolgroup_list[col].treecol;
    }else{
    f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_xul.treecols.treecolgroups.treecolgroup_list[col]));
    return false;
    }
    }
    return true;
    }
    case (ischosen (pl_xul.treerow)) {
    pl_currentTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[sizeof(pl_currentTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list)].treerow := pl_xul.treerow;
    return true;
    }
    case (ischosen (pl_xul.treecell)) {
    var integer vl_rowCount := 0;
    if(isbound(pl_currentTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list)){
    vl_rowCount := sizeof(pl_currentTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list);
    }
    var integer vl_cellCount := 0;
    if(isbound(pl_currentTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[vl_rowCount].treerow.treecellgroups.treecellgroup_list)){
    vl_cellCount := sizeof(pl_currentTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[vl_rowCount].treerow.treecellgroups.treecellgroup_list);
    }
    // add the cell to the last row's cells
    pl_currentTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[vl_rowCount].treerow.treecellgroups.treecellgroup_list[vl_cellCount].treecell := pl_xul.treecell;
    return true;
    }
    case (ischosen (pl_xul.treeitem)) {
    // add each row to the one-and-only treeitem (treechildren.treeitemgroup_list[0]):
    for(var integer i := 0; i < sizeof(pl_xul.treeitem.treerowgroups.treerowgroup_list); i := i + 1) {
    if(ischosen(pl_xul.treeitem.treerowgroups.treerowgroup_list[i].treerow)){
    pl_currentTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[sizeof(pl_currentTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list)].treerow := pl_xul.treeitem.treerowgroups.treerowgroup_list[i].treerow;
    }else{
    f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_xul.treeitem.treerowgroups.treerowgroup_list[i]));
    return false;
    }
    }
    return true;
    }
    case else
    {

    }
    }
    }

    return false;
    }*/

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_addElementToHbox
    //
    //  Purpose:
    //    Private function to look through a Hbox when adding a widget.
    //
    //  Parameters:
    //    pl_parentWidgetId *integer*
    //    pl_xul *XTDP_XML_Tag*
    //    pl_currentHbox *Tabbox
    //
    //  Return Value:
    //    *boolean*
    //
    //  Errors:
    //    none
    //
    //  Detailed Comments:
    //    Returns true if pl_xul has been added to pl_currentHbox or a widget inside.
    //
    ///////////////////////////////////////////////////////////
    /*private function f_EPTF_UIHandler_addElementToHbox(
    in EPTF_UIHandler_WidgetIdString pl_parentWidgetId,
    in Widgets pl_xul,
    inout ttcn_ericsson_se_protocolModules_xtdp_xtdl.Hbox pl_currentHbox)
    runs on EPTF_UIHandler_Private_CT
    return boolean {
    if(pl_currentHbox.id == pl_parentWidgetId) {
    var integer vl_index := sizeof(pl_currentHbox.embeddedwidgets.embeddedwidget_list);
    if (ischosen (pl_xul.tabbox)) {
    pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_index].tabbox := pl_xul.tabbox; return true;
    } else if (ischosen (pl_xul.tree)) {
    pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_index].tree := pl_xul.tree; return true;
    } else if (ischosen (pl_xul.hbox)) {
    pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_index].hbox := pl_xul.hbox; return true;
    } else if (ischosen (pl_xul.label_)) {
    pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_index].label_ := pl_xul.label_; return true;
    } else if (ischosen (pl_xul.spacer)) {
    pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_index].spacer := pl_xul.spacer; return true;
    } else if (ischosen (pl_xul.button)) {
    pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_index].button := pl_xul.button; return true;
    } else if (ischosen (pl_xul.textbox)) {
    pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_index].textbox := pl_xul.textbox; return true;
    } else if (ischosen (pl_xul.pushbutton)) {
    pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_index].pushbutton := pl_xul.pushbutton; return true;
    } else if (ischosen (pl_xul.togglebutton)) {
    pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_index].togglebutton := pl_xul.togglebutton; return true;
    } else { return false; }
    } else {
    var boolean ok := false;
    for(var integer vl_i := 0; vl_i < sizeof(pl_currentHbox.embeddedwidgets.embeddedwidget_list); vl_i := vl_i + 1) {
    if(ischosen(pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_i].tabbox)) {
    ok := f_EPTF_UIHandler_addElementToTabbox(pl_parentWidgetId, pl_xul, pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_i].tabbox);
    } else if(ischosen(pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_i].tree)) {
    ok := f_EPTF_UIHandler_addElementToTree(pl_parentWidgetId, pl_xul, pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_i].tree);
    } else if(ischosen(pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_i].hbox)) {
    ok := f_EPTF_UIHandler_addElementToHbox(pl_parentWidgetId, pl_xul, pl_currentHbox.embeddedwidgets.embeddedwidget_list[vl_i].hbox);
    }
    if(ok) {
    return ok;
    }
    }
    }
    return false;
    }*/

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromXul
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends all widgetIds
    //    from request to string list of current runtime GUI widgetIds
    //
    //  Parameters:
    //    pl_xul - *in* *Widgets* - union type of possible gui items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    //
    //  Return Value:
    //    -
    //
    //  Errors:
    //    none
    //
    //  Detailed Comments:
    //    NOTE: This is the interface function to all list append functions below.
    //    These functions have been created according to the data structure described in XUL_XSD.asn.
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromXul (
      inout Widgets pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      select(pl_xul){
        //FIXME ischosen?
        // iterator in appendAllWidgetIdsFromXul
        /*case({iterator := ?}) {
        return f_EPTF_UIHandler_Config_processIterator(pl_xul.iterator, pl_widgetsOut, pl_parentIdx, pl_widgetExists);
        }*/
        case({window := ?}) {
          return f_EPTF_UIHandler_appendAllWidgetIdsFromWindow(pl_xul.window, pl_widgetExists);
        }
        case({tabpages := ?}) {
          return f_EPTF_UIHandler_appendAllWidgetIdsFromTabpages(pl_xul.tabpages, pl_parentIdx, pl_widgetExists);
        }
        case({tabpage := ?}) {
          return f_EPTF_UIHandler_appendAllWidgetIdsFromTabpage(pl_xul.tabpage, pl_parentIdx, pl_widgetExists);
        }
        case({tree := ?}) {
          return f_EPTF_UIHandler_appendAllWidgetIdsFromTree(pl_xul.tree, pl_parentIdx, pl_widgetExists);
        }
        case({treecols := ?}) {
          return f_EPTF_UIHandler_appendAllWidgetIdsFromTreecols(pl_xul.treecols.treecolgroups.treecolgroup_list, pl_parentIdx, pl_widgetExists);
        }
        case({treecol := ?}) {
          return -1 != f_EPTF_UIHandler_appendTreecol(pl_xul.treecol, pl_parentIdx, pl_widgetExists);
        }
        case({treechildren := ?}) {
          return f_EPTF_UIHandler_appendAllWidgetIdsFromTreeItemGroups(pl_xul.treechildren.treeitemgroups.treeitemgroup_list, pl_parentIdx, pl_widgetExists);
        }
        case({treeitem := ?}) {
          return f_EPTF_UIHandler_appendAllWidgetIdsFromTreeRowGroups(pl_xul.treeitem.treerowgroups.treerowgroup_list, pl_parentIdx, pl_widgetExists);
        }
        case({treerow := ?}) {
          return f_EPTF_UIHandler_appendAllWidgetIdsFromTreeCellGroups(pl_xul.treerow.treecellgroups.treecellgroup_list, pl_parentIdx, pl_widgetExists);
        }
        case({treecell := ?}) {
          return f_EPTF_UIHandler_appendCell(pl_xul.treecell, pl_parentIdx, pl_widgetExists, sizeof(v_UIHandler_guiItemList[pl_parentIdx].widgetData.treeData.columns)-1);
        }
        case({hbox := ?}) {
          return f_EPTF_UIHandler_appendAllWidgetIdsFromHbox(pl_xul.hbox, pl_parentIdx, pl_widgetExists);
        }
        case({label_ := ?}) {
          return f_EPTF_UIHandler_appendLabel(pl_xul.label_, pl_parentIdx, pl_widgetExists);
        }
        case({spacer := ?}) {
          return f_EPTF_UIHandler_appendSpacer(pl_xul.spacer, pl_parentIdx, pl_widgetExists);
        }
        case({button := ?}) {
          return f_EPTF_UIHandler_appendButton(pl_xul.button, pl_parentIdx, pl_widgetExists);
        }
        case({textbox := ?}) {
          return f_EPTF_UIHandler_appendTextbox(pl_xul.textbox, pl_parentIdx, pl_widgetExists);
        }
        case({chart := ?}) {
          return f_EPTF_UIHandler_appendChart(pl_xul.chart, pl_parentIdx, pl_widgetExists);
        }
        case({trace := ?}) {
          return f_EPTF_UIHandler_appendTrace(pl_xul.trace, pl_parentIdx, pl_widgetExists);
        }
        case({toolbar := ?}) {
          return f_EPTF_UIHandler_appendToolbar(pl_xul.toolbar, pl_parentIdx, pl_widgetExists);
        }
        case({toolbarbutton := ?}) {
          return f_EPTF_UIHandler_appendToolbarbutton(pl_xul.toolbarbutton, pl_parentIdx, pl_widgetExists);
        }
        case({toolbarelements := ?}) {
          var boolean vl_ret := true;
          for(var integer vl_i := 0; vl_i < sizeof(pl_xul.toolbarelements.toolbarelement_list);vl_i := vl_i + 1){
            if(ischosen(pl_xul.toolbarelements.toolbarelement_list[vl_i].choice.toolbarbutton)){
              vl_ret := vl_ret and f_EPTF_UIHandler_appendToolbarbutton(pl_xul.toolbarelements.toolbarelement_list[vl_i].choice.toolbarbutton, pl_parentIdx, pl_widgetExists);
            }else if(ischosen(pl_xul.toolbarelements.toolbarelement_list[vl_i].choice.separator)){
              vl_ret := vl_ret and f_EPTF_UIHandler_appendSeparator(pl_xul.toolbarelements.toolbarelement_list[vl_i].choice.separator, pl_parentIdx, pl_widgetExists);
            }else{
              f_EPTF_UIHandler_warning("Unhandled widgettype as a toolbarelement!");
            }
          }
          return vl_ret;
        }
        case({tracelist := ?}) {
          var boolean vl_ret := true;
          for(var integer vl_i := 0; vl_i < sizeof(pl_xul.tracelist.trace_list);vl_i := vl_i + 1){
            vl_ret := vl_ret and f_EPTF_UIHandler_appendTrace(pl_xul.tracelist.trace_list[vl_i], pl_parentIdx, pl_widgetExists);
          }
          return vl_ret;
        }
        case({listbox := ?}) {
          return f_EPTF_UIHandler_appendListbox(pl_xul.listbox, pl_parentIdx, pl_widgetExists);
        }
        case({listitem := ?}) {
          return f_EPTF_UIHandler_appendListitem(pl_xul.listitem, pl_parentIdx, pl_widgetExists);
        }
        case({numericalwidget := ?}) {
          return f_EPTF_UIHandler_appendNumericalwidget(pl_xul.numericalwidget, pl_parentIdx, pl_widgetExists);
        }
        case({menulist := ?}) {
          return f_EPTF_UIHandler_appendMenulist(pl_xul.menulist, pl_parentIdx, pl_widgetExists);
        }
        case({menuitem := ?}) {
          return f_EPTF_UIHandler_appendMenuitem(pl_xul.menuitem, pl_parentIdx, pl_widgetExists);
        }
        case ({distributionchart := ?}){
          return f_EPTF_UIHandler_appendDistributionchart(pl_xul.distributionchart, pl_parentIdx, pl_widgetExists);
        }
        case ({valuelist := ?}){
          return f_EPTF_UIHandler_appendValuelist(pl_xul.valuelist, pl_parentIdx, pl_widgetExists);
        }
        case ({image := ?}){
          return f_EPTF_UIHandler_appendImage(pl_xul.image, pl_parentIdx, pl_widgetExists);
        }
        case({pushbutton := ?}) {
          return f_EPTF_UIHandler_appendPushbutton(pl_xul.pushbutton, pl_parentIdx, pl_widgetExists);
        }
        case({togglebutton := ?}) {
          return f_EPTF_UIHandler_appendTogglebutton(pl_xul.togglebutton, pl_parentIdx, pl_widgetExists);
        }
        case({htmlcode := ?}) {
          return f_EPTF_UIHandler_appendHtmlcode(pl_xul.htmlcode, pl_parentIdx, pl_widgetExists);
        }
        case({separator := ?}) {
          return f_EPTF_UIHandler_appendSeparator(pl_xul.separator, pl_parentIdx, pl_widgetExists);
        }
        case else {
          f_EPTF_UIHandler_warning("Unhandled widget type in f_EPTF_UIHandler_appendAllWidgetIdsFromXul!");
          return false;
        }
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_deleteChildrenFromWindow
    //
    //  Purpose:
    //    Deletes the childrens from the widget given in XUL format
    //
    //  Parameters:
    //    pl_window - *in* *Windowtype*
    //
    //  Return Value:
    //    Windowtype
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_deleteChildrenFromWindow(in Windowtype pl_window)
    return Windowtype {
      var Windowtype ret := pl_window;
      ret.embeddedwidgets.embeddedwidget_list := {};
      return ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_deleteChildrenFromTree
    //
    //  Purpose:
    //    Deletes the childrens from the widget given in XUL format
    //
    //  Parameters:
    //    pl_xul - *in* *Tree*
    //
    //  Return Value:
    //    Tree
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_deleteChildrenFromTree(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tree pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tree {
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tree ret := pl_xul;
      ret.treecols.treecolgroups.treecolgroup_list := {};
      ret.treechildren.treeitemgroups.treeitemgroup_list := {};
      return ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_deleteChildrenFromTabpages
    //
    //  Purpose:
    //    Deletes the childrens from the widget given in XUL format
    //
    //  Parameters:
    //    pl_xul - *in* *Tabpages*
    //
    //  Return Value:
    //    Tabpages
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_deleteChildrenFromTabpages(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tabpages pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tabpages {
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tabpages ret := pl_xul;
      ret.tabpagegroups.tabpagegroup_list := {};
      return ret;
    }
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_deleteChildrenFromHbox
    //
    //  Purpose:
    //    Deletes the childrens from the widget given in XUL format
    //
    //  Parameters:
    //    pl_xul - *in* *Hbox*
    //
    //  Return Value:
    //    Hbox
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_deleteChildrenFromHbox(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Hbox pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Hbox {
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Hbox ret := pl_xul;
      ret.embeddedwidgets.embeddedwidget_list := {};
      return ret;
    }
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_deleteChildrenFromChart
    //
    //  Purpose:
    //    Deletes the childrens from the widget given in XUL format
    //
    //  Parameters:
    //    pl_xul - *in* *Chart*
    //
    //  Return Value:
    //    Chart
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_deleteChildrenFromChart(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Chart pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Chart {
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Chart ret := pl_xul;
      ret.tracegroups.tracegroup_list := {};
      return ret;
    }
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_deleteChildrenFromToolbar
    //
    //  Purpose:
    //    Deletes the childrens from the widget given in XUL format
    //
    //  Parameters:
    //    pl_xul - *in* *Toolbar*
    //
    //  Return Value:
    //    Toolbar
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_deleteChildrenFromToolbar(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Toolbar pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Toolbar {
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Toolbar ret := pl_xul;
      ret.choice_list := {};
      return ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_deleteChildrenFromListbox
    //
    //  Purpose:
    //    Deletes the childrens from the widget given in XUL format
    //
    //  Parameters:
    //    pl_xul - *in* *Listbox*
    //
    //  Return Value:
    //    Listbox
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_deleteChildrenFromListbox(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Listbox pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Listbox {
      pl_xul.externaldata := omit;
      pl_xul.listitemgroups.listitemgroup_list := {};
      return pl_xul;
    }
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_deleteChildrenFromMenulist
    //
    //  Purpose:
    //    Deletes the childrens from the widget given in XUL format
    //
    //  Parameters:
    //    pl_xul - *in* *Menulist*
    //
    //  Return Value:
    //    Menulist
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_deleteChildrenFromMenulist(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Menulist pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Menulist {
      pl_xul.externaldata := omit;
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Menulist ret := pl_xul;
      ret.menupopup.choice.menuitemgroups.menuitemgroup_list := {};
      return ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_deleteChildrenDistributionchart
    //
    //  Purpose:
    //    Deletes the children from the widget given in XUL format
    //
    //  Parameters:
    //    pl_xul - *in* *Distributionchart*
    //
    //  Return Value:
    //    Distributionchart
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_deleteChildrenFromDistributionchart(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Distributionchart pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Distributionchart {
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Distributionchart ret := pl_xul;
      ret.externaldatagroups.externaldatagroup_list := {};
      return ret;
    }

    // The others are just the Identity
    private function f_EPTF_UIHandler_deleteChildrenFromMenuitem(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Menuitem pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Menuitem {
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Menuitem ret := pl_xul;
      return ret;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromNumericalwidget(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Numericalwidget pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Numericalwidget {
      pl_xul.externaldata := omit;
      return pl_xul;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromTreecell(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Treecell pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Treecell {
      //var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Treecell ret := pl_xul;
      pl_xul.externaldata := omit;
      return pl_xul;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromListitem(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Listitem pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Listitem {
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Listitem ret := pl_xul;
      return ret;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromTreerow(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Treerow pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Treerow {
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Treerow ret := pl_xul;
      return ret;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromTabpage(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tabpage pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tabpage {
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tabpage ret := pl_xul;
      ret.embeddedwidgets := {{}};
      return ret;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromLabel(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Label pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Label {
      // if externaldata present then ->
      if(ispresent(pl_xul.externaldata)) {
        // add customclass to notify the LoadMain.xsl that the content of this label can change (search for "dynamic updatable label" in xsl)
        if (ispresent(pl_xul.customclass) and pl_xul.customclass!="") {
          pl_xul.customclass := "HasExternalData "&pl_xul.customclass;
        } else {
          pl_xul.customclass := "HasExternalData";
        }
      }
      pl_xul.externaldata := omit;
      return pl_xul;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromSpacer(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Spacer pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Spacer {
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Spacer ret := pl_xul;
      return ret;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromButton(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Button pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Button {
      pl_xul.externaldata := omit;
      return pl_xul;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromTextbox(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Textbox pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Textbox {
      pl_xul.externaldata := omit;
      return pl_xul;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromTrace(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Trace pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Trace {
      pl_xul.externaldata := omit;
      return pl_xul;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromToolbarbutton(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Toolbarbutton pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Toolbarbutton {
      pl_xul.externaldata := omit;
      return pl_xul;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromSeparator(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Separator pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Separator {
      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Separator ret := pl_xul;
      return ret;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromPushbutton(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Pushbutton pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Pushbutton {
      pl_xul.externaldata := omit;
      return pl_xul;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromTogglebutton(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Togglebutton pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Togglebutton {
      pl_xul.externaldata := omit;
      return pl_xul;
    }
    private function f_EPTF_UIHandler_deleteChildrenFromHtmlcode(in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Htmlcode pl_xul)
    return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Htmlcode {
      pl_xul.externaldata := omit;
      return pl_xul;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_anywidget
    //
    //  Purpose:
    //    Casting function from XTDP_XML_Tag to AnyWidget
    //
    //  Parameters:
    //    pl_xul - *in* *XTDP_XML_Tag* - union type of possible gui items
    //
    //  Return Value:
    //    AnyWidget - an union of some gui items
    //
    //  Errors:
    //    Unhandled widgettype
    //
    //  Detailed Comments:
    //    -
    ///////////////////////////////////////////////////////////
    /*  private function f_EPTF_UIHandler_anywidget(in Widgets pl_xul, inout boolean pl_succ)
    runs on EPTF_UIHandler_Private_CT
    return AnyWidget {
    pl_succ := true;
    select(pl_xul){
    case ({tabbox := ?}) {
    return {tabbox := pl_xul.tabbox};
    }
    case ({tree := ?}) {
    return {tree := pl_xul.tree};
    }
    case ({hbox := ?}) {
    return {hbox := pl_xul.hbox};
    }
    case ({label_ := ?}) {
    return {textlabel := pl_xul.label_};
    }
    case ({spacer := ?}) {
    return {spacer := pl_xul.spacer};
    }
    case ({button := ?}) {
    return {button := pl_xul.button};
    }
    case ({textbox := ?}) {
    return {textbox := pl_xul.textbox};
    }
    case ({chart := ?}) {
    return {chart := pl_xul.chart};
    }
    case ({toolbar := ?}) {
    return {toolbar := pl_xul.toolbar};
    }
    case ({toolbarbutton := ?}) {
    return {toolbarbutton := pl_xul.toolbarbutton};
    }
    case ({listbox := ?}) {
    return {listbox := pl_xul.listbox};
    }
    case ({numericalwidget := ?}) {
    return {numericalwidget := pl_xul.numericalwidget};
    }
    case ({menulist := ?}) {
    return {menulist := pl_xul.menulist};
    }
    case ({distributionchart := ?}) {
    return {distributionchart := pl_xul.distributionchart};
    }
    case ({image := ?}) {
    //f_EPTF_UIHandler_debug("f_EPTF_UIHandler_anywidget: image found, skip it");
    pl_succ := false;
    return {spacer := {0.0,omit}}; // a dummy widget - omit can not be used
    }
    case else{
    f_EPTF_UIHandler_debug("Unhandled widget in f_EPTF_UIHandler_anywidget: " & log2str(pl_xul));
    pl_succ := false;
    return {spacer := {0.0,omit}}; // a dummy widget - omit can not be used
    }
    }
    // control will never go here, but we need these because of gcc
    pl_succ := false;
    return {spacer := {0.0,omit}};
    }*/
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_Widgets
    //
    //  Purpose:
    //    Casting function from XTDP_XML_Tag to AnyWidget
    //
    //  Parameters:
    //    pl_xul - *in* *XTDP_XML_Tag* - union type of possible gui items
    //    pl_returnWidget - *out* *Embeddedwidget* - AnyWidget - an union of some gui items
    //
    //  Errors:
    //    Unhandled widgettype
    //
    //  Detailed Comments:
    //    -
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_Widgets(in Widgets pl_xul,
      inout boolean pl_succ,
      out ttcn_ericsson_se_protocolModules_xtdp_xtdl.Embeddedwidget pl_widgets)
    runs on EPTF_UIHandler_Private_CT
    // return ttcn_ericsson_se_protocolModules_xtdp_xtdl.Embeddedwidget
    {
      pl_succ := true;
      //FIXME Is not faster the ischosen?
      if (ischosen(pl_xul.tabpages)) {
        pl_widgets := {tabpages := pl_xul.tabpages};
        return;
      }
      else if (ischosen(pl_xul.tree)) {
        pl_widgets := {tree := pl_xul.tree};
        return;
      }
      else if (ischosen(pl_xul.hbox)) {
        pl_widgets := {hbox := pl_xul.hbox};
        return;
      }
      else if (ischosen(pl_xul.label_)) {
        pl_widgets := {label_ := pl_xul.label_};
        return;
      }
      else if (ischosen(pl_xul.spacer)) {
        pl_widgets := {spacer := pl_xul.spacer};
        return;
      }
      else if (ischosen(pl_xul.button)) {
        pl_widgets := {button := pl_xul.button};
        return;
      }
      else if (ischosen(pl_xul.textbox)) {
        pl_widgets := {textbox := pl_xul.textbox};
        return;
      }
      else if (ischosen(pl_xul.chart)) {
        pl_widgets := {chart := pl_xul.chart};
        return;
      }
      else if (ischosen(pl_xul.toolbar)) {
        pl_widgets := {toolbar := pl_xul.toolbar};
        return;
      }
      else if (ischosen(pl_xul.listbox)) {
        pl_widgets := {listbox := pl_xul.listbox};
        return;
      }
      else if (ischosen(pl_xul.numericalwidget)) {
        pl_widgets := {numericalwidget := pl_xul.numericalwidget};
        return;
      }
      else if (ischosen(pl_xul.menulist)) {
        pl_widgets := {menulist := pl_xul.menulist};
        return;
      }
      else if (ischosen(pl_xul.distributionchart)) {
        pl_widgets := {distributionchart := pl_xul.distributionchart};
        return;
      }
      else if (ischosen(pl_xul.image)) {
        //f_EPTF_UIHandler_debug("f_EPTF_UIHandler_anywidget: image found, skip it");
        pl_succ := false;
        pl_widgets := {spacer := {0.0,omit}}; // a dummy widget - omit can not be used
        return;
      }
      else if (ischosen(pl_xul.pushbutton)) {
        pl_widgets := {pushbutton := pl_xul.pushbutton};
        return;
      }
      else if (ischosen(pl_xul.togglebutton)) {
        pl_widgets := {togglebutton := pl_xul.togglebutton};
        return;
      }
      else if (ischosen(pl_xul.htmlcode)) {
        pl_widgets := {htmlcode := pl_xul.htmlcode};
        return;
      } else {
        if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
          f_EPTF_UIHandler_debug(%definitionId&": Unhandled widget: " & log2str(pl_xul));
        }
        pl_succ := false;
        pl_widgets := {spacer := {0.0,omit}}; // a dummy widget - omit can not be used
        return;
      }
    }
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_widgetList
    //
    //  Purpose:
    //    Casting function from EPTF_UIHandler_XTDP_XML_TagList to WidgetList
    //
    //  Parameters:
    //    pl_xul - *in* *EPTF_UIHandler_XTDP_XML_TagList* - union type of possible gui items
    //
    //  Return Value:
    //    WidgetList - a list of some gui items
    //
    //  Errors:
    //    none
    //
    //  Detailed Comments:
    //    -
    ///////////////////////////////////////////////////////////
    /*  private function f_EPTF_UIHandler_widgetList(in EPTF_UIHandler_WidgetsList pl_xuls)
    runs on EPTF_UIHandler_Private_CT
    return WidgetList {
    var WidgetList wl:={};
    var AnyWidget aw;
    var boolean succ := true;
    for (var integer i:=0;i<sizeof(pl_xuls);i:=i+1){
    aw := f_EPTF_UIHandler_anywidget(pl_xuls[i], succ);
    if(succ){
    wl[sizeof(wl)] := aw;
    }
    }
    return wl;
    }
    */

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_embeddedwidgets
    //
    //  Purpose:
    //    Casting function from EPTF_UIHandler_XTDP_XML_TagList to WidgetList
    //
    //  Parameters:
    //    pl_xul - *in* *EPTF_UIHandler_XTDP_XML_TagList* - union type of possible gui items
    //    wl     - *out* *ttcn_ericsson_se_protocolModules_xtdp_xtdl.Embeddedwidgets* - a list of some gui items
    //
    //  Errors:
    //    none
    //
    //  Detailed Comments:
    //    -
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_embeddedwidgets(
      in EPTF_UIHandler_WidgetsList pl_xuls,
      out ttcn_ericsson_se_protocolModules_xtdp_xtdl.Embeddedwidgets wl)
    runs on EPTF_UIHandler_Private_CT {

      wl := {{}};

      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Embeddedwidget aw;
      var boolean succ := true;
      for (var integer i:=0;i<sizeof(pl_xuls);i:=i+1){
        if (ischosen(pl_xuls[i].metaiterator)) {
          var integer vl_metaIteratorIdx := f_EPTF_UIHandler_widgetRecIndex(f_EPTF_UIHandler_unichar2charstring(pl_xuls[i].metaiterator.id));
          var EPTF_UIHandler_WidgetsList v_xuls_metaIteratorChildren;
          f_EPTF_UIHandler_buildchildrenXULs(vl_metaIteratorIdx, v_xuls_metaIteratorChildren);
          var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Embeddedwidgets vl_embedded;
          f_EPTF_UIHandler_embeddedwidgets(v_xuls_metaIteratorChildren,vl_embedded);
          wl.embeddedwidget_list := wl.embeddedwidget_list & vl_embedded.embeddedwidget_list;
        } else {

          f_EPTF_UIHandler_Widgets(pl_xuls[i], succ, aw);
          if(succ){
            wl.embeddedwidget_list[sizeof(wl.embeddedwidget_list)] := aw;
          }
        }
      }

    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_tabpagegroups
    //
    //  Purpose:
    //    Casting function from EPTF_UIHandler_XTDP_XML_TagList to WidgetList
    //
    //  Parameters:
    //    pl_xul - *in* *EPTF_UIHandler_XTDP_XML_TagList* - union type of possible gui items
    //    wl     - *out* *ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tabpagegroups* - a list of some gui items
    //
    //  Errors:
    //    none
    //
    //  Detailed Comments:
    //    -
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_tabpagegroups(
      in EPTF_UIHandler_WidgetsList pl_xuls,
      out ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tabpagegroups wl)
    runs on EPTF_UIHandler_Private_CT {

      wl := {{}};

      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tabpagegroups aw;
      var boolean succ := true;
      for (var integer i:=0;i<sizeof(pl_xuls);i:=i+1){

        if (ischosen(pl_xuls[i].metaiterator)) {
          var integer vl_metaIteratorIdx := f_EPTF_UIHandler_widgetRecIndex(f_EPTF_UIHandler_unichar2charstring(pl_xuls[i].metaiterator.id));
          var EPTF_UIHandler_WidgetsList v_xuls_metaIteratorChildren;
          f_EPTF_UIHandler_buildchildrenXULs(vl_metaIteratorIdx, v_xuls_metaIteratorChildren);

          var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tabpagegroups vl_embedded;
          f_EPTF_UIHandler_tabpagegroups(v_xuls_metaIteratorChildren,vl_embedded);
          wl.tabpagegroup_list := wl.tabpagegroup_list & vl_embedded.tabpagegroup_list;


        } else if (ischosen(pl_xuls[i].tabpage)) {

          wl.tabpagegroup_list[sizeof(wl.tabpagegroup_list)].tabpage := pl_xuls[i].tabpage;

        } else {
          //FIXME extra check
          //f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_xuls[i]));
        }
      }

    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_TraceList
    //
    //  Purpose:
    //    Casting function from EPTF_UIHandler_XTDP_XML_TagList to TraceList
    //
    //  Parameters:
    //    pl_xul - *in* *EPTF_UIHandler_XTDP_XML_TagList* - union type of possible gui items
    //    pl_tracelist - *out* *TraceList*
    //
    //  Errors:
    //    none
    //
    //  Detailed Comments:
    //    -
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_TraceList(
      in integer pl_index,
      in EPTF_UIHandler_WidgetsList pl_xuls,
      out ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tracegroups pl_wl)
    runs on EPTF_UIHandler_Private_CT{

      pl_wl := {{}};

      var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tracelist vl_tracelist:={ /*trace_list :=*/ {} };

      var EPTF_IntegerList vl_nonMetaChildrens := f_EPTF_UIHandler_getNonMetaChildren(pl_index);
      for (var integer i:=0;i<sizeof(pl_xuls);i:=i+1){
        if (ischosen(pl_xuls[i].trace)){
          var integer vl_i := sizeof(vl_tracelist.trace_list);
          vl_tracelist.trace_list[vl_i] := pl_xuls[i].trace;
          pl_wl.tracegroup_list[vl_i].trace := vl_tracelist.trace_list[vl_i];
          var integer vl_tracePointer;
          if (not f_EPTF_int2int_HashMap_Find(v_UIHandler_tracePointerHashMapId, vl_nonMetaChildrens[i], vl_tracePointer)){
            continue;
          }
          if ( sizeof(pl_xuls[i].trace.choice_list) < pl_xuls[i].trace.maxPoints) {
            continue;
          }
          var integer vl_currTraceID := v_UIHandler_tracePointers[vl_tracePointer];
          for (var integer j:=0; j<sizeof(pl_xuls[i].trace.choice_list); j:=j+1) {
            vl_tracelist.trace_list[vl_i].choice_list[j] := pl_xuls[i].trace.choice_list[vl_currTraceID];
            vl_currTraceID := vl_currTraceID + 1;
            if (vl_currTraceID==sizeof(pl_xuls[i].trace.choice_list)) {
              vl_currTraceID := 0;
            }

          }
          //update it
          pl_wl.tracegroup_list[vl_i].trace := vl_tracelist.trace_list[vl_i];

        } else if (ischosen(pl_xuls[i].metaiterator)) {
          var integer vl_metaIteratorIdx := f_EPTF_UIHandler_widgetRecIndex(f_EPTF_UIHandler_unichar2charstring(pl_xuls[i].metaiterator.id));
          var EPTF_UIHandler_WidgetsList v_xuls_metaIteratorChildren;
          f_EPTF_UIHandler_buildchildrenXULs(vl_metaIteratorIdx, v_xuls_metaIteratorChildren);

          var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Tracegroups vl_embedded;
          f_EPTF_UIHandler_TraceList(pl_index,v_xuls_metaIteratorChildren,vl_embedded);

          // Insert into both list (pl_wl.tracegroup_list and vl_tracelist.trace_list)
          for(var integer vl_idx:=0; vl_idx<sizeof(vl_embedded.tracegroup_list);vl_idx:=vl_idx+1) {
            var integer vl_i := sizeof(vl_tracelist.trace_list);
            vl_tracelist.trace_list[vl_i] := vl_embedded.tracegroup_list[vl_idx].trace;
            pl_wl.tracegroup_list[vl_i].trace := vl_tracelist.trace_list[vl_i]
          }

        }else{
          //FIXME extra check
          //f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_xuls[i]));
        }
      }
    }
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_Toolbarelements
    //
    //  Purpose:
    //    Casting function from EPTF_UIHandler_XTDP_XML_TagList to Toolbarelements
    //
    //  Parameters:
    //    pl_xul - *in* *EPTF_UIHandler_XTDP_XML_TagList* - union type of possible gui items
    //    pl_toolbe - *out* *Toolbarelements*
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_Toolbarelements(
      in EPTF_UIHandler_WidgetsList pl_xuls,
      out ttcn_ericsson_se_protocolModules_xtdp_xtdl.Toolbarelements pl_toolbe)
    runs on EPTF_UIHandler_Private_CT{

      pl_toolbe:={
        /*toolbarelement_list :=*/ {}
      };
      for (var integer i:=0;i<sizeof(pl_xuls);i:=i+1){
        if (ischosen(pl_xuls[i].toolbarbutton)){
          pl_toolbe.toolbarelement_list[sizeof(pl_toolbe.toolbarelement_list)].choice.toolbarbutton := pl_xuls[i].toolbarbutton;
        } else if (ischosen(pl_xuls[i].pushbutton)){
          pl_toolbe.toolbarelement_list[sizeof(pl_toolbe.toolbarelement_list)].choice.pushbutton := pl_xuls[i].pushbutton;
        } else if (ischosen(pl_xuls[i].togglebutton)){
          pl_toolbe.toolbarelement_list[sizeof(pl_toolbe.toolbarelement_list)].choice.togglebutton := pl_xuls[i].togglebutton;
        } else if (ischosen(pl_xuls[i].separator)){
          pl_toolbe.toolbarelement_list[sizeof(pl_toolbe.toolbarelement_list)].choice.separator := pl_xuls[i].separator;
        }
      }

    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_Treecols
    //
    //  Purpose:
    //    Casting function from EPTF_UIHandler_XTDP_XML_TagList to Treecols
    //
    //  Parameters:
    //    pl_xul - *in* *EPTF_UIHandler_XTDP_XML_TagList* - union type of possible gui items
    //
    //  Return Value:
    //    Treecols
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_Treecols(
      in EPTF_UIHandler_WidgetsList pl_xuls,
      out ttcn_ericsson_se_protocolModules_xtdp_xtdl.Treecols pl_cols)
    runs on EPTF_UIHandler_Private_CT{
      pl_cols:={
        /*treecolgroup_list :=*/ {{}}
      };
      for (var integer i:=0;i<sizeof(pl_xuls);i:=i+1){
        if (ischosen(pl_xuls[i].treecol)){
          pl_cols.treecolgroups.treecolgroup_list[sizeof(pl_cols.treecolgroups.treecolgroup_list)].treecol := pl_xuls[i].treecol;
        } else if (ischosen(pl_xuls[i].metaiterator)) {
          var integer vl_metaIteratorIdx := f_EPTF_UIHandler_widgetRecIndex(f_EPTF_UIHandler_unichar2charstring(pl_xuls[i].metaiterator.id));
          var EPTF_UIHandler_WidgetsList v_xuls_metaIteratorChildren;
          f_EPTF_UIHandler_buildchildrenXULs(vl_metaIteratorIdx, v_xuls_metaIteratorChildren);

          var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Treecols vl_embedded;
          f_EPTF_UIHandler_Treecols(v_xuls_metaIteratorChildren,vl_embedded);
          pl_cols.treecolgroups.treecolgroup_list := pl_cols.treecolgroups.treecolgroup_list & vl_embedded.treecolgroups.treecolgroup_list;


        }
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_getTreeIdx
    //
    //  Purpose:
    //    Gives back the current tree's id from e.g. a treerowid
    //
    //  Parameters:
    //    pl_childIdx - *in* *integer* - widgetid, whose tree parent is to be found
    //
    //  Return Value:
    //    Tree widget id.
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_getTreeIdx(in integer pl_childIdx)
    runs on EPTF_UIHandler_Private_CT return integer {
      var integer vl_nonMetaParentIdx := f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(pl_childIdx);
      if(v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetType != wtTree){
        return f_EPTF_UIHandler_getTreeIdx(v_UIHandler_guiItemList[vl_nonMetaParentIdx].parentIdx );
//        vl_data := v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData;
      }
      return vl_nonMetaParentIdx;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_treechildren
    //
    //  Purpose:
    //    Casting function from EPTF_UIHandler_XTDP_XML_TagList to Treechildren
    //
    //  Parameters:
    //    pl_xul - *in* *EPTF_UIHandler_XTDP_XML_TagList* - union type of possible gui items
    //
    //  Return Value:
    //    Treechildren
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_treechildren(
      in EPTF_UIHandler_WidgetsList pl_xuls,
      in integer pl_cols,
      out ttcn_ericsson_se_protocolModules_xtdp_xtdl.Treechildren pl_children,
      in integer pl_parentWidgetIdx,
      inout integer pl_row)
    runs on EPTF_UIHandler_Private_CT
    {
      var integer vl_nonMetaParentIdx := f_EPTF_UIHandler_getTreeIdx(pl_parentWidgetIdx);
      var integer vl_columns := sizeof(v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.columns);

      pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list:={};
      var integer vl_cellCounter := 0;
      for (var integer i:=0;i<sizeof(pl_xuls);i:=i+1){
        if (ischosen(pl_xuls[i].treecell)) {
          var integer vl_row := 0;
          if (vl_columns != 0) {
            vl_row := vl_cellCounter / vl_columns;
          }
          var integer vl_cellIdxInRow := vl_cellCounter-vl_row*vl_columns;
          //sizeof(pl_children.treeitemgroups.treeitemgroup_list[sizeof(pl_children.treeitemgroups.treeitemgroup_list)].treeitem.treerowgroups.treerowgroup_list[vl_row].treerow.treecellgroups.treecellgroup_list);
          pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[vl_row].treerow.treecellgroups.treecellgroup_list[vl_cellIdxInRow].treecell := pl_xuls[i].treecell;
          vl_cellCounter :=  vl_cellCounter + 1;
        } else if(ischosen(pl_xuls[i].treechildren)) {
          pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list :=
          pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list & pl_xuls[i].treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list;
          pl_row := pl_row + sizeof(pl_xuls[i].treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list)
        } else if (ischosen(pl_xuls[i].metaiterator)) {
          var integer vl_metaIteratorIdx := f_EPTF_UIHandler_widgetRecIndex(f_EPTF_UIHandler_unichar2charstring(pl_xuls[i].metaiterator.id));
          var EPTF_UIHandler_WidgetsList v_xuls_metaIteratorChildren;
          f_EPTF_UIHandler_buildchildrenXULs(vl_metaIteratorIdx, v_xuls_metaIteratorChildren);

          var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Treechildren vl_embedded;
          f_EPTF_UIHandler_treechildren(v_xuls_metaIteratorChildren, pl_cols,vl_embedded,pl_parentWidgetIdx, pl_row);

          if (v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.iteratorUnionType == treecelliterator) {
            if (sizeof(vl_embedded.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list)>0) {
              var integer vl_row := sizeof(pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list)-1;
              if (vl_row<0) {
                vl_row := 0;
                pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[vl_row] := {treerow:={{{}}}}
              }
              pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[vl_row].treerow.treecellgroups.treecellgroup_list :=
               pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[vl_row].treerow.treecellgroups.treecellgroup_list
               & vl_embedded.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[0].treerow.treecellgroups.treecellgroup_list;
            }
          } else {
            pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list :=
              pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list
              & vl_embedded.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list;
          }

          var integer vl_nofNewCells := 0;
          if (sizeof(vl_embedded.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list)>0) {
            vl_nofNewCells := sizeof(vl_embedded.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[0].treerow.treecellgroups.treecellgroup_list);
          }
          vl_cellCounter := vl_cellCounter + vl_nofNewCells;
        } else if (ischosen(pl_xuls[i].treerow)) {
          var integer vl_treeIdx := -1;
          var integer vl_parentIdx := pl_parentWidgetIdx;

          while(vl_treeIdx == -1 and vl_parentIdx != -1){
           if(v_UIHandler_guiItemList[vl_parentIdx].widgetType == wtTree){
             vl_treeIdx := vl_parentIdx;
           } else {
             vl_parentIdx := v_UIHandler_guiItemList[vl_parentIdx].parentIdx;
           }
          }
          var integer vl_treerowIdx := -1;
          if(vl_treeIdx == -1){
             f_EPTF_UIHandler_warning(%definitionId&": The tree of the treerow has not been found! " & log2str(pl_xuls[i]) );
             break;
          } else {
            var integer vl_dummy := -1;
            vl_treerowIdx := f_EPTF_UIHandler_TreeRowIdxInATree(pl_row, vl_treeIdx, vl_dummy );
            if(vl_treerowIdx == -1){
              f_EPTF_UIHandler_warning(%definitionId&": The treerow has not been found in the database for the tree: " & log2str(v_UIHandler_guiItemList[vl_treeIdx].id) );
              break;
            }
          }
          var EPTF_UIHandler_WidgetsList v_xuls_treerowChildren := {};
          pl_row := pl_row + 1;
          if(sizeof(v_UIHandler_guiItemList[vl_treerowIdx].children) > 0){
              for(var integer vl_treerowchildrenIdx := 0; vl_treerowchildrenIdx < sizeof(v_UIHandler_guiItemList[vl_treerowIdx].children); vl_treerowchildrenIdx := vl_treerowchildrenIdx + 1){
                if(v_UIHandler_guiItemList[v_UIHandler_guiItemList[vl_treerowIdx].children[vl_treerowchildrenIdx]].widgetType == wtTreecell){
                  vl_cellCounter :=  vl_cellCounter + 1;
                  v_xuls_treerowChildren := v_xuls_treerowChildren & { v_UIHandler_guiItemList[v_UIHandler_guiItemList[vl_treerowIdx].children[vl_treerowchildrenIdx]].XULformat };
                } else {
                  var EPTF_UIHandler_WidgetsList v_xuls_treerowChildrenPlus := {};
                  f_EPTF_UIHandler_buildchildrenXULs(v_UIHandler_guiItemList[vl_treerowIdx].children[vl_treerowchildrenIdx], v_xuls_treerowChildrenPlus);

                  for(var integer vl_l := 0; vl_l < sizeof(v_xuls_treerowChildrenPlus); vl_l := vl_l + 1){
                     v_xuls_treerowChildren[sizeof(v_xuls_treerowChildren)] := v_xuls_treerowChildrenPlus[vl_l];
                  }
                }

              }
              var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Treechildren vl_embedded;
              f_EPTF_UIHandler_treechildren(v_xuls_treerowChildren, pl_cols,vl_embedded,vl_treerowIdx, pl_row);
              pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list :=
              pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list
                  & vl_embedded.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list;

              var integer vl_nofNewCells := 0;
              if (sizeof(vl_embedded.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list)>0) {
                vl_nofNewCells := sizeof(vl_embedded.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[0].treerow.treecellgroups.treecellgroup_list);
              }
              vl_cellCounter := vl_cellCounter + vl_nofNewCells;
          } else {
            //empty row
              pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[sizeof(pl_children.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list)].treerow
               := pl_xuls[i].treerow;
            }
        } else if (ischosen(pl_xuls[i].treecol)) {
          //Nothing to do
        } else {
          f_EPTF_UIHandler_warning(%definitionId&": Not handled widgettype! " & log2str(pl_xuls[i]) );
        }
      }
      return;
    }

    private function f_EPTF_UIHandler_TreeRowIdxInATree(
      in integer pl_rowToFind,
      in integer pl_parentIdx,
      inout integer pl_countTreeRow
    )
    runs on EPTF_UIHandler_Private_CT return integer{
        var integer vl_treerowIdx := -1;

        for(var integer vl_i := 0; vl_i < sizeof(v_UIHandler_guiItemList[pl_parentIdx].children); vl_i := vl_i + 1){
           if(v_UIHandler_guiItemList[v_UIHandler_guiItemList[pl_parentIdx].children[vl_i]].widgetType == wtTreerow){
             pl_countTreeRow := pl_countTreeRow + 1;
           } else {
             vl_treerowIdx := f_EPTF_UIHandler_TreeRowIdxInATree(pl_rowToFind, v_UIHandler_guiItemList[pl_parentIdx].children[vl_i], pl_countTreeRow);
           }
           if(pl_countTreeRow >= pl_rowToFind){
               if(vl_treerowIdx == -1){
                 vl_treerowIdx := v_UIHandler_guiItemList[pl_parentIdx].children[vl_i];
               }
               break;
           }
        }

        return vl_treerowIdx;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_Listitems
    //
    //  Purpose:
    //    Casting function from EPTF_UIHandler_XTDP_XML_TagList to Listitems
    //
    //  Parameters:
    //    pl_xul - *in* *EPTF_UIHandler_XTDP_XML_TagList* - union type of possible gui items
    //    pl_tcs - *out* *Listbox.listitemgroups.listitemgroup_list* - Listitems
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_Listitems(
      in EPTF_UIHandler_WidgetsList pl_xuls,
      out ttcn_ericsson_se_protocolModules_xtdp_xtdl.Listitemgroups pl_wl)
    runs on EPTF_UIHandler_Private_CT {

      pl_wl:={{}};
      for (var integer i:=0;i<sizeof(pl_xuls);i:=i+1){
        if (ischosen(pl_xuls[i].listitem)){
          pl_wl.listitemgroup_list[sizeof(pl_wl.listitemgroup_list)].listitem := pl_xuls[i].listitem;
        } else if (ischosen(pl_xuls[i].metaiterator)) {
          var integer vl_metaIteratorIdx := f_EPTF_UIHandler_widgetRecIndex(f_EPTF_UIHandler_unichar2charstring(pl_xuls[i].metaiterator.id));
          var EPTF_UIHandler_WidgetsList v_xuls_metaIteratorChildren;
          f_EPTF_UIHandler_buildchildrenXULs(vl_metaIteratorIdx, v_xuls_metaIteratorChildren);

          var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Listitemgroups vl_embedded;
          f_EPTF_UIHandler_Listitems(v_xuls_metaIteratorChildren,vl_embedded);
          pl_wl.listitemgroup_list := pl_wl.listitemgroup_list & vl_embedded.listitemgroup_list;


        }
      }

    }
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_Menuitems
    //
    //  Purpose:
    //    Casting function from EPTF_UIHandler_XTDP_XML_TagList to Menuitems
    //
    //  Parameters:
    //    pl_xul - *in* *EPTF_UIHandler_XTDP_XML_TagList* - union type of possible gui items
    //    pl_tcs - *out* *ttcn_ericsson_se_protocolModules_xtdp_xtdl.Menupopup* - Menuitems
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_Menupopup(
      in EPTF_UIHandler_WidgetsList pl_xuls,
      out ttcn_ericsson_se_protocolModules_xtdp_xtdl.Menupopup pl_tcs)
    runs on EPTF_UIHandler_Private_CT {

      pl_tcs:={
        ///*iteratordata :=*/ omit,
        /*menuitem_list :=*/ choice := {menuitemgroups:= {{}}}
      };
      for (var integer i:=0;i<sizeof(pl_xuls);i:=i+1){
        if (ischosen(pl_xuls[i].menuitem)){
          pl_tcs.choice.menuitemgroups.menuitemgroup_list[sizeof(pl_tcs.choice.menuitemgroups.menuitemgroup_list)].menuitem := pl_xuls[i].menuitem;
        } else if (ischosen(pl_xuls[i].metaiterator)) {
          var integer vl_metaIteratorIdx := f_EPTF_UIHandler_widgetRecIndex(f_EPTF_UIHandler_unichar2charstring(pl_xuls[i].metaiterator.id));
          var EPTF_UIHandler_WidgetsList v_xuls_metaIteratorChildren;
          f_EPTF_UIHandler_buildchildrenXULs(vl_metaIteratorIdx, v_xuls_metaIteratorChildren);

          var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Menupopup vl_embedded;
          f_EPTF_UIHandler_Menupopup(v_xuls_metaIteratorChildren,vl_embedded);
          pl_tcs.choice.menuitemgroups.menuitemgroup_list := pl_tcs.choice.menuitemgroups.menuitemgroup_list & vl_embedded.choice.menuitemgroups.menuitemgroup_list;


        }
      }

    }

    type record of Valuelist Value_list_list;
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_Valuelists
    //
    //  Purpose:
    //    Casting function from EPTF_UIHandler_XTDP_XML_TagList to ValueLists
    //
    //  Parameters:
    //    pl_xul - *in* *EPTF_UIHandler_XTDP_XML_TagList* - union type of possible gui items
    //    pl_tcs - *out* *Distributionchart.valuelist_list* - DistributionchartValuelists
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_Valuelists(
      in EPTF_UIHandler_WidgetsList pl_xuls,
      out Value_list_list pl_tcs)
    runs on EPTF_UIHandler_Private_CT {

      pl_tcs:={};
      for (var integer i:=0;i<sizeof(pl_xuls);i:=i+1){
        if (ischosen(pl_xuls[i].valuelist)){
          pl_tcs[sizeof(pl_tcs)] := pl_xuls[i].valuelist;
        }
      }

    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_Intervallimits
    //
    //  Purpose:
    //    Creates an Intervallimits structure from a stored intervallimits GUI item
    //
    //  Parameters:
    //    pl_index - *in* *integer* - index of intervallimits in the GUI item list
    //    pl_limits - *out* *Intervallimits* - Intervallimitslist
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_Intervallimits(
      in integer pl_index,
      out ttcn_ericsson_se_protocolModules_xtdp_xtdl.Intervallimits pl_limits)
    runs on EPTF_UIHandler_Private_CT {

      f_EPTF_Base_assert(%definitionId & ": Invalid  index: " & int2str(pl_index), pl_index > -1 and pl_index < sizeof(v_UIHandler_guiItemList));
      f_EPTF_Base_assert(%definitionId & ": Invalid  widget type: ", v_UIHandler_guiItemList[pl_index].widgetType == wtIntervallimits);


      pl_limits:={
        //omit,
        v_UIHandler_guiItemList[pl_index].id,
        { value_list := {} }
      };
      for (var integer i:=0; i<sizeof(v_UIHandler_guiItemList[pl_index].widgetData.distChartData.intervallimits); i:=i+1) {
        pl_limits.choice.value_list[i] := v_UIHandler_guiItemList[pl_index].widgetData.distChartData.intervallimits[i];
      }

    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_Distributionchart
    //
    //  Purpose:
    //    Creates an Intervallimits structure from a stored intervallimits GUI item
    //
    //  Parameters:
    //    pl_index - *in* *integer* - index of intervallimits in the GUI item list
    //    pl_limits - *out* *Intervallimits* - Intervallimitslist
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_Distributionchart(
      in integer pl_index,
      inout ttcn_ericsson_se_protocolModules_xtdp_xtdl.Distributionchart pl_distributionchart)
    runs on EPTF_UIHandler_Private_CT {
       f_EPTF_Base_assert(%definitionId & ": Invalid  index: " & int2str(pl_index), pl_index > -1 and pl_index < sizeof(v_UIHandler_guiItemList));
       //f_EPTF_Base_assert(%definitionId & ": Invalid  widget type: ", v_UIHandler_guiItemList[pl_index].widgetType == wtDistributionchart);

       var Widgets vl_xul;

       if (sizeof(pl_distributionchart.externaldatagroups.externaldatagroup_list)==0) {
         pl_distributionchart.externaldatagroups.externaldatagroup_list[0].intervallimits := {"",{value_list:= {} }};
         pl_distributionchart.externaldatagroups.externaldatagroup_list[1].valuelist_list := {};
       }

       var integer vl_size := sizeof(v_UIHandler_guiItemList[pl_index].children);

       for(var integer i := 0; i<vl_size; i := i + 1){
          select(v_UIHandler_guiItemList[v_UIHandler_guiItemList[pl_index].children[i]].widgetType){
            case(wtIntervallimits){
               var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Intervallimits vl_intervallimits_new;
               f_EPTF_UIHandler_Intervallimits(v_UIHandler_guiItemList[pl_index].children[i], vl_intervallimits_new);
               pl_distributionchart.externaldatagroups.externaldatagroup_list[0].intervallimits.id := vl_intervallimits_new.id;
               pl_distributionchart.externaldatagroups.externaldatagroup_list[0].intervallimits.choice.value_list := pl_distributionchart.externaldatagroups.externaldatagroup_list[0].intervallimits.choice.value_list & vl_intervallimits_new.choice.value_list;
            }
            case(wtValuelist){
               vl_xul := v_UIHandler_guiItemList[v_UIHandler_guiItemList[pl_index].children[i]].XULformat;
               vl_xul.valuelist.externaldata := omit;
               pl_distributionchart.externaldatagroups.externaldatagroup_list[1].valuelist_list[sizeof(pl_distributionchart.externaldatagroups.externaldatagroup_list[1].valuelist_list)] :=  vl_xul.valuelist;

            }
            case(wtMetaIterator) {
              f_EPTF_UIHandler_Distributionchart(v_UIHandler_guiItemList[pl_index].children[i],pl_distributionchart);
            }
            case else {
              f_EPTF_Base_assert(%definitionId & ": Invalid  widget type: " & log2str(v_UIHandler_guiItemList[v_UIHandler_guiItemList[pl_index].children[i]].widgetType), false);
            }
           }
       }
    }



    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_ImageList
    //
    //  Purpose:
    //    Casting function from EPTF_UIHandler_XTDP_XML_TagList to ImageList
    //
    //  Parameters:
    //    pl_xul - *in* *EPTF_UIHandler_XTDP_XML_TagList* - union type of possible gui items
    //
    //  Return Value:
    //    DistributionchartValuelists
    ///////////////////////////////////////////////////////////
    /*  private function f_EPTF_UIHandler_ImageList(in EPTF_UIHandler_XTDP_XML_TagList pl_xuls) runs on EPTF_UIHandler_Private_CT
    return ImageList {
    var ImageList tcs:={};
    for (var integer i:=0;i<sizeof(pl_xuls);i:=i+1){
    if (ischosen(pl_xuls[i].xtdp_image)){
    tcs[sizeof(tcs)] := pl_xuls[i].xtdp_image;
    }
    }
    return tcs;
    }*/

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_buildchildrenXUL
    //
    //  Purpose:
    //    Builds a tree, that is supposed to be the given widget's children.
    //
    //  Parameters:
    //    pl_index - *in* <integer> - index in GuiRecItem
    //    pl_xul    - *out* <Widgets> - XTDP_XML_Tag
    //
    ///////////////////////////////////////////////////////////
    friend function f_EPTF_UIHandler_buildchildrenXUL(
      in integer pl_index,
      out Widgets pl_xul,
      in boolean pl_processMetaIterator := false)
    runs on EPTF_UIHandler_Private_CT
    {
      //action("***f_EPTF_UIHandler_buildchildrenXUL: v_UIHandler_guiItemList[",pl_index,"]", v_UIHandler_guiItemList[pl_index]);
      // SJZ 2012.11.20 Kill all externaldata from the outgoing xul (if new parameter tells so),
      //CR_TR00019705       as the XULformat contains externaldatas and gui does not want to get it,

      // make a children recursively: produce the children and with typeselection, place it childrens
      pl_xul := {separator := { id := "This in an unknown widget!" } };
      var EPTF_UIHandler_WidgetsList v_xuls := {};
      if (not ispresent(v_UIHandler_guiItemList[pl_index].XULformat)) {
        if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
          f_EPTF_UIHandler_debug(%definitionId&": XUL format ommitted, ignoring this subtree!");
        }
      } else {
          pl_xul := v_UIHandler_guiItemList[pl_index].XULformat;
          f_EPTF_UIHandler_buildchildrenXULs(pl_index, v_xuls, pl_processMetaIterator);
      }

      select(v_UIHandler_guiItemList[pl_index].widgetType){
        case(wtWindow){
          f_EPTF_UIHandler_warning(%definitionId&": Too many windows present in database!");
        }
        case (wtTabpages){
          f_EPTF_UIHandler_tabpagegroups(v_xuls,pl_xul.tabpages.tabpagegroups);
        }
        case (wtTabpage) {
          f_EPTF_UIHandler_embeddedwidgets(v_xuls, pl_xul.tabpage.embeddedwidgets);
        }
        case (wtHbox){
          f_EPTF_UIHandler_embeddedwidgets(v_xuls, pl_xul.hbox.embeddedwidgets);
        }
        case (wtChart){
          f_EPTF_UIHandler_TraceList(pl_index, v_xuls, pl_xul.chart.tracegroups);
        }
        case (wtToolbar) {
          var ttcn_ericsson_se_protocolModules_xtdp_xtdl.Toolbarelements toolbarElements;
          f_EPTF_UIHandler_Toolbarelements(v_xuls, toolbarElements);
          //        v_xul.toolbar.toolbarelements :=
          for (var integer i := 0; i < sizeof(toolbarElements.toolbarelement_list); i := i + 1) {
            if (ischosen(toolbarElements.toolbarelement_list[i].choice.toolbarbutton)) {
              pl_xul.toolbar.choice_list[i].toolbarbutton := toolbarElements.toolbarelement_list[i].choice.toolbarbutton;
            } else if (ischosen(toolbarElements.toolbarelement_list[i].choice.pushbutton)) {
              pl_xul.toolbar.choice_list[i].pushbutton := toolbarElements.toolbarelement_list[i].choice.pushbutton;
            } else if (ischosen(toolbarElements.toolbarelement_list[i].choice.togglebutton)) {
              pl_xul.toolbar.choice_list[i].togglebutton := toolbarElements.toolbarelement_list[i].choice.togglebutton;
            }else {
              pl_xul.toolbar.choice_list[i].separator := toolbarElements.toolbarelement_list[i].choice.separator;
            }
          }
        }
        case (wtTree){
          f_EPTF_UIHandler_Treecols(v_xuls, pl_xul.tree.treecols);
          var integer vl_dummy := 0;
          f_EPTF_UIHandler_treechildren(v_xuls, sizeof(pl_xul.tree.treecols.treecolgroups.treecolgroup_list),pl_xul.tree.treechildren, pl_index, vl_dummy);
        }
        case (wtListbox){
          f_EPTF_UIHandler_Listitems(v_xuls, pl_xul.listbox.listitemgroups);
        }
        case (wtMenulist){
          f_EPTF_UIHandler_Menupopup(v_xuls, pl_xul.menulist.menupopup);
        }
        case (wtDistributionchart){
          f_EPTF_UIHandler_Distributionchart(pl_index, pl_xul.distributionchart);
        }
        case (wtMetaIterator) {
            // if metaiterator is kept, it will be replaced inside f_EPTF_UIHandler_treechildren, f_EPTF_UIHandler_Listitems etc under the other cases
        }
        case else{
          if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
            f_EPTF_UIHandler_debug(%definitionId&": This widget has no children: "&log2str(v_UIHandler_guiItemList[pl_index]));
          }
        }
      }

    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_buildchildrenXULs
    //
    //  Purpose:
    //    Builds a list of the given widget's childrens
    //
    //  Parameters:
    //    pl_index - *in* <integer> - index in GuiRecItem
    //    pl_xuls   - *out* <EPTF_UIHandler_WidgetsList>
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_buildchildrenXULs(
      in integer pl_index,
      out EPTF_UIHandler_WidgetsList pl_xuls,
      in boolean pl_processMetaIterator := false)
    runs on EPTF_UIHandler_Private_CT {

      pl_xuls := {};

      if(pl_processMetaIterator) {
        var EPTF_IntegerList vl_nonMetaChildren := f_EPTF_UIHandler_getNonMetaChildren(pl_index);
        for (var integer i:=0;i<sizeof(vl_nonMetaChildren);i:=i+1){
          f_EPTF_UIHandler_buildchildrenXUL(vl_nonMetaChildren[i], pl_xuls[i], true);
        }
      }
      else {
        for (var integer i:=0;i<sizeof(v_UIHandler_guiItemList[pl_index].children);i:=i+1){
          f_EPTF_UIHandler_buildchildrenXUL(v_UIHandler_guiItemList[pl_index].children[i], pl_xuls[i]);
        }
      }

      //action("***DONE processing children of                v_UIHandler_guiItemList[",pl_index,"]: ", v_UIHandler_guiItemList[pl_index]);
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_buildXUL
    //
    //  Purpose:
    //    Builds the whole XUL tree, that describes the layout of the GUI.
    ///////////////////////////////////////////////////////////
    friend function f_EPTF_UIHandler_buildXUL(
      out Widgets pl_xul,
      in boolean pl_imageNeeded := true)
    runs on EPTF_UIHandler_Private_CT {
      // ONLY ONE WINDOW SUPPORTED, THAT CONAINS ALL THE WIDGETS.
      if (0 == sizeof(v_UIHandler_guiItemList))
      {
        f_EPTF_UIHandler_error("No window in GuiItemList!");
      }
      pl_xul := v_UIHandler_guiItemList[v_UIHandler_windowIndex].XULformat;
      var EPTF_UIHandler_WidgetsList xuls;
      f_EPTF_UIHandler_buildchildrenXULs(v_UIHandler_windowIndex, xuls);
      f_EPTF_UIHandler_embeddedwidgets(xuls, pl_xul.window.embeddedwidgets);
      if(pl_imageNeeded){
        for ( var integer i := 0; i < sizeof(xuls) ; i := i+1 )
        {
          if (ischosen(xuls[i].image)) {
            var boolean vl_idx := false;
            for ( var integer j := 0; j < sizeof(pl_xul.window.image_list) ; j := j+1 )
            {
              if(pl_xul.window.image_list[j].id == xuls[i].image.id){vl_idx := true;}
            }
            if(not vl_idx){
              pl_xul.window.image_list[sizeof(pl_xul.window.image_list)] := xuls[i].image;
            }
          }
        }
      } else {
        pl_xul.window.image_list := {}
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromWindow
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_window - *inout* *Windowtype* - possible window items (tabbox, hbox)
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromWindow(
      inout Windowtype pl_window,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean {
      pl_widgetExists := false;
      if (pl_window.id == "") {
        return false;
      }
      pl_window.id := f_EPTF_UIHandler_setWidgetID(pl_window.id);
      var charstring vl_id := f_EPTF_UIHandler_unichar2charstring(pl_window.id);
      v_UIHandler_windowIndex := f_EPTF_UIHandler_addWidgetRec({
          vl_id,
          wtWindow,
          omit,
          -1,
          {},
          omit,
          {window := f_EPTF_UIHandler_deleteChildrenFromWindow(pl_window)}, false},pl_widgetExists);
      if(-1 == v_UIHandler_windowIndex){
        return false;
      }
      var boolean bool:=true;
      for ( var integer i := 0; i < sizeof(pl_window.image_list) ; i := i+1 ) {
        bool := f_EPTF_UIHandler_appendImage(pl_window.image_list[i], v_UIHandler_windowIndex, pl_widgetExists)
      }
      if (0 != sizeof(pl_window.embeddedwidgets.embeddedwidget_list) ) {
        bool := f_EPTF_UIHandler_appendAllWidgetIdsFromEmbeddedwidgets(pl_window.embeddedwidgets, v_UIHandler_windowIndex,pl_widgetExists);
      }
      return bool;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromWidgetList
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widgets and their children to the GUI item list
    //
    //  Parameters:
    //    pl_widgets - *in* *WidgetList* - possible widgetList items (tabbox, tree, hbox, textlabel, spacer, button, textbox)
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    //
    //  Return Value:
    //    -
    //
    //  Errors:
    //    none
    //
    //  Detailed Comments:
    //    Check when a new widget type has been added
    //
    ///////////////////////////////////////////////////////////
    /*  private function f_EPTF_UIHandler_appendAllWidgetIdsFromWidgetList(
    in EPTF_UIHandler_WidgetList pl_widgets,
    in integer pl_parentIdx,
    inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
    pl_widgetExists := false;
    var boolean vl_ret := true;
    var integer maxIndex := sizeof(pl_widgets);
    for (var integer vl_i:=0; (vl_i < maxIndex) and vl_ret; vl_i := vl_i+1 ) {
    select(pl_widgets[vl_i]){
    case ({tabbox := ?}){
    vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromTabbox(pl_widgets[vl_i].tabbox, pl_parentIdx, pl_widgetExists);
    }
    case ({tree := ?}) {
    vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromTree(pl_widgets[vl_i].tree, pl_parentIdx, pl_widgetExists);
    }
    case ({hbox := ?}) {
    vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromHbox(pl_widgets[vl_i].hbox, pl_parentIdx, pl_widgetExists);
    }
    case ({label_ := ?}) {
    vl_ret := vl_ret and f_EPTF_UIHandler_appendLabel(pl_widgets[vl_i].label_,pl_parentIdx, pl_widgetExists);
    }
    case ({spacer := ?}) {
    vl_ret := vl_ret and f_EPTF_UIHandler_appendSpacer(pl_widgets[vl_i].spacer,pl_parentIdx, pl_widgetExists);
    }
    case ({button := ?}) {
    vl_ret := vl_ret and f_EPTF_UIHandler_appendButton(pl_widgets[vl_i].button,pl_parentIdx, pl_widgetExists);
    }
    case ({textbox := ?}) {
    vl_ret := vl_ret and f_EPTF_UIHandler_appendTextbox(pl_widgets[vl_i].textbox,pl_parentIdx, pl_widgetExists);
    }
    case( {chart := ?}) {
    vl_ret := vl_ret and f_EPTF_UIHandler_appendChart(pl_widgets[vl_i].chart,pl_parentIdx, pl_widgetExists);
    }
    case({toolbar := ?}) {
    vl_ret := vl_ret and f_EPTF_UIHandler_appendToolbar(pl_widgets[vl_i].toolbar,pl_parentIdx, pl_widgetExists);
    }
    case({toolbarbutton := ?}) {
    vl_ret := vl_ret and f_EPTF_UIHandler_appendToolbarbutton(pl_widgets[vl_i].toolbarbutton,pl_parentIdx, pl_widgetExists);
    }
    case({listbox := ?}) {
    vl_ret := vl_ret and f_EPTF_UIHandler_appendListbox(pl_widgets[vl_i].listbox,pl_parentIdx, pl_widgetExists);
    }
    case({numericalwidget := ?}) {
    vl_ret := vl_ret and f_EPTF_UIHandler_appendNumericalwidget(pl_widgets[vl_i].numericalwidget,pl_parentIdx, pl_widgetExists);
    }
    case({menulist := ?}) {
    vl_ret := vl_ret and f_EPTF_UIHandler_appendMenulist(pl_widgets[vl_i].menulist,pl_parentIdx, pl_widgetExists);
    }
    case ({distributionchart := ?}){
    vl_ret := vl_ret and f_EPTF_UIHandler_appendDistributionchart(pl_widgets[vl_i].distributionchart,pl_parentIdx, pl_widgetExists);
    }
    case else {
    f_EPTF_UIHandler_warning("Unhandled widget type!");
    //          f_EPTF_Base_stop();
    }
    }
    }
    return vl_ret;
    }*/

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromEmbeddedwidgets
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widgets and their children to the GUI item list
    //
    //  Parameters:
    //    pl_widgets - *in* *WidgetList* - possible widgetList items (tabbox, tree, hbox, textlabel, spacer, button, textbox)
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    //
    //  Return Value:
    //    -
    //
    //  Errors:
    //    none
    //
    //  Detailed Comments:
    //    Check when a new widget type has been added
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromEmbeddedwidgets(
      in Embeddedwidgets pl_widgets,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      var boolean vl_ret := true;
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": In widgets incoming: " & log2str(pl_widgets));
      }
      var integer vl_embeddedwidget_list_size := sizeof(pl_widgets.embeddedwidget_list);
      for(var integer vl_i:=0; vl_i < vl_embeddedwidget_list_size and vl_ret; vl_i := vl_i + 1){
        if(ischosen(pl_widgets.embeddedwidget_list[vl_i].iterator)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_Config_processIterator( pl_widgets.embeddedwidget_list[vl_i], pl_parentIdx, true, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].externalvalue)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_Config_processIterator( pl_widgets.embeddedwidget_list[vl_i], pl_parentIdx, true, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].tabpages)){
          //vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromTabbox(pl_widgets.embeddedwidget_list[vl_i].tabbox, pl_parentIdx, pl_widgetExists);
          vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromTabpages(pl_widgets.embeddedwidget_list[vl_i].tabpages, pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].tree)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromTree(pl_widgets.embeddedwidget_list[vl_i].tree, pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].hbox)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromHbox(pl_widgets.embeddedwidget_list[vl_i].hbox, pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].label_)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendLabel(pl_widgets.embeddedwidget_list[vl_i].label_,pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].spacer)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendSpacer(pl_widgets.embeddedwidget_list[vl_i].spacer,pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].button)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendButton(pl_widgets.embeddedwidget_list[vl_i].button,pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].textbox)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendTextbox(pl_widgets.embeddedwidget_list[vl_i].textbox,pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].chart)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendChart(pl_widgets.embeddedwidget_list[vl_i].chart,pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].toolbar)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendToolbar(pl_widgets.embeddedwidget_list[vl_i].toolbar,pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].listbox)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendListbox(pl_widgets.embeddedwidget_list[vl_i].listbox,pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].numericalwidget)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendNumericalwidget(pl_widgets.embeddedwidget_list[vl_i].numericalwidget,pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].menulist)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendMenulist(pl_widgets.embeddedwidget_list[vl_i].menulist,pl_parentIdx, pl_widgetExists);
        }
        else if (ischosen(pl_widgets.embeddedwidget_list[vl_i].distributionchart)){
          vl_ret := vl_ret and f_EPTF_UIHandler_appendDistributionchart(pl_widgets.embeddedwidget_list[vl_i].distributionchart,pl_parentIdx, pl_widgetExists);
        }
        else if (ischosen(pl_widgets.embeddedwidget_list[vl_i].pushbutton)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendPushbutton(pl_widgets.embeddedwidget_list[vl_i].pushbutton,pl_parentIdx, pl_widgetExists);
        }
        else if (ischosen(pl_widgets.embeddedwidget_list[vl_i].togglebutton)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendTogglebutton(pl_widgets.embeddedwidget_list[vl_i].togglebutton,pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_widgets.embeddedwidget_list[vl_i].htmlcode)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendHtmlcode(pl_widgets.embeddedwidget_list[vl_i].htmlcode,pl_parentIdx, pl_widgetExists);
        } else {
          f_EPTF_UIHandler_warning(%definitionId&": Unhandled widget type!");
          //          f_EPTF_Base_stop();
        }
      }
      return vl_ret;
    }

    //To make WidgetId optional
    type record XULWidgetId{
      universal charstring widgetId optional
    }
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_XULWidgetId2charstr
    //
    //  Purpose:
    //  Converts a widget ID to a charstring
    //
    //  Detailed Comments:
    //  In the XUL structures the widget ID is universal charstring. It must be changed to charstring.
    //  There are cases when the ID of widgets is optional. In order to handle easier it
    //  has to be changed to an empty string.
    ///////////////////////////////////////////////////////////
    public function f_EPTF_UIHandler_XULWidgetId2charstr(in XULWidgetId pl_id)
    return charstring{
      if(ispresent(pl_id.widgetId)){
        if (lengthof(pl_id.widgetId)==0) {return ""}
        return f_EPTF_UIHandler_unichar2charstring(pl_id.widgetId);
      }else{
        return "";
      }
    }

    friend function f_EPTF_UIHandler_unichar2charstring(in universal charstring pl_uni)
    return charstring{
      var charstring vl_char := "";
      for (var integer vl_i:= 0;vl_i<lengthof(pl_uni);vl_i:=vl_i+1)
      {
        vl_char := vl_char & int2char(unichar2int(pl_uni[vl_i]));
      }
      return vl_char
    }

    friend function  f_EPTF_UIHandler_setWidgetID(in template universal charstring pl_id)
    runs on EPTF_UIHandler_Private_CT
    return universal charstring{
      if(not isvalue(pl_id) or 0 == lengthof(pl_id)){
       return f_EPTF_UIHandler_getrandomid();
      }
      var integer vl_idx;
      var boolean vl_isexisting := (valueof(pl_id) != "" and f_EPTF_str2int_HashMap_Find(v_UIHandler_widgetHashMapId, f_EPTF_UIHandler_unichar2charstring(valueof(pl_id)), vl_idx));
      if(vl_isexisting == true){    // old  -1 != vl_prevIdx
        if(v_UIHandler_customGUIProcess){
          //: need to handle in XML process
          //if(v_UIHandler_iteratorChangeInProgress == true){
            var charstring vl_storeOrigId := f_EPTF_UIHandler_unichar2charstring(valueof(pl_id));
            //generaljunk idt.
            var universal charstring vl_unichar := f_EPTF_UIHandler_getrandomid();
            f_EPTF_UIHandler_warning(%definitionId&": Wrong widget ID: "& vl_storeOrigId & ". It is already in use. The new widget created by an iterator is renamed to: " & f_EPTF_UIHandler_unichar2charstring(vl_unichar) &". In order to avoid any problems please rename the widget in your customgui xml file.");
            return vl_unichar;
         // }
        }
      }
      return valueof(pl_id);
    }

    //Gets the widgetId
    friend function f_EPTF_UIHandler_getWidgetID(in Widgets pl_widget, out charstring pl_widgetId)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
        if(ischosen(pl_widget.window)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.window.id);
          return true;
        }
        else if(ischosen(pl_widget.iterator )) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.iterator.id);
          return true;
        }
        else if(ischosen(pl_widget.externalvalue )) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.externalvalue.id);
          return true;
        }
        else if(ischosen(pl_widget.treecol )) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.treecol.id);
          return true;
        }
        else if(ischosen(pl_widget.treecell )) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.treecell.id);
          return true;
        }
        else if(ischosen(pl_widget.trace )) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.trace.id);
          return true;
        }
        else if(ischosen(pl_widget.toolbarbutton )) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.toolbarbutton.id);
          return true;
        }
        else if(ischosen(pl_widget.tabpage )) {
          if(ispresent(pl_widget.tabpage.id)) {
            pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.tabpage.id);
          } else {
            pl_widgetId := f_EPTF_UIHandler_unichar2charstring(f_EPTF_UIHandler_getrandomid());
          }
          return true;
        }
        else if(ischosen(pl_widget.listitem )) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.listitem.id);
          return true;
        }
        else if(ischosen(pl_widget.menuitem )) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.menuitem.id);
          return true;
        }
        else if(ischosen(pl_widget.distributionchart )) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.distributionchart.id);
          return true;
        }
        else if(ischosen(pl_widget.valuelist )) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.valuelist.id);
          return true;
        }
        else if(ischosen(pl_widget.image )) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.image.id);
          return true;
        }
        else if(ischosen(pl_widget.tabpages)){
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.tabpages.id);
          return true;
        }
        else if(ischosen(pl_widget.tree)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.tree.id);
          return true;
        }
        else if(ischosen(pl_widget.hbox)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.hbox.id);
          return true;
        }
        else if(ischosen(pl_widget.label_)) {
          if(ispresent(pl_widget.label_.id) and pl_widget.label_.id != omit) {
            pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.label_.id);
          } else {
            pl_widgetId := "";
          }
          return true;
        }
        else if(ischosen(pl_widget.spacer)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.spacer.id);
          return true;
        }
        else if(ischosen(pl_widget.button)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.button.id);
          return true;
        }
        else if(ischosen(pl_widget.textbox)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.textbox.id);
          return true;
        }
        else if(ischosen(pl_widget.chart)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.chart.id);
          return true;
        }
        else if(ischosen(pl_widget.toolbar)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.toolbar.id);
          return true;
        }
        else if(ischosen(pl_widget.listbox)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.listbox.id);
          return true;
        }
        else if(ischosen(pl_widget.numericalwidget)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.numericalwidget.id);
          return true;
        }
        else if(ischosen(pl_widget.menulist)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.menulist.id);
          return true;
        }
        else if (ischosen(pl_widget.distributionchart)){
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.distributionchart.id);
          return true;
        }
        else if (ischosen(pl_widget.pushbutton)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.pushbutton.id);
          return true;
        }
        else if (ischosen(pl_widget.togglebutton)) {
          pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.togglebutton.id);
          return true;
        }
        else if(ischosen(pl_widget.treerow )) {
          pl_widgetId := "";
          return true;
        }
        else if(ischosen(pl_widget.toolbarelements )) {
          pl_widgetId := "";
          return true;
        }
        else if(ischosen(pl_widget.tracelist )) {
          pl_widgetId := "";
          return true;
        }
        else if(ischosen(pl_widget.treecols )) {
          pl_widgetId := "";
          return true;
        }
        else if(ischosen(pl_widget.treechildren )) {
          pl_widgetId := "";
          return true;
        }
        else if(ischosen(pl_widget.treeitem )) {
          pl_widgetId := "";
          return true;
        }
        else if(ischosen(pl_widget.separator )) {
          if(ispresent(pl_widget.separator.id)){
            pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.separator.id);
          } else {
            pl_widgetId := "";
          }
          return true;
        }
        else if(ischosen(pl_widget.htmlcode )) {
          if(ispresent(pl_widget.htmlcode.id)){
            pl_widgetId := f_EPTF_UIHandler_unichar2charstring(pl_widget.htmlcode.id);
          } else {
            pl_widgetId := "";
          }
          return true;
        } else {
          f_EPTF_UIHandler_warning(%definitionId&": Unhandled widget type! : "&log2str(pl_widget));
          //          f_EPTF_Base_stop();
        }
      return false;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_getrandomid
    //
    //  Purpose:
    //    Returns a generated unique widget ID. See also <c_EPTF_UIHandler_widgetIdPrefix>
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_getrandomid(in boolean pl_notVisible := false)
    runs on EPTF_UIHandler_Private_CT
    return universal charstring {
      var charstring vl_id;
      if(pl_notVisible){
        vl_id := c_EPTF_UIHandler_notVisibleWidgetIdPrefix & int2str(v_EPTF_UIHandler_generatedNotVisibleIdCounter);
        v_EPTF_UIHandler_generatedNotVisibleIdCounter := v_EPTF_UIHandler_generatedNotVisibleIdCounter + 1;
      } else {
        vl_id := c_EPTF_UIHandler_widgetIdPrefix & int2str(v_EPTF_UIHandler_generatedIdCounter);
        v_EPTF_UIHandler_generatedIdCounter := v_EPTF_UIHandler_generatedIdCounter + 1;
      }
      return vl_id;
    }


    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromTabpages
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_tabpages - *in* *Tabpages* - possible tabpages items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromTabpages(
      inout Tabpages pl_tabpages,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_tabpages.id := f_EPTF_UIHandler_setWidgetID(pl_tabpages.id)
      var charstring tabpagesid := f_EPTF_UIHandler_unichar2charstring(pl_tabpages.id)

      var integer vl_idx := f_EPTF_UIHandler_addWidgetRec({
          tabpagesid,
          wtTabpages,
          omit,
          pl_parentIdx,
          {},
          omit,
          {tabpages := f_EPTF_UIHandler_deleteChildrenFromTabpages(pl_tabpages)}, false}, pl_widgetExists);

      if(-1 != vl_idx){
        // Call children...
        //******************************************************************
        return f_EPTF_UIHandler_appendAllWidgetIdsFromTabpagegroup_list(pl_tabpages.tabpagegroups.tabpagegroup_list, vl_idx, pl_widgetExists)
      }
      return false;
    }



    private type union EPTF_UIHandler_TabpanelsParentId{
      integer tabBoxIdx,
      //integer tabIdxInTabs,
      integer tabIdx
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromTabpages
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_tabpages - *in* <Tabpages> - possible tabpages items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromTabpagegroup_list(
      inout Tabpagegroups.tabpagegroup_list pl_tabpagegroup_list,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean {
      pl_widgetExists := false;
      var boolean vl_ret := true;

      //var EPTF_UIHandler_HandledWidgetType vl_parentType := v_UIHandler_guiItemList[pl_parentIdx].widgetType;
      var integer i:=0;
      var integer vl_tabpagegroup_list_size := sizeof(pl_tabpagegroup_list);
      while ( isbound(pl_tabpagegroup_list) and (i < vl_tabpagegroup_list_size) and vl_ret )
      {
        if (ischosen(pl_tabpagegroup_list[i].tabpage)){
          //: GIKXLZ, vl_ret change
          f_EPTF_UIHandler_appendAllWidgetIdsFromTabpage(pl_tabpagegroup_list[i].tabpage, pl_parentIdx, pl_widgetExists);
        }
        else if (ischosen(pl_tabpagegroup_list[i].iterator)){
          f_EPTF_UIHandler_Config_processTabpageiterator(pl_tabpagegroup_list[i], pl_parentIdx, true, pl_widgetExists)
        }
        else if (ischosen(pl_tabpagegroup_list[i].externalvalue)){
          f_EPTF_UIHandler_Config_processTabpageiterator(pl_tabpagegroup_list[i], pl_parentIdx, true, pl_widgetExists)
        } else {
          f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_tabpagegroup_list[i]));
          vl_ret := false;
        }
        i := i + 1;
      } //for
      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromExternaldatagroup_list
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_tabpages - *in* <Tabpages> - possible tabpages items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromExternaldatagroup_list(
      in Externaldatagroups.externaldatagroup_list pl_externaldatagroup_list,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists,
      inout Distributionchart pl_xul)
    runs on EPTF_UIHandler_Private_CT
    return boolean {
      pl_widgetExists := false;
      var boolean vl_ret := true;

      var integer vl_treeitems_size := sizeof(pl_externaldatagroup_list);
      for(var integer i := 0; i < vl_treeitems_size and vl_ret; i := i + 1 ){
        if (ischosen(pl_externaldatagroup_list[i].valuelist_list)){
          for(var integer j := 0; j <sizeof(pl_externaldatagroup_list[i].valuelist_list); j := j + 1) {
            vl_ret := vl_ret and f_EPTF_UIHandler_appendValuelist(pl_externaldatagroup_list[i].valuelist_list[j], pl_parentIdx, pl_widgetExists);
            //pl_xul.valuelist_list[sizeof(pl_xul.valuelist_list)] := pl_externaldatagroup_list[i].valuelist_list[j];
          }
        }
        else if (ischosen(pl_externaldatagroup_list[i].iterator)){
          f_EPTF_UIHandler_Config_processValueListiterator(pl_externaldatagroup_list[i], pl_xul, pl_parentIdx, true, pl_widgetExists)
        }
        else if (ischosen(pl_externaldatagroup_list[i].externalvalue)){
          f_EPTF_UIHandler_Config_processValueListiterator(pl_externaldatagroup_list[i], pl_xul, pl_parentIdx, true, pl_widgetExists);
        } else {
          f_EPTF_Base_assert(%definitionId & ": Invalid element to be added: " & log2str(pl_externaldatagroup_list[i]), false);
          vl_ret := false;
        }
      } //for
      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromTabpage
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_tabpage - *in* <Tabpage> - possible tabpage items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromTabpage(
      inout Tabpage pl_tabpage,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean {
      pl_widgetExists := false;
      var boolean vl_ret := true;
      var integer vl_tabPage_id;
      if(v_UIHandler_guiItemList[pl_parentIdx].widgetType == wtTabpage) {
        v_UIHandler_guiItemList[pl_parentIdx].XULformat.tabpage.maxheight := pl_tabpage.maxheight;
        v_UIHandler_guiItemList[pl_parentIdx].XULformat.tabpage.orientation := pl_tabpage.orientation;
        var Embeddedwidgets e_widgets := pl_tabpage.embeddedwidgets;
        pl_tabpage := v_UIHandler_guiItemList[pl_parentIdx].XULformat.tabpage;
        pl_tabpage.embeddedwidgets := e_widgets;
        vl_tabPage_id := pl_parentIdx;

        if (0 != sizeof(pl_tabpage.embeddedwidgets.embeddedwidget_list )) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromEmbeddedwidgets(pl_tabpage.embeddedwidgets, vl_tabPage_id, pl_widgetExists);
        }
      } else if( v_UIHandler_guiItemList[pl_parentIdx].widgetType == wtWindow){
        vl_tabPage_id := f_EPTF_UIHandler_appendTabPage(pl_tabpage, pl_parentIdx, pl_widgetExists);
        if (0 != sizeof(pl_tabpage.embeddedwidgets.embeddedwidget_list )) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromEmbeddedwidgets(pl_tabpage.embeddedwidgets, pl_parentIdx, pl_widgetExists);
        }
      } else {
        vl_tabPage_id := f_EPTF_UIHandler_appendTabPage(pl_tabpage, pl_parentIdx, pl_widgetExists);
        if (0 != sizeof(pl_tabpage.embeddedwidgets.embeddedwidget_list )) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromEmbeddedwidgets(pl_tabpage.embeddedwidgets, vl_tabPage_id, pl_widgetExists);
        }
      }

      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromTree
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widgets and their children to the GUI item list
    //
    //  Parameters:
    //    pl_tree - *in* <Tree> - possible tree items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromTree(
      in Tree pl_tree,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": "&log2str(pl_tree));
      }
      pl_widgetExists := false;
      var boolean vl_ret := false;
      var Tree vl_xtdpTree := f_EPTF_UIHandler_deleteChildrenFromTree(pl_tree);
      vl_xtdpTree.rows := 0.0;  // initially tree doesn't have rows in the counter. This counter is incremented in f_EPTF_UIHandler_appendAllWidgetIdsFromTreeRowGroups
      pl_tree.id := f_EPTF_UIHandler_setWidgetID(pl_tree.id);
      var integer vl_idx := f_EPTF_UIHandler_addWidgetRec(
        {
          /*id*/ f_EPTF_UIHandler_unichar2charstring(pl_tree.id),
          /*widgetType*/wtTree,
          /*widgetDataType*/omit,
          /*parentIdx*/pl_parentIdx,
          /*children*/{},
          /*widgetData*/{treeData := {{},0}},
          /*XULformat*/{tree := vl_xtdpTree},
          /*xuldisabled*/false
        },
        pl_widgetExists);
      if(-1 != vl_idx ){
        // Calling children...
        if(f_EPTF_UIHandler_appendAllWidgetIdsFromTreecols(pl_tree.treecols.treecolgroups.treecolgroup_list, vl_idx, pl_widgetExists)){
          //Treechildren
          vl_ret := f_EPTF_UIHandler_appendAllWidgetIdsFromTreeItemGroups(pl_tree.treechildren.treeitemgroups.treeitemgroup_list, vl_idx, pl_widgetExists);
          // if not enough row is defined, append empty rows to the tree
          var integer vl_rowNum := 0;
          if(ispresent(pl_tree.rows)) {
            vl_rowNum := float2int(pl_tree.rows);
          }

          for (var integer i:= float2int(v_UIHandler_guiItemList[vl_idx].XULformat.tree.rows);  i<vl_rowNum; i := i+1) {
            var Treerow vl_UIHandler_XSD_emptyTreeRow := c_UIHandler_XSD_emptyTreeRow;
            vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromTreeCellGroups(vl_UIHandler_XSD_emptyTreeRow.treecellgroups.treecellgroup_list, vl_idx, pl_widgetExists);
            if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
              f_EPTF_UIHandler_debug(%definitionId&": Empty row added to tree since not enough rows specified");
            }
          }
          //if(float2int(v_UIHandler_guiItemList[vl_idx].XULformat.tree.rows)<vl_rowNum){
            v_UIHandler_guiItemList[vl_idx].XULformat.tree.rows := int2float(vl_rowNum);
          //}
        }
      }

      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendTreecol
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_col - *in* <Treecol> - tree column item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendTreecol(
      in Treecol pl_col,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return integer{
      pl_widgetExists := false;
      pl_col.id := f_EPTF_UIHandler_setWidgetID(pl_col.id);
      pl_col.id := f_EPTF_UIHandler_setWidgetID(pl_col.id);
      var charstring tid := f_EPTF_UIHandler_unichar2charstring(pl_col.id);
      var integer vl_idx := f_EPTF_UIHandler_addWidgetRec(
        {
          tid,
          wtTreecol,
          pl_col.widgetType,
          pl_parentIdx,
          {},
          omit,
          {treecol := pl_col},
          false
        },
        pl_widgetExists
        //It has no reason. The default value appends to the end.
        /*,
        sizeof(v_UIHandler_guiItemList[pl_parentIdx].widgetData.treeData.columns)*/
      );
      if(-1 != vl_idx){
        var integer vl_nonMetaParentIdx := f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(pl_parentIdx);
        f_EPTF_UIHandler_addIdx2IdxList(v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.columns, vl_idx);
        // add new empty cell to the end of every row
        var integer vl_rowNum := float2int(v_UIHandler_guiItemList[vl_nonMetaParentIdx].XULformat.tree.rows);
        //var integer vl_colNum := sizeof(v_UIHandler_guiItemList[pl_parentIdx].widgetData.treeData.columns);
        var EPTF_UIHandler_GuiItemRec vl_emptyCell := {
          "",
          wtTreecell,
          pl_col.widgetType,
          pl_parentIdx,
          {},
          {cellData := {vl_idx,omit}},
          {treecell := c_UIHandler_XSD_emptyTreeCell},
          false
        }
        var integer vl_cellIdx;
        var boolean vl_dummy;
        var integer vl_col := sizeof(v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.columns)-1;
        for ( var integer i := 0; i < vl_rowNum ; i := i+1 ) {
          // create emplty cell with proper id and insert to its own place
          vl_emptyCell.id := f_EPTF_UIHandler_unichar2charstring(f_EPTF_UIHandler_getrandomid());
          vl_emptyCell.XULformat.treecell.id := vl_emptyCell.id;
          vl_cellIdx := f_EPTF_UIHandler_addWidgetRec(vl_emptyCell, vl_dummy/*, i * vl_colNum + vl_colNum - 1 + vl_colNum*/);
          v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.nofCells := v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.nofCells + 1;
        }
// FIXME
//         if(vl_col > 0){
//                 //rearrange the childrenList in the tree
//                 var EPTF_IntegerList vl_newChildrenList := {};
//                 var integer vl_nofChildren := v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.nofCells;
//                 vl_col := vl_col +1;
//                 var integer vl_ptr1 := -1; //it goes from the start
//                 var integer vl_ptr2 := vl_nofChildren - vl_rowNum - 2;  //it goes from the new column
//                 var integer vl_ptr3 := vl_ptr1;
//                 for ( var integer i := 0; i < vl_nofChildren ; i := i+1 )
//                 {
//                   if (i mod vl_col == vl_col-1) {
//                     vl_ptr2 := vl_ptr2 + 1;
//                     vl_ptr3 := vl_ptr2;
//                   } else {
//                     vl_ptr1:= vl_ptr1 +1;
//                     vl_ptr3 := vl_ptr1;
//                   }
//                   vl_newChildrenList[i] := v_UIHandler_guiItemList[vl_nonMetaParentIdx].children[vl_ptr3];
//                 }
//                 v_UIHandler_guiItemList[vl_nonMetaParentIdx].children := vl_newChildrenList;
//         }
      }
      return vl_idx;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromTreecols
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_cols - *in* <Treecols> - possible tree coloumn items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromTreecols(
      inout Treecolgroups.treecolgroup_list pl_cols,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      var boolean vl_ret := true;

      var integer vl_cols_size := sizeof(pl_cols);
      for (var integer i:=0; i < vl_cols_size and vl_ret; i := i+ 1 ){
        if (ischosen(pl_cols[i].treecol)){
          vl_ret := vl_ret and (-1 != f_EPTF_UIHandler_appendTreecol(pl_cols[i].treecol, pl_parentIdx, pl_widgetExists));
        }
        else if (ischosen(pl_cols[i].iterator)){
          f_EPTF_UIHandler_Config_processTreecoliterator(pl_cols[i], pl_parentIdx, true, pl_widgetExists);
          //The iterator processed and replaced with its represented data.
          //Let's process them. Therefore don't increment the position
        }
        else if (ischosen(pl_cols[i].externalvalue)){
          f_EPTF_UIHandler_Config_processTreecoliterator(pl_cols[i], pl_parentIdx, true, pl_widgetExists);
        } else {
          f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_cols[i]));
          vl_ret := false;
        }
      } //for
      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromTreeItemGroups
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_list - *in* <Treechildren> - possible tree items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromTreeItemGroups(
      in Treeitemgroups.treeitemgroup_list pl_treeitems,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": "&log2str(pl_treeitems))
      }
      pl_widgetExists := false;
      var boolean vl_ret := true;
      var integer vl_treeitems_size := sizeof(pl_treeitems);
      for(var integer i := 0; i < vl_treeitems_size and vl_ret; i := i + 1 ){
        if (ischosen(pl_treeitems[i].treeitem)){
          vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromTreeRowGroups(pl_treeitems[i].treeitem.treerowgroups.treerowgroup_list, pl_parentIdx, pl_widgetExists);
        }
        else if (ischosen(pl_treeitems[i].iterator)){
          f_EPTF_UIHandler_Config_processTreeItemiterator(pl_treeitems[i], pl_parentIdx, true, pl_widgetExists);
        }
        else if (ischosen(pl_treeitems[i].externalvalue)){
          f_EPTF_UIHandler_Config_processTreeItemiterator(pl_treeitems[i], pl_parentIdx, true, pl_widgetExists);
        } else {
          f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_treeitems[i]));
          vl_ret := false;
        }
      } //for
      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromTreeRowGroups
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends Treeitem typed widgetIds
    //    from request to string list of current runtime GUI widgetIds
    //
    //  Parameters:
    //    pl_treeitem - *in* <Treeitem> - possible tree items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromTreeRowGroups(
      inout Treerowgroups.treerowgroup_list pl_treerowgroups,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      var integer vl_nonMetaParentIdx := f_EPTF_UIHandler_getTreeIdx(pl_parentIdx);
      var integer vl_treedataColumns := sizeof(v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.columns);

      var boolean vl_ret := true;
      var integer pl_treerowgroups_size := sizeof(pl_treerowgroups);
      for(var integer i := 0; i < pl_treerowgroups_size and vl_ret; i := i + 1 ){
        if (ischosen(pl_treerowgroups[i].treerow)){
          var integer vl_treerowIdx := f_EPTF_UIHandler_appendTreeRow(pl_parentIdx, pl_widgetExists);
          vl_ret := vl_ret and f_EPTF_UIHandler_appendAllWidgetIdsFromTreeCellGroups(pl_treerowgroups[i].treerow.treecellgroups.treecellgroup_list, vl_treerowIdx, pl_widgetExists);
          // increment rowsize of tree
          if(ispresent(v_UIHandler_guiItemList[vl_nonMetaParentIdx].XULformat.tree.rows)) {
            v_UIHandler_guiItemList[vl_nonMetaParentIdx].XULformat.tree.rows := v_UIHandler_guiItemList[vl_nonMetaParentIdx].XULformat.tree.rows + 1.0;
          } else {
            v_UIHandler_guiItemList[vl_nonMetaParentIdx].XULformat.tree.rows := 1.0;
          }
        }
        else if (ischosen(pl_treerowgroups[i].iterator)){
          f_EPTF_UIHandler_Config_processTreerowiterator(pl_treerowgroups[i], pl_parentIdx, true, pl_widgetExists);
        }
        else if (ischosen(pl_treerowgroups[i].externalvalue)){
          f_EPTF_UIHandler_Config_processTreerowiterator(pl_treerowgroups[i], pl_parentIdx, true, pl_widgetExists);
        } else {
          f_EPTF_Base_assert(%definitionId&": Invalid element to be added: "&log2str(pl_treerowgroups[i]),false);
          vl_ret := false;
        }
      } //for
      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendCell
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_treecell - *in* <Treecell> - possible tree items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    //    pl_columnsIdx - *in* *integer* the idx of the column in v_UIHandler_guiItemList[pl_parentIdx].widgetData.treeData.columns.
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendCell(
      inout Treecell pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists,
      in integer pl_columnsIdx
    ) runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      //Check the column count
      var integer vl_nonMetaParentIdx := f_EPTF_UIHandler_getTreeIdx(pl_parentIdx);
      var integer vl_treedataColumns := sizeof(v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.columns);
      if(0 == vl_treedataColumns){
        f_EPTF_UIHandler_warning("There are no columns in the tree!");
        return false;
      }
      if(vl_treedataColumns<= pl_columnsIdx){
        f_EPTF_UIHandler_error("There are less columns ("&
          int2str(vl_treedataColumns)&
          ")in the tree '"&
          v_UIHandler_guiItemList[vl_nonMetaParentIdx].id&"' than cells.");
        return false;
      }
      //get the row idx from the tree xulformat
      //var integer vl_currentRow := float2int(v_UIHandler_guiItemList[pl_parentIdx].XULformat.tree.rows);
      var integer vl_colIdx := v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.columns[pl_columnsIdx];

      var charstring tid;
      if(ispresent(pl_xul.id)){
        pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
        tid := f_EPTF_UIHandler_unichar2charstring(pl_xul.id);
      }else{
        tid := "";
      }
      if (tid == ""){
        var integer vl_row := 0;
        if (vl_treedataColumns != 0) {
          vl_row := v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.nofCells / vl_treedataColumns;
        }
        tid := f_EPTF_UIHandler_unichar2charstring(f_EPTF_UIHandler_getrandomid());
        pl_xul.id := tid;
      }
      var boolean vl_ret := -1 != f_EPTF_UIHandler_addWidgetRec({
          tid,
          wtTreecell,
          v_UIHandler_guiItemList[vl_colIdx].widgetDataType,
          pl_parentIdx,
          {},
          {cellData := {vl_colIdx, omit}},
          {treecell := f_EPTF_UIHandler_deleteChildrenFromTreecell(pl_xul)}, false},
        pl_widgetExists);

       if (vl_ret) {
         v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.nofCells := v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.nofCells + 1;
        }

      if(ispresent(pl_xul.externaldata)){
        f_EPTF_UIHandler_Config_processExternalData(pl_xul.externaldata, tid);
        pl_xul.externaldata := omit;
      }
      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromTreeCellGroups
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_treerow - *in* <Treerow> - possible tree row items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromTreeCellGroups(
      in Treecellgroups.treecellgroup_list pl_treecellgroups,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists,
      in boolean pl_appendCells := true)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      var boolean vl_ret := true;
      var integer vl_nonMetaParentIdx := f_EPTF_UIHandler_getTreeIdx(pl_parentIdx);

      var EPTF_IntegerList vl_cols := v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.columns;
      var integer vl_nofCells := v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.nofCells;

      // return if too much cell is given in the row

      //vl_rowsize := sizeof(pl_treecellgroups.treecellgroup_list);
      // iterate through the treerow and add cells to internal database

      var integer vl_treecellgroups_size := sizeof(pl_treecellgroups);
      for(var integer i := 0; i < vl_treecellgroups_size and vl_ret; i := i + 1 ){
        if (ischosen(pl_treecellgroups[i].treecell)){
          //Cells
          var integer vl_sizeOfSibling := v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.nofCells;
          var integer vl_columnsIdx := vl_sizeOfSibling mod sizeof(vl_cols);
          vl_ret := vl_ret and f_EPTF_UIHandler_appendCell(pl_treecellgroups[i].treecell, pl_parentIdx, pl_widgetExists, vl_columnsIdx)
        }
        else if (ischosen(pl_treecellgroups[i].iterator)){
          f_EPTF_UIHandler_Config_processTreecelliterator(pl_treecellgroups[i], pl_parentIdx, true, pl_widgetExists);
          //The iterator processed and replaced with its represented data.
          //Let's process them. Therefore don't increment the position
        }
        else if (ischosen(pl_treecellgroups[i].externalvalue)){
          f_EPTF_UIHandler_Config_processTreecelliterator(pl_treecellgroups[i], pl_parentIdx, true, pl_widgetExists);
        } else {
          f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_treecellgroups[i]));
          vl_ret := false;
        }
      } //while

      //Check the processed cellcount
      var integer vl_nofCellsNew := v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.nofCells;
      var integer vl_rowsize := vl_nofCellsNew-vl_nofCells;
      if(vl_rowsize > sizeof(vl_cols)){
        f_EPTF_UIHandler_warning("There are more cells in the row than columns in the tree.");
        return false;
      }
//FIXME: AUTOMATIC CELL APPEND REMOVED
//       if(pl_appendCells){
//         // add empty cells to the row if not enough is given
//         var integer vl_row := 0;
//         var integer vl_columns := sizeof(vl_cols);
//         if (vl_columns != 0) {
//           vl_row := v_UIHandler_guiItemList[vl_nonMetaParentIdx].widgetData.treeData.nofCells / vl_columns;
//         }
//         for (var integer i := vl_rowsize; i < vl_columns and vl_ret; i := i+1) {
//           var Treecell vl_emptyCell := c_UIHandler_XSD_emptyTreeCell;
//           vl_emptyCell.id := v_UIHandler_guiItemList[vl_nonMetaParentIdx].id&"."&int2str(vl_row)&"."&int2str(i);
//           vl_ret := vl_ret and f_EPTF_UIHandler_appendCell(vl_emptyCell, pl_parentIdx, pl_widgetExists, i);
//           //pl_list[i].treecell := c_UIHandler_XSD_emptyTreeCell;
//         }
//         // increment rowsize of tree
//         //v_UIHandler_guiItemList[pl_parentIdx].XULformat.tree.rows := v_UIHandler_guiItemList[pl_parentIdx].XULformat.tree.rows + 1.0;
//       }
      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendAllWidgetIdsFromHbox
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_hbox - *in* <Hbox> - possible Hbox items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendAllWidgetIdsFromHbox(
      inout Hbox pl_hbox,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": pl_hbox"&log2str(pl_hbox)&
          "\npl_parentIdx: "&log2str(pl_parentIdx));
      }
      //    log("DEBUG: ","--- f_EPTF_UIHandler_appendAllWidgetIdsFromHbox", pl_hbox);
      pl_widgetExists := false;
      pl_hbox.id := f_EPTF_UIHandler_setWidgetID(pl_hbox.id);
      var charstring hboxid := f_EPTF_UIHandler_unichar2charstring(pl_hbox.id);
      var integer vl_idx := f_EPTF_UIHandler_addWidgetRec({
          hboxid,
          wtHbox,
          omit,
          pl_parentIdx,
          {},
          omit,
          {hbox := f_EPTF_UIHandler_deleteChildrenFromHbox(pl_hbox)}, false}, pl_widgetExists);

      // Calling children...
      if (0 < sizeof(pl_hbox.embeddedwidgets.embeddedwidget_list) and (-1 != vl_idx)) {
        return f_EPTF_UIHandler_appendAllWidgetIdsFromEmbeddedwidgets(pl_hbox.embeddedwidgets, vl_idx, pl_widgetExists);
      }
      return -1 != vl_idx;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendTabPage
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_tabpage - *in* <Tabpage> - possible Tabpage items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendTabPage(
      inout Tabpage pl_tabpage,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return integer{
      pl_widgetExists := false;
      pl_tabpage.id := f_EPTF_UIHandler_setWidgetID(pl_tabpage.id)
      return f_EPTF_UIHandler_addWidgetRec({
          f_EPTF_UIHandler_unichar2charstring(pl_tabpage.id),
          wtTabpage,
          omit,
          pl_parentIdx,
          {},
          omit,
          {tabpage := f_EPTF_UIHandler_deleteChildrenFromTabpage(pl_tabpage)}, false}, pl_widgetExists);
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendLabel
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_label - *in* <Label> - possible Label items
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendLabel(
      in Label pl_label,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      if(not isbound(pl_label.id) or pl_label.id == omit or 0 == lengthof(pl_label.id)){
        pl_label.id := f_EPTF_UIHandler_getrandomid();
      }
      pl_label.id := f_EPTF_UIHandler_setWidgetID(pl_label.id);
      var charstring labelid := f_EPTF_UIHandler_unichar2charstring(pl_label.id);
      var boolean vl_ret := -1 != f_EPTF_UIHandler_addWidgetRec({
          labelid,
          wtLabel,
          omit,
          pl_parentIdx,
          {},
          omit,
          {label_ := f_EPTF_UIHandler_deleteChildrenFromLabel(pl_label)}, false}, pl_widgetExists);
      if(ispresent(pl_label.externaldata)){
        f_EPTF_UIHandler_Config_processExternalData(pl_label.externaldata, labelid);
        pl_label.externaldata := omit;
      }
      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendSpacer
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_xul - *in* <Spacer> - possible Spacer item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendSpacer(
      inout Spacer pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var charstring spacerid := f_EPTF_UIHandler_unichar2charstring(pl_xul.id);
      return -1 != f_EPTF_UIHandler_addWidgetRec({
          spacerid,
          wtSpacer,
          omit,
          pl_parentIdx,
          {},
          omit,
          {spacer := f_EPTF_UIHandler_deleteChildrenFromSpacer(pl_xul)}, false}, pl_widgetExists);
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendButton
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_xul - *in* <Button> - possible Button item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendButton(
      inout Button pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var charstring vl_id := f_EPTF_UIHandler_unichar2charstring(pl_xul.id);
      var boolean vl_ret := -1 != f_EPTF_UIHandler_addWidgetRec({
          vl_id,
          wtButton,
          omit,
          pl_parentIdx,
          {},
          omit,
          {button := f_EPTF_UIHandler_deleteChildrenFromButton(pl_xul)}, false}, pl_widgetExists);
      if(ispresent(pl_xul.externaldata)){
        f_EPTF_UIHandler_Config_processExternalData(pl_xul.externaldata, vl_id);
        pl_xul.externaldata := omit;
      }
      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendPushbutton
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_xul - *in* <Pushbutton> - possible Pushbutton item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendPushbutton(
      inout Pushbutton pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var charstring vl_id := f_EPTF_UIHandler_unichar2charstring(pl_xul.id);
      if( -1 != f_EPTF_UIHandler_addWidgetRec({
            vl_id,
            wtPushbutton,
            omit,
            pl_parentIdx,
            {},
            omit,
            {pushbutton := f_EPTF_UIHandler_deleteChildrenFromPushbutton(pl_xul)}, false}, pl_widgetExists)){
        if(ispresent(pl_xul.externaldata)){
          f_EPTF_UIHandler_Config_processExternalData(pl_xul.externaldata, vl_id);
          pl_xul.externaldata := omit;
        }
        return true;
      }else{
        return false;
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendTogglebutton
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_xul - *in* <Togglebutton> - possible Togglebutton item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendTogglebutton(
      inout Togglebutton pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var charstring vl_id := f_EPTF_UIHandler_unichar2charstring(pl_xul.id);
      if( -1 != f_EPTF_UIHandler_addWidgetRec({
            vl_id,
            wtTogglebutton,
            omit,
            pl_parentIdx,
            {},
            omit,
            {togglebutton := f_EPTF_UIHandler_deleteChildrenFromTogglebutton(pl_xul)}, false}, pl_widgetExists)){
        if(ispresent(pl_xul.externaldata)){
          f_EPTF_UIHandler_Config_processExternalData(pl_xul.externaldata, vl_id);
          pl_xul.externaldata := omit;
        }
        return true;
      }else{
        return false;
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendTextbox
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_xul - *in* <Textbox> - possible Textbox item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendTextbox(
      inout Textbox pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var charstring vl_id := f_EPTF_UIHandler_unichar2charstring(pl_xul.id);
      if( -1 != f_EPTF_UIHandler_addWidgetRec({
            vl_id,
            wtTextbox,
            omit,
            pl_parentIdx,
            {},
            omit,
            {textbox := f_EPTF_UIHandler_deleteChildrenFromTextbox(pl_xul)}, false}, pl_widgetExists)){
        if(ispresent(pl_xul.externaldata)){
          f_EPTF_UIHandler_Config_processExternalData(pl_xul.externaldata, vl_id);
          pl_xul.externaldata := omit;
        }
        return true;
      }else{
        return false;
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendHtmlcode
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_xul - *in* <Htmlcode> - possible Htmlcode item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendHtmlcode(
      inout Htmlcode pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var charstring vl_id := f_EPTF_UIHandler_unichar2charstring(pl_xul.id);
      if( -1 != f_EPTF_UIHandler_addWidgetRec({
            vl_id,
            wtHtmlcode,
            omit,
            pl_parentIdx,
            {},
            omit,
            {htmlcode := f_EPTF_UIHandler_deleteChildrenFromHtmlcode(pl_xul)}, false}, pl_widgetExists)){
        if(ispresent(pl_xul.externaldata)){
          f_EPTF_UIHandler_Config_processExternalData(pl_xul.externaldata, vl_id);
          pl_xul.externaldata := omit;
        }
        return true;
      }else{
        return false;
      }
    }
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendChart
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_xul - *in* <Chart> - possible Chart item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendChart(
      inout Chart pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var integer vl_idx := f_EPTF_UIHandler_addWidgetRec({
          f_EPTF_UIHandler_unichar2charstring(pl_xul.id),
          wtChart,
          omit,
          pl_parentIdx,
          {},
          omit,
          {chart := f_EPTF_UIHandler_deleteChildrenFromChart(pl_xul)}, false}, pl_widgetExists)
      if(-1 < vl_idx){
        return f_EPTF_UIHandler_Config_processTracegroups(pl_xul.tracegroups.tracegroup_list, vl_idx, pl_widgetExists);
      }
      return false;
    }

    private function f_EPTF_UIHandler_Config_processTracegroups(
      in Tracegroups.tracegroup_list pl_tracegroups,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      var boolean vl_ret := true;
      var integer pl_tracegroups_size := sizeof(pl_tracegroups);
      for(var integer i := 0; i < pl_tracegroups_size and vl_ret; i := i + 1 ){
        if (ischosen(pl_tracegroups[i].trace)) {
          vl_ret := vl_ret and f_EPTF_UIHandler_appendTrace(pl_tracegroups[i].trace, pl_parentIdx, pl_widgetExists);
        }
        else if ( ischosen(pl_tracegroups[i].iterator) ){
          f_EPTF_UIHandler_Config_processTraceiterator(pl_tracegroups[i], pl_parentIdx, true, pl_widgetExists);
        }
        else if ( ischosen(pl_tracegroups[i].externalvalue) ){
          f_EPTF_UIHandler_Config_processTraceiterator(pl_tracegroups[i], pl_parentIdx, true, pl_widgetExists);
        } else {
          f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_tracegroups[i]));
          vl_ret := false;
        }
      }
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": Result : " & log2str(pl_tracegroups));
      }
      return vl_ret;
    }
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendTrace
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_xul - *in* <Trace> - possible Trace item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendTrace(
      inout Trace pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var charstring vl_id := f_EPTF_UIHandler_unichar2charstring(pl_xul.id);
      if( -1 != f_EPTF_UIHandler_addWidgetRec({
            vl_id,
            wtTrace,
            omit,
            pl_parentIdx,
            {},
            omit,
            {trace := f_EPTF_UIHandler_deleteChildrenFromTrace(pl_xul)}, false}, pl_widgetExists)){
        if(ispresent(pl_xul.externaldata)){
          f_EPTF_UIHandler_Config_processExternalData(pl_xul.externaldata, vl_id);
          pl_xul.externaldata := omit;
        }
        return true;
      }else{
        return false;
      }

    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendToolbar
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_xul - *in* <Toolbar> - possible Toolbar item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendToolbar(
      inout Toolbar pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var integer vl_idx := f_EPTF_UIHandler_addWidgetRec({
          f_EPTF_UIHandler_unichar2charstring(pl_xul.id),
          wtToolbar,
          omit,
          pl_parentIdx,
          {},
          omit,
          {toolbar := f_EPTF_UIHandler_deleteChildrenFromToolbar(pl_xul)}, false}, pl_widgetExists);
      if(-1 < vl_idx){
        var boolean vl_ret := true;
        for(var integer vl_i := 0; vl_i < sizeof(pl_xul.choice_list);vl_i := vl_i + 1){
          if(ischosen(pl_xul.choice_list[vl_i].toolbarbutton)){
            vl_ret := vl_ret and f_EPTF_UIHandler_appendToolbarbutton(pl_xul.choice_list[vl_i].toolbarbutton, vl_idx, pl_widgetExists);
          }
          else if(ischosen(pl_xul.choice_list[vl_i].pushbutton)){
            vl_ret := vl_ret and f_EPTF_UIHandler_appendPushbutton(pl_xul.choice_list[vl_i].pushbutton, vl_idx, pl_widgetExists);
          }
          else if(ischosen(pl_xul.choice_list[vl_i].togglebutton)){
            vl_ret := vl_ret and f_EPTF_UIHandler_appendTogglebutton(pl_xul.choice_list[vl_i].togglebutton, vl_idx, pl_widgetExists);
          } else {
            vl_ret := vl_ret and f_EPTF_UIHandler_appendSeparator(pl_xul.choice_list[vl_i].separator, vl_idx, pl_widgetExists);
          }
        }
        return vl_ret;
      }
      return false;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendToolbarelements
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_xul - *in* <Toolbarelements> - possible Toolbar item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendToolbarelements(
      inout Toolbarelements pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      var boolean vl_ret := true;
      for(var integer vl_i := 0; vl_i < sizeof(pl_xul.toolbarelement_list);vl_i := vl_i + 1){
        if (ischosen(pl_xul.toolbarelement_list[vl_i].choice.toolbarbutton)){
          vl_ret := vl_ret and f_EPTF_UIHandler_appendToolbarbutton(pl_xul.toolbarelement_list[vl_i].choice.toolbarbutton, pl_parentIdx, pl_widgetExists);
        }
        else if (ischosen(pl_xul.toolbarelement_list[vl_i].choice.togglebutton)){
          vl_ret := vl_ret and f_EPTF_UIHandler_appendTogglebutton(pl_xul.toolbarelement_list[vl_i].choice.togglebutton, pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_xul.toolbarelement_list[vl_i].choice.separator)){
          vl_ret := vl_ret and f_EPTF_UIHandler_appendSeparator(pl_xul.toolbarelement_list[vl_i].choice.separator, pl_parentIdx, pl_widgetExists);
        }
        else if(ischosen(pl_xul.toolbarelement_list[vl_i].choice.pushbutton)){
          vl_ret := vl_ret and f_EPTF_UIHandler_appendPushbutton(pl_xul.toolbarelement_list[vl_i].choice.pushbutton, pl_parentIdx, pl_widgetExists);
        } else {
          f_EPTF_UIHandler_warning("Unhandled widgettype as a toolbarelement!");
        }
      }
      return vl_ret;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendToolbarbutton
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_xul - *in* <Toolbarbutton> - possible Toolbarbutton item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendToolbarbutton(
      inout Toolbarbutton pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var charstring vl_id := f_EPTF_UIHandler_unichar2charstring(pl_xul.id);
      if( -1 != f_EPTF_UIHandler_addWidgetRec({
            vl_id,
            wtToolbarbutton,
            omit,
            pl_parentIdx,
            {},
            omit,
            {toolbarbutton := f_EPTF_UIHandler_deleteChildrenFromToolbarbutton(pl_xul)}, false}, pl_widgetExists)){
        if(ispresent(pl_xul.externaldata)){
          f_EPTF_UIHandler_Config_processExternalData(pl_xul.externaldata, vl_id);
          pl_xul.externaldata := omit;
        }
        return true;
      }else{
        return false;
      }
    }

    private function f_EPTF_UIHandler_appendListbox(
      inout Listbox pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var integer vl_idx := f_EPTF_UIHandler_addWidgetRec({
          f_EPTF_UIHandler_unichar2charstring(pl_xul.id),
          wtListbox,
          omit,
          pl_parentIdx,
          {},
          omit,
          {listbox := f_EPTF_UIHandler_deleteChildrenFromListbox(pl_xul)}, false}, pl_widgetExists)
      if(ispresent(pl_xul.externaldata)){
    	 f_EPTF_UIHandler_Config_processExternalData(pl_xul.externaldata, f_EPTF_UIHandler_unichar2charstring(pl_xul.id));
   		 pl_xul.externaldata := omit;
   	  }
      if(-1 < vl_idx){
        return f_EPTF_UIHandler_Config_processListitemgroups(pl_xul.listitemgroups.listitemgroup_list, vl_idx, pl_widgetExists)
      }
      return false;
    }

    private function f_EPTF_UIHandler_Config_processListitemgroups(
      inout Listitemgroups.listitemgroup_list pl_listitems,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      var boolean vl_ret := true;
      var integer vl_listitems_size := sizeof(pl_listitems);
      for(var integer i := 0; i < vl_listitems_size and vl_ret; i := i + 1 ){
        if ( ischosen(pl_listitems[i].listitem) ){
          vl_ret := vl_ret and f_EPTF_UIHandler_appendListitem(pl_listitems[i].listitem, pl_parentIdx, pl_widgetExists);
        }
        else if ( ischosen(pl_listitems[i].iterator) ){
          f_EPTF_UIHandler_Config_processListitemiterator(pl_listitems[i], pl_parentIdx, true, pl_widgetExists);
        }
        else if ( ischosen(pl_listitems[i].externalvalue) ){
          f_EPTF_UIHandler_Config_processListitemiterator(pl_listitems[i], pl_parentIdx, true, pl_widgetExists);
        } else {
          f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_listitems[i]));
          vl_ret := false;
        }
      }
      return vl_ret;
    }
    private function f_EPTF_UIHandler_appendListitem(
      inout Listitem pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      return -1 != f_EPTF_UIHandler_addWidgetRec({
          f_EPTF_UIHandler_unichar2charstring(pl_xul.id),
          wtListitem,
          omit,
          pl_parentIdx,
          {},
          omit,
          {listitem := f_EPTF_UIHandler_deleteChildrenFromListitem(pl_xul)}, false}, pl_widgetExists);
    }

    private function f_EPTF_UIHandler_appendNumericalwidget(
      inout Numericalwidget pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      var template Widgettype vt_widgetType;
      select( pl_xul.widgetType )
      {
        case ( floatField )//Note: floatField of Numericalwidgettype
        {
          vt_widgetType := floatField //Note: floatField of Widgettype
        }
        case (integerField)
        {
          vt_widgetType := integerField //Note: integerField of Widgettype
        }
        case else
        {
          vt_widgetType := omit
        }
      }
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var charstring vl_id := f_EPTF_UIHandler_unichar2charstring(pl_xul.id);
      if( -1 != f_EPTF_UIHandler_addWidgetRec({
            vl_id,
            wtNumericalwidget,
            valueof(vt_widgetType),
            pl_parentIdx,
            {},
            omit,
            {numericalwidget := f_EPTF_UIHandler_deleteChildrenFromNumericalwidget(pl_xul)}, false}, pl_widgetExists)){
        if(ispresent(pl_xul.externaldata)){
          f_EPTF_UIHandler_Config_processExternalData(pl_xul.externaldata, vl_id);
          pl_xul.externaldata := omit;
        }
        return true;
      }else{
        return false;
      }
    }

    private function f_EPTF_UIHandler_appendMenulist(
      inout Menulist pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var charstring vl_id := f_EPTF_UIHandler_unichar2charstring(pl_xul.id);
      var integer vl_idx := f_EPTF_UIHandler_addWidgetRec({
          vl_id,
          wtMenulist,
          omit,
          pl_parentIdx,
          {},
          omit,
          {menulist := f_EPTF_UIHandler_deleteChildrenFromMenulist(pl_xul)}, false}, pl_widgetExists)
      if(-1 < vl_idx ){
        var boolean vl_ret;
        if(ispresent(pl_xul.menupopup.choice.menuitemgroups)){
          vl_ret := f_EPTF_UIHandler_appendMenuitemGroups(pl_xul.menupopup.choice.menuitemgroups.menuitemgroup_list, vl_idx, pl_widgetExists);
        } else {
          if(ispresent(pl_xul.menupopup.choice.externaldata_list)){
            if(sizeof(pl_xul.menupopup.choice.externaldata_list) == 1){
              var Menuitemgroups.menuitemgroup_list vl_menuitemgroupList;
              // : what is this: f_EPTF_UIHandler_appendMenuitemGroupsFromExternalData ?
              vl_ret := f_EPTF_UIHandler_appendMenuitemGroupsFromExternalData(vl_menuitemgroupList,vl_id, pl_xul.menupopup.choice.externaldata_list[0], vl_idx, pl_widgetExists);
              vl_ret := f_EPTF_UIHandler_appendMenuitemGroups(vl_menuitemgroupList, vl_idx, pl_widgetExists);
              pl_xul.menupopup.choice := { menuitemgroups := { vl_menuitemgroupList } }
            } else {
              f_EPTF_UIHandler_warning(%definitionId&": Only one externaldata is allowed: "&log2str(pl_xul.menupopup));
              vl_ret := false;
            }
          } else {
            f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_xul.menupopup));
            vl_ret := false;
          }
        }


        if(ispresent(pl_xul.externaldata)){
          f_EPTF_UIHandler_Config_processExternalData(pl_xul.externaldata, vl_id);
          pl_xul.externaldata := omit;
        }
        return vl_ret;
      }
      return false;
    }

    private function f_EPTF_UIHandler_appendMenuitemGroups(
      inout Menuitemgroups.menuitemgroup_list pl_menuitems,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      var boolean vl_ret := true;
      var integer vl_menuitems_size := sizeof(pl_menuitems);
      for(var integer i := 0; i < vl_menuitems_size and vl_ret; i := i + 1 ){
        if ( ischosen(pl_menuitems[i].menuitem) ){
          vl_ret := vl_ret and f_EPTF_UIHandler_appendMenuitem(pl_menuitems[i].menuitem, pl_parentIdx, pl_widgetExists);
        }
        else if ( ischosen(pl_menuitems[i].iterator) ){
          f_EPTF_UIHandler_Config_processMenuitemiterator(pl_menuitems[i], pl_parentIdx, true, pl_widgetExists);
        }
        else if ( ischosen(pl_menuitems[i].externalvalue) ){
          f_EPTF_UIHandler_Config_processMenuitemiterator(pl_menuitems[i], pl_parentIdx, true, pl_widgetExists);
        } else {
          f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_menuitems[i]));
          vl_ret := false;
        }
      }
      return vl_ret;
    }

    private function f_EPTF_UIHandler_appendMenuitemGroupsFromExternalData(
      out Menuitemgroups.menuitemgroup_list pl_xul,
      in charstring pl_widgetId,  //menulist id
      inout Datadescription pl_datadescription,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_xul := {};
      var boolean vl_bool:=false;
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": Started on : " & log2str(pl_datadescription));
      }
      // Ask the UIHandler about the datasource, then send him the question.
      var EPTF_DataSource_Params vl_dataparamList:= {};
      var charstring vl_varName  := "";
      if(ispresent(pl_datadescription.params)){
        for(var integer i := 0; i < sizeof(pl_datadescription.params.dataparam_list); i := i + 1 ){
          var integer vl_dataParamsSize := sizeof(vl_dataparamList);
          vl_dataparamList[vl_dataParamsSize].paramName := f_unichar2charstr(pl_datadescription.params.dataparam_list[i].name); // FIXME
          vl_dataparamList[vl_dataParamsSize].paramValue := f_unichar2charstr(pl_datadescription.params.dataparam_list[i].value_);
        }
      }
      var charstring vl_source := f_unichar2charstr(pl_datadescription.source);

      var charstring vl_ptcname := "";
      if(ispresent(pl_datadescription.ptcname)){ vl_ptcname := f_unichar2charstr(pl_datadescription.ptcname)}

      var charstring vl_element := f_unichar2charstr(pl_datadescription.element);

      var EPTF_UIHandler_GuiItemRec vl_widgetRec;
      var EPTF_Var_DirectContent vl_defaultValue;
      f_EPTF_UIHandler_getWidgetRec(pl_widgetId, vl_widgetRec)
      f_EPTF_UIhandler_simulation_getDefaultValue(vl_widgetRec, vl_defaultValue);

      if(f_EPTF_UIHandler_simulation_getData( vl_varName,
          vl_source,
          vl_ptcname,
          vl_element,
          vl_dataparamList,
          -,
          -,
          vl_defaultValue ) == 0 ){
        var integer vl_varId := f_EPTF_Var_getId(vl_varName);

        if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
          f_EPTF_UIHandler_debug(%definitionId&": widgetId: " & log2str(pl_widgetId) & " varId: " & log2str(vl_varId));
        }

        var EPTF_Var_DirectContent vl_currentContent;
        f_EPTF_Var_getContent(vl_varId, vl_currentContent);
        for (var integer i:=0; i<sizeof(vl_currentContent.charstringlistVal); i:=i+1) {
              pl_xul[i].menuitem.id     := pl_widgetId & "." & vl_currentContent.charstringlistVal[i];
              pl_xul[i].menuitem.label_ := vl_currentContent.charstringlistVal[i];
              pl_xul[i].menuitem.selected := false;
              pl_xul[i].menuitem.externaldata := omit;
        }
        var integer vl_idx := f_EPTF_UIHandler_widgetRecIndex(pl_widgetId);
        f_EPTF_Var_addPostProcFn(vl_varId, {refers(f_EPTF_UIHandler_updateMenulistItemsFromExternaldata), {vl_idx}});

        vl_bool := true;
      } else {
        f_EPTF_UIHandler_error(%definitionId&": Configuration error : Invalid dataSource parameters: \n"&
          "\nSource: "&vl_source&
          "\nPTC : "&vl_ptcname &
          "\nData Name : " &vl_element&
          "\nParams:" & log2str(vl_dataparamList)&
          "\nCheck the warnings above for more info.");
      }
      return vl_bool;
    }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_updateMenulistItemsFromExternaldata
  //
  //  Purpose:
  //
  //
  //  Parameters:
  //    pl_idx - *in* *integer* - EPTF Variable index
  //    pl_argList - *in* <EPTF_IntegerList> - argument list - widgetRecIdx for the menulist
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  function f_EPTF_UIHandler_updateMenulistItemsFromExternaldata(in integer pl_idx, in EPTF_IntegerList pl_argList)
  runs on EPTF_UIHandler_Private_CT
  {
    if(v_UIHandler_createGUIRunning){
      var integer vl_sizeof_postPonedPostProc := sizeof(v_UIHandler_postponedPostProcDB);
      var boolean vl_found := false;
      for (var integer i:=0; i< vl_sizeof_postPonedPostProc; i:=i+1) {
        if(v_UIHandler_postponedPostProcDB[i].idx == pl_idx and v_UIHandler_postponedPostProcDB[i].argList == pl_argList){
          vl_found := true;
        }
      }

      if(not vl_found){
        v_UIHandler_postponedPostProcDB[sizeof(v_UIHandler_postponedPostProcDB)] := {pl_idx, pl_argList};
      }

      return;
    }

    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug("Update menu items from variable : " & log2str(pl_idx) & " args: " & log2str(pl_argList));
    }

    var integer vl_size := sizeof(v_UIHandler_guiItemList[pl_argList[0]].children)
    var EPTF_CharstringList vl_list;
    for (var integer i:=0; i<vl_size; i:=i+1) {
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug("Remove menuitems from menulist: " & log2str(v_UIHandler_guiItemList[v_UIHandler_guiItemList[pl_argList[0]].children[i]].id));
      }
      vl_list[i] :=  v_UIHandler_guiItemList[v_UIHandler_guiItemList[pl_argList[0]].children[i]].id;
    }
    for (var integer i:=0; i<vl_size; i:=i+1) {
      f_EPTF_UIHandler_removeElementFromGui(vl_list[i]);
    }

    var integer vl_subsIdx := f_EPTF_UIHandler_getSubscriptionIdxByWidgetId(v_UIHandler_guiItemList[pl_argList[0]].id);
    if(-1 != vl_subsIdx){
      var EPTF_Var_DirectContent vl_content;
      f_EPTF_Var_getContent(v_UIHandler_openSubscriptions[vl_subsIdx].varIdx, vl_content);
      if(ischosen(vl_content.charstringVal)){
        vl_content := {charstringVal := ""};
      } else if(ischosen(vl_content.intVal)){
        vl_content := {intVal := 0};
      } else {
        vl_content := {charstringVal := ""};
      }
      f_EPTF_Var_adjustContent(v_UIHandler_openSubscriptions[vl_subsIdx].varIdx, vl_content);
    } else {
      f_EPTF_UIHandler_warning(%definitionId&": No variable is added to the widget: "&log2str(v_UIHandler_guiItemList[pl_argList[0]].id));
    }


    var EPTF_Var_DirectContent vl_currentContent;
    f_EPTF_Var_getContent(pl_idx, vl_currentContent);
    var Menuitemgroups.menuitemgroup_list vl_menuitemgroupList := {};
    for (var integer i:=0; i<sizeof(vl_currentContent.charstringlistVal); i:=i+1) {
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug("Add menuitem to menulist: " & log2str(vl_currentContent.charstringlistVal[i]));
      }
      vl_menuitemgroupList[i].menuitem.id     := v_UIHandler_guiItemList[pl_argList[0]].id & "." & vl_currentContent.charstringlistVal[i];
      vl_menuitemgroupList[i].menuitem.label_ := vl_currentContent.charstringlistVal[i];
      vl_menuitemgroupList[i].menuitem.selected := false;
      vl_menuitemgroupList[i].menuitem.externaldata := omit;
    }
    var boolean vl_widgetExists;
    var boolean vl_ret := f_EPTF_UIHandler_appendMenuitemGroups(vl_menuitemgroupList, pl_argList[0], vl_widgetExists);

    if(tsp_EPTF_UIHandler_enableBrowserGUI == true){
      f_EPTF_UIHandler_Browser_reportGUIChanged(v_UIHandler_guiItemList[pl_argList[0]].id);
    }
    for (var integer i:=0; i<sizeof(vl_currentContent.charstringlistVal); i:=i+1) {
      f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleAddElementToGUI(v_UIHandler_guiItemList[pl_argList[0]].id, { menuitem := vl_menuitemgroupList[i].menuitem}));
    }

    if(vl_ret == false){
      f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(vl_menuitemgroupList));
    }

  }

    private function f_EPTF_UIHandler_appendMenuitem(
      inout Menuitem pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      return -1 != f_EPTF_UIHandler_addWidgetRec({
          f_EPTF_UIHandler_unichar2charstring(pl_xul.id),
          wtMenuitem,
          omit,
          pl_parentIdx,
          {},
          omit,
          {menuitem := f_EPTF_UIHandler_deleteChildrenFromMenuitem(pl_xul)}, false}, pl_widgetExists);
    }

    private function f_EPTF_UIHandler_appendDistributionchart(
      inout Distributionchart pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var charstring vl_id := f_EPTF_UIHandler_unichar2charstring(pl_xul.id);
      var integer vl_idx := f_EPTF_UIHandler_addWidgetRec({
          vl_id,
          wtDistributionchart,
          omit,
          pl_parentIdx,
          {},
          omit,
          {distributionchart := f_EPTF_UIHandler_deleteChildrenFromDistributionchart(pl_xul)}, false}, pl_widgetExists)

      if(-1 < vl_idx and not pl_widgetExists){
        var boolean vl_ret := true;
        var integer i:=0;
        while ( isbound(pl_xul.externaldatagroups.externaldatagroup_list) and (i < sizeof(pl_xul.externaldatagroups.externaldatagroup_list)) and vl_ret )
        {
            if (ischosen(pl_xul.externaldatagroups.externaldatagroup_list[i].intervallimits)){
              vl_ret := vl_ret and f_EPTF_UIHandler_appendIntervallimits(pl_xul.externaldatagroups.externaldatagroup_list[i].intervallimits, vl_idx, pl_widgetExists);
            }
            else if (ischosen(pl_xul.externaldatagroups.externaldatagroup_list[i].valuelist_list)){
              for(var integer j := 0; j <sizeof(pl_xul.externaldatagroups.externaldatagroup_list[i].valuelist_list); j := j + 1) {
                vl_ret := vl_ret and f_EPTF_UIHandler_appendValuelist(pl_xul.externaldatagroups.externaldatagroup_list[i].valuelist_list[j], vl_idx, pl_widgetExists);
              }
            }
            else if (ischosen(pl_xul.externaldatagroups.externaldatagroup_list[i].iterator)){
              f_EPTF_UIHandler_Config_processValueListiterator(pl_xul.externaldatagroups.externaldatagroup_list[i], pl_xul, vl_idx, true, pl_widgetExists)
            }
            else if (ischosen(pl_xul.externaldatagroups.externaldatagroup_list[i].externalvalue)){
              f_EPTF_UIHandler_Config_processValueListiterator(pl_xul.externaldatagroups.externaldatagroup_list[i], pl_xul, vl_idx, true, pl_widgetExists)
            } else {
              f_EPTF_UIHandler_warning(%definitionId&": Invalid element to be added: "&log2str(pl_xul.externaldatagroups.externaldatagroup_list[i]));
              vl_ret := false;
            }
            i := i + 1;
        }
        var integer vl_size := sizeof(pl_xul.externaldatagroups.externaldatagroup_list);
        for(var integer j := 0; j < vl_size; j := j + 1){
          if(ischosen(pl_xul.externaldatagroups.externaldatagroup_list[j].intervallimits)){
            var Externaldatagroup temp:= pl_xul.externaldatagroups.externaldatagroup_list[0];
            pl_xul.externaldatagroups.externaldatagroup_list[0] := pl_xul.externaldatagroups.externaldatagroup_list[j];
            pl_xul.externaldatagroups.externaldatagroup_list[j] := temp;
          }
        }
        return vl_ret;
      }
      return false;
    }

    private function f_EPTF_UIHandler_appendIntervallimits(
      inout Intervallimits pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      var EPTF_FloatList vl_floatList := {};
      if(ispresent(pl_xul.choice.value_list)){
        for ( var integer i := 0; i < sizeof(pl_xul.choice.value_list) ; i := i+1 ) {
          vl_floatList[i] := pl_xul.choice.value_list[i];
        }
      }
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var integer vl_exit:= f_EPTF_UIHandler_addWidgetRec({
          /*id*/ f_EPTF_UIHandler_unichar2charstring(pl_xul.id),
          /*widgetType*/ wtIntervallimits,
          /*widgetDataType*/ omit,
          /*parentIdx*/ pl_parentIdx,
          /*children*/ {},
          /*widgetData*/ {distChartData := {intervallimits := vl_floatList}},
          /*XULformat*/ omit,
          /*xuldisabled*/ false}, pl_widgetExists);

      if(ispresent(pl_xul.choice.externaldata)){
        f_EPTF_UIHandler_Config_processExternalData(pl_xul.choice.externaldata, f_EPTF_UIHandler_unichar2charstring(pl_xul.id));
        pl_xul.choice.externaldata := {};
      }
      return -1 != vl_exit;
    }

    private function f_EPTF_UIHandler_appendValuelist(
      inout Valuelist pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      var Valuelist vl_xul := pl_xul;
      vl_xul.externaldata := omit;
      var integer vl_exit:= f_EPTF_UIHandler_addWidgetRec({
         /*id*/ f_EPTF_UIHandler_unichar2charstring(pl_xul.id),
         /*widgetType*/ wtValuelist,
         /*widgetDataType*/ omit,
         /*parentIdx*/ pl_parentIdx,
         /*children*/ {},
         /*widgetData*/ omit,
         /*XULformat*/ {valuelist := vl_xul}, // external data removed from  vl_xul
         /*xuldisabled*/ false}, pl_widgetExists);

      if(ispresent(pl_xul.externaldata)){
        f_EPTF_UIHandler_Config_processExternalData(pl_xul.externaldata, f_EPTF_UIHandler_unichar2charstring(pl_xul.id));
        pl_xul.externaldata := omit;
      }
      return -1 != vl_exit;
    }

    private function f_EPTF_UIHandler_appendImage(
      inout Image pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      return -1 != f_EPTF_UIHandler_addWidgetRec({
          f_EPTF_UIHandler_unichar2charstring(pl_xul.id),
          wtImage,
          omit,
          pl_parentIdx,
          {},
          omit,
          {image := pl_xul}, false}, pl_widgetExists);
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendSeparator
    //
    //  Purpose:
    //    before sending XTDP_AddRequests out this function appends the described widget and its children to the GUI item list
    //
    //  Parameters:
    //    pl_xul - *in* <Separator> - possible Separator item
    //    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
    //    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_appendSeparator(
      in ttcn_ericsson_se_protocolModules_xtdp_xtdl.Separator pl_xul,
      in integer pl_parentIdx,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT
    return boolean{
      pl_widgetExists := false;
      pl_xul.id := f_EPTF_UIHandler_setWidgetID(pl_xul.id);
      return -1 != f_EPTF_UIHandler_addWidgetRec({
          f_EPTF_UIHandler_unichar2charstring(pl_xul.id),
          wtSeparator,
          omit,
          pl_parentIdx,
          {},
          omit,
          {separator := f_EPTF_UIHandler_deleteChildrenFromSeparator(pl_xul)}, false}, pl_widgetExists);
    }
  } //EPTF_WidgetAddInternalFunctions group

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_requestLayout
  //
  //  Purpose:
  //    Sends a layoutRequest message to the RuntimeGUI and
  //    builds the database of the widgets by the response
  //
  //  Detailed Comments:
  //     It should be called only once, after connecting to a GUI
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_requestLayout()
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    if (not v_UIHandler_initialized){ return false }
    f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_layoutRequest);

    var boolean vl_widgetExists := false;

    if(f_EPTF_Semaphore_waitForUnlock(v_UIHandler_layoutResponseReceivedSemaphore, tsp_EPTF_UIHandler_maxWaitTimer))
    {
      f_EPTF_UIHandler_warning("Timer timeout! No layout response received!");
      f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
      v_UIHandler_layoutResponseReceivedSemaphore := f_EPTF_Semaphore_new();
      return false;
    }
    v_UIHandler_layoutResponseReceivedSemaphore := f_EPTF_Semaphore_new();
    //f_EPTF_Semaphore_lock(v_UIHandler_layoutResponseReceivedSemaphore);

    if(ischosen(v_UIHandler_receivedMessage.choice.xTDP_LayoutResponse.widgets.window))
    {
      if(not f_EPTF_UIHandler_appendAllWidgetIdsFromXul(v_UIHandler_receivedMessage.choice.xTDP_LayoutResponse.widgets, v_UIHandler_windowIndex, vl_widgetExists))
      {
        f_EPTF_UIHandler_warning("There was an error during processing the layout response.");
        f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
        return false;
      }
    }
    else
    {
      f_EPTF_UIHandler_warning("Unexpected XTDP LayoutResponse (not xtdp_window)!");
    }
    f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
    return true;
  }

  type enumerated EPTF_UIHandler_connectionResult
  {
    connected(0),
    connectFailed,
    temporarilyUnavailable
  };

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_connectAndInitGui
  //
  //  Purpose:
  //    function to connect to GUI
  //
  //  Parameters:
  //    -
  //
  //  Return Value:
  //    boolean
  //
  //  Errors:
  //    Common error possibilities
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_connectAndInitGui(out ConnectionId pl_clientId)
  runs on EPTF_UIHandler_Private_CT
  return EPTF_UIHandler_connectionResult
  {
    pl_clientId := -1;
    if(v_EPTF_UIHandler_servermode){
      return connected;
    }
    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug("****ConnectGUI****");
    }
    if (v_UIHandler_guiConnected) {
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug("****ConnectGUI: already connected****");
      }
      return connected;
    }
    var Result vl_result
    f_EPTF_Transport_connect(
      IPL4, {tcp := {}}, c_ipv4AnyAddr, c_anyPort, v_UIHandler_GUI_Host, v_UIHandler_GUI_Port, c_EPTF_UIHandler_XTDPType, vl_result, true)
    if(ispresent(vl_result.connId))
    {
      pl_clientId := vl_result.connId;
      if(-1 == vl_result.connId)
      {
        f_EPTF_UIHandler_warning("-----  CLL_UIHandler connecting to GUI failed ----");
        //f_EPTF_Base_stopAll();
        f_EPTF_UIHandler_headlessmode();
        return connectFailed;
      } else if (ispresent(vl_result.errorCode) and vl_result.errorCode==ERROR_TEMPORARILY_UNAVAILABLE) {
        f_EPTF_UIHandler_headlessmode();
        return temporarilyUnavailable;
      }
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&log2str("***Connected on socket: ", vl_result.connId));
      }
      // I am XTDP-session server => nothing to do here:
      //      var charstring vl_handshakeError:=f_EPTF_UIHandler_handshake(vl_result.connId);
      //      if (vl_handshakeError!="") {
      //        // handshake unsuccessful
      //        return false;
      //      }
      //      if (not f_EPTF_UIHandler_authclient(vl_result.connId))
      //      {
      //        f_EPTF_UIHandler_closeXTDPSession(vl_result.connId);
      //        return false;
      //      }
      f_EPTF_UIHandler_addclientid(vl_result.connId);
      //      v_UIHandler_guiConnected := true;
      return connected;
    }
    else
    {
      f_EPTF_UIHandler_warning(log2str("-----  CLL_UIHandler Unsuccessful attempt to connect. You can set the IP address and port with the module pars. tsp_xtdp_listen_addr:tsp_xtdp_listen_port Client address:",v_UIHandler_GUI_Host,":", v_UIHandler_GUI_Port," with answer: ", vl_result));
      f_EPTF_UIHandler_headlessmode();
      //f_EPTF_Base_stopAll();
      return connectFailed;
    }
  }

  private function f_EPTF_UIHandler_closeXTDPSession(in integer pl_clientId) runs on EPTF_UIHandler_Private_CT {
    var Result vl_result
    if (f_EPTF_UIHandler_getClientHandshakeSuccessful(pl_clientId)) {
      // only close session if handshake was successful
      v_UIHandler_lastRequest := v_UIHandler_lastRequest +1;
      v_UIHandler_byeTimer := f_EPTF_Semaphore_new();
      var ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Message vl_messageToSend :=
      {
        v_UIHandler_byeTimer+1000*v_UIHandler_lastRequest,
        {xTDP_Bye := ""}
      }

      f_EPTF_Transport_send(IPL4, pl_clientId, f_EPTF_UIHandler_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(vl_messageToSend)), vl_result, false)
      //f_EPTF_Transport_send(IPL4, pl_clientId, char2oct("bye\r\n"), vl_result, false);

      if (f_EPTF_Semaphore_waitForUnlock(v_UIHandler_byeTimer,v_byeMaxTime)) {
        // max wait time expired before response received:
        //v_byeErrorMsg := "Error: UIHandler: Communication error: No response received for Handshake request"
        f_EPTF_UIHandler_warning("Communication error: No response received for Bye message");
      }
      v_UIHandler_byeTimer := -1;
    }
    f_EPTF_UIHandler_delclientid(pl_clientId);
    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug(%definitionId&": XTDP session is closed for client: "&log2str(pl_clientId));
    }
    if (sizeof(v_UIHandler_GUIClientId) == 0)
    {
      f_EPTF_UIHandler_headlessmode();
    }
    f_EPTF_Transport_close(IPL4, pl_clientId, vl_result)
    f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_getGUIAddrPorts
  //
  //  Purpose:
  //    function to get address, port and reconnect port of the GUI to connect.
  //
  //  Parameters:
  //    pl_host - *out* *charstring* - the hostname of the GUI
  //    pl_port - *out* *integer* - the port number of then GUI
  //    pl_reconnectPort - *out* *integer* - the reconnect port number of then GUI
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_getGUIAddrPorts(out charstring pl_host, out integer pl_port, out integer pl_reconnectPort)
  runs on EPTF_UIHandler_Private_CT {
    pl_host := v_UIHandler_GUI_Host;
    pl_port := v_UIHandler_GUI_Port;
    pl_reconnectPort := v_UIHandler_udp_port;
  }
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_setGUIAddrPorts
  //
  //  Purpose:
  //    function to set address , port  and reconnect port of the GUI to connect.
  //
  //  Parameters:
  //    pl_host - *in* *charstring* - optional - the hostname of the GUI
  //    pl_port - *in* *integer* - optional - the port number of then GUI
  //    pl_reconnectPort - *in* *integer* - optional - the reconnect port number of then GUI
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    Gives an opportunity to set the address of the GUI from code
  //    beside the tsp way. It must be called after the f_EPTF_UIhandler_init_CT.
  //    It will close the connections and make way to have new connections.
  //    If neither of the pl_host and the pl_port parameters are given, all connection are closed and no GUI
  //    connection is allowed until this function is called again.
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_setGUIAddrPorts(in charstring pl_host := "", in integer pl_port := -1, in integer pl_reconnectPort := -1)
  runs on EPTF_UIHandler_Private_CT {
    if (not v_UIHandler_initialized){ return }
    var ConnectionId vl_connId := -1;
    var boolean vl_UIHandler_transportConnectionFailed := false;
    var boolean v_UIHandler_guiConnectedWasTrue := false;

    if(v_UIHandler_guiConnected == true){
      for (var integer i := 0; i<sizeof(v_UIHandler_GUIClientId); i:= i+1)
      {
          f_EPTF_UIHandler_closeXTDPSession(v_UIHandler_GUIClientId[i].clientId);
          //var Result vl_result
          //f_EPTF_Transport_send(IPL4, v_UIHandler_GUIClientId[i], char2oct("bye\r\n"), vl_result, false)
      }
      v_UIHandler_guiConnectedWasTrue := true;
    }
    if(pl_reconnectPort > -1){
      f_EPTF_UIHandler_setGuiReconnectPort( pl_reconnectPort );
    }

    if(pl_host == "" and pl_port == -1){
      v_UIHandler_GUI_Host := pl_host;
      v_UIHandler_GUI_Port := pl_port;
      f_EPTF_UIHandler_warning(%definitionId&": Neither of the pl_host and the pl_port parameters is used! Please specify at least one. Until this, all connections are closed and the GUI is not able to connect to the application! ");
      return;
    }

    if(pl_host != ""){
      v_UIHandler_GUI_Host := pl_host;
    }
    if(pl_port > -1){
      v_UIHandler_GUI_Port := pl_port;
    }

    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug(%definitionId&": The following values are set: " & pl_host &":" & log2str(pl_port));
    }

    if(v_UIHandler_guiConnectedWasTrue == true){
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": Trying to make the connection. ");
      }

      var EPTF_UIHandler_connectionResult vl_res := f_EPTF_UIHandler_connectAndInitGui(vl_connId);
      if(connected != vl_res){
          if (v_EPTF_UIHandler_headlessmode) {
            // connect to GUI failed -> switch to headless mode
            if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
              f_EPTF_UIHandler_debug("initGUI failed, switch to headless mode");
            }
            f_EPTF_UIHandler_headlessmode();
            vl_UIHandler_transportConnectionFailed := vl_res != temporarilyUnavailable;
          } else {
            // connecting to GUI failed and headless mode not enabled -> stop running
            f_EPTF_UIHandler_error("initGUI failed!");
          }
      }
    } else if (v_EPTF_UIHandler_headlessmode) {
        // headless mode enabled -> switch to headless mode
        if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
          f_EPTF_UIHandler_debug("UIHandler started in headless mode");
        }
        f_EPTF_UIHandler_headlessmode();
    } else {
        // uncorrect starrtup configuration: client mode, not to connect to GUI, headless mode disabled -> stop running
        f_EPTF_UIHandler_error("Uncorrect UIHandler configuration for startup: client mode, not to connect to GUI, headless mode disabled");
    }
    if ((v_UIHandler_guiConnected and not v_EPTF_UIHandler_servermode) and not vl_UIHandler_transportConnectionFailed) {
      timer t_wait_for_connectGUI := 0.0;
      timer t_max_wait_for_connectGUI := tsp_EPTF_UIHandler_maxGUIWaitTime;
      t_max_wait_for_connectGUI.start;
      t_wait_for_connectGUI.start;
      alt {
        [v_UIHandler_guiConnected or (vl_connId != -1 and not f_EPTF_UIHandler_isConnectedClientid(vl_connId))] t_wait_for_connectGUI.timeout {
          // connection established, or lost
        }
        [] t_max_wait_for_connectGUI.timeout {
          f_EPTF_UIHandler_error("In client mode connecting to GUI on " & v_UIHandler_GUI_Host & ":" & log2str(v_UIHandler_GUI_Port) & " failed: Timeout during handshake&authentication. Please correct the tsp_xtdp_listen_addr / tsp_xtdp_listen_port parameter(s) in order to be able to connect to the RuntimeGUI! ");
        }
      }
    }


  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_setGuiReconnectPort
  //
  //  Purpose:
  //    function to set the port of the GUI to reconnect.
  //
  //  Parameters:
  //    pl_reconnectPort - *in* *integer* - the reconnect port number of then GUI
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    Gives an opportunity to set the reconnect port of the GUI from code
  //    beside the tsp way. It must be called after the f_EPTF_UIhandler_init_CT.
  //    If no parameter is given or the port is negative, reconnection of the GUI is disabled
  //    until the f_EPTF_UIHandler_setPingerPort() function is called again.
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_setGuiReconnectPort( in integer pl_reconnectPort := -1)
  runs on EPTF_UIHandler_Private_CT {
    if(pl_reconnectPort < 0){
      f_EPTF_UIHandler_warning(%definitionId&": Pinger port is deactivated, reconnection of the GUI is disabled!");
    }
    v_UIHandler_udp_port := pl_reconnectPort;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_setGuiHostPort
  //
  //  Purpose:
  //    function to set address of the GUI to connect.
  //
  //  Parameters:
  //    pl_host - *in* *charstring* the hostname of the GUI
  //    pl_port - *in* *integer* the port number of then GUI
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    Gives an opportunity to set the address of the GUI from code
  //    beside the tsp way. It must be called before the f_EPTF_UIhandler_init_CT
  //    to take effect.
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_setGuiHostPort(in charstring pl_host, in integer pl_port)
  runs on EPTF_UIHandler_Private_CT {
    v_UIHandler_GUI_Host := pl_host;
    v_UIHandler_GUI_Port := pl_port;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_startserverxtdp
  //
  //  Purpose:
  //    function to start the XTDP port as server.
  //
  //  Parameters:
  //    -
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_startserverxtdp() runs on EPTF_UIHandler_Private_CT
  {
    var Result vl_result
    f_EPTF_Transport_listen(
      IPL4, {tcp := {}}, c_ipv4AnyAddr, v_UIHandler_GUI_Port, c_EPTF_UIHandler_XTDPType, vl_result, true)

    if(ispresent(vl_result.connId))
    {
      //    v_connectionDB.connList[sizeof(v_connectionDB.connList)] := {vl_result.connId};
    }
    else
    {
      f_EPTF_UIHandler_warning(log2str("Unsuccessful attempt to listen with answer: ", vl_result)); // kell f_EPTF_Base_stop();?
    }
  }

  private function f_EPTF_UIHandler_initguitoclient(in integer pl_clientid, in boolean pl_shadowedGui := false) runs on EPTF_UIHandler_Private_CT{
      if(v_UIHandler_createGUIRunning){
        //If createGUI is happening right now, we postpone the runtimegui init until creategui is done
        v_UIHandler_initToGUIClient := true;
        v_UIHandler_initGUIToClientList[sizeof(v_UIHandler_initGUIToClientList)] := {pl_clientid, pl_shadowedGui}
      } else {
        //No createGUI is happening right now, we do our job
        f_EPTF_UIHandler_initGuiToClientInner(pl_clientid, pl_shadowedGui);
      }
  }

  ///////////////////////////////////////////////////////////
  //  Altstep: as_UIHandler_handleInitGUIToClient
  //
  //  Purpose:
  //    -
  ///////////////////////////////////////////////////////////
  private altstep as_UIHandler_handleInitGUIToClient() runs on EPTF_UIHandler_Private_CT {
    []t_UIHandler_initGUIToClientTimer.timeout{
      for(var integer vl_i := 0; vl_i < sizeof(v_UIHandler_initGUIToClientList); vl_i:=vl_i+1){
        f_EPTF_UIHandler_initGuiToClientInner( v_UIHandler_initGUIToClientList[vl_i].pl_clientid, v_UIHandler_initGUIToClientList[vl_i].pl_shadowedGui)
      }
      v_UIHandler_initGUIToClientList := {};
      t_UIHandler_initGUIToClientTimer.start;
      v_UIHandler_initToGUIClient := false;
      repeat;
    }
  }

  private function f_EPTF_UIHandler_initGuiToClientInner(in integer pl_clientid, in boolean pl_shadowedGui := false) runs on EPTF_UIHandler_Private_CT{
    //This piece of code can run only in case of v_UIHandler_createGUIRunning == false and v_UIHandler_initToGUIClient == true with a 0.0 timer
    v_UIHandler_lastRequest := v_UIHandler_lastRequest +1;
    var ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Message vl_messageToSend :=
    {
      transactionID := v_UIHandler_lastRequest,
      choice :=
      {
        xTDP_RemoveRequests:=
        {
          xTDP_RemoveRequest_list := {
            {
              requestId := 1,
              widgetId := omit
            }
          }
        }
      }
    }

    var Result vl_result
    f_EPTF_Transport_send(IPL4, pl_clientid, f_EPTF_UIHandler_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(vl_messageToSend)), vl_result, false)

    if (0 < sizeof(v_UIHandler_guiItemList))
    {
      var Widgets layout;
      f_EPTF_UIHandler_buildXUL(layout);
      if (pl_shadowedGui) {
        layout.window.title := layout.window.title & " - Shadowed GUI -";
      }
      v_UIHandler_lastRequest := v_UIHandler_lastRequest +1;
      vl_messageToSend :=
      {
        transactionID := v_UIHandler_lastRequest,
        choice :=
        {
          xTDP_AddRequests :=
          {
            xTDP_AddRequest_list := {
              {
                requestId := 2,
                parentWidgetId := omit,
                widgets := layout
              }
            }
          }
        }
      }
      f_EPTF_Transport_send(IPL4, pl_clientid, f_EPTF_UIHandler_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(vl_messageToSend)), vl_result, false)
    }
    v_UIHandler_guiLayoutReady := true;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_updateguilist_refreshwidget
  //
  //  Purpose:
  //    At a widgetrefresh, it refreshes the inner database too.
  //
  //  Parameters:
  //    pl_widgetid - *in* <charstring> - Id of the widget
  //    pl_arg - *in* <charstring> - the new value
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    none
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_updateguilist_refreshwidget(
    in charstring pl_widgetid,
    in EPTF_Var_DirectContent pl_dcontent)
  runs on EPTF_UIHandler_Private_CT{
    // if headless mode is not enabled don't refresh internal database
    if (not v_EPTF_UIHandler_headlessmode) {
      return;
    }

    var integer vl_index := f_EPTF_UIHandler_widgetRecIndex(pl_widgetid);
    if (vl_index==-1) {
      return;
    }
    select (v_UIHandler_guiItemList[vl_index].widgetType) {
      case(wtTextbox){
        var charstring pl_arg := f_EPTF_Var_directContent2str(pl_dcontent);
        v_UIHandler_guiItemList[vl_index].XULformat.textbox.value_ := pl_arg;
      }
      case(wtHtmlcode){
        var charstring pl_arg := f_EPTF_Var_directContent2str(pl_dcontent);
        v_UIHandler_guiItemList[vl_index].XULformat.htmlcode.value_ := pl_arg;
      }
      case (wtTreecell){
        var charstring pl_arg := f_EPTF_Var_directContent2str(pl_dcontent);
        select( v_UIHandler_guiItemList[vl_index].widgetDataType )
        {
          case ( statusLED )
          {
            // Cut the text part if statusLED requested
            var integer vl_i:=f_strstr(pl_arg,"]");
            if(0<vl_i) {
              pl_arg := substr(pl_arg,0,vl_i+1);
            }
            v_UIHandler_guiItemList[vl_index].XULformat.treecell.label_ := pl_arg;
          }
         case ( pushButton ){
            //nothing to refresh
         }
          case else
          {
            v_UIHandler_guiItemList[vl_index].XULformat.treecell.label_ := pl_arg;
          }
        }
      }
      case (wtLabel){
        var charstring pl_arg := f_EPTF_Var_directContent2str(pl_dcontent);
        v_UIHandler_guiItemList[vl_index].XULformat.label_.value_ := pl_arg;
      }
      case (wtListbox){
        var charstring pl_arg := f_EPTF_Var_directContent2str(pl_dcontent);
        var EPTF_IntegerList vl_children := f_EPTF_UIHandler_getNonMetaChildren(vl_index);
        for (var integer i:=0;i<sizeof(vl_children);i:=i+1){
          if (v_UIHandler_guiItemList[vl_children[i]].XULformat.listitem.label_ == pl_arg){
            v_UIHandler_guiItemList[vl_children[i]].XULformat.listitem.selected := true;
          } else {
            v_UIHandler_guiItemList[vl_children[i]].XULformat.listitem.selected := false;
          }
        }
      }
      case (wtMenulist){
        var charstring pl_arg := f_EPTF_Var_directContent2str(pl_dcontent);
        var EPTF_IntegerList vl_children := f_EPTF_UIHandler_getNonMetaChildren(vl_index);
        if (v_UIHandler_guiItemList[vl_index].XULformat.menulist.label_ == pl_arg or pl_arg==""){ // menulabel selected
          for (var integer i:=0;i<sizeof(vl_children);i:=i+1){
            v_UIHandler_guiItemList[vl_children[i]].XULformat.menuitem.selected := false;
          }
          return;
        }
        var boolean menuselected := false;
        for (var integer i:=0;i<sizeof(vl_children);i:=i+1){   // test if menuitem selected
          if (v_UIHandler_guiItemList[vl_children[i]].XULformat.menuitem.label_ == pl_arg){
            v_UIHandler_guiItemList[vl_children[i]].XULformat.menuitem.selected := true;
            menuselected := true;
          } else {
            v_UIHandler_guiItemList[vl_children[i]].XULformat.menuitem.selected := false;
          }
        }

        if (not menuselected and v_UIHandler_guiItemList[vl_index].XULformat.menulist.editable == true){// if not menuitem nor menulabel,than its a menulabel change
          v_UIHandler_guiItemList[vl_index].XULformat.menulist.label_ := pl_arg;
        }
      }
      case (wtNumericalwidget){
        var float pl_arg := 0.0;
        if(ischosen(pl_dcontent.intVal)){  // integerField
          pl_arg := int2float(pl_dcontent.intVal);
        } else if(ischosen(pl_dcontent.floatVal)) { //floatField
          pl_arg := pl_dcontent.floatVal;
        } else {return;}
        v_UIHandler_guiItemList[vl_index].XULformat.numericalwidget.value_ := pl_arg;
      }
      case (wtValuelist){
        if (ischosen(pl_dcontent.integerlistVal)){
          v_UIHandler_guiItemList[vl_index].XULformat.valuelist.value_list := {};
          for (var integer i := 0;i<sizeof(pl_dcontent.integerlistVal);i:=i+1){
            v_UIHandler_guiItemList[vl_index].XULformat.valuelist.value_list[i] := pl_dcontent.integerlistVal[i];
          }
        }
      }
      case (wtIntervallimits){
        if (ischosen(pl_dcontent.floatlistVal)){
          v_UIHandler_guiItemList[vl_index].widgetData.distChartData.intervallimits := {};
          for (var integer i := 0;i<sizeof(pl_dcontent.floatlistVal);i:=i+1){
            v_UIHandler_guiItemList[vl_index].widgetData.distChartData.intervallimits[i] := pl_dcontent.floatlistVal[i];
          }
        }
      }
      case else { }
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_refreshWidget
  //
  //  Purpose:
  //    Refreshes the content specified by the subscription
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_refreshWidget(in EPTF_UIHandler_OpenSubscription pl_subs, in boolean pl_init := false,
    in EPTF_Var_DirectContent pl_currentContent := {unknownVal:={omit}})
  runs on EPTF_UIHandler_Private_CT {
    if (pl_subs.widgetId == "") {
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": Widget with empty ID cannot be refreshed!");
      }
      return;
    }
    var EPTF_Var_TimeLine vl_timeLine;
    f_EPTF_Var_getTimeLine(pl_subs.varIdx,vl_timeLine);
    if(0 == vl_timeLine.size and not
      (pl_init or f_EPTF_Var_checkSubscriptionMode(pl_subs.varIdx,realtime))){
      return;
    }
    var EPTF_Var_DirectContent vl_currentContent;
    if(pl_init or f_EPTF_Var_checkSubscriptionMode(pl_subs.varIdx,realtime)){
      if (ischosen(pl_currentContent.unknownVal)) {
        f_EPTF_Var_getContent(pl_subs.varIdx,vl_currentContent);
      } else {
        vl_currentContent := pl_currentContent;
      }
    }else{
      vl_currentContent := vl_timeLine.timeLineData[vl_timeLine.size-1].content;
    }

    select(pl_subs.widgetType){
      case(wtTrace){

        // create timeLine from current content (if timeLine is not available because of realTime subscription)
        var integer vl_iCount := vl_timeLine.size;
        if (vl_iCount == 0) {
          vl_iCount := 1;
          vl_timeLine.size := 1;
          vl_timeLine.timeLineData := {
            {
              timestamp := f_EPTF_Base_getAbsTimeInSecs(),
              content := vl_currentContent
            }
          };
        }

        if(0 < vl_iCount){ //Because of init
          var ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Requests vl_requests := {omit, {c_UIHandler_XSD_emptyXTDPRequest}};
          var integer vl_size := 0;
          for(var integer vl_iTl := 0; vl_iTl < vl_iCount; vl_iTl := vl_iTl + 1){
            var charstring vl_stringVal;
            if (ischosen(vl_timeLine.timeLineData[vl_iTl].content.floatVal)) {
              vl_stringVal := float2str(vl_timeLine.timeLineData[vl_iTl].content.floatVal);
            } else if  (ischosen(vl_timeLine.timeLineData[vl_iTl].content.intVal)) {
              vl_stringVal:= int2str(vl_timeLine.timeLineData[vl_iTl].content.intVal);
            }
            // ekovist 2012.03.09. - HO88979: EPTFÂ CLL UIHandler: dynamic tc error in case of wrong datasource type used in xml
            if(isbound(vl_stringVal)) {
              var charstring vl_timelinepoint:= float2str(vl_timeLine.timeLineData[vl_iTl].timestamp) & "/"& vl_stringVal;
              v_UIHandler_lastRequest := v_UIHandler_lastRequest + 1;
              var ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Request vl_request := valueof(ts_ASP_XTDP_traceItem(
                  v_UIHandler_lastRequest,
                  pl_subs.widgetId,
                  vl_timelinepoint
                ));
              vl_requests.xTDP_Request_list[vl_size] := vl_request;
              vl_size := vl_size + 1;
            }
            else {
              f_EPTF_UIHandler_error("The specified "&pl_subs.widgetId&" widget can not be connected to variable (invalid type: required FLOAT or INT)!" );
            }
          }
          if (vl_iCount > 0 and vl_size>0){
            var integer vl_tracePointer;
			var integer vl_widgetIdx := f_EPTF_UIHandler_widgetRecIndex(pl_subs.widgetId);
			if(-1 < vl_widgetIdx) {
            	if (not f_EPTF_int2int_HashMap_Find(v_UIHandler_tracePointerHashMapId, vl_widgetIdx, vl_tracePointer)){
        	      vl_tracePointer := sizeof(v_UIHandler_tracePointers);
        	      f_EPTF_int2int_HashMap_Insert(v_UIHandler_tracePointerHashMapId, vl_widgetIdx, vl_tracePointer);
        	      v_UIHandler_tracePointers[vl_tracePointer] := 0;
     	       }

  	           var integer vl_currTraceID := v_UIHandler_tracePointers[vl_tracePointer];
    	       v_UIHandler_guiItemList[vl_widgetIdx].XULformat.trace.choice_list[vl_currTraceID].xy_value.x :=
        	   vl_timeLine.timeLineData[vl_iCount-1].timestamp;
	           if (ischosen(vl_timeLine.timeLineData[vl_iCount-1].content.floatVal)) {
    	          v_UIHandler_guiItemList[vl_widgetIdx].XULformat.trace.choice_list[vl_currTraceID].xy_value.y :=
        	      vl_timeLine.timeLineData[vl_iCount-1].content.floatVal;
	           } else if (ischosen(vl_timeLine.timeLineData[vl_iCount-1].content.intVal)) {
    	          v_UIHandler_guiItemList[vl_widgetIdx].XULformat.trace.choice_list[vl_currTraceID].xy_value.y :=
        	      int2float(vl_timeLine.timeLineData[vl_iCount-1].content.intVal);
	           } else {
    	          v_UIHandler_guiItemList[vl_widgetIdx].XULformat.trace.choice_list[vl_currTraceID].xy_value.y := 0.0;
        	   }
	           vl_currTraceID := vl_currTraceID + 1;
    	       if (vl_currTraceID == v_UIHandler_guiItemList[vl_widgetIdx].XULformat.trace.maxPoints) {
        	      vl_currTraceID := 0;
	           }
    	       v_UIHandler_tracePointers[vl_tracePointer] := vl_currTraceID;
			}
			else {
			   f_EPTF_UIHandler_warning("There is no widget with name "&pl_subs.widgetId&" to refresh!");
			}
          }
          if (vl_size>0){
            for(var integer clientindex:=0;clientindex<sizeof(v_UIHandler_GUIClientId);clientindex := clientindex+1){
              f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_sendTimeline(v_UIHandler_GUIClientId[clientindex].clientId,vl_requests));
            }
          }
        }
      }
      case(wtTreecell){
        f_EPTF_UIHandler_updateguilist_refreshwidget(pl_subs.widgetId,
          vl_currentContent);
        if(ispresent(pl_subs.widgetDataType)) { // HN57133: case omit moved to else-branch
          select(pl_subs.widgetDataType){
            case(checkBox){
              f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToChkBox(pl_subs.widgetId,
                  f_EPTF_Var_directContent2str(vl_currentContent)));
            }
            case(toggleButton){
              f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToTgglButton(pl_subs.widgetId,
                  f_EPTF_Var_directContent2str(vl_currentContent)));
            }
            case(floatField){
              if (ischosen(vl_currentContent.floatVal)) {
                f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToFlt(pl_subs.widgetId, vl_currentContent.floatVal));
              } else {
                f_EPTF_UIHandler_error("The specified "&pl_subs.widgetId&" TREECELL widget can not be connected to variable (invalid type: required FLOAT)!" );
              }
            }
            case(integerField){
              if (ischosen(vl_currentContent.intVal)) {
                f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToInt(pl_subs.widgetId, vl_currentContent.intVal));
              } else {
                f_EPTF_UIHandler_error("The specified "&pl_subs.widgetId&" TREECELL widget can not be connected to variable (invalid type: required INT)!" );
              }
            }
            case(pushButton){
              //EGBOZIE: Pushbutton is not update-able!
              //f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToStr(pl_subs.widgetId,
              //f_EPTF_Var_directContent2str(vl_currentContent)));
            }
            case(statusLED){
              if (ischosen(vl_currentContent.statusLEDVal)) {
                var charstring vl_statusLedTxt := f_EPTF_Var_directContent2str(vl_currentContent);
                // Cut the text part if statusLED requested
                var integer vl_i:=f_strstr(vl_statusLedTxt,"]");
                if(0<vl_i) {
                  vl_statusLedTxt := substr(vl_statusLedTxt,0,vl_i+1);
                }
                f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToLed(pl_subs.widgetId, vl_statusLedTxt ));
              } else {
                f_EPTF_UIHandler_error("The specified "&pl_subs.widgetId&" TREECELL widget can not be connected to variable (invalid type: required STATUSLED)!" );
              }
            }
            case(statusLEDWithText){
              if (ischosen(vl_currentContent.statusLEDVal)) {
                f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToLedWithText(pl_subs.widgetId,
                    f_EPTF_Var_directContent2str(vl_currentContent)));
              } else {
                f_EPTF_UIHandler_error("The specified "&pl_subs.widgetId&" TREECELL widget can not be connected to variable (invalid type: required STATUSLED)!" );
              }
            }
            case(string){ // case omit -> else
              f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToStr(pl_subs.widgetId,
                  f_EPTF_Var_directContent2str(vl_currentContent)));
            }
            case else { }
          }
        } else {
          f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToStr(pl_subs.widgetId,
              f_EPTF_Var_directContent2str(vl_currentContent)));
        }
      }
      case (wtValuelist){
        f_EPTF_UIHandler_updateguilist_refreshwidget(pl_subs.widgetId,
          vl_currentContent);
        if (ischosen(vl_currentContent.integerlistVal)){
          var XTDP_Actions.choice.put.argument_list csl := {""};
          for (var integer i:=0; i<sizeof(vl_currentContent.integerlistVal);i:=i+1){
            csl[i] := int2str(vl_currentContent.integerlistVal[i])
          }
          f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueTovalueList(pl_subs.widgetId,
              csl));
        }
      }
      case (wtListbox){
        var integer index := f_EPTF_UIHandler_widgetRecIndex(pl_subs.widgetId);
        if (index != -1 and v_UIHandler_guiItemList[index].XULformat.listbox.seltype == multiple){
          var XTDP_Actions.choice.put.argument_list csl := {""};
          if (ischosen(vl_currentContent.integerlistVal)){
          var EPTF_IntegerList vl_children := f_EPTF_UIHandler_getNonMetaChildren(index);
            for (var integer i:=0;i<sizeof(vl_currentContent.integerlistVal);i:=i+1){
              //Here the f_EPTF_UIHandler_XULWidgetId2charstr is used simply to convert ustr to charstring
              csl[i]:= f_EPTF_UIHandler_XULWidgetId2charstr({v_UIHandler_guiItemList[vl_children[vl_currentContent.integerlistVal[i]]].XULformat.listitem.label_})

            }
            for (var integer i:=0; i<sizeof(csl);i:=i+1){
              f_EPTF_UIHandler_updateguilist_refreshwidget(pl_subs.widgetId,
                {charstringVal := unichar2char(csl[i])});
            }
            f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueTovalueList(pl_subs.widgetId,
                csl));
          }

        } else{
          f_EPTF_UIHandler_updateguilist_refreshwidget(pl_subs.widgetId,
            vl_currentContent);
          f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToStr(pl_subs.widgetId,
              f_EPTF_Var_directContent2str(vl_currentContent)));
        }
      }
      case (wtNumericalwidget){
        f_EPTF_UIHandler_updateguilist_refreshwidget(pl_subs.widgetId,
          vl_currentContent);
        select( pl_subs.widgetDataType )
        {
          case ( integerField)
          {
            if (ischosen(vl_currentContent.intVal)) {
              f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToNumericalwidget(pl_subs.widgetId,
                  int2str(vl_currentContent.intVal)));
            } else {
              f_EPTF_UIHandler_error("The specified "&pl_subs.widgetId&" NUMERICAL widget can not be connected to variable (invalid type: required INT)!" );
            }
          }
          case ( floatField)
          {
            if (ischosen(vl_currentContent.floatVal)) {
              f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToNumericalwidget(pl_subs.widgetId,
                  float2str(vl_currentContent.floatVal)));
            } else {
              f_EPTF_UIHandler_error("The specified "&pl_subs.widgetId&" NUMERICAL widget can not be connected to variable (invalid type: required FLOAT)!" );
            }
          }
          case else
          {//impossible, just in case
            f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToNumericalwidget(pl_subs.widgetId,
                f_EPTF_Var_directContent2str(vl_currentContent)));
          }
        }
      }
      case (wtButton){
        f_EPTF_UIHandler_updateguilist_refreshwidget(pl_subs.widgetId,
          vl_currentContent);
        //eistfal: Pushbutton is not update-able!
        //f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToStr(pl_subs.widgetId,
        //f_EPTF_Var_directContent2str(vl_currentContent)));
        //  #eistfal: toggleButton is update-able, how to perform it?
      }
      case (wtPushbutton){
        f_EPTF_UIHandler_updateguilist_refreshwidget(pl_subs.widgetId,
          vl_currentContent);
      }
      case (wtTogglebutton){
        f_EPTF_UIHandler_updateguilist_refreshwidget(pl_subs.widgetId,
          vl_currentContent);
      }
      case else{   // connectd to single string variable
        //Default data handling
        f_EPTF_UIHandler_updateguilist_refreshwidget(pl_subs.widgetId,
          vl_currentContent);
        f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleRqPutValueToStr(pl_subs.widgetId,
            f_EPTF_Var_directContent2str(vl_currentContent)));
      }
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_parseGuiParam
  //
  //  Purpose:
  //    Parses a value as it is set by user on the GUI,
  //    stores it in the connected variable
  //
  //  Parameters:
  //    pl_widgetID - *in* *EPTF_UIHandler_WidgetIdString* -  widgetID to identify param
  //    pl_arglist - *in* <EPTF_CharstringList> -  new value to set
  //
  //  Detailed Comments:
  //    Uses <f_EPTF_UIHandler_parseParamValue> function
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_parseGuiParam(in EPTF_UIHandler_WidgetIdString pl_widgetID, in EPTF_CharstringList pl_arglist)
  runs on EPTF_UIHandler_Private_CT
  {
    var charstring vl_argument := "";
    if (sizeof(pl_arglist)!=0) {
      vl_argument := pl_arglist[0];
    }

    // look up param based on widgetID
    var integer vl_paramIdx := f_EPTF_UIHandler_getSubscriptionIdxByWidgetId(pl_widgetID);

    if (-1 == vl_paramIdx) {
      f_EPTF_UIHandler_warning(%definitionId&" Warning : there's no subscription to widgetID ("& pl_widgetID & ") referred by GUI");
      //f_EPTF_Base_stop();
      return;
    }
    if(wtButton == v_UIHandler_openSubscriptions[vl_paramIdx].widgetType
      or wtPushbutton == v_UIHandler_openSubscriptions[vl_paramIdx].widgetType
      or (wtTreecell == v_UIHandler_openSubscriptions[vl_paramIdx].widgetType
        and ispresent(v_UIHandler_openSubscriptions[vl_paramIdx].widgetDataType)
        and v_UIHandler_openSubscriptions[vl_paramIdx].widgetDataType == pushButton)
    ){
      var EPTF_Var_DirectContent vl_content;
      f_EPTF_Var_getContent(v_UIHandler_openSubscriptions[vl_paramIdx].varIdx, vl_content);
      if(ischosen(vl_content.intVal)){
        vl_content.intVal := vl_content.intVal + 1;
        f_EPTF_Var_adjustContent(v_UIHandler_openSubscriptions[vl_paramIdx].varIdx, vl_content);
      } else {
        f_EPTF_Var_refreshContent(v_UIHandler_openSubscriptions[vl_paramIdx].varIdx);
      }
    } else if(wtListbox == v_UIHandler_openSubscriptions[vl_paramIdx].widgetType){
      var integer recindex := f_EPTF_UIHandler_widgetRecIndex(v_UIHandler_openSubscriptions[vl_paramIdx].widgetId);
      if (recindex != -1 and v_UIHandler_guiItemList[recindex].XULformat.listbox.seltype == multiple){
        //var EPTF_UIHandler_XTDP_XML_TagList listitems := {};
        var integer k :=0
        var EPTF_IntegerList intlist := {};
        var EPTF_IntegerList vl_children := f_EPTF_UIHandler_getNonMetaChildren(recindex);
        for (var integer i:=0;i<sizeof(vl_children);i:=i+1){
          if (k<sizeof(pl_arglist) and v_UIHandler_guiItemList[vl_children[i]].XULformat.listitem.label_ ==
            pl_arglist[k]){
            k:=k+1;
            intlist[sizeof(intlist)] := i;
          }
        }
        f_EPTF_Var_adjustContent(v_UIHandler_openSubscriptions[vl_paramIdx].varIdx, {integerlistVal := intlist});
      }

    }else{
      if(not f_EPTF_UIHandler_parseParamValue(v_UIHandler_openSubscriptions[vl_paramIdx].varIdx,vl_argument)){
        f_EPTF_UIHandler_refreshWidget(v_UIHandler_openSubscriptions[vl_paramIdx]);
        f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleErrorResp(9999, vl_argument, requestor, illegalArgument, "ERROR: illegal input value at " & f_EPTF_Var_getName(v_UIHandler_openSubscriptions[vl_paramIdx].varIdx)));
      }
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_updatesubscriptionsguilist
  //
  //  Purpose:
  //    Refreshes the content of the widgets connected to the specified variable.
  //
  //  Parameters:
  //    pl_varIdx - *in* *integer - The index of the variable.
  //    pl_dcontent - *in* *EPTF_Var_DirectContent* - The new content.
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_updatesubscriptionsguilist(
    in integer pl_varIdx,
    in EPTF_Var_DirectContent pl_dcontent)
  runs on EPTF_UIHandler_Private_CT {
    var EPTF_UIHandler_OpenSubscriptions vl_subs;
    if(f_EPTF_UIHandler_getSubscriptionsByVarIdx(pl_varIdx, vl_subs)){
      for(var integer vl_i := 0; vl_i < sizeof(vl_subs); vl_i := vl_i + 1){
        f_EPTF_UIHandler_updateguilist_refreshwidget(vl_subs[vl_i].widgetId,
          pl_dcontent);
        //        f_EPTF_Var_directContent2str(pl_dcontent));

      }
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_adjustContentResponseHandler
  //
  //  Purpose:
  //    Response handler callback function for Variable adjustContent.
  ///////////////////////////////////////////////////////////
  friend function f_EPTF_UIHandler_adjustContentResponseHandler(
    in integer pl_idx,
    in EPTF_Var_DirectContent pl_content,
    in boolean pl_result,
    in EPTF_IntegerList pl_argList) runs on EPTF_UIHandler_Private_CT
  {
    if(not pl_result) { // guard function returned false
      var EPTF_UIHandler_OpenSubscriptions vl_subs;
      if(f_EPTF_UIHandler_getSubscriptionsByVarIdx(pl_idx, vl_subs)){
        for(var integer i := 0; i < sizeof(vl_subs); i := i + 1) {
          f_EPTF_UIHandler_refreshWidget(vl_subs[i],-,pl_content);
        }
      }
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_parseParamValue
  //
  //  Purpose:
  //    Parses a charstring value and
  //    stores it in the specified variable
  ///////////////////////////////////////////////////////////
  friend function f_EPTF_UIHandler_parseParamValue(
    in integer pl_varIdx,
    in charstring pl_argument)
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    var EPTF_Var vl_parsedArgument;
    var EPTF_Var_DirectContent vl_content;
    f_EPTF_Var_getContent(pl_varIdx, vl_content);
    var boolean vl_ret := false;
    if (ischosen(vl_content.intVal)){
      var charstring vl_arg := f_EPTF_UIHandler_str2Integer(pl_argument);
      if(vl_arg != "") {
        vl_parsedArgument.content.direct.intVal := str2int(vl_arg);
        // detect user typos
        //if ((vl_parsedArgument.content.direct.intVal != 0) or (vl_arg == "0"))
        { // store
          f_EPTF_UIHandler_updatesubscriptionsguilist(pl_varIdx, vl_parsedArgument.content.direct);
          f_EPTF_Var_adjustContent(pl_varIdx, vl_parsedArgument.content.direct,
            {refers(f_EPTF_UIHandler_adjustContentResponseHandler), {}});
          vl_ret := true;
        }
      }
    }
    else if (ischosen(vl_content.integerlistVal))
    {
      // parse it
      vl_parsedArgument.content.direct.integerlistVal := f_EPTF_UIHandler_str2IntegerList(pl_argument);
      // detect user typos
      if ((sizeof(vl_parsedArgument.content.direct.integerlistVal) != 0) or (regexp(pl_argument, "\\s#(,)([0-9]+)\\s#(,)", 0) == ""))
      {
        // no typo, argument ok
        // store
        f_EPTF_UIHandler_updatesubscriptionsguilist(pl_varIdx, vl_parsedArgument.content.direct);
        f_EPTF_Var_adjustContent(pl_varIdx, vl_parsedArgument.content.direct,
          {refers(f_EPTF_UIHandler_adjustContentResponseHandler), {}});
        vl_ret := true;
      }
    }
    else if (ischosen(vl_content.floatlistVal))
    {
      // parse it
      vl_parsedArgument.content.direct.floatlistVal := f_EPTF_UIHandler_str2FloatList(pl_argument);
      // detect user typos
      if (sizeof(vl_parsedArgument.content.direct.floatlistVal) != 0) //: a regexp should be here??
      {
        // no typo, argument ok
        // store
        f_EPTF_UIHandler_updatesubscriptionsguilist(pl_varIdx, vl_parsedArgument.content.direct);
        f_EPTF_Var_adjustContent(pl_varIdx, vl_parsedArgument.content.direct,
          {refers(f_EPTF_UIHandler_adjustContentResponseHandler), {}});
        vl_ret := true;
      }
    }
    else if (ischosen(vl_content.octetstringVal))
    {
      // detect user typos
      if (regexp(pl_argument, "\\s#(,)([0-9a-fA-F]+)\\s#(,)", 0) != "")
      {
        // check if the length of pl_argument is odd
        var charstring vl_convertedOS := regexp(pl_argument, "\\s#(,)([0-9a-fA-F]+)\\s#(,)", 0);
        if ((lengthof(vl_convertedOS) mod 2) != 0) { vl_convertedOS := "0" & vl_convertedOS };

        vl_parsedArgument.content.direct.octetstringVal := str2oct(vl_convertedOS);
        // store
        f_EPTF_UIHandler_updatesubscriptionsguilist(pl_varIdx, vl_parsedArgument.content.direct);
        f_EPTF_Var_adjustContent(pl_varIdx, vl_parsedArgument.content.direct,
          {refers(f_EPTF_UIHandler_adjustContentResponseHandler), {}});
        vl_ret := true;
      }
    }
    else if (ischosen(vl_content.floatVal))
    {
      // detect user typos
      if (regexp(pl_argument, c_EPTF_CLI_floatNumber, 0) != "")
      {
        vl_parsedArgument.content.direct.floatVal := str2float(pl_argument);
        // store
        f_EPTF_UIHandler_updatesubscriptionsguilist(pl_varIdx, vl_parsedArgument.content.direct);
        f_EPTF_Var_adjustContent(pl_varIdx, vl_parsedArgument.content.direct,
          {refers(f_EPTF_UIHandler_adjustContentResponseHandler), {}});
        vl_ret := true;
      }
    }
    else if (ischosen(vl_content.boolVal))
    {
      vl_parsedArgument.content.direct.boolVal := f_EPTF_UIHandler_str2bool(pl_argument);
      // store
      f_EPTF_Var_adjustContent(pl_varIdx, vl_parsedArgument.content.direct,
        {refers(f_EPTF_UIHandler_adjustContentResponseHandler), {}});
      vl_ret := true;
    }
    else if (ischosen(vl_content.bitstringVal))
    {
      // detect user typos
      if (regexp(pl_argument, "\\s#(,)([01]+)\\s#(,)", 0) != "")
      {
        vl_parsedArgument.content.direct.bitstringVal := str2bit(pl_argument);
        // store
        f_EPTF_UIHandler_updatesubscriptionsguilist(pl_varIdx, vl_parsedArgument.content.direct);
        f_EPTF_Var_adjustContent(pl_varIdx, vl_parsedArgument.content.direct,
          {refers(f_EPTF_UIHandler_adjustContentResponseHandler), {}});
        vl_ret := true;
      }
    }
    else if (ischosen(vl_content.hexstringVal))
    {
      // detect user typos
      if (regexp(pl_argument, "\\s#(,)([0-9a-fA-F]+)\\s#(,)", 0) != "")
      {
        vl_parsedArgument.content.direct.hexstringVal := str2hex(pl_argument);
        // store
        f_EPTF_UIHandler_updatesubscriptionsguilist(pl_varIdx, vl_parsedArgument.content.direct);
        f_EPTF_Var_adjustContent(pl_varIdx, vl_parsedArgument.content.direct,
          {refers(f_EPTF_UIHandler_adjustContentResponseHandler), {}});
        vl_ret := true;
      }
    }
    else if (ischosen(vl_content.charstringVal))
    {
      vl_parsedArgument.content.direct.charstringVal := pl_argument;
      // store
      f_EPTF_UIHandler_updatesubscriptionsguilist(pl_varIdx, vl_parsedArgument.content.direct);
      f_EPTF_Var_adjustContent(pl_varIdx, vl_parsedArgument.content.direct,
        {refers(f_EPTF_UIHandler_adjustContentResponseHandler), {}});
      vl_ret := true;
    }
    else if (ischosen(vl_content.statusLEDVal))
    {
      // parse statusled string
      const charstring cl_ledStart := "[led:";
      const charstring cl_ledEnd := "]";
      var charstring vl_ledColor := f_substr_token(pl_argument,cl_ledStart,cl_ledEnd);
      var charstring vl_withText := "";
      var EPTF_LEDColors vl_color;
      if(vl_ledColor != "") {
        var charstring vl_ledStr := cl_ledStart&vl_ledColor&cl_ledEnd;
        var integer vl_i:=f_strstr(pl_argument,vl_ledStr);
        if(vl_i==0) {
          vl_withText := substr(pl_argument, lengthof(vl_ledStr), (lengthof(pl_argument)-lengthof(vl_ledStr)));
          select(vl_ledColor) {
            case ("blue"){ vl_color := led_blue;}
            case ("black"){ vl_color := led_black;}
            case ("yellow"){ vl_color := led_yellow;}
            case ("green"){ vl_color := led_green;}
            case ("red"){ vl_color := led_red;}
          }
          if(isbound(vl_color)==true) {
            if(vl_withText == "") {
              vl_parsedArgument.content.direct.statusLEDVal := {color:=vl_color, text:= omit };
            }
            else {
              vl_parsedArgument.content.direct.statusLEDVal := {color:=vl_color, text:= vl_withText };
            }
            // store
            f_EPTF_UIHandler_updatesubscriptionsguilist(pl_varIdx, vl_parsedArgument.content.direct);
            f_EPTF_Var_adjustContent(pl_varIdx, vl_parsedArgument.content.direct, {refers(f_EPTF_UIHandler_adjustContentResponseHandler), {}});
            vl_ret := true;
          }
        }
      }
    }
    else{
      f_EPTF_UIHandler_warning("Invalid value type!");
      //f_EPTF_Base_stop();
    }
    return vl_ret;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_setWidgetOriginalDisabled
  //
  //  Purpose:
  //   Set oroginal enabled state of the widget in the list of GUI items
  //
  //  Parameters:
  //    pl_i - *in* *integer* the idx of the widget in the gui items' list
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_setWidgetOriginalDisabled(in integer pl_i)
  runs on EPTF_UIHandler_Private_CT
  return boolean
  {
    if (pl_i == -1){return false;}
    v_UIHandler_guiItemList[pl_i].xuldisabled := false;			// always setup
    if (v_UIHandler_guiItemList[pl_i].widgetType == wtTabpages){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.tabpages.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.tabpages.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTabpage){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.tabpage.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.tabpage.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtHbox){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.hbox.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.hbox.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTree){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.tree.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.tree.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTreecol){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.treecol.disabledongui)){
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.treecol.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTreecell){
      // cell editable info not present in XUL -> after headless mode enabled cell could become disabled
      // workaround:  enabling a cell enables the whole column
      // get treecol's widgetIdx
      var integer vl_colIdx := v_UIHandler_guiItemList[pl_i].widgetData.cellData.colIdx;
      // set treecol editable
      if(ispresent(v_UIHandler_guiItemList[vl_colIdx].XULformat.treecol.disabledongui)){
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[vl_colIdx].XULformat.treecol.disabledongui;
      } else {
        v_UIHandler_guiItemList[pl_i].xuldisabled := false;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtLabel){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.label_.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.label_.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtButton){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.button.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.button.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTextbox){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.textbox.disabledongui)) {
         v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.textbox.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtNumericalwidget){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.numericalwidget.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.numericalwidget.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtChart){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.chart.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.chart.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtDistributionchart){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.distributionchart.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.distributionchart.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtToolbar){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.toolbar.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.toolbar.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtToolbarbutton){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.toolbarbutton.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.toolbarbutton.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtListbox){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.listbox.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.listbox.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtMenulist){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.menulist.disabledongui)) {
         v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.menulist.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtPushbutton){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.pushbutton.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.pushbutton.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTogglebutton){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.togglebutton.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.togglebutton.disabledongui;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtHtmlcode){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.htmlcode.disabledongui)) {
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[pl_i].XULformat.htmlcode.disabledongui;
      }
    }
    return(v_UIHandler_guiItemList[pl_i].xuldisabled);
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_updateguilist_enablewidget
  //
  //  Purpose:
  //    Sets the enabled state of the widget in the list of GUI items to enabled
  //
  //  Parameters:
  //    pl_i - *in* *integer* the idx of the widget in the gui items' list
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_updateguilist_enablewidget(in integer pl_i) runs on EPTF_UIHandler_Private_CT {
    if (pl_i == -1){return;}
    // If disabled in xul -> just return
    if(not ispresent(v_UIHandler_guiItemList[pl_i].xuldisabled)){
      var boolean vl_enabled := f_EPTF_UIHandler_setWidgetOriginalDisabled(pl_i);
    }
    // If disabled on XML ->
    if(v_UIHandler_guiItemList[pl_i].xuldisabled == true){
      return;
    }
    if (v_UIHandler_guiItemList[pl_i].widgetType == wtButton){
      v_UIHandler_guiItemList[pl_i].XULformat.button.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTabpages){
      v_UIHandler_guiItemList[pl_i].XULformat.tabpages.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTree){
      v_UIHandler_guiItemList[pl_i].XULformat.tree.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTreecol){
      v_UIHandler_guiItemList[pl_i].XULformat.treecol.editable := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTreecell){
      // cell editable info not present in XUL -> after headless mode enabled cell could become disabled
      // workaround:  enabling a cell enables the whole column
      // get treecol's widgetIdx
      //      var integer vl_colIdx := v_UIHandler_guiItemList[pl_i].widgetData.cellData.colIdx;
      // set treecol editable
      //      v_UIHandler_guiItemList[vl_colIdx].XULformat.treecol.editable := true;
	  var integer vl_colIdx := v_UIHandler_guiItemList[pl_i].widgetData.cellData.colIdx;
      // set treecol editable
      if(0<= vl_colIdx and ispresent(v_UIHandler_guiItemList[vl_colIdx].xuldisabled)) {
        // If disabled on XML
        v_UIHandler_guiItemList[pl_i].xuldisabled := v_UIHandler_guiItemList[vl_colIdx].xuldisabled;
      } else {
        v_UIHandler_guiItemList[pl_i].xuldisabled := false;
      }
      v_UIHandler_guiItemList[pl_i].widgetData.cellData.editable := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtHbox){
      v_UIHandler_guiItemList[pl_i].XULformat.hbox.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtLabel){
      v_UIHandler_guiItemList[pl_i].XULformat.label_.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTextbox){
      v_UIHandler_guiItemList[pl_i].XULformat.textbox.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtChart){
      v_UIHandler_guiItemList[pl_i].XULformat.chart.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtListbox){
      v_UIHandler_guiItemList[pl_i].XULformat.listbox.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtNumericalwidget){
      v_UIHandler_guiItemList[pl_i].XULformat.numericalwidget.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtMenulist){
      v_UIHandler_guiItemList[pl_i].XULformat.menulist.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtDistributionchart){
      v_UIHandler_guiItemList[pl_i].XULformat.distributionchart.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtPushbutton){
      v_UIHandler_guiItemList[pl_i].XULformat.pushbutton.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTogglebutton){
      v_UIHandler_guiItemList[pl_i].XULformat.togglebutton.disabled := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtHtmlcode){
      v_UIHandler_guiItemList[pl_i].XULformat.htmlcode.disabled := false;
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_updateguilist_disablewidget
  //
  //  Purpose:
  //    Sets the enabled state of the widget in the list of GUI items to disabled
  //
  //  Parameters:
  //    pl_i - *in* *integer* the idx of the widget in the gui items' list
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_updateguilist_disablewidget(in integer pl_i) runs on EPTF_UIHandler_Private_CT {
    if (pl_i == -1) {return;}
    if (v_UIHandler_guiItemList[pl_i].widgetType == wtButton){
      v_UIHandler_guiItemList[pl_i].XULformat.button.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTabpages){
      v_UIHandler_guiItemList[pl_i].XULformat.tabpages.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTree){
      v_UIHandler_guiItemList[pl_i].XULformat.tree.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTreecol){
      v_UIHandler_guiItemList[pl_i].XULformat.treecol.editable := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTreecell){
      v_UIHandler_guiItemList[pl_i].widgetData.cellData.editable := false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtHbox){
      v_UIHandler_guiItemList[pl_i].XULformat.hbox.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtLabel){
      v_UIHandler_guiItemList[pl_i].XULformat.label_.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTextbox){
      v_UIHandler_guiItemList[pl_i].XULformat.textbox.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtChart){
      v_UIHandler_guiItemList[pl_i].XULformat.chart.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtListbox){
      v_UIHandler_guiItemList[pl_i].XULformat.listbox.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtNumericalwidget){
      v_UIHandler_guiItemList[pl_i].XULformat.numericalwidget.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtMenulist){
      v_UIHandler_guiItemList[pl_i].XULformat.menulist.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtDistributionchart){
      v_UIHandler_guiItemList[pl_i].XULformat.distributionchart.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtPushbutton){
      v_UIHandler_guiItemList[pl_i].XULformat.pushbutton.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTogglebutton){
      v_UIHandler_guiItemList[pl_i].XULformat.togglebutton.disabled := true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtHtmlcode){
      v_UIHandler_guiItemList[pl_i].XULformat.htmlcode.disabled := true;
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_isWidgetEnabled
  //
  //  Purpose:
  //    Gets the enabled state of the widget in the list of GUI items
  //
  //  Parameters:
  //    pl_i - *in* *integer* the idx of the widget in the gui items' list
  ///////////////////////////////////////////////////////////
  friend function f_EPTF_UIHandler_isWidgetEnabled(in integer pl_i)
  runs on EPTF_UIHandler_Private_CT
  return boolean
  {
    if (pl_i == -1){return false;}
    // If disabled on XML
    if(v_UIHandler_guiItemList[pl_i].xuldisabled == true){ return false; }
    if (v_UIHandler_guiItemList[pl_i].widgetType == wtButton){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.button.disabled)) {
        return not v_UIHandler_guiItemList[pl_i].XULformat.button.disabled;
      } else {
        return true;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTreecol){
      if(v_UIHandler_guiItemList[pl_i].XULformat.treecol.widgetType == statusLED or
        v_UIHandler_guiItemList[pl_i].XULformat.treecol.widgetType == statusLEDWithText) {
        return false;
      }
      return v_UIHandler_guiItemList[pl_i].XULformat.treecol.editable;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTreecell){
      // cell editable info not present in XUL -> after headless mode enabled cell could become disabled
      // workaround:  enabling a cell enables the whole column
      // get treecol's widgetIdx
      if(ispresent(v_UIHandler_guiItemList[pl_i].widgetData.cellData.editable)) {
        return v_UIHandler_guiItemList[pl_i].widgetData.cellData.editable;
      }
      var integer vl_colIdx := v_UIHandler_guiItemList[pl_i].widgetData.cellData.colIdx;
      // set treecol editable
      if(v_UIHandler_guiItemList[vl_colIdx].XULformat.treecol.widgetType == statusLED or
        v_UIHandler_guiItemList[vl_colIdx].XULformat.treecol.widgetType == statusLEDWithText) {
        return false;
      }
      return (not ispresent(v_UIHandler_guiItemList[vl_colIdx].XULformat.treecol.editable)) or
      v_UIHandler_guiItemList[vl_colIdx].XULformat.treecol.editable;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTextbox){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.textbox.readonly)
        and v_UIHandler_guiItemList[pl_i].XULformat.textbox.readonly) { return false; }
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.textbox.disabled)) {
        return not v_UIHandler_guiItemList[pl_i].XULformat.textbox.disabled;
      } else {
        return true;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtListbox){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.listbox.disabled)) {
        return not v_UIHandler_guiItemList[pl_i].XULformat.listbox.disabled;
      } else {
        return true;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtNumericalwidget){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.numericalwidget.readonly)
        and v_UIHandler_guiItemList[pl_i].XULformat.numericalwidget.readonly) { return false; }
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.numericalwidget.disabled)) {
        return not v_UIHandler_guiItemList[pl_i].XULformat.numericalwidget.disabled;
      } else {
        return true;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtMenulist){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.menulist.disabled)) {
        return not v_UIHandler_guiItemList[pl_i].XULformat.menulist.disabled;
      } else {
        return true;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtPushbutton){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.pushbutton.disabled)) {
        return not v_UIHandler_guiItemList[pl_i].XULformat.pushbutton.disabled;
      } else {
        return true;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTogglebutton){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.togglebutton.disabled)) {
        return not v_UIHandler_guiItemList[pl_i].XULformat.togglebutton.disabled;
      } else {
        return true;
      }
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtHtmlcode){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.htmlcode.disabled)) {
        return not v_UIHandler_guiItemList[pl_i].XULformat.htmlcode.disabled;
      } else {
        return true;
      }
    }
    /* else if (v_UIHandler_guiItemList[pl_i].widgetType == wtDistributionchart){
    return false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTabbox){
    return false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTree){
    return false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtHbox){
    return false;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtLabel){
    return false; // text labels are never editable on the GUI
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtChart){
    return false;
    }*/else { return false; }
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_isWidgetUninitialisedOrDisabled
  //
  //  Purpose:
  //    Gets the unitialised or disabled state of the widget in the list of GUI items
  //
  //  Parameters:
  //    pl_i - *in* *integer* the idx of the widget in the gui items' list
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_isWidgetUninitialisedOrDisabled(in integer pl_i)
  runs on EPTF_UIHandler_Private_CT
  return boolean
  {
    if (pl_i == -1){return false;}
    if (v_UIHandler_guiItemList[pl_i].widgetType == wtButton){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.button.disabled)) {
        return v_UIHandler_guiItemList[pl_i].XULformat.button.disabled;
      }
      return true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTreecol){
      if(v_UIHandler_guiItemList[pl_i].XULformat.treecol.widgetType == statusLED or
        v_UIHandler_guiItemList[pl_i].XULformat.treecol.widgetType == statusLEDWithText) {
        return true;
      }
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.treecol.editable)) {
        return not v_UIHandler_guiItemList[pl_i].XULformat.treecol.editable;
      }
      return true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTreecell){
      if(ispresent(v_UIHandler_guiItemList[pl_i].widgetData.cellData.editable)) {
        return not v_UIHandler_guiItemList[pl_i].widgetData.cellData.editable;
      }
      return true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTextbox){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.textbox.readonly)
         and v_UIHandler_guiItemList[pl_i].XULformat.textbox.readonly) {
        return true;
      }
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.textbox.disabled)) {
        return v_UIHandler_guiItemList[pl_i].XULformat.textbox.disabled;
      }
      return true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtListbox){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.listbox.disabled)) {
        return v_UIHandler_guiItemList[pl_i].XULformat.listbox.disabled;
      }
      return true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtNumericalwidget){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.numericalwidget.readonly)
         and v_UIHandler_guiItemList[pl_i].XULformat.numericalwidget.readonly) {
        return true;
      }
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.numericalwidget.disabled)) {
        return v_UIHandler_guiItemList[pl_i].XULformat.numericalwidget.disabled;
      }
      return true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtMenulist){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.menulist.disabled)) {
        return v_UIHandler_guiItemList[pl_i].XULformat.menulist.disabled;
      }
      return true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtPushbutton){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.pushbutton.disabled)) {
        return v_UIHandler_guiItemList[pl_i].XULformat.pushbutton.disabled;
      }
      return true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtTogglebutton){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.togglebutton.disabled)) {
         return v_UIHandler_guiItemList[pl_i].XULformat.togglebutton.disabled;
      }
      return true;
    } else if (v_UIHandler_guiItemList[pl_i].widgetType == wtHtmlcode){
      if(ispresent(v_UIHandler_guiItemList[pl_i].XULformat.htmlcode.disabled)) {
        return v_UIHandler_guiItemList[pl_i].XULformat.htmlcode.disabled;
      }
      return true;
    }
    else { return true; }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_isGuiVarEditable
  //
  //  Purpose:
  //    Gets the enabled state of a GUI variable
  //
  //  Parameters:
  //    pl_varIdx - *in* *integer* the idx of the GUI variable
  ///////////////////////////////////////////////////////////
  friend function f_EPTF_UIHandler_isGuiVarEditable(in integer pl_varIdx)
  runs on EPTF_UIHandler_Private_CT
  return boolean
  {
    var EPTF_UIHandler_OpenSubscriptions vl_subs := {};
    if(f_EPTF_UIHandler_getSubscriptionsByVarIdx(pl_varIdx, vl_subs)) {
      for(var integer i:=0;i<sizeof(vl_subs);i:=i+1) {
        var integer vl_widgetIdx := f_EPTF_UIHandler_widgetRecIndex(vl_subs[i].widgetId);
        if(vl_widgetIdx != -1 and f_EPTF_UIHandler_isWidgetEnabled(vl_widgetIdx)) { return true; }
      }
      return false;
    } else {
      return false;
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_handleEnableWidgetByIdx
  //
  //  Purpose:
  //    Handles the EnableWidgetByIdx and DisableWidgetByIdx messages
  //
  //  Parameters:
  //    pl_msg - *in* *EPTF_UIHandler_AdminEnableWidgetByIdx* - the message that specifies the widget
  //    pl_enable - *in* *boolean* - Describes what to do. Enable or disable.
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_handleEnableWidgetByIdx(
    in EPTF_UIHandler_AdminEnableWidgetByIdx pl_msg,
    in boolean pl_enable)
  runs on EPTF_UIHandler_Private_CT {
    var EPTF_UIHandler_OpenSubscriptions vl_subs;
    if(f_EPTF_UIHandler_getSubscriptionsByVarIdx(pl_msg.index, vl_subs)){
      for(var integer vl_i := 0; vl_i < sizeof(vl_subs); vl_i := vl_i + 1){
        var integer vl_widgetIdx := f_EPTF_UIHandler_widgetRecIndex(vl_subs[vl_i].widgetId);
        if(-1 == vl_widgetIdx){
          f_EPTF_UIHandler_warning("The variable index is invalid!");
          EPTF_adminPort_CP.send(
            t_UIHandler_AdminEnableWidgetNAck(pl_msg.messageID)) to vl_subs[vl_i].provider;
          return;
        }
        if(pl_enable){
          f_EPTF_Base_assert(%definitionId&": Invalid  widget id: "&vl_subs[vl_i].widgetId, vl_widgetIdx > -1);
          f_EPTF_UIHandler_updateguilist_enablewidget(vl_widgetIdx);
        }else{
          f_EPTF_Base_assert(%definitionId&": Invalid  widget id: "&vl_subs[vl_i].widgetId, vl_widgetIdx > -1);
          f_EPTF_UIHandler_updateguilist_disablewidget(vl_widgetIdx);
        }
       // check here
       if(f_EPTF_UIHandler_isWidgetEnabled(vl_widgetIdx) == true){
          f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_enableWidget(vl_subs[vl_i].widgetId));
        }else{
          f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_disableWidget(vl_subs[vl_i].widgetId));
        }
        EPTF_adminPort_CP.send(
          t_UIHandler_AdminEnableWidgetAck(pl_msg.messageID))to vl_subs[vl_i].provider;
      }
    }
  }

  //=========================================================================
  // Altsteps
  //=========================================================================
  ///////////////////////////////////////////////////////////
  //  Altstep: as_UIHandler_pingGUI
  //
  //  Purpose:
  //    In headless mode, it transmits UDP pings and
  //    receives, validates the answers
  ///////////////////////////////////////////////////////////
  private altstep as_UIHandler_pingGUI() runs on EPTF_UIHandler_Private_CT {
    []t_UIHandler_pingtimer.timeout{
      var Result vl_result
      f_EPTF_Transport_sendTo(
        IPL4,
        v_UIHandler_pingerConnectionId,
        v_UIHandler_GUI_Host,
        v_UIHandler_udp_port,
        char2oct("This is UIHandler: " & int2str(v_UIHandler_pingcounter)),
        vl_result,
        false)
      v_UIHandler_pingcounter := v_UIHandler_pingcounter + 1;
      if (v_UIHandler_pingcounter == 2147483646) {v_UIHandler_pingcounter := 2;v_UIHandler_prevpingcounter := 0;v_UIHandler_succpingcounter:=0;}
      t_UIHandler_pingtimer.start;
      repeat;
    }
  }

  //FIXME Use new API
  function f_EPTF_UIHandler_pingerReceive(
    in EPTF_Transport_TransportType pl_transportType,
    in ConnectionId pl_connId,
    in HostName pl_remHost,
    in PortNumber pl_remPort,
    in HostName pl_locHost,
    in PortNumber pl_locPort,
    in ProtoTuple pl_proto,
    in integer pl_userData,
    in octetstring pl_msg)
  runs on EPTF_UIHandler_Private_CT
  {
    if (not v_UIHandler_initialized) {
      return;
    }
    if(not match(pl_msg, '47554920726573706F6E73653A*'O)) {
      return;
    }
    if (v_UIHandler_prevpingcounter == v_UIHandler_pingcounter - 2) {
      v_UIHandler_succpingcounter := v_UIHandler_succpingcounter + 1;
    } else {v_UIHandler_succpingcounter := 0;}
    v_UIHandler_prevpingcounter := v_UIHandler_pingcounter - 1;
    if (v_UIHandler_succpingcounter == 3) {
      f_EPTF_UIHandler_headlessmodeover();
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_UIHandler_setHandshakeMaxTime
  //
  //  Purpose:
  //    Sets the XTDP handshake timeout
  //
  //  Parameters:
  //    pl_maxTime - *in* *float* - the time of the XTDP handshake timeout in seconds. Default: 1.0
  ///////////////////////////////////////////////////////////
  public function f_UIHandler_setHandshakeMaxTime(in float pl_maxTime := 1.0) runs on EPTF_UIHandler_Private_CT {
    v_handshakeMaxTime := pl_maxTime;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_UIHandler_setByeMaxTime
  //
  //  Purpose:
  //    Sets the XTDP bye timeout
  //
  //  Parameters:
  //    pl_maxTime - *in* *float* - the time of the XTDP bye timeout in seconds. Default: 1.0
  ///////////////////////////////////////////////////////////
  public function f_UIHandler_setByeMaxTime(in float pl_maxTime := 1.0) runs on EPTF_UIHandler_Private_CT {
    v_byeMaxTime := pl_maxTime;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_UIHandler_setAuthMaxTime
  //
  //  Purpose:
  //    Sets the XTDP authentication timeout
  //
  //  Parameters:
  //    pl_maxTime - *in* *float* - the time of the XTDP authentication timeout in seconds. Default: 1.0
  ///////////////////////////////////////////////////////////
  public function f_UIHandler_setAuthMaxTime(in float pl_maxTime := 1.0) runs on EPTF_UIHandler_Private_CT {
    v_authMaxTime := pl_maxTime;
  }


  /////////////////////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_WidgetFunctions_setXTDP_XSDFilepath
  //
  //  Purpose:
  //    This function sets the the UIHandler XTDP XSD file path.
  //    If its not empty string the CreateGUI validate the XML with it.
  //
  //  Parameters:
  //    pl_filepath - *in* <charstring> - the file path
  //
  //  Return Value:
  //    -
  //
  /////////////////////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_WidgetFunctions_setXTDP_XSDFilepath(in charstring pl_filepath)
    runs on EPTF_UIHandler_Private_CT{
      v_EPTF_UIHandler_WidgetFunctions_XTDP_XSD_filepath := pl_filepath;
  }

  /////////////////////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_WidgetFunctions_getXTDP_XSDFilepath
  //
  //  Purpose:
  //    This function returns with the UIHandler XTDP XSD file path.
  //
  //  Parameters:
  //    -
  //
  //  Return Value:
  //    *charstring* - the filepath
  //
  /////////////////////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_WidgetFunctions_getXTDP_XSDFilepath()
    runs on EPTF_UIHandler_Private_CT return charstring{
      return v_EPTF_UIHandler_WidgetFunctions_XTDP_XSD_filepath;
  }


  const float c_EPTF_UIHandler_xtdpMyVersion := 1.0;
  const float c_EPTF_UIHandler_xtdlMyVersion := 1.0;

  // returns the error message ("" if success)
  private function f_EPTF_UIHandler_handshake(in integer pl_guiClientId) runs on EPTF_UIHandler_Private_CT return charstring {
    v_UIHandler_lastRequest := v_UIHandler_lastRequest + 1;
    var integer vl_handshakeTimer := f_EPTF_Semaphore_new();
    var Result vl_result
    f_EPTF_Transport_send(
      IPL4,
      pl_guiClientId,//v_UIHandler_GUIClientId[i],
      f_EPTF_UIHandler_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Message:{
            transactionID := vl_handshakeTimer+1000*v_UIHandler_lastRequest,
            choice := { xTDP_HandshakeRequest := {
                xtdpRequiredVersion := c_EPTF_UIHandler_xtdpMyVersion,
                xtdlRequiredVersion := c_EPTF_UIHandler_xtdlMyVersion,
                xtdpMyVersion := c_EPTF_UIHandler_xtdpMyVersion,
                xtdlMyVersion := c_EPTF_UIHandler_xtdlMyVersion
                ,elem_list := {}
              }}
          })),
      vl_result,
      false
    );
    v_handshakeErrorMsg := "";
    if (f_EPTF_Semaphore_waitForUnlock(vl_handshakeTimer,v_handshakeMaxTime)) {
      // max wait time expired before response received:
      v_handshakeErrorMsg := "Error: UIHandler: Communication error: No response received for Handshake request"
    }
    if (v_handshakeErrorMsg!="") {
      f_EPTF_UIHandler_warning("XTDP Handshake failed for client "&log2str(pl_guiClientId)&". Closing XTDP session. Handshake result: "&v_handshakeErrorMsg);
      f_EPTF_UIHandler_closeXTDPSession(pl_guiClientId);
      // handshake unsuccessful
    }
    f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
    return v_handshakeErrorMsg;
  }

  ///////////////////////////////////////////////////////////
  //  Altstep: as_UIHandler_handleSubscriptNote
  //
  //  Purpose:
  //    Calls the f_EPTF_UIHandler_handleSubscriptNote
  //    when receives a subscription note
  ///////////////////////////////////////////////////////////
  private altstep as_UIHandler_handleSubscriptNote() runs on EPTF_UIHandler_Private_CT {
    var EPTF_UIHandler_WidgetMsg vl_EPTF_CLL_UISubscMgmtMsg;
    var EPTF_Var_CT vl_EPTF_CLL_UISubscMgmtMsg_sender;
    [] EPTF_adminPort_CP.receive({subscribeNoteMsg := ?}) -> value vl_EPTF_CLL_UISubscMgmtMsg sender vl_EPTF_CLL_UISubscMgmtMsg_sender {
      f_EPTF_UIHandler_handleSubscriptNote(vl_EPTF_CLL_UISubscMgmtMsg.subscribeNoteMsg,vl_EPTF_CLL_UISubscMgmtMsg_sender);
    }
  }

  private altstep as_UIHandler_bufferedXTDP() runs on EPTF_UIHandler_Private_CT
  {
    []t_UIHandler_bufferedXTDP.timeout
    {
      //      if (sizeof(v_UIHandler_Requestbuffer.data.choice.xTDP_Requests.xTDP_Request_list) != 0)
      if (f_EPTF_UIHandler_requestBuffer_size() != 0)
      {
        for (var integer i:=0;i<sizeof(v_UIHandler_GUIClientId);i:=i+1)
        {
          //    v_UIHandler_Requestbuffer.client_id := v_UIHandler_GUIClientId[i];
          if (v_UIHandler_guiConnected)
          {
            var Result vl_result
            f_EPTF_Transport_send(IPL4, v_UIHandler_GUIClientId[i].clientId, f_EPTF_UIHandler_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(v_UIHandler_Requestbuffer.data)), vl_result, false)
          }
        }
        //        v_UIHandler_Requestbuffer.data.choice.xTDP_Requests.xTDP_Request_list := {};
        f_EPTF_UIHandler_requestBuffer_clear();
      }
      t_UIHandler_bufferedXTDP.start(tsp_EPTF_UIHandler_bufferedXTDP);
    }
  }
  ///////////////////////////////////////////////////////////
  //  Altstep: as_UIHandler_handleSubscriptNote
  //
  //  Purpose:
  //    The main altstep of the component
  ///////////////////////////////////////////////////////////
  private altstep as_handle_main_EPTF_UIHandler_MgmtIf() runs on EPTF_UIHandler_Private_CT {
    [/*not v_UIHandler_subscriptInProcess*/] as_UIHandler_handleSubscriptNote(){repeat;};
    [not v_UIHandler_guiConnected and not v_EPTF_UIHandler_servermode] as_UIHandler_pingGUI(){repeat;}
    [f_EPTF_UIHandler_layoutReady()] as_UIHandler_handleEnableWidget(){repeat;};
    [f_EPTF_UIHandler_layoutReady()] as_UIHandler_handleDisableWidget(){repeat;};
    [f_EPTF_UIHandler_layoutReady()] as_UIHandler_handleSetFocusToWidget(){repeat;};
    [f_EPTF_UIHandler_layoutReady()] as_UIHandler_handleaddElementToGUI(){repeat;};
    [f_EPTF_UIHandler_layoutReady()] as_UIHandler_handleCreateGUI(){repeat;};
    [f_EPTF_UIHandler_layoutReady()] as_UIHandler_handleremoveElementFromGUI(){repeat;};
    [f_EPTF_UIHandler_layoutReady()] as_UIHandler_handleWidgetExists(){repeat;};
    [tsp_EPTF_UIHandler_bufferedXTDP != 0.0] as_UIHandler_bufferedXTDP(){repeat;};
    [not v_UIHandler_createGUIRunning and v_UIHandler_initToGUIClient] as_UIHandler_handleInitGUIToClient(){repeat;}
  }

  ///////////////////////////////////////////////////////////
  //  Altstep: as_UIHandler_handleEnableWidget
  //
  //  Purpose:
  //    Altstep that handles enableWidget messages at CLL_UIHandler interface.
  //
  //  Errors:
  //    none
  //
  //  Detailed Comments:
  //    As altstep receives enableWidget requests, sends XTDP-enable-widget
  //    message to GUI if connected
  ///////////////////////////////////////////////////////////
  private altstep as_UIHandler_handleEnableWidget() runs on EPTF_UIHandler_Private_CT {
    var EPTF_UIHandler_WidgetMsg vl_EPTF_msg_tmp;
    [] EPTF_adminPort_CP.receive(t_UIHandler_AdminEnableWidgetByIdx(?,?))
    -> value vl_EPTF_msg_tmp sender v_UIHandler_address_tmp {
      f_EPTF_UIHandler_handleEnableWidgetByIdx(vl_EPTF_msg_tmp.enableWidgetByIdx, true);
      repeat;
    }
    [] EPTF_adminPort_CP.receive(t_UIHandler_AdminEnableWidgetByWidgetName(?,?)) -> value vl_EPTF_msg_tmp sender v_UIHandler_address_tmp {
      var EPTF_UIHandler_WidgetIdString vl_widgetName := vl_EPTF_msg_tmp.enableWidgetByWidgetName.widgetName;
      var integer vl_widgetIdx := f_EPTF_UIHandler_widgetRecIndex(vl_widgetName);
      if(-1 < vl_widgetIdx) {
      	f_EPTF_UIHandler_updateguilist_enablewidget(vl_widgetIdx);
      	if (vl_widgetName == "") {
    	    f_EPTF_UIHandler_warning("CLL_UIHandler: the widget name is empty in as_UIHandler_handleEnableWidget()");
    	    EPTF_adminPort_CP.send(t_UIHandler_AdminEnableWidgetNAck(vl_EPTF_msg_tmp.enableWidgetByWidgetName.messageID)) to v_UIHandler_address_tmp;
   	   	}
      }
      else {
     	    f_EPTF_UIHandler_warning("CLL_UIHandler: here is no widget with name "&vl_widgetName&" in as_UIHandler_handleEnableWidget()");
    	    EPTF_adminPort_CP.send(t_UIHandler_AdminEnableWidgetNAck(vl_EPTF_msg_tmp.enableWidgetByWidgetName.messageID)) to v_UIHandler_address_tmp;
      }
      if (v_UIHandler_guiConnected) {
        // check here
        if(f_EPTF_UIHandler_isWidgetEnabled(vl_widgetIdx) == true){
	       f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_enableWidget(vl_widgetName));
        } else {
          f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_disableWidget(vl_widgetName));
        }
      }
      EPTF_adminPort_CP.send(t_UIHandler_AdminEnableWidgetAck(vl_EPTF_msg_tmp.enableWidgetByWidgetName.messageID)) to v_UIHandler_address_tmp;
    }
  }

  ///////////////////////////////////////////////////////////
  //  Altstep: as_UIHandler_handleDisableWidget
  //
  //  Purpose:
  //    Altstep that handles disableWidget messages at CLL_UIHandler interface.
  //
  //  Errors:
  //    none
  //
  //  Detailed Comments:
  //    As altstep receives disableWidget requests, sends XTDP-disable-widget
  //    message to GUI if connected
  ///////////////////////////////////////////////////////////
  private altstep as_UIHandler_handleDisableWidget() runs on EPTF_UIHandler_Private_CT {
    var EPTF_UIHandler_WidgetMsg vl_EPTF_msg_tmp;
    [] EPTF_adminPort_CP.receive(t_UIHandler_AdminDisableWidgetByIdx(?,?)) -> value vl_EPTF_msg_tmp sender v_UIHandler_address_tmp {
      f_EPTF_UIHandler_handleEnableWidgetByIdx(vl_EPTF_msg_tmp.enableWidgetByIdx, false);
      repeat;
    }
    [] EPTF_adminPort_CP.receive(t_UIHandler_AdminDisableWidgetByWidgetName(?,?)) -> value vl_EPTF_msg_tmp sender v_UIHandler_address_tmp {
      var EPTF_UIHandler_WidgetIdString vl_widgetName := vl_EPTF_msg_tmp.disableWidgetByWidgetName.widgetName;
      var integer vl_widgetIdx := f_EPTF_UIHandler_widgetRecIndex(vl_widgetName);
      f_EPTF_UIHandler_updateguilist_disablewidget(vl_widgetIdx);
      if(-1 < vl_widgetIdx) {
      	if (vl_widgetName == "") {
	       	f_EPTF_UIHandler_warning("CLL_UIHandler: the widget name is empty in as_UIHandler_handleDisableWidget()");
	        EPTF_adminPort_CP.send(t_UIHandler_AdminDisableWidgetNAck(vl_EPTF_msg_tmp.disableWidgetByWidgetName.messageID)) to v_UIHandler_address_tmp;
      	}
      } else {
	  	f_EPTF_UIHandler_warning("CLL_UIHandler: here is no widget with name "&vl_widgetName&" in as_UIHandler_handleDisableWidget()");
	  	EPTF_adminPort_CP.send(t_UIHandler_AdminDisableWidgetNAck(vl_EPTF_msg_tmp.disableWidgetByWidgetName.messageID)) to v_UIHandler_address_tmp;
      }
      if (v_UIHandler_guiConnected) {
        f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_disableWidget(vl_widgetName));
      }
      EPTF_adminPort_CP.send(t_UIHandler_AdminDisableWidgetAck(vl_EPTF_msg_tmp.disableWidgetByWidgetName.messageID)) to v_UIHandler_address_tmp;
    }
  }

  ///////////////////////////////////////////////////////////
  //  Altstep: as_UIHandler_handleSetFocusToWidget
  //
  //  Purpose:
  //    Altstep that handles setFocusToWidget messages at CLL_UIHandler interface.
  //
  //  Errors:
  //    none
  //
  //  Detailed Comments:
  //    As altstep receives setFocusToWidget requests, sends XTDP-setfocus-widget
  //    message to GUI if connected
  ///////////////////////////////////////////////////////////
  private altstep as_UIHandler_handleSetFocusToWidget() runs on EPTF_UIHandler_Private_CT {
    var EPTF_UIHandler_WidgetMsg vl_EPTF_msg_tmp;
    [] EPTF_adminPort_CP.receive(t_UIHandler_AdminSetFocusToWidget(?,?,*)) -> value vl_EPTF_msg_tmp sender v_UIHandler_address_tmp {
      var EPTF_UIHandler_WidgetIdString vl_widgetName := vl_EPTF_msg_tmp.setFocusToWidget.widgetName;
      if (vl_widgetName == "") {
        f_EPTF_UIHandler_warning("CLL_UIHandler: the widget name is empty in as_UIHandler_handleSetFocusToWidget()");
        EPTF_adminPort_CP.send(t_UIHandler_AdminSetFocusToWidgetNAck(vl_EPTF_msg_tmp.setFocusToWidget.messageID)) to v_UIHandler_address_tmp;
      }
      if (v_UIHandler_guiConnected) {
        if (not(ispresent(vl_EPTF_msg_tmp.setFocusToWidget.tabIndex))) {
          f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_setFocusToWidget(vl_widgetName));
        }
        else {
          f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_setFocusToTab(vl_widgetName, vl_EPTF_msg_tmp.setFocusToWidget.tabIndex));
        }
        EPTF_adminPort_CP.send(t_UIHandler_AdminSetFocusToWidgetAck(vl_EPTF_msg_tmp.setFocusToWidget.messageID)) to v_UIHandler_address_tmp;
      }

      if(tsp_EPTF_UIHandler_enableBrowserGUI){
        if(v_EPTF_UIHandler_Browser_activateWidgetIds != ""){
          v_EPTF_UIHandler_Browser_activateWidgetIds := v_EPTF_UIHandler_Browser_activateWidgetIds & "," & vl_widgetName;
        } else {
          v_EPTF_UIHandler_Browser_activateWidgetIds := vl_widgetName;
        }
      }

    }
  }

  ///////////////////////////////////////////////////////////
  //  Altstep: as_UIHandler_handleaddElementToGUI
  //
  //  Purpose:
  //    Altstep that handles addElementToGUI messages at CLL_UIHandler interface.
  //
  //  Errors:
  //    none
  //
  //  Detailed Comments:
  //    As altstep receives addElementToGUI requests, sends XTDP-AddRequests
  //    message to GUI if connected
  ///////////////////////////////////////////////////////////
  private altstep as_UIHandler_handleaddElementToGUI() runs on EPTF_UIHandler_Private_CT
  {
    var EPTF_UIHandler_WidgetMsg vl_EPTF_msg_tmp;
    var boolean vl_widgetExists := false;
    [] EPTF_adminPort_CP.receive(t_UIHandler_AdminAddElementToGUI(*, ?, ?/*, ?*/)) -> value vl_EPTF_msg_tmp sender v_UIHandler_address_tmp
    {
      if (f_EPTF_UIHandler_XSD_addElementToGui(vl_EPTF_msg_tmp.addElementToGUI.xul, vl_EPTF_msg_tmp.addElementToGUI.parentWidgetId, vl_widgetExists))
      { //send ack
        EPTF_adminPort_CP.send(t_UIHandler_AdminAddElementToGUIAck(
            vl_EPTF_msg_tmp.addElementToGUI.messageID,
            vl_widgetExists)) to v_UIHandler_address_tmp;
      } else
      { //send nack
        EPTF_adminPort_CP.send(t_UIHandler_AdminAddElementToGUINAck(vl_EPTF_msg_tmp.addElementToGUI.messageID/*,
            vl_EPTF_msg_tmp.addElementToGUI.replyRoutingIds*/)) to v_UIHandler_address_tmp;
      }
    }
  }

  ///////////////////////////////////////////////////////////
  //  Altstep: as_UIHandler_handleCreateGUI
  //
  //  Purpose:
  //    Altstep that handles CreateGUI messages at CLL_UIHandler interface.
  //
  //  Errors:
  //    none
  //
  //  Detailed Comments:
  //    As altstep receives createGUI requests, and calls createGui
  ///////////////////////////////////////////////////////////
  private altstep as_UIHandler_handleCreateGUI() runs on EPTF_UIHandler_Private_CT
  {
    var EPTF_UIHandler_WidgetMsg vl_EPTF_msg_tmp;
    [] EPTF_adminPort_CP.receive(t_UIHandler_AdminCreateGUI(*, ?, ?/*, ?*/)) -> value vl_EPTF_msg_tmp sender v_UIHandler_address_tmp
    {
      if (f_EPTF_UIHandler_createGUI(vl_EPTF_msg_tmp.createGUI.xul, vl_EPTF_msg_tmp.createGUI.parentWidgetId))
      { //send ack
        EPTF_adminPort_CP.send(t_UIHandler_AdminCreateGUIAck(vl_EPTF_msg_tmp.createGUI.messageID)) to v_UIHandler_address_tmp;
      } else
      { //send nack
        EPTF_adminPort_CP.send(t_UIHandler_AdminCreateGUINAck(vl_EPTF_msg_tmp.createGUI.messageID)) to v_UIHandler_address_tmp;
      }
    }
  }

  ///////////////////////////////////////////////////////////
  //  Altstep: as_UIHandler_handleremoveElementFromGUI
  //
  //  Purpose:
  //    Altstep that handles removeElementFromGUI messages at CLL_UIHandler interface.
  //
  //  Errors:
  //    none
  //
  //  Detailed Comments:
  //    As altstep receives removeElementFromGUI requests, sends XTDP-RemoveRequests
  //    message to GUI if connected
  ///////////////////////////////////////////////////////////
  private altstep as_UIHandler_handleremoveElementFromGUI() runs on EPTF_UIHandler_Private_CT
  {
    var EPTF_UIHandler_WidgetMsg vl_EPTF_msg_tmp;
    [] EPTF_adminPort_CP.receive(t_UIHandler_AdminRemoveElementFromGUI(?,?)) -> value vl_EPTF_msg_tmp sender v_UIHandler_address_tmp
    {
      if (f_EPTF_UIHandler_removeElementFromGui(vl_EPTF_msg_tmp.removeElementFromGUI.widgetId))
      {//send ack
        EPTF_adminPort_CP.send(t_UIHandler_AdminRemoveElementFromGUIAck(vl_EPTF_msg_tmp.removeElementFromGUI.widgetId/*,
            vl_EPTF_msg_tmp.removeElementFromGUI.replyRoutingIds*/)) to v_UIHandler_address_tmp;
      } else
      {//send nack
        EPTF_adminPort_CP.send(t_UIHandler_AdminRemoveElementFromGUINAck(vl_EPTF_msg_tmp.removeElementFromGUI.widgetId/*,
            vl_EPTF_msg_tmp.removeElementFromGUI.replyRoutingIds*/)) to v_UIHandler_address_tmp;
      }
    }
  }


  ///////////////////////////////////////////////////////////
  //  Altstep: as_UIHandler_handleWidgetExists
  //
  //  Purpose:
  //    Altstep that handles widgetExists messages at CLL_UIHandler interface.
  //
  //  Errors:
  //    none
  //
  //  Detailed Comments:
  //    As altstep receives widgetExists requests it checks the given widget
  //    in UI handler's internal database
  ///////////////////////////////////////////////////////////
  private altstep as_UIHandler_handleWidgetExists() runs on EPTF_UIHandler_Private_CT
  {
    var EPTF_UIHandler_WidgetMsg vl_EPTF_msg_tmp;
    [] EPTF_adminPort_CP.receive(t_UIHandler_AdminWidgetExists(*,*)) -> value vl_EPTF_msg_tmp sender v_UIHandler_address_tmp
    {
      var EPTF_UIHandler_GuiItemRec vl_rec;
      if(not f_EPTF_UIHandler_getWidgetRec(vl_EPTF_msg_tmp.widgetExists.widgetName, vl_rec)){
        if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
          f_EPTF_UIHandler_debug(%definitionId&": f_EPTF_UIHandler_getwidgetrec failed!");
        }
      }
      EPTF_adminPort_CP.send(
        t_UIHandler_AdminWidgetExistsResp(
          vl_EPTF_msg_tmp.widgetExists.widgetName,
          vl_EPTF_msg_tmp.widgetExists.messageID,
          vl_rec.widgetType)) to v_UIHandler_address_tmp;
    }
  }

  private function f_EPTF_UIHandler_addclientid(in integer pl_clientid) runs on EPTF_UIHandler_Private_CT{
    if (f_EPTF_UIHandler_isConnectedClientid(pl_clientid)) {
      return;
    }
    var integer vl_clientIdx := sizeof(v_UIHandler_GUIClientId);
    v_UIHandler_GUIClientId[vl_clientIdx] := c_EPTF_UIHandler_GUIClientData;
    v_UIHandler_GUIClientId[vl_clientIdx].clientId := pl_clientid;
  }

  private function f_EPTF_UIHandler_setClientHandshakeSuccessful(in integer pl_clientid) runs on EPTF_UIHandler_Private_CT{
    for (var integer i:=0;i<sizeof(v_UIHandler_GUIClientId);i:=i+1){
      if (v_UIHandler_GUIClientId[i].clientId == pl_clientid){
        v_UIHandler_GUIClientId[i].handshakeSuccessful := true;
        return;
      }
    }
  }

  private function f_EPTF_UIHandler_getClientHandshakeSuccessful(in integer pl_clientid) runs on EPTF_UIHandler_Private_CT return boolean {
    for (var integer i:=0;i<sizeof(v_UIHandler_GUIClientId);i:=i+1){
      if (v_UIHandler_GUIClientId[i].clientId == pl_clientid){
        return v_UIHandler_GUIClientId[i].handshakeSuccessful;
      }
    }
    return false;
  }

  private function f_EPTF_UIHandler_setClientAuthenticationSuccessful(in integer pl_clientid) runs on EPTF_UIHandler_Private_CT{
    for (var integer i:=0;i<sizeof(v_UIHandler_GUIClientId);i:=i+1){
      if (v_UIHandler_GUIClientId[i].clientId == pl_clientid){
        v_UIHandler_GUIClientId[i].authenticationSuccessful := true;
        return;
      }
    }
  }

  private function f_EPTF_UIHandler_getClientAuthenticationSuccessful(in integer pl_clientid) runs on EPTF_UIHandler_Private_CT return boolean {
    for (var integer i:=0;i<sizeof(v_UIHandler_GUIClientId);i:=i+1){
      if (v_UIHandler_GUIClientId[i].clientId == pl_clientid){
        return v_UIHandler_GUIClientId[i].authenticationSuccessful;
      }
    }
    return false;
  }

  private function f_EPTF_UIHandler_delclientid(in integer pl_clientid) runs on EPTF_UIHandler_Private_CT{
    var EPTF_UIHandler_GUIClientDataList list := {};
    for (var integer i:=0;i<sizeof(v_UIHandler_GUIClientId);i:=i+1){
      if (v_UIHandler_GUIClientId[i].clientId != pl_clientid){
        list[sizeof(list)] := v_UIHandler_GUIClientId[i];
      }
    }
    v_UIHandler_GUIClientId := list;
  }

  private function f_EPTF_UIHandler_isConnectedClientid(in integer pl_clientid) runs on EPTF_UIHandler_Private_CT return boolean {
    for (var integer i:=0;i<sizeof(v_UIHandler_GUIClientId);i:=i+1){
      if (v_UIHandler_GUIClientId[i].clientId == pl_clientid){
        return true;
      }
    }
    return false;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_clearTracePointersDB
  //
  //  Purpose:
  //    Clear trace pointer database
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_clearTracePointersDB() runs on EPTF_UIHandler_Private_CT {
    //Empty the pointer list
    v_UIHandler_tracePointers := {};
    f_EPTF_int2int_HashMap_Clear(v_UIHandler_tracePointerHashMapId);
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_clearInternalWidgetDB
  //
  //  Purpose:
  //    Clear internal widget database
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_clearInternalWidgetDB() runs on EPTF_UIHandler_Private_CT {
    //Empty the widget list
    //FIXME: v_EPTF_UIHandler_Config_ConnectVarToWidgets:={} : unsubscribe?
    var integer vl_i, vl_subsIdx:=-1, vl_size:=sizeof(v_UIHandler_guiItemList);
    for(vl_i:=0; vl_i < vl_size; vl_i:=vl_i+1)
    {
      vl_subsIdx := f_EPTF_UIHandler_getSubscriptionIdxByWidgetId(v_UIHandler_guiItemList[vl_i].id);
      if(vl_subsIdx > -1){
        f_EPTF_Var_unsubscribe(v_UIHandler_openSubscriptions[vl_subsIdx].varIdx);
      }
    }
    v_EPTF_UIHandler_Config_ConnectVarToWidgets := {};
    v_UIHandler_guiItemList := {};
    f_EPTF_str2int_HashMap_Clear(v_UIHandler_widgetHashMapId);
    //There is no window
    v_UIHandler_windowIndex := -1;
    // we must not close variable connections because of headless mode
    f_EPTF_UIHandler_clearTracePointersDB();
  }

  group Logging {

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_error
    //
    //  Purpose:
    //    Function to log an error from UIHandler feature.
    //
    //  Parameters:
    //    - pl_message - *in* *charstring* - the message to log
    //
    //  Return Value:
    //    -
    //
    //  Errors & assertions:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    friend function f_EPTF_UIHandler_error(in charstring pl_message)
    runs on EPTF_UIHandler_Private_CT
    {
      f_EPTF_Logging_error(true, tsp_EPTF_UIHandler_loggingComponentMask&": "&pl_message);
      f_EPTF_Base_stopAll();
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_warning
    //
    //  Purpose:
    //    Function to log a warning from UIHandler feature.
    //
    //  Parameters:
    //    - pl_message - *in* *charstring* - the message to log
    //
    //  Return Value:
    //    -
    //
    //  Errors & assertions:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    friend function f_EPTF_UIHandler_warning(in @lazy charstring pl_message)
    runs on EPTF_UIHandler_Private_CT
    {
      f_EPTF_Logging_warningV2(pl_message, v_UIHandler_loggingMaskId, {c_EPTF_UIHandler_loggingClassIdx_Warning});
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_debug
    //
    //  Purpose:
    //    Function to log a debug message from UIHandler feature.
    //
    //  Parameters:
    //    - pl_message - *in* *charstring* - the message to log
    //
    //  Return Value:
    //    -
    //
    //  Errors & assertions:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    friend function f_EPTF_UIHandler_debug(in @lazy charstring pl_message)
    runs on EPTF_UIHandler_Private_CT
    {
      f_EPTF_Logging_debugV2(pl_message, v_UIHandler_loggingMaskId, {c_EPTF_UIHandler_loggingClassIdx_Debug});
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_debugEnabled
    //
    //  Purpose:
    //    Function to check if debug is enabled for UIHandler
    //
    //  Parameters:
    //    -
    //
    //  Return Value:
    //    *boolean* - true if debug enalbed
    //
    //  Errors & assertions:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    friend function f_EPTF_UIHandler_debugEnabled()
    runs on EPTF_UIHandler_Private_CT
    return boolean
    {
      return f_EPTF_Logging_isEnabled(v_UIHandler_loggingMaskId, c_EPTF_UIHandler_loggingClassIdx_Debug);
    }

  } // group Logging

  group Transport
  {

    private function f_EPTF_UIHandler_getWidgetFromXTDPAction(
      in XTDP_Actions pl_action,
      out template XTDP_Widget pl_retWidget){
      if (ischosen(pl_action.choice.get)) {
        pl_retWidget := pl_action.choice.get.widget;
      }
      else if (ischosen(pl_action.choice.put)) {
        pl_retWidget := pl_action.choice.put.widget;
      }
      else if (ischosen(pl_action.choice.increase)) {
        pl_retWidget := pl_action.choice.increase.widget;
      }
      else if (ischosen(pl_action.choice.decrease)) {
        pl_retWidget := pl_action.choice.decrease.widget;
      }
      else if (ischosen(pl_action.choice.enable)) {
        pl_retWidget := pl_action.choice.enable.widget;
      }
      else if (ischosen(pl_action.choice.disable)) {
        pl_retWidget := pl_action.choice.disable.widget;
      }
      else if (ischosen(pl_action.choice.setfocus)) {
        pl_retWidget := pl_action.choice.setfocus.widget;
      }
      else if (ischosen(pl_action.choice.gettooltip)) {
        pl_retWidget := pl_action.choice.gettooltip.widget;
      }
      else if (ischosen(pl_action.choice.settooltip)) {
        pl_retWidget := pl_action.choice.settooltip.widget;
      }
      else if (ischosen(pl_action.choice.replaceimage)) {
        pl_retWidget := pl_action.choice.replaceimage.widget;
      } else {
        pl_retWidget := omit;
      }
    }

    private function f_EPTF_UIHandler_getArgumentListFromXTDPAction(in XTDP_Actions pl_action) return EPTF_CharstringList {
      var EPTF_CharstringList vl_result := {};
      if (ischosen(pl_action.choice.put)) {
        for (var integer i:=0; i<sizeof(pl_action.choice.put.argument_list); i:=i+1) {
          vl_result[i] := unichar2char(pl_action.choice.put.argument_list[i]);
        }
        return vl_result;
      }
      if (ischosen(pl_action.choice.increase)) {
        for (var integer i:=0; i<sizeof(pl_action.choice.increase.argument_list); i:=i+1) {
          vl_result[i] := unichar2char(pl_action.choice.increase.argument_list[i]);
        }
        return vl_result;
      }
      if (ischosen(pl_action.choice.decrease)) {
        for (var integer i:=0; i<sizeof(pl_action.choice.decrease.argument_list); i:=i+1) {
          vl_result[i] := unichar2char(pl_action.choice.decrease.argument_list[i]);
        }
        return vl_result;
      }
      if (ischosen(pl_action.choice.settooltip)) {
        for (var integer i:=0; i<sizeof(pl_action.choice.settooltip.argument_list); i:=i+1) {
          vl_result[i] := unichar2char(pl_action.choice.settooltip.argument_list[i]);
        }
        return vl_result;
      }
      if (ischosen(pl_action.choice.replaceimage)) {
        for (var integer i:=0; i<sizeof(pl_action.choice.replaceimage.argument_list); i:=i+1) {
          vl_result[i] := unichar2char(pl_action.choice.replaceimage.argument_list[i]);
        }
        return vl_result;
      }
      return vl_result;
    }

    ///////////////////////////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_HandleMsgs_XTDP
    //
    //  Purpose:
    //    Handles incoming XTDP messages.
    //
    //  Detailed comments:
    //    Calls the registered call-back function.
    ///////////////////////////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_HandleMsgs_XTDP(
      in EPTF_Transport_TransportType pl_transportType,
      in ConnectionId pl_connId,
      in HostName pl_remHost,
      in PortNumber pl_remPort,
      in HostName pl_locHost,
      in PortNumber pl_locPort,
      in ProtoTuple pl_proto,
      in integer pl_userData,
      in octetstring pl_msg)
    runs on EPTF_UIHandler_Private_CT
    {
      if (not v_UIHandler_initialized) {
        return;
      }

      if (v_UIHandler_cleanupCalled) {
        f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
      } else {
        // threadsafe:
        f_EPTF_Semaphore_waitForUnlock(v_UIHandler_xtdpReceivedMessageSemaphore_r,pl_autoDeleteSemaphore:=false);
        f_EPTF_Semaphore_lock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
      }
      var integer vl_connId := pl_connId;
      var integer vl_succ := XTDP_EncDecFunctions.dec_XTDP_Message(f_EPTF_UIHandler_getRawMsg_XTDP(pl_msg), v_UIHandler_receivedMessage);
      //action(%definitionId&":v_UIHandler_receivedMessage: ", v_UIHandler_receivedMessage);
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": Message arrived for client "&log2str(vl_connId)&": "&log2str(v_UIHandler_receivedMessage));
      }

      if (v_UIHandler_cleanupCalled) {
        if(not ischosen(v_UIHandler_receivedMessage.choice.xTDP_Bye)) {
          if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
            f_EPTF_UIHandler_debug(%definitionId&": Message arrived during cleanup: Message dropped");
          }
          return;
        }
      }

      // drop  messages that come before handshake or authentication:
      if(not ischosen(v_UIHandler_receivedMessage.choice.xTDP_HandshakeRequest)) {
        // handshake is required:
        if (not f_EPTF_UIHandler_getClientHandshakeSuccessful(vl_connId)) {
          // there was no successful handshake
          f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
          if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
            f_EPTF_UIHandler_debug(%definitionId&": Message arrived for client "&log2str(vl_connId)&" before successful handshake. Message dropped: "&log2str(v_UIHandler_receivedMessage));
          }
          return;
        }
      }
      if(not ischosen(v_UIHandler_receivedMessage.choice.xTDP_AuthResponse)
        and not ischosen(v_UIHandler_receivedMessage.choice.xTDP_HandshakeRequest)
        and not ischosen(v_UIHandler_receivedMessage.choice.xTDP_Bye)) {
        // authentication is required:
        if (not f_EPTF_UIHandler_getClientAuthenticationSuccessful(vl_connId)) {
          // there was no successful authentication
          f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
          if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
            f_EPTF_UIHandler_debug(%definitionId&": Message arrived for client "&log2str(vl_connId)&" before successful authentication. Message dropped: "&log2str(v_UIHandler_receivedMessage));
          }
          return;
        }
      }

      if(ischosen(v_UIHandler_receivedMessage.choice.xTDP_Requests))
      {
        if(match(v_UIHandler_receivedMessage.choice.xTDP_Requests, tr_XTDP_Requests_exitTTCNButtonPressed))
        {
          f_EPTF_Semaphore_unlock(v_UIHandler_exitButtonPressedSemaphore);
        }
        if(match(v_UIHandler_receivedMessage.choice.xTDP_Requests, tr_XTDP_Requests_widgetModification(?, ?)))
        {
          const ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Message vl_messageToSend :=
          {
            //            noNamespaceSchemaLocation := "XTDP-Message.xsd",
            transactionID := omit,
            choice :=
            {
              xTDP_Responses :=
              {
                xTDP_Response_list := {
                  {
                    requestId := 1,
                    responseCode := error_,
                    argument := omit,
                    errorSource := omit,
                    errorCode := omit,
                    errorMessage := "Modification is not possible on a shadowed GUI!"
                  }
                }
              }
            }
          }

          if (v_UIHandler_GUIClientId[0].clientId != vl_connId)
          {
            var Result vl_result
            f_EPTF_Transport_send(IPL4, vl_connId, f_EPTF_UIHandler_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(vl_messageToSend)), vl_result, false)
          }
          else
          {
            var template XTDP_Widget vl_widget
            f_EPTF_UIHandler_getWidgetFromXTDPAction(v_UIHandler_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_, vl_widget);
            var EPTF_UIHandler_WidgetIdString vl_wID := "";
            if (isvalue(vl_widget)) {
              vl_wID := f_EPTF_UIHandler_XULWidgetId2charstr({valueof(vl_widget.widgetId)});
            }
            var EPTF_CharstringList vl_template_XTDP_Actions_choice_put_argument_list := f_EPTF_UIHandler_getArgumentListFromXTDPAction(v_UIHandler_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_);
            f_EPTF_UIHandler_parseGuiParam(vl_wID, vl_template_XTDP_Actions_choice_put_argument_list);
          }
        }
        f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
      }
      else if(ischosen(v_UIHandler_receivedMessage.choice.xTDP_Responses))
      {
        if(match(v_UIHandler_receivedMessage.choice.xTDP_Responses, tr_XTDP_Responses_singleSuccessResp))
        {
          // no response needed
        }
        f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
      }
      else if(ischosen(v_UIHandler_receivedMessage.choice.xTDP_LayoutResponse))
      {
        f_EPTF_Semaphore_unlock(v_UIHandler_layoutResponseReceivedSemaphore);
      }
      else if(ischosen(v_UIHandler_receivedMessage.choice.xTDP_Outcome))
      {
        if (v_UIHandler_receivedMessage.transactionID!=omit) {
          var integer vl_semaphoreId := v_UIHandler_receivedMessage.transactionID rem 1000;
          if (f_EPTF_Semaphore_isLocked(vl_semaphoreId)) {
            f_EPTF_Semaphore_unlock(vl_semaphoreId);
            if (v_UIHandler_receivedMessage.choice.xTDP_Outcome.responseCode == error_) {
              v_handshakeErrorMsg := "Error: UIHandler: Version compatibility check failure during handshake procedure: "&log2str(v_UIHandler_receivedMessage.choice.xTDP_Outcome);
            }
          }
        }
      }
      else if(ischosen(v_UIHandler_receivedMessage.choice.xTDP_HandshakeRequest))
      {
        var ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Message vl_messageToSend := {
          transactionID := v_UIHandler_receivedMessage.transactionID,
          choice := {
            xTDP_Outcome := {
              responseCode := success,
              errorCode_list := {
              },
              errorMessage := omit
              ,elem_list := {}
            }
          }
        }
        if (
          v_UIHandler_receivedMessage.choice.xTDP_HandshakeRequest.xtdpRequiredVersion != c_EPTF_UIHandler_xtdpMyVersion
          or v_UIHandler_receivedMessage.choice.xTDP_HandshakeRequest.xtdlRequiredVersion != c_EPTF_UIHandler_xtdlMyVersion
        ) {
          // version mismatch
          vl_messageToSend := {
            transactionID := v_UIHandler_receivedMessage.transactionID,
            choice := {
              xTDP_Outcome := {
                responseCode := error_,
                errorCode_list := {
                },
                errorMessage := "Version mismatch detected during handshake. Suppored XTDP/XDTL versions: "
                &log2str(c_EPTF_UIHandler_xtdpMyVersion)&"/"&log2str(c_EPTF_UIHandler_xtdlMyVersion)
                ,elem_list := {}
              }
            }
          }
          // add error codes:
          if (v_UIHandler_receivedMessage.choice.xTDP_HandshakeRequest.xtdpRequiredVersion != c_EPTF_UIHandler_xtdpMyVersion) {
            vl_messageToSend.choice.xTDP_Outcome.errorCode_list := vl_messageToSend.choice.xTDP_Outcome.errorCode_list & {xtdpIncompatibleVersion};
          }
          if (v_UIHandler_receivedMessage.choice.xTDP_HandshakeRequest.xtdlRequiredVersion != c_EPTF_UIHandler_xtdlMyVersion) {
            vl_messageToSend.choice.xTDP_Outcome.errorCode_list := vl_messageToSend.choice.xTDP_Outcome.errorCode_list & {xtdlIncompatibleVersion};
          }
        } else {
          // successful handshake
          f_EPTF_UIHandler_setClientHandshakeSuccessful(vl_connId);
        }
        //send response:
        var Result vl_result;
        f_EPTF_Transport_send(IPL4, vl_connId, f_EPTF_UIHandler_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(vl_messageToSend)), vl_result, false);
        f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);

        // start authentication if handshake successful:
        if (vl_messageToSend.choice.xTDP_Outcome.responseCode != success
          or not f_EPTF_UIHandler_authclient(vl_connId))
        {
          f_EPTF_UIHandler_closeXTDPSession(vl_connId);
        } else {
          // successful handshake and authentication
          v_UIHandler_guiConnected := true;
          if(sizeof(v_UIHandler_GUIClientId)==1 and sizeof(v_UIHandler_guiItemList) == 0)
          {
            // master GUI is up (first time)
            if("" != v_UIHandler_windowLayout or "" != tsp_EPTF_GUI_DefaultWindow or v_EPTF_UIHandler_headlessmode){
              // send my layout to GUI
              if (v_EPTF_UIHandler_headlessmode == false and not v_UIHandler_guiLayoutReady) {
                // reset layout to initial
                f_EPTF_UIHandler_clearGUI();
                //f_EPTF_UIHandler_createInitialLayout(v_UIHandler_windowLayout);
                if(null != v_EPTF_UIHandler_createLayoutCallback){
                  v_EPTF_UIHandler_createLayoutCallback.apply( );
                }
                v_UIHandler_guiLayoutReady := true;
              } else {
                // use current layout
                f_EPTF_UIHandler_initguitoclient(vl_connId);
              }
            } else {
              //get layout from GUI
              if (not v_UIHandler_guiLayoutReady) {
                // init layout from GUI
                f_EPTF_UIHandler_clearInternalWidgetDB();
                if(not f_EPTF_UIHandler_requestLayout()){
                  if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
                    f_EPTF_UIHandler_debug(%definitionId&": f_EPTF_UIHandler_requestlayout failed!");
                  }
                }
                v_UIHandler_guiLayoutReady := true;
              } else {
                // use current layout (Original Master GUI was closed and then restarted)
                f_EPTF_UIHandler_initguitoclient(vl_connId);
              }
            }
          }
          else
          {
            // slave GUI-s will contain the copy of master
            // restarted master GUI will contain current layout
            if (sizeof(v_UIHandler_GUIClientId)==1 and sizeof(v_UIHandler_guiItemList) != 0){
              if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
                f_EPTF_UIHandler_debug(%definitionId&": Master GUI restarted. Sending current layout...");
              }
              f_EPTF_UIHandler_initguitoclient(vl_connId);
            } else {
              f_EPTF_UIHandler_initguitoclient(vl_connId,true); // Shadowed GUI
            }
          }
        }

      }
      else if(ischosen(v_UIHandler_receivedMessage.choice.xTDP_AuthChallenge))
      {
        // send response
        var ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Message vl_messageToSend :=
        {
          //            noNamespaceSchemaLocation := "XTDP-Message.xsd",
          transactionID := v_UIHandler_receivedMessage.transactionID,
          choice := {
            xTDP_AuthResponse := v_EPTF_UIHandler_Authresp
          }
        }
        var Result vl_result;
        f_EPTF_Transport_send(IPL4, vl_connId, f_EPTF_UIHandler_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(vl_messageToSend)), vl_result, false)
        f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
      }
      else if(ischosen(v_UIHandler_receivedMessage.choice.xTDP_AuthResponse))
      {
        if (v_UIHandler_receivedMessage.transactionID!=omit) {
          var integer vl_semaphoreId := v_UIHandler_receivedMessage.transactionID rem 1000;
          if (f_EPTF_Semaphore_isLocked(vl_semaphoreId)) {
            f_EPTF_Semaphore_unlock(vl_semaphoreId);
          }
        }
      }
      else if(ischosen(v_UIHandler_receivedMessage.choice.xTDP_Bye))
      {
        if (v_UIHandler_receivedMessage.transactionID!=omit) {
          var integer vl_semaphoreId := v_UIHandler_receivedMessage.transactionID rem 1000;
          if (v_UIHandler_byeTimer == vl_semaphoreId) {
            // response to my bye msg
            f_EPTF_Semaphore_unlock(vl_semaphoreId);
            return;
          }
        }
        //send bye response:
        var ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Message vl_messageToSend :=
        {
          //            noNamespaceSchemaLocation := "XTDP-Message.xsd",
          transactionID := v_UIHandler_receivedMessage.transactionID,
          choice := {
            xTDP_Bye := ""
          }
        }
        var Result vl_result;
        f_EPTF_Transport_send(IPL4, vl_connId, f_EPTF_UIHandler_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(vl_messageToSend)), vl_result, false)

        // restart semaphore timer if it is running:
        if (f_EPTF_Semaphore_isLocked(v_UIHandler_byeTimer)) {
          // semaphore is locked => timer is running
          // increase semaphore lock until restarted timer expires:
          timer t_semaphoreWait := v_byeMaxTime;
          t_semaphoreWait.start;
          f_EPTF_Semaphore_increaseLock(v_UIHandler_byeTimer);
          t_semaphoreWait.timeout;
          f_EPTF_Semaphore_decreaseLock(v_UIHandler_byeTimer);
        }
        f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
      }
      else if(ischosen(v_UIHandler_receivedMessage.choice.xTDP_ARResponses))
      {
        //FIXME:
        f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
      }
      else
      {
        f_EPTF_UIHandler_warning("Unexpected XTDP message received: "&log2str(v_UIHandler_receivedMessage));
        // send unsupported procedure response:
        var ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Message vl_messageToSend := {
          transactionID := v_UIHandler_receivedMessage.transactionID,
          choice := {
            xTDP_Outcome := {
              responseCode := error_,
              errorCode_list := {
                procedureUnsupported
              },
              errorMessage := omit
              ,elem_list := {}
            }
          }
        }
        var Result vl_result;
        f_EPTF_Transport_send(IPL4, vl_connId, f_EPTF_UIHandler_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(vl_messageToSend)), vl_result, false)

        f_EPTF_Semaphore_unlock(v_UIHandler_xtdpReceivedMessageSemaphore_r);
      }
    }

    friend function f_EPTF_UIHandler_layoutReady() runs on EPTF_UIHandler_Private_CT return boolean {
      if (v_UIHandler_windowLayout != "" or v_EPTF_UIHandler_headlessmode == true) {
        return true;
      } else {
        return v_UIHandler_guiLayoutReady;
      }
    }

    friend function f_EPTF_UIHandler_waitForLayoutReady() runs on EPTF_UIHandler_Private_CT {
      if (f_EPTF_UIHandler_layoutReady()) {
        return;
      }
      timer t_waitForLayoutReady := 0.0;
      t_waitForLayoutReady.start;
      alt {
        [f_EPTF_UIHandler_layoutReady()] t_waitForLayoutReady.timeout {
        }
      }
    }

    ///////////////////////////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_HandleEvent_XTDP
    //
    //  Purpose:
    //    The event handler function.
    //
    //  Detailed Comments:
    //    Calls the registered call-back function.
    ///////////////////////////////////////////////////////////////////////////////
    function f_EPTF_UIHandler_HandleEvent_XTDP(
      in EPTF_Transport_TransportType pl_transportType,
      in ConnectionId pl_connId,
      in PortEvent pl_event)
    runs on EPTF_UIHandler_Private_CT
    {
      if (not v_UIHandler_initialized) {
        return;
      }
      //action(%definitionId&": XTDP event received: ",pl_event);
      if(ischosen(pl_event.connOpened))
      {
        // I am XTDP-session server. Always!!! => wait for handshake request => nothing to do here
        //         var charstring vl_handshakeError:=f_EPTF_UIHandler_handshake(v_EPTF_CommPort_IPL4_incomingMessage.asp_Event.connOpened.connId);
        //         if (vl_handshakeError!="") {
        //           // handshake unsuccessful
        //           return;
        //         }
        //
        //         if (not f_EPTF_UIHandler_authclient(v_EPTF_CommPort_IPL4_incomingMessage.asp_Event.connOpened.connId))
        //         {
        //           f_EPTF_UIHandler_closeXTDPSession(v_EPTF_CommPort_IPL4_incomingMessage.asp_Event.connOpened.connId);
        //           return;
        //         }
        if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
          f_EPTF_UIHandler_debug(%definitionId&log2str(": GUI connected: ", pl_event.connOpened.connId));
        }
        f_EPTF_UIHandler_addclientid(pl_event.connOpened.connId);
        //        v_UIHandler_guiConnected := true;
        //         if(sizeof(v_UIHandler_GUIClientId)==1)
        //         {
        //           f_EPTF_UIHandler_headlessmodeover();
        //         }
        //         else
        //         {
        //           f_EPTF_UIHandler_initguitoclient(pl_event.connOpened.connId);
        //         }
      }
      else if(ischosen(pl_event.connClosed))
      {
        if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
          f_EPTF_UIHandler_debug(%definitionId&": Transport is closed for client: "&log2str(pl_event.connClosed.connId));
        }
        //if(v_EPTF_UIHandler_headlessmode)
        //{
        f_EPTF_UIHandler_delclientid(pl_event.connClosed.connId);
        if (f_EPTF_Semaphore_isLocked(v_UIHandler_byeTimer)) {
          f_EPTF_Semaphore_unlock(v_UIHandler_byeTimer)
        }
        if (sizeof(v_UIHandler_GUIClientId) == 0)
        {
          f_EPTF_UIHandler_headlessmode();
        }
        //}
      }
      else if(ischosen(pl_event.result))
      {
        if(pl_event.result.errorCode == ERROR_AVAILABLE)
        {
          v_EPTF_CommPort_IPL4_incomingMessage.asp_Event := pl_event;  // Artifact artf195095 : CLL - faulty IPl4 event handler?
          f_EPTF_TransportIPL4_defaultConnResultEventHandler();
          // I am XTDP-session server. Always!!! => wait for handshake request => nothing to do here
          if (not f_EPTF_UIHandler_isConnectedClientid(pl_event.result.connId)) {

            //             // Handshake handling:
            //             var charstring vl_handshakeError:=f_EPTF_UIHandler_handshake(v_EPTF_CommPort_IPL4_incomingMessage.asp_Event.result.connId);
            //             if (vl_handshakeError!="") {
            //               // handshake unsuccessful
            //               return;
            //             }
            //
            //             if (not f_EPTF_UIHandler_authclient(pl_event.result.connId))
            //                             {
            //               f_EPTF_UIHandler_closeXTDPSession(pl_event.result.connId);
            //               return;
            //             }
            if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
              f_EPTF_UIHandler_debug(%definitionId&log2str(": GUI connected: ", pl_event.result.connId));
            }
            f_EPTF_UIHandler_addclientid(pl_event.result.connId);
            //            v_UIHandler_guiConnected := true;
            //             f_EPTF_UIHandler_headlessmodeover();
          }
        }
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_getMsgLen_XTDP
    //
    //  Purpose:
    //    Function to get the length of the received XTDP message
    //
    //  Parameters:
    //    stream - *in octetstring* - The received message
    //    args - *in* - <ro_integer> - Function arguments
    //
    //  Return Value:
    //    integer - the length of the received message
    //
    ///////////////////////////////////////////////////////////
    function f_EPTF_UIHandler_getMsgLen_XTDP
    (
      in EPTF_Transport_TransportType pl_transportType,
      in octetstring pl_stream,
      inout EPTF_IntegerList pl_args
    )
    return integer
    {
      if (lengthof(pl_stream)<4)
      {
        return -1
      }
      else
      {
        return oct2int(substr(pl_stream,0, 4))
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_getRawMsg_XTDP
    //
    //  Purpose:
    //    Function to get the raw XTDP message without the length
    //
    //  Parameters:
    //    stream - *in octetstring* - The received message
    //
    //  Return Value:
    //    octetstring - raw XTDP message
    //
    ///////////////////////////////////////////////////////////
    function f_EPTF_UIHandler_getRawMsg_XTDP(in octetstring stream) return octetstring
    {
      if (lengthof(stream) <4)  {
        return ''O
      }  else {
        return substr(stream,4, lengthof(stream)-4)
      }
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_appendLength_XTDP
    //
    //  Purpose:
    //    Function to append the length to the encoded XTDP message
    //
    //  Parameters:
    //    stream - *in octetstring* - The received message
    //
    //  Return Value:
    //    octetstring - raw XTDP message
    //
    ///////////////////////////////////////////////////////////
    function f_EPTF_UIHandler_appendLength_XTDP(in octetstring stream) return octetstring
    {
      return int2oct(lengthof(stream)+4,4) & stream
    }

  } //group Transport funstions

  group simulation {


    private function f_EPTF_UIHandler_simulation_getData(
      out charstring pl_dataVarName,
      in charstring pl_source,
      in charstring pl_ptcName := "",
      in charstring pl_element,
      in EPTF_DataSource_Params pl_params := {},
      in EPTF_Var_SubscriptionMode pl_subscriptionMode := tsp_EPTF_UIHandler_subscriptionMode,
      in integer pl_refreshRate := tsp_EPTF_DataSource_refreshRate,
      in EPTF_Var_DirectContent vl_defaultValue
    ) runs on EPTF_UIHandler_Private_CT return integer {
      var integer vl_getDataResult := f_EPTF_DataSource_getData(pl_dataVarName, pl_source, pl_ptcName, pl_element, pl_params, pl_subscriptionMode, pl_refreshRate);
      if(vl_getDataResult == 0) {

        if(v_EPTF_UIHandler_simulation_buildDB_file != "") {
          var integer vl_simulationDBIdx;
          var charstring vl_simulation_id := "";
          var integer vl_params_size := sizeof(pl_params);
          for(var integer i := 0; i < vl_params_size; i := i + 1 ){
            vl_simulation_id := vl_simulation_id & "." & pl_params[i].paramName;
            vl_simulation_id := vl_simulation_id & "." & pl_params[i].paramValue;
          }
          vl_simulation_id:= "simulation." & pl_source & "." & pl_ptcName & "." & pl_element & "." & vl_simulation_id;
          if(not f_EPTF_str2int_HashMap_Find(v_UIHandler_simulation_varsHashMapId, vl_simulation_id, vl_simulationDBIdx)) {
            var integer vl_directContentDB_size := sizeof(v_UIHandler_simulation_directContentDB);
            var integer vl_varId := f_EPTF_Var_getId(pl_dataVarName);
            var EPTF_Var_DirectContent vl_currentContent;
            f_EPTF_Var_getContent(vl_varId, vl_currentContent);
            v_UIHandler_simulation_directContentDB[vl_directContentDB_size].directContent := vl_currentContent;
            v_UIHandler_simulation_directContentDB[vl_directContentDB_size].key := vl_simulation_id;
            f_EPTF_str2int_HashMap_Insert(v_UIHandler_simulation_varsHashMapId, vl_simulation_id, vl_directContentDB_size);
          }
        }
        return vl_getDataResult;
      } else if(v_EPTF_UIHandler_simulatonMode) {
       //get the data from DB
       if(f_EPTF_UIHandler_simulation_getDataFromDB(pl_dataVarName, pl_source, pl_ptcName, pl_element, pl_params) == 0) {
         return 0;
       } else { //create random data to simulate
         pl_dataVarName := log2str(vl_defaultValue);
         if(f_EPTF_Var_getId(pl_dataVarName) == -1) {
           f_EPTF_Var_newVar(log2str(vl_defaultValue), vl_defaultValue)
         }
         return 0;
       }
      } else {
        return vl_getDataResult;
      }
    }


    private function f_EPTF_UIhandler_simulation_getCondition(
      out boolean pl_conditionValue,
      in charstring pl_source,
      in charstring pl_ptcName := "",
      in charstring pl_method,
      in EPTF_DataSource_Params pl_params := {}
    ) runs on EPTF_UIHandler_Private_CT return integer {
      var integer vl_getDataResult := f_EPTF_DataSource_getCondition(pl_conditionValue, pl_source, pl_ptcName, pl_method, pl_params);
      var charstring pl_dataVarName := "";
      if(vl_getDataResult == 0) {
        if(v_EPTF_UIHandler_simulation_buildDB_file != "") {
          var integer vl_simulationDBIdx;
          var charstring vl_simulation_id := "";
          var integer vl_params_size := sizeof(pl_params);
          for(var integer i := 0; i < vl_params_size; i := i + 1 ){
            vl_simulation_id := vl_simulation_id & "." & pl_params[i].paramName;
            vl_simulation_id := vl_simulation_id & "." & pl_params[i].paramValue;
          }
          vl_simulation_id:= "simulation." & pl_source & "." & pl_ptcName & "." & "condition" & "." & vl_simulation_id;
          if(not f_EPTF_str2int_HashMap_Find(v_UIHandler_simulation_varsHashMapId, vl_simulation_id, vl_simulationDBIdx)) {
            var integer vl_directContentDB_size := sizeof(v_UIHandler_simulation_directContentDB);
            var integer vl_varId;
            f_EPTF_Var_newBool(vl_simulation_id, pl_conditionValue, vl_varId)
            var EPTF_Var_DirectContent vl_currentContent;
            f_EPTF_Var_getContent(vl_varId, vl_currentContent);
            v_UIHandler_simulation_directContentDB[vl_directContentDB_size].directContent := vl_currentContent;
            v_UIHandler_simulation_directContentDB[vl_directContentDB_size].key := vl_simulation_id;
            f_EPTF_str2int_HashMap_Insert(v_UIHandler_simulation_varsHashMapId, vl_simulation_id, vl_directContentDB_size);
          }
        }
        return vl_getDataResult;
      } else if(v_EPTF_UIHandler_simulatonMode) {
       //get the data from DB
        if(f_EPTF_UIHandler_simulation_getDataFromDB(pl_dataVarName, pl_source, pl_ptcName, "condition", pl_params) == 0) {
          var integer vl_varId := f_EPTF_Var_getId(pl_dataVarName);
          pl_conditionValue := f_EPTF_Var_getBoolValue(vl_varId);
          return 0;
        } else { //create random data to simulate?
          pl_conditionValue := true;
          return 0;
        }
      } else {
        return vl_getDataResult;
      }
    }

    private function f_EPTF_UIhandler_simulation_getDefaultValue(in EPTF_UIHandler_GuiItemRec pl_widgetRec, out EPTF_Var_DirectContent vl_defaultValue) {
      if(ispresent(pl_widgetRec.widgetDataType)) {
        if(pl_widgetRec.widgetDataType == checkBox) {
          vl_defaultValue := { boolVal := true };
        } else if(pl_widgetRec.widgetDataType == floatField) {
          vl_defaultValue := { floatVal := 1.1 };
        // NOT SUPPORTED:
        //} else if(pl_widgetRec.widgetDataType == image) {
        //  vl_defaultValue := { intVal := 1 };
        } else if(pl_widgetRec.widgetDataType == integerField) {
          vl_defaultValue := { intVal := 1 };
        } else if(pl_widgetRec.widgetDataType == none_) {
          vl_defaultValue := { charstringVal := "my_value" };
        } else if(pl_widgetRec.widgetDataType == pushButton) {
          vl_defaultValue := { intVal := 1 };
        } else if(pl_widgetRec.widgetDataType == statusLED) {
          vl_defaultValue := { statusLEDVal := { led_black, "my_led" } };
        } else if(pl_widgetRec.widgetDataType == statusLEDWithText) {
          vl_defaultValue := { statusLEDVal := { led_black, "my_led" } };
        } else if(pl_widgetRec.widgetDataType == string) {
          vl_defaultValue := { charstringVal := "my_string" };
        } else if(pl_widgetRec.widgetDataType == toggleButton) {
          vl_defaultValue := { boolVal := true };
        } else if(pl_widgetRec.widgetDataType == trace) {
          vl_defaultValue := { floatVal := 1.1 };
        // NOT SUPPORTED:
        //} else if(pl_widgetRec.widgetDataType == valueList) {
        //  vl_defaultValue := { intVal := 1 };
        }
      } else {
        vl_defaultValue := { charstringVal := "omit"};
      }
    }

    ///////////////////////////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_simulation_Subscribe2saveDBButton_vars
    //
    //  Purpose:
    //    Subscribe variable to saveDB button and adds test management
    //    post processing functions
    //
    //  Parameters:
    //    -
    //
    //  Return Value:
    //    -
    //
    //  Errors:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////////////////////////
     private function f_EPTF_UIHandler_simulation_Subscribe2saveDBButton_vars() runs on EPTF_UIHandler_Private_CT {
      var integer vl_idx;
      f_EPTF_Var_newInt(
        c_EPTF_UIHandler_simulation_saveDBToFile, 0, vl_idx);
      f_EPTF_Var_addPostProcFn(
        vl_idx, { refers(f_EPTF_UIHandler_simulation_saveDB_PostProc), {}} );

     }

    ///////////////////////////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_simulation_saveDB_PostProc
    //
    //  Purpose:
    //    Test management post proc function to save DB to file
    //
    //  Parameters:
    //    -
    //
    //  Return Value:
    //    -
    //
    //  Errors:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////////////////////////
    private function f_EPTF_UIHandler_simulation_saveDB_PostProc(
      in integer pl_idx,
      in EPTF_IntegerList pl_argList)
    runs on EPTF_UIHandler_Private_CT
    {
      if(v_EPTF_UIHandler_simulation_buildDB_file != "") {
        f_EPTF_UIHandler_simulation_saveDBToFile(v_EPTF_UIHandler_simulation_buildDB_file);
      } else {
        f_EPTF_UIHandler_error(%definitionId&": FileName to save simulation Database was not given");
      }
    }

    private function f_EPTF_UIHandler_simulation_saveDBToFile(in charstring pl_fileName) runs on EPTF_UIHandler_Private_CT
      return boolean {
      var integer vl_file := f_FIO_open_trunc_wronly(pl_fileName);
      var integer vl_retval:=-1;
      if(vl_file==-1){
        f_EPTF_UIHandler_error(%definitionId&": Couldn't open the file "&pl_fileName&".");
        return false;
      }

      var charstring vl_stringDB :=  f_EPTF_UIHandler_simulation_encode_directContentDB(v_UIHandler_simulation_directContentDB);
      vl_retval:=f_FIO_write_text(vl_file, vl_stringDB)
      if(-1 == vl_retval){
        f_EPTF_UIHandler_error(%definitionId&": Couldn't read the file "&pl_fileName&".");
        return false;
      }

      if( f_FIO_close(vl_file)==-1) {
        f_EPTF_UIHandler_error(%definitionId&": Could not close the file "&pl_fileName&".");
        return false;
      }
      return true;
    }

    function f_EPTF_UIHandler_simulation_createDBFromFile(in charstring pl_fileName, out EPTF_UIHandler_simulation_directContentDB pl_DB)
    runs on EPTF_UIHandler_Private_CT
    {
      var charstring vl_stringDB;
      f_EPTF_UIHandler_readFileToCharstring(pl_fileName, vl_stringDB);
      f_EPTF_UIHandler_simulation_decode_directContentDB(vl_stringDB, pl_DB)

    }


    private function f_EPTF_UIHandler_simulation_getDataFromDB(
      out charstring pl_dataVarName,
      in charstring pl_source,
      in charstring pl_ptcName := "",
      in charstring pl_element,
      in EPTF_DataSource_Params pl_params := {})
    runs on EPTF_UIHandler_Private_CT return integer
    {
      var charstring vl_simulation_id := "";
      var integer vl_Idx := -1;
      var integer vl_paramSize := sizeof(pl_params);
      for(var integer i := 0; i < vl_paramSize; i := i + 1 ){
        vl_simulation_id := vl_simulation_id & "." & pl_params[i].paramName;
        vl_simulation_id := vl_simulation_id & "." & pl_params[i].paramValue;
      }
      vl_simulation_id:= "simulation." & pl_source & "." & pl_ptcName & "." & pl_element & "." & vl_simulation_id;

      //if(f_EPTF_str2int_HashMap_Find(v_UIHandler_simulation_varsHashMapId, vl_simulation_id, vl_Idx)) {
      //variable created in init function at simulation mode. The variable name is the simulation id.
      if(f_EPTF_Var_getId(vl_simulation_id) != -1) {
        pl_dataVarName := vl_simulation_id;
        return 0;
      } else {
        return -1;
      }
    }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_simulation_encode_directContentDB
  //
  //  Purpose:
  //    Encodes a EPTF_UIHandler_simulation_directContentDB to its charstring representation
  //
  ///////////////////////////////////////////////////////////
  public external function f_EPTF_UIHandler_simulation_encode_directContentDB(in EPTF_UIHandler_simulation_directContentDB pl_DB)
  return charstring;

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_simulation_decode_directContentDB
  //
  //  Purpose:
  //    Decode a charstring to EPTF_UIHandler_simulation_directContentDB
  //
  ///////////////////////////////////////////////////////////
  public  external function f_EPTF_UIHandler_simulation_decode_directContentDB(in charstring pl_dbStr, out EPTF_UIHandler_simulation_directContentDB pl_DB);





  }// /group simulation


} // group PrivateFunctions

group CLI{
  ///////////////////////////////////////////////////////////
  // Function: f_EPTF_UIHandler_CLIClient_init_CT
  // Parameters:
  //   pl_prefix - *in charstring* - all UIHandler command-line interface
  //     commands are prefixed with this value
  // Purpose:
  //   The initialization function.
  ///////////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_CLIClient_init_CT(in charstring pl_prefix)
  runs on EPTF_UIHandler_Private_CT {
    //if (not v_UIHandler_CLI_initialized)
    {
      //f_EPTF_UIHandler_init_CT(pl_selfName, pl_connectGUI);
      //f_EPTF_Logging_init_CT(pl_selfName);
      //f_EPTF_CLI_Client_init_CT(pl_selfName, pl_CLI_compRef)
      v_UIHandler_CLI_loggingMaskId := f_EPTF_Logging_registerComponentMasks(tsp_EPTF_UIHandler_CLI_loggingComponentMask, c_EPTF_UIHandler_loggingEventClasses, EPTF_Logging_CLL);
      if(tsp_debug_EPTF_UIHandler_CLI_Functions) {
        f_EPTF_Logging_enableLocalMask(v_UIHandler_CLI_loggingMaskId, c_EPTF_UIHandler_loggingClassIdx_Debug);
      } else {
        f_EPTF_Logging_disableLocalMask(v_UIHandler_CLI_loggingMaskId, c_EPTF_UIHandler_loggingClassIdx_Debug);
      }
      //f_EPTF_Base_registerCleanup(refers(f_EPTF_UIHandler_CLIClient_cleanup_CT));

      f_EPTF_HashMap_init_CT (pl_prefix);
      v_UIHandler_CLI_vars2Display := f_EPTF_str2int_HashMap_New("v_UIHandler_CLI_vars2Display");

      if(registerOK != f_EPTF_CLI_Client_registerCommand(pl_prefix&c_UIHandler_CLIClient_commandGET, c_UIHandler_CLIClient_commandGETHelp, refers(f_EPTF_UIHandler_CLIClient_handleGET))){
        f_EPTF_Base_assert("Registration failed for command: ", false)
      }
      if(registerOK != f_EPTF_CLI_Client_registerCommand(pl_prefix&c_UIHandler_CLIClient_commandSET, c_UIHandler_CLIClient_commandSETHelp, refers(f_EPTF_UIHandler_CLIClient_handleSET))){
        f_EPTF_Base_assert("Registration failed for command: "&c_UIHandler_CLIClient_commandSET, false)
      }
      if(registerOK != f_EPTF_CLI_Client_registerCommand(pl_prefix&c_UIHandler_CLIClient_commandLS, c_UIHandler_CLIClient_commandLSHelp, refers(f_EPTF_UIHandler_CLIClient_handleLS))){
        f_EPTF_Base_assert("Registration failed for command: "&c_UIHandler_CLIClient_commandLS, false)
      }
      if(registerOK != f_EPTF_CLI_Client_registerCommand(pl_prefix&c_UIHandler_CLIClient_commandLSREADONLY, c_UIHandler_CLIClient_commandLSREADONLYHelp, refers(f_EPTF_UIHandler_CLIClient_handleLSREADONLY))){
        f_EPTF_Base_assert("Registration failed for command: "&c_UIHandler_CLIClient_commandLSREADONLY, false)
      }
      if(registerOK != f_EPTF_CLI_Client_registerCommand(pl_prefix&c_UIHandler_CLIClient_commandLSWRITABLE, c_UIHandler_CLIClient_commandLSWRITABLEHelp, refers(f_EPTF_UIHandler_CLIClient_handleLSWRITABLE))){
        f_EPTF_Base_assert("Registration failed for command: "&c_UIHandler_CLIClient_commandLSWRITABLE, false)
      }
      if(registerOK != f_EPTF_CLI_Client_registerCommand(pl_prefix&c_UIHandler_CLIClient_commandDISPLAY, c_UIHandler_CLIClient_commandDISPLAYHelp, refers(f_EPTF_UIHandler_CLIClient_handleDISPLAY))){
        f_EPTF_Base_assert("Registration failed for command: "&c_UIHandler_CLIClient_commandDISPLAY, false)
      }
      if(registerOK != f_EPTF_CLI_Client_registerCommand(pl_prefix&c_UIHandler_CLIClient_commandHIDE, c_UIHandler_CLIClient_commandHIDEHelp, refers(f_EPTF_UIHandler_CLIClient_handleHIDE))){
        f_EPTF_Base_assert("Registration failed for command: "&c_UIHandler_CLIClient_commandHIDE, false)
      }

      v_UIHandler_CLI_def := activate(as_UIHandler_CLIClient_main());
      //v_UIHandler_CLI_initialized := true;
    }
  }

  ///////////////////////////////////////////////////////////
  // Function: f_EPTF_UIHandler_CLIClient_cleanup_CT
  //
  // Purpose:
  //   Cleanup function of the EPTF_UIHandler_Private_CT component.
  //
  // Detailed Comments:
  //   This function mustn't be called directly. You must call f_EPTF_Base_cleanup_CT instead.
  ///////////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_CLIClient_cleanup_CT()
  runs on EPTF_UIHandler_Private_CT {
    //if (v_UIHandler_CLI_initialized)
    {
      //deactivate(v_UIHandler_CLI_def);
      if(t_UIHandler_CLI_refresh.running){
        t_UIHandler_CLI_refresh.stop;
      }
      f_EPTF_str2int_HashMap_Delete("v_UIHandler_CLI_vars2Display");
      //unmap(self:v_UIHandler_CLI_TELNETaspIf, system:v_UIHandler_CLI_TELNETaspIf);
      //unmap(self:v_UIHandler_CLI_displayTELNETaspIf, system:v_UIHandler_CLI_displayTELNETaspIf);
      //v_UIHandler_CLI_initialized := false;
    }
  }

  ///////////////////////////////////////////////////////////
  // Function: f_EPTF_UIHandler_CLIClient_logAll
  //
  // Purpose:
  //   Log all internal variables in EPTF_UIHandler_Private_CT component.
  //
  // Detailed Comments:
  //
  ///////////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_CLIClient_logAll()
  runs on EPTF_UIHandler_Private_CT {
    log("------Content of EPTF_UIHandler_CLIClient_CT: -------");
    //log("v_UIHandler_CLI_initialized: ", v_UIHandler_CLI_initialized);
    log("v_UIHandler_CLI_clientConnected: ", v_UIHandler_CLI_clientConnected);
    log("v_UIHandler_CLI_displayConnected: ", v_UIHandler_CLI_displayConnected);
    log("v_UIHandler_CLI_vars2Display: ", v_UIHandler_CLI_vars2Display);
    log("------Finished Content of EPTF_UIHandler_CLIClient_CT -------");
  }//f_

  friend function f_EPTF_UIHandler_CLIClient_displayVarContent(in charstring pl_msg)
  runs on EPTF_UIHandler_Private_CT {
    f_EPTF_CLI_Client_sendCommandDisplay(c_UIHandler_CLIClient_commandDISPLAY, pl_msg)
  }
  ///////////////////////////////////////////////////////////
  // Function: f_EPTF_UIHandler_CLIClient_refreshTimeout
  // Purpose:
  //   Periodically displays the variables.
  ///////////////////////////////////////////////////////////////
  friend function f_EPTF_UIHandler_CLIClient_refreshTimeout() runs on EPTF_UIHandler_Private_CT {
    if(v_UIHandler_CLI_displayConnected){
      var charstring vl_varName;
      var boolean vl_hasItem := f_EPTF_str2int_HashMap_Begin(v_UIHandler_CLI_vars2Display, vl_varName);
      //log(vl_varName);
      while(vl_hasItem){
        var integer vl_varIdx;
        if(not f_EPTF_str2int_HashMap_Find(v_UIHandler_CLI_vars2Display, vl_varName, vl_varIdx)){
          f_EPTF_UIHandler_CLIClient_error(log2str("Fatal hashmap error displaying variable ",vl_varName));
          //f_EPTF_Base_stop();
        }
        var EPTF_Var_DirectContent vl_content;
        f_EPTF_Var_getContent(vl_varIdx, vl_content);
        f_EPTF_UIHandler_CLIClient_displayVarContent(  f_UIHandler_CLIClient_varContentAnswer(vl_varName, f_EPTF_Var_directContent2str(vl_content)))
        vl_hasItem := f_EPTF_str2int_HashMap_Next(v_UIHandler_CLI_vars2Display, vl_varName)
      }
    }
  }

  ///////////////////////////////////////////////////////////
  // Altstep: as_UIHandler_CLIClient_main
  // Purpose:
  //   The main altstep.
  ///////////////////////////////////////////////////////////////
  friend altstep as_UIHandler_CLIClient_main() runs on EPTF_UIHandler_Private_CT {
    [] as_UIHandler_CLIClient_handleRefreshTimeout(){repeat;}
    // [] as_UIHandler_CLI_handleTelnetCmd(){repeat;}
  }

  ///////////////////////////////////////////////////////////
  // Altstep: as_UIHandler_CLIClient_handleRefreshTimeout
  // Purpose:
  //   The periodic refresh.
  ///////////////////////////////////////////////////////////////
  friend altstep as_UIHandler_CLIClient_handleRefreshTimeout() runs on EPTF_UIHandler_Private_CT {
    [] t_UIHandler_CLI_refresh.timeout{
      f_EPTF_UIHandler_CLIClient_refreshTimeout();
      t_UIHandler_CLI_refresh.start( ts_CLI_refreshRate );
    }
  }

  friend function f_EPTF_UIHandler_CLIClient_var2str(in integer pl_varIdx)
  runs on EPTF_UIHandler_Private_CT
  return charstring
  {
    var EPTF_Var_DirectContent vl_content;
    f_EPTF_Var_getContent(pl_varIdx, vl_content);
    if(ischosen(vl_content.intVal)) {
      return int2str(vl_content.intVal);
    } else if(ischosen(vl_content.floatVal)) {
      return float2str(vl_content.floatVal);
    } else if(ischosen(vl_content.boolVal)) {
      if(vl_content.boolVal) { return "true"; }
      else { return "false"; }
    } else if(ischosen(vl_content.charstringVal)) {
      return vl_content.charstringVal;
    } else if(ischosen(vl_content.octetstringVal)) {
      return oct2str(vl_content.octetstringVal);
    } else if(ischosen(vl_content.hexstringVal)) {
      return hex2str(vl_content.hexstringVal);
    } else if(ischosen(vl_content.bitstringVal)) {
      return bit2str(vl_content.bitstringVal);
    } else if(ischosen(vl_content.integerlistVal)) {
      return log2str(vl_content.integerlistVal);
    } else if(ischosen(vl_content.floatlistVal)) {
      return log2str(vl_content.floatlistVal);
    } else if(ischosen(vl_content.statusLEDVal)) {
      return log2str(vl_content.statusLEDVal);
    }
    return log2str(vl_content);
  }

  //FIXME
  public function f_EPTF_CLI_Client_split(in charstring pl_string) return EPTF_CharstringList {
    return f_EPTF_CLI_splitString(pl_string)
  }

  friend function f_EPTF_UIHandler_CLIClient_handleGET(
    in charstring pl_commandArgs,
    inout charstring pl_result)
  runs on EPTF_UIHandler_Private_CT
  return integer{
    var integer vl_ret := -1
    var charstring vl_varName := pl_commandArgs
    if("" != vl_varName){
      var integer vl_varIdx:=f_EPTF_Var_getId(vl_varName);
      if (-1 < vl_varIdx) {
        var EPTF_Var_DirectContent vl_content;
        f_EPTF_Var_getContent(vl_varIdx, vl_content);
        pl_result := f_UIHandler_CLIClient_varContentAnswer(vl_varName, f_EPTF_Var_directContent2str(vl_content))
        vl_ret := 0
      }else{
        pl_result := f_UIHandler_CLIClient_errInvalidVarName(vl_varName, c_UIHandler_CLIClient_commandGET)
      }
    }else{
      pl_result := f_UIHandler_CLIClient_errEmptyVarName(c_UIHandler_CLIClient_commandGET)
    }
    return vl_ret
  }

  friend function f_EPTF_UIHandler_CLIClient_handleSET(
    in charstring pl_commandArgs,
    inout charstring pl_result)
  runs on EPTF_UIHandler_Private_CT
  return integer{
    var integer vl_ret := -1
//    Old mechanism : simple regexp.
//    var charstring vl_varName := regexp(pl_commandArgs,c_UIHandler_CLI_assignExt,0);
//    var charstring vl_newContent := regexp(pl_commandArgs,c_UIHandler_CLI_assignExt,1);

    //If help is needed, return immediately.
    if(pl_commandArgs == "help"){
      pl_result := c_UIHandler_CLIClient_cmdUsage&c_UIHandler_CLIClient_setUsage;
      return vl_ret;
    }

    var charstring vl_varName := "";
    var charstring vl_newContent := "";
    var integer vl_startVarname := -1;
    var integer vl_endVarname := -1;
    var boolean vl_varnameWithQuot := false;
    var boolean vl_moreLetItEqualSignFound := false;
    var integer vl_letItEqualSignFound := -1;
    var integer vl_backslashInARowCounter := 0;
    var boolean vl_backslashInARowCounterResetNextTime := false;

    //Loop along the input string letter by letter.
    for(var integer i:= 0; i< lengthof(pl_commandArgs)-1; i:= i +1){

      //Value backslash counter reset-ed
      if(vl_backslashInARowCounterResetNextTime==true){
        vl_backslashInARowCounter := 0;
        vl_backslashInARowCounterResetNextTime := false;
      }

      //When a contiguous backslash sequence ends, this terminates in the next round of the loop
      if(vl_startVarname > -1 and vl_backslashInARowCounter > 0 and pl_commandArgs[i] != "\\" ){
        vl_backslashInARowCounterResetNextTime := true;
      }

      //The String has definitely started, with or without quote
      if(vl_startVarname == -1 and pl_commandArgs[i] != " " and pl_commandArgs[i] != "\t" ){
        if(pl_commandArgs[i] == "\"" and i + 1 < lengthof(pl_commandArgs)){
          vl_startVarname := i+1;
          vl_varnameWithQuot := true;
        } else {
          vl_startVarname := i;
        }
        continue;
      }
      //Quoted varname ends at the paired quote character
      if(pl_commandArgs[i] == "\"" and vl_varnameWithQuot==true and (vl_backslashInARowCounter mod 2 == 0)){
        vl_endVarname := i-1;
        continue;
      }

      //Count backslashes
      if(pl_commandArgs[i] == "\\" and vl_startVarname > -1){
         vl_backslashInARowCounter := vl_backslashInARowCounter + 1;
         continue;
      }

      //Non-quoted varname ends at last non-space character before :=
      if(vl_startVarname > -1 and vl_endVarname == -1 and vl_varnameWithQuot == false and (pl_commandArgs[i] == " " or pl_commandArgs[i] == "\t" )){
        vl_endVarname := i-1;
        continue;
      }

      //Not Quoted Value end reset, because a not whitespace has arrived
      if(vl_startVarname > -1 and vl_endVarname > -1 and i+1< lengthof(pl_commandArgs) and vl_varnameWithQuot == false
         and (pl_commandArgs[i] != ":" or pl_commandArgs[i+1] != "=" ) and pl_commandArgs[i] != " " and pl_commandArgs[i] !="\t" ){
        vl_endVarname := -1;
        continue;
      }

      //Non-space character after quoted varname -> parse error
      if(vl_startVarname > -1 and vl_endVarname > -1 and i+1< lengthof(pl_commandArgs) and vl_varnameWithQuot == true
         and (pl_commandArgs[i] != ":" or pl_commandArgs[i+1] != "=" ) and pl_commandArgs[i] != " " and pl_commandArgs[i] !="\t" ){
        break;
      }

      //Non-quoted varname ends at := if there are no spaces before :=
      if(vl_startVarname > -1 and vl_endVarname == -1 and i+1< lengthof(pl_commandArgs) and vl_varnameWithQuot == false
         and pl_commandArgs[i] == ":" and pl_commandArgs[i+1] == "="){
         vl_endVarname := i-1;
      }

      //A Let It Be Equal sign has come, we register it. It is used when start has been found, but no end of the string
      //that is not quoted but it looked it to be before.
      if(i+1< lengthof(pl_commandArgs) and pl_commandArgs[i] == ":" and pl_commandArgs[i+1] == "="){
        if(vl_letItEqualSignFound > -1){
          vl_moreLetItEqualSignFound := true;
        } else {
          vl_letItEqualSignFound := i;
        }
      }

      //The := and a valid varname start and end has been found, variable name is ready, let's find out the content.
      if(vl_startVarname > -1 and vl_endVarname > -1 and i+1< lengthof(pl_commandArgs) and pl_commandArgs[i] == ":" and pl_commandArgs[i+1] == "="){
        vl_varName := substr(pl_commandArgs,vl_startVarname,vl_endVarname-vl_startVarname+1);
        vl_varName := f_EPTF_Common_decodeEscapeSequence(vl_varName);
        vl_newContent := substr(pl_commandArgs,i+2,lengthof(pl_commandArgs)-i-2);
        vl_newContent := f_EPTF_UIHandler_CLIClient_clearStringFromStartAndEndWhiteSpaces(vl_newContent);
        break;
      }
    }

    //If we found the start of the variable name, but not the end, than it is probably the case, that
    //we thought that it is a quoted variable name, but it isn't. Try the other way, the quot is the part of the variable name
    if( vl_startVarname > -1 and vl_endVarname == -1 and vl_varName == "" and vl_newContent == ""
        and vl_moreLetItEqualSignFound == false and vl_letItEqualSignFound > -1){

      //If it was thought to be quoted, but it isn't, we put the quot alsointo the name.
      if(vl_varnameWithQuot==true){
        vl_varName := substr(pl_commandArgs,vl_startVarname-1, vl_letItEqualSignFound-vl_startVarname+1);
      } else {
        //I really don't know, if this case is possible.
        // remove this case, if not needed.
        vl_varName := substr(pl_commandArgs,vl_startVarname, vl_letItEqualSignFound-vl_startVarname);
      }
      var integer vl_i;
      //Remove white spaces from the back.
      for( vl_i := lengthof(vl_varName)-1; vl_i > 0; vl_i:= vl_i-1){
        if(vl_varName[vl_i] != "" and vl_varName[vl_i] != "\t"){
          break;
        }
      }
      vl_varName := substr(vl_varName, 0, vl_i);
      vl_varName := f_EPTF_Common_decodeEscapeSequence(vl_varName);
      vl_newContent := substr(pl_commandArgs,vl_letItEqualSignFound+2,lengthof(pl_commandArgs)-vl_letItEqualSignFound-2);
      vl_newContent := f_EPTF_UIHandler_CLIClient_clearStringFromStartAndEndWhiteSpaces(vl_newContent);
    }

    if(f_EPTF_UIHandler_CLIClient_debugEnabled()){
       f_EPTF_UIHandler_CLIClient_debug("SET command arrived, variable name : " & vl_varName);
       f_EPTF_UIHandler_CLIClient_debug("SET command arrived, variable content : " & vl_newContent);
    }

    if("" != vl_varName and "" != vl_newContent){
      //var charstring vl_varName := vl_args[0]
      //var charstring vl_newContent := vl_args[1]
      var integer vl_varIdx:=f_EPTF_Var_getId(vl_varName);
      if (-1 < vl_varIdx) {
        if(f_EPTF_UIHandler_isGuiVarEditable(vl_varIdx)) {
          if(f_EPTF_UIHandler_parseParamValue(vl_varIdx, vl_newContent)){
            //f_EPTF_CLI_Client_sendCommandDisplay(c_UIHandler_CLIClient_commandSET,
            pl_result := f_UIHandler_CLIClient_setContentOK(vl_varName,vl_newContent)
            //log(%definitionId,": pl_result==",pl_result)
            vl_ret := 0
          }else{
            pl_result := f_UIHandler_CLIClient_errInvalidContent(vl_newContent, c_UIHandler_CLIClient_commandSET)
          }
        } else {
          pl_result := f_UIHandler_CLIClient_errVarIsReadonly(vl_varName)
        }
      }else{
        pl_result := f_UIHandler_CLIClient_errInvalidVarName(vl_varName, c_UIHandler_CLIClient_commandSET)
      }
    }else{
      pl_result := c_UIHandler_CLIClient_cmdUsage&c_UIHandler_CLIClient_setUsage;
    }
    return vl_ret
  }

  private function f_EPTF_UIHandler_CLIClient_clearStringFromStartAndEndWhiteSpaces (
    in charstring pl_stringToStrip) return charstring{
        var charstring vl_newContent := pl_stringToStrip
        var integer vl_startValue := -1;
        var integer vl_endValue := -1;
        var boolean vl_valueWithQuot := false;
        var integer vl_valueBackslashInARowCounter := 0;
        var boolean vl_valueBackslashInARowCounterResetNextTime := false;
        //Go throug all the letters in the input string);
        for(var integer j:= 0; j< lengthof(vl_newContent); j:= j +1){
          //Value backslash counter reset-ed
          if(vl_valueBackslashInARowCounterResetNextTime==true){
            vl_valueBackslashInARowCounter := 0;
            vl_valueBackslashInARowCounterResetNextTime := false;
          }

          //When a contiguous backslash sequence ends, this terminates in the next round of the loop
          if(vl_startValue > -1 and vl_valueBackslashInARowCounter > 0 and vl_newContent[j] != "\\" ){
            vl_valueBackslashInARowCounterResetNextTime := true;
          }
          //The String has definitely started, with or without quote
          if(vl_startValue == -1 and vl_newContent[j] != " " and vl_newContent[j] != "\t" ){
              if(vl_newContent[j] == "\"" and j + 1 < lengthof(vl_newContent)){
                //Quoted Value start
                vl_startValue := j+1;
                vl_valueWithQuot := true;
              } else {
                //Not Quoted Value start
                vl_startValue := j;
              }
              continue;
          }

          //Quoted varname ends at the paired quote character
          if(vl_newContent[j] == "\"" and vl_valueWithQuot==true and (vl_valueBackslashInARowCounter mod 2 == 0)){
            vl_endValue := j-1;
            continue;
          }

          //Count backslashes
          if(vl_newContent[j] == "\\" and vl_startValue > -1){
             vl_valueBackslashInARowCounter := vl_valueBackslashInARowCounter + 1;
             continue;
          }

          //Not Quoted Value probably end, but not sure, it depends on the forthcomming letters
          if(vl_startValue > -1 and vl_valueWithQuot == false and (vl_newContent[j] == " " or vl_newContent[j] == "\t" )){
            if(vl_endValue == -1){
              vl_endValue := j-1;
            }
            continue;
          }

          //Not Quoted Value end reset, because a not whitespace has arrived
          if(vl_startValue > -1 and vl_endValue > -1 and vl_valueWithQuot == false and vl_newContent[j] != " " and vl_newContent[j] !="\t" ){
            vl_endValue := -1;
            continue;
          }

          //After a Quoted Value, a non-whitespace character has arrived, it will be error at the end.
          if(vl_startValue > -1 and vl_endValue > -1 and j+1< lengthof(vl_newContent) and vl_valueWithQuot == true
             and vl_newContent[j] != " " and vl_newContent[j] !="\t" ){
            vl_startValue := -1;
            vl_endValue := -1;
            break;
          }

        }

        //After examing all letters, endvalue not found. This means that we thought that this is a quoted string, but it isn't
        //or the string ends with a value character.
        if( vl_endValue == -1){
          if(vl_valueWithQuot == true and vl_startValue > 0){ vl_startValue:= vl_startValue-1;}
          vl_endValue := lengthof(vl_newContent)-1;
        }

        //Get the value if possible, do the decode of the Escape Sequences
        if(vl_startValue > -1 and vl_endValue-vl_startValue+1 > 0){
          vl_newContent := substr(vl_newContent,vl_startValue,vl_endValue-vl_startValue+1);
          vl_newContent := f_EPTF_Common_decodeEscapeSequence(vl_newContent);
        } else {
          vl_newContent := "";
        }
        return vl_newContent;
  }



  friend function f_EPTF_UIHandler_CLIClient_handleLS (
    in charstring pl_commandArgs,
    inout charstring pl_result)
  runs on EPTF_UIHandler_Private_CT
  return integer{
    var EPTF_UIHandler_OpenSubscriptions vl_subs := f_EPTF_UIHandler_openSubscriptions();
    var charstring vl_list := "";
    for(var integer i:=0;i<sizeof(vl_subs);i:=i+1) {
      if(i>0) { vl_list := vl_list & "\n" }
      vl_list := vl_list & f_EPTF_Var_getName(vl_subs[i].varIdx);
      vl_list := vl_list & " := ";
      vl_list := vl_list & f_EPTF_UIHandler_CLIClient_var2str(vl_subs[i].varIdx);
    }
    pl_result := vl_list
    return 0
  }
  friend function f_EPTF_UIHandler_CLIClient_handleLSREADONLY(
    in charstring pl_commandArgs,
    inout charstring pl_result)
  runs on EPTF_UIHandler_Private_CT
  return integer{
    var EPTF_UIHandler_OpenSubscriptions vl_subs := f_EPTF_UIHandler_openSubscriptions();
    var charstring vl_list := "";
    for(var integer i:=0;i<sizeof(vl_subs);i:=i+1) {
      if(not f_EPTF_UIHandler_isGuiVarEditable(vl_subs[i].varIdx)) {
        if(lengthof(vl_list)>0) { vl_list := vl_list & "\n" }
        vl_list := vl_list & f_EPTF_Var_getName(vl_subs[i].varIdx);
        vl_list := vl_list & " := ";
        vl_list := vl_list & f_EPTF_UIHandler_CLIClient_var2str(vl_subs[i].varIdx);
      }
    }
    pl_result := vl_list
    return 0
  }
  friend function f_EPTF_UIHandler_CLIClient_handleLSWRITABLE(
    in charstring pl_commandArgs,
    inout charstring pl_result)
  runs on EPTF_UIHandler_Private_CT
  return integer{
    var EPTF_UIHandler_OpenSubscriptions vl_subs := f_EPTF_UIHandler_openSubscriptions();
    var charstring vl_list := "";
    for(var integer i:=0;i<sizeof(vl_subs);i:=i+1) {
      if(f_EPTF_UIHandler_isGuiVarEditable(vl_subs[i].varIdx)) {
        if(lengthof(vl_list)>0) { vl_list := vl_list & "\n" }
        vl_list := vl_list & f_EPTF_Var_getName(vl_subs[i].varIdx);
        vl_list := vl_list & " := ";
        vl_list := vl_list & f_EPTF_UIHandler_CLIClient_var2str(vl_subs[i].varIdx);
      }
    }
    pl_result := vl_list
    return 0
  }
  friend function f_EPTF_UIHandler_CLIClient_handleDISPLAY(
    in charstring pl_commandArgs,
    inout charstring pl_result)
  runs on EPTF_UIHandler_Private_CT
  return integer{
    var integer vl_ret := -1
    var charstring vl_varName := pl_commandArgs
    if("" != vl_varName){
      var integer vl_varIdx:=f_EPTF_Var_getId(vl_varName);
      if (-1 < vl_varIdx) {
        var integer vl_temp;
        if(not f_EPTF_str2int_HashMap_Find(v_UIHandler_CLI_vars2Display, vl_varName,vl_temp)){
          f_EPTF_str2int_HashMap_Insert(v_UIHandler_CLI_vars2Display, vl_varName, vl_varIdx);
        }
        var EPTF_Var_DirectContent vl_content;
        f_EPTF_Var_getContent(vl_varIdx, vl_content);
        pl_result := f_UIHandler_CLIClient_varContentAnswer(vl_varName, f_EPTF_Var_directContent2str(vl_content))
        if(not t_UIHandler_CLI_refresh.running){
          t_UIHandler_CLI_refresh.start( ts_CLI_refreshRate );
        }
        vl_ret := 0
      }else{
        pl_result := f_UIHandler_CLIClient_errInvalidVarName(vl_varName, c_UIHandler_CLIClient_commandDISPLAY)
      }
    }else{
      pl_result := f_UIHandler_CLIClient_errEmptyVarName(c_UIHandler_CLIClient_commandDISPLAY)
    }
    return vl_ret
  }
  friend function f_EPTF_UIHandler_CLIClient_handleHIDE(
    in charstring pl_commandArgs,
    inout charstring pl_result)
  runs on EPTF_UIHandler_Private_CT
  return integer{
    var integer vl_ret := -1
    //Hide all the variables
    if(""==pl_commandArgs){
      f_EPTF_str2int_HashMap_Clear(v_UIHandler_CLI_vars2Display);
      if(t_UIHandler_CLI_refresh.running){
        t_UIHandler_CLI_refresh.stop;
      }
      vl_ret := 0
    }else{
      var charstring vl_varName := pl_commandArgs
      var integer vl_varIdx:=f_EPTF_Var_getId(vl_varName);
      if (-1 < vl_varIdx) {
        var integer vl_temp;
        if(f_EPTF_str2int_HashMap_Find(v_UIHandler_CLI_vars2Display, vl_varName,vl_temp)){
          f_EPTF_str2int_HashMap_Erase(v_UIHandler_CLI_vars2Display, vl_varName);
        }
        if(0 == f_EPTF_str2int_HashMap_Size(v_UIHandler_CLI_vars2Display)){
          if(t_UIHandler_CLI_refresh.running){
            t_UIHandler_CLI_refresh.stop;
          }
        }
        pl_result := f_UIHandler_CLIClient_hideAnswer(vl_varName)
        vl_ret := 0
      }else{
        pl_result := f_UIHandler_CLIClient_errInvalidVarName(vl_varName, c_UIHandler_CLIClient_commandHIDE)
      }
    }
    return vl_ret
  }
  friend function f_EPTF_UIHandler_CLIClient_handleQUIT(
    in charstring pl_commandArgs,
    inout charstring pl_result)
  runs on EPTF_UIHandler_Private_CT
  return integer{
    var integer vl_ret := -1
    return vl_ret
  }
  friend function f_EPTF_UIHandler_CLIClient_handleSTOP(
    in charstring pl_commandArgs,
    inout charstring pl_result)
  runs on EPTF_UIHandler_Private_CT
  return integer{
    f_EPTF_Base_stopAll(none);
    return 0
  }
  friend function f_EPTF_UIHandler_CLIClient_handleHELP(
    in charstring pl_commandArgs,
    inout charstring pl_result)
  runs on EPTF_UIHandler_Private_CT
  return integer{
    pl_result := c_UIHandler_CLIClient_help
    return 0
  }

  group Logging {
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_CLIClient_error
    //
    //  Purpose:
    //    Function to log an error from UIHandler_CLIClient feature.
    //
    //  Parameters:
    //    - pl_message - *in* *charstring* - the message to log
    //
    //  Return Value:
    //    -
    //
    //  Errors & assertions:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    friend function f_EPTF_UIHandler_CLIClient_error(in charstring pl_message)
    runs on EPTF_UIHandler_Private_CT
    {
      f_EPTF_Logging_error(true, tsp_EPTF_UIHandler_CLI_loggingComponentMask&": "&pl_message);
      f_EPTF_Base_stopAll();
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_CLIClient_warning
    //
    //  Purpose:
    //    Function to log a warning from UIHandler_CLIClient feature.
    //
    //  Parameters:
    //    - pl_message - *in* *charstring* - the message to log
    //
    //  Return Value:
    //    -
    //
    //  Errors & assertions:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    friend function f_EPTF_UIHandler_CLIClient_warning(in @lazy charstring pl_message)
    runs on EPTF_UIHandler_Private_CT
    {
      f_EPTF_Logging_warningV2(pl_message, v_UIHandler_CLI_loggingMaskId, {c_EPTF_UIHandler_loggingClassIdx_Warning});
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_CLIClient_debug
    //
    //  Purpose:
    //    Function to log a debug message from UIHandler_CLIClient feature.
    //
    //  Parameters:
    //    - pl_message - *in* *charstring* - the message to log
    //
    //  Return Value:
    //    -
    //
    //  Errors & assertions:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    friend function f_EPTF_UIHandler_CLIClient_debug(in @lazy charstring pl_message)
    runs on EPTF_UIHandler_Private_CT
    {
      f_EPTF_Logging_debugV2(pl_message, v_UIHandler_CLI_loggingMaskId, {c_EPTF_UIHandler_loggingClassIdx_Debug});
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_CLIClient_debugEnabled
    //
    //  Purpose:
    //    Function to check if debug is enabled for UIHandler_CLIClient
    //
    //  Parameters:
    //    -
    //
    //  Return Value:
    //    *boolean* - true if debug enabled
    //
    //  Errors & assertions:
    //    -
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    friend function f_EPTF_UIHandler_CLIClient_debugEnabled()
    runs on EPTF_UIHandler_Private_CT
    return boolean
    {
      return f_EPTF_Logging_isEnabled(v_UIHandler_CLI_loggingMaskId, c_EPTF_UIHandler_loggingClassIdx_Debug);
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandler_CLIClient_sendUserMessage
    //
    //  Purpose:
    //    Sends a custom message to the display terminal
    ///////////////////////////////////////////////////////////
    public function f_EPTF_UIHandler_CLIClient_sendUserMessage(in charstring pl_msg)
    runs on EPTF_UIHandler_Private_CT
    {
      f_EPTF_UIHandler_CLIClient_displayVarContent(pl_msg)
    }
  }
} //CLI

group UIHandler_Config{

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_readFileToCharstring
  //
  //  Purpose:
  //    Loads a XUL describing a window layout and creates the described GUI.
  //
  //  Parameters:
  //    *in charstring pl_fileName* - The name of the file to be processed
  //    It means the window if it's empty
  //
  //  Detailed Comments:
  //    Calls the <f_EPTF_UIHandler_createGUI> function
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_readFileToCharstring(
    in charstring pl_fileName,
    out charstring pl_fileContent)
  runs on EPTF_UIHandler_Private_CT
  return boolean {
    var integer vl_file := f_FIO_open_rdonly(pl_fileName);
    var integer vl_retval:=-1;
    if(vl_file==-1){
      f_EPTF_UIHandler_error(%definitionId&": Couldn't open the file "&pl_fileName&".");
      return false;
    }

    var integer vl_from:=f_FIO_seek_home(vl_file);
    var integer vl_to:=f_FIO_seek_end(vl_file);
    if( f_FIO_seek_home(vl_file)==-1) {
      f_EPTF_UIHandler_error(%definitionId&": File seek error in file "&pl_fileName&".");
      return false;
    }

    vl_retval:=f_FIO_read_text(vl_file, pl_fileContent, vl_to-vl_from)
    if(-1 == vl_retval){
      f_EPTF_UIHandler_error(%definitionId&": Couldn't read the file "&pl_fileName&".");
      return false;
    }

    if( f_FIO_close(vl_file)==-1) {
      f_EPTF_UIHandler_error(%definitionId&": Could not close the file "&pl_fileName&".");
      return false;
    }

    return true;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_createGUIFromFile
  //
  //  Purpose:
  //    This function reads the given file and calls the
  //    f_EPTF_UIHandler_createGUI with the processed charstring.
  //
  //  Parameters:
  //    *in charstring pl_fileName* - The name of the XUL file to be processed
  //    *in charstring pl_parentWidgetId* - ParentId where to insert the XUL.
  //
  //  Detailed Comments:
  //    Calls the <f_EPTF_UIHandler_createGUI> function
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_createGUIFromFile(
    in charstring pl_fileName,
    in charstring pl_parentWidgetId := "")
  runs on EPTF_UIHandler_CT
  return boolean {
    var charstring vl_GUI := "";

    f_EPTF_UIHandler_readFileToCharstring(pl_fileName, vl_GUI)
    return f_EPTF_UIHandler_createGUI(vl_GUI, pl_parentWidgetId);
  }


  // this function is only used in EPTF_CLL_UIHandler_GUIFunctions.cc, but passed to a function reference,
  // but this is needed to be able to log the function ref from TTCN
  private external function f_EPTF_UIHandler_expand_current_iterator(
    //request parameters:
    in charstring pl_source,
    in charstring pl_ptcName,                   // response may fill this if it was ""
    in charstring pl_element,
    in EPTF_DataSource_Params pl_params,
    // reponse parameters:
    in integer pl_errorCode,                    // error code in the response
    in charstring pl_remoteDataVarName,         // var name on the remote component. In case errorCode!=0: it contains the error message
    in EPTF_Var_CT/*EPTF_DataSourceClient_CT*/ pl_ownerCompRef,// reference to the remote component
    in integer pl_localDataVarId,               // var Id on the local component (contains the current value, not subscribed to remote!)
    in EPTF_Var_DirectContent pl_dataValue,     // the value of the data
    // user data
    in EPTF_IntegerList pl_userData             // user specific data given at the request
  );


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_createGUI
  //
  //  Purpose:
  //    This function processes the given XML and resolves
  //    iterators, externalvalues and datasources in it.
  //
  //  Parameters:
  //    *in charstring pl_xul* - The XML to process
  //    *in charstring pl_parentWidgetId* - ParentId where to insert the xml
  //
  //  Detailed Comments:
  //    This function can be used to create a GUI based on an XML.
  //    The XML has to be valid against the XSD of the XTDP Protocol Module.
  //    The GUI created from the XML will be placed under the parant widget id
  //    specified in pl_parentWidgetId parameter. Use empty string to place
  //    the XML to the main window.
  //    Before this function is called with an XML, all datasources in it
  //    should be ready and all variables belonging to the data sources
  //    should exist. The function <f_EPTF_DataSource_registerReadyCallback>
  //    can be used to register callback functions that are called when a data source
  //    becomes ready. Before calling <f_EPTF_UIHandler_createGUI> you have to check
  //    that all data sources in the XML became ready.
  //
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_createGUI(in charstring pl_xul,
    in charstring pl_parentWidgetId := "")
  runs on EPTF_UIHandler_Private_CT
  return boolean {
    return f_EPTF_UIHandler_createGUI_private(pl_xul, pl_parentWidgetId, true);
  }

  private external function f_EPTF_UIHandler_expandXML(out charstring pl_xulExpanded, in charstring pl_xul, in charstring pl_parentWidgetId := "") return boolean;

  private external function f_EPTF_UIHandler_removeXML(in charstring pl_parentWidgetId := "") return boolean;

  private external function f_EPTF_UIHandler_refreshedXMLforNode(in integer pl_nodePointer, out charstring pl_xulExpanded) return boolean;

  private external function f_EPTF_UIHandler_printAllXML();

  private function f_EPTF_UIHandler_createGUI_private (
    in charstring pl_xul,
    in charstring pl_parentWidgetId := "",
    in boolean pl_appendTo_GUI_DescriptionDB := true,
    in boolean pl_send_to_RTGUI := true)
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    if (not v_UIHandler_initialized){ return false }
    v_UIHandler_createGUIRunning := true;
    var charstring vl_expandedXML;
    var boolean vl_return := true;
    var charstring vl_progressInfo := "Creating GUI from xml under widgetId: "&pl_parentWidgetId;
    f_EPTF_UIHandler_updateOwnProgress(vl_progressInfo);

    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug(%definitionId&": Started on: " & log2str(pl_xul));
    }
    if(f_EPTF_UIHandler_expandXML(vl_expandedXML, pl_xul, pl_parentWidgetId) == true) {
      var integer vl_widgetParentIdx := 0;
      var boolean vl_clearGui := false;
      if("" != pl_parentWidgetId){
        vl_widgetParentIdx := f_EPTF_UIHandler_widgetRecIndex(pl_parentWidgetId);
        if(-1 == vl_widgetParentIdx){
          f_EPTF_UIHandler_warning(%definitionId&": The received parent widget with ID """&pl_parentWidgetId&""" does not exist!");
          vl_widgetParentIdx := 0;
        }
      }
      if(pl_appendTo_GUI_DescriptionDB == true) {
        f_EPTF_UIHandler_addWidgetWithParent(pl_parentWidgetId, vl_expandedXML);
      }
      var Widgets vl_widgets := f_EPTF_UIHandler_XSD_decodeXUL(vl_expandedXML);

      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": Decoded widgets: " & log2str(vl_widgets));
      }

      f_EPTF_UIHandler_updateOwnProgress(vl_progressInfo&" Done.");

      var boolean vl_widgetExists;

      //If the root element is a window, clear the GUI
      if(ischosen(vl_widgets.window)){
        f_EPTF_UIHandler_clearInternalWidgetDB();
        vl_clearGui := true;
      }

      //var EPTF_UIHandler_WidgetsList vl_widgetslist;
      v_UIHandler_widgetIdxList := {}
      v_UIHandler_actualParentIdx := -1;
      v_UIHandler_actualParentIdxIsFilled := false;

      v_UIHandler_customGUIProcess := true;
      vl_return := f_EPTF_UIHandler_Config_Parse(vl_widgets,
        vl_widgetParentIdx,
        vl_widgetExists);
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": Widgets after: " & log2str(vl_widgets));
        f_EPTF_UIHandler_debug(%definitionId&": "&f_EPTF_UIHandler_XSD_encodeXUL(vl_widgets));
      }

      if (vl_clearGui) {
        f_EPTF_UIHandler_clearGUI(false);
      }

      if(not v_UIHandler_initToGUIClient and pl_send_to_RTGUI){

        var integer vl_UIHandler_widgetIdxList_size := sizeof(v_UIHandler_widgetIdxList);
        for(var integer vl_i := 0; vl_i < vl_UIHandler_widgetIdxList_size; vl_i := vl_i + 1) {
          var integer vl_parentWidgetIdx := f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].parentIdx);
          var charstring vl_parentWidgetId := "";
          if(vl_parentWidgetIdx != -1) {
            vl_parentWidgetId := v_UIHandler_guiItemList[vl_parentWidgetIdx].id;
          }
          // the valuelist should only be put on the GUI if its parent (distribution chart) was not already put:
          if (v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].widgetType == wtValuelist) {
            // put only to the GUI if its parent chart is not in the v_UIHandler_widgetIdxList
            var boolean vl_parentWasUpdated := false;
            for (var integer vl_j:=vl_i-1; vl_j>=0; vl_j := vl_j - 1 ) {
              if (vl_parentWidgetIdx == v_UIHandler_widgetIdxList[vl_j]) {
                vl_parentWasUpdated := true;
              }
            }
            if (vl_parentWasUpdated) {
              continue; // vl_i
            }
          }

          //valuelist xulsformat is in the distribution chart, so alredy in the gui
          // if the xulformat is empty, that means it is intervallimits, which is inside the distribution chart and generated by buildchildrenxul below
          //at tree: need to build the whole tree, RTGUI doesn't support add treecell element
          if(ispresent(v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].XULformat)) {
             if(v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].widgetType != wtTreecell and
                v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].widgetType != wtTreecol) {
                //if(v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].widgetType == wtDistributionchart or
                //  v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].widgetType == wtTree) {
                var Widgets vl_xul;
                //buildchildrenxul cant handle window, f_EPTF_UIHandler_buildXUL makes the whole xul from the window.
                if(v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].widgetType == wtWindow){
                  f_EPTF_UIHandler_buildXUL(vl_xul);
                } else {
                  f_EPTF_UIHandler_buildchildrenXUL(v_UIHandler_widgetIdxList[vl_i], vl_xul, true);
                }
                f_EPTF_UIHandler_XSD_addElementToGui_private(vl_xul, vl_parentWidgetId, vl_widgetExists,false);
             } else {
               var Widgets vl_xul;
               f_EPTF_UIHandler_buildchildrenXUL(v_UIHandler_widgetIdxList[vl_i], vl_xul, true);
               f_EPTF_UIHandler_XSD_addElementToGui_private(vl_xul, vl_parentWidgetId, vl_widgetExists,false);
             }
          }
        }
      }

      v_UIHandler_widgetIdxList := {};
      v_UIHandler_actualParentIdx := -1;
      v_UIHandler_actualParentIdxIsFilled := false;

      // wait to finish all getData handlers:
      f_EPTF_UIHandler_waitForProcessExternalData_handlers();

      // FIXME: if more progress info is added later, the progress variable has to be connected to the widget
      vl_return := f_EPTF_UIHandler_Config_connectAllVarsToWidget() and vl_return;
    } else {
      // XML Load error
      f_EPTF_UIHandler_error(%definitionId&": The received XML is invalid, it can not be decoded fully.\n"&
        "For further detailes see the log file above.");
    }
    v_UIHandler_createGUIRunning := false;
    return vl_return;
  }


  public function f_EPTF_UIHandler_createGUI_old (in charstring pl_xul,
    in charstring pl_parentWidgetId := "")
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    return f_EPTF_UIHandler_createGUI_private_old(pl_xul, pl_parentWidgetId, true);
  }

  private function f_EPTF_UIHandler_createGUI_private_old (
    in charstring pl_xul,
    in charstring pl_parentWidgetId := "",
    in boolean pl_appendTo_GUI_DescriptionDB := true,
    in boolean pl_send_to_RTGUI := true)
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    if (not v_UIHandler_initialized){ return false }
    v_UIHandler_createGUIRunning := true;
    var charstring vl_progressInfo := "Creating GUI from xml under widgetId: "&pl_parentWidgetId;
    f_EPTF_UIHandler_updateOwnProgress(vl_progressInfo);

    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug(%definitionId&": Started on: " & log2str(pl_xul));
    }

    var integer vl_widgetParentIdx := 0;
    var boolean vl_clearGui := false;
    if("" != pl_parentWidgetId){
      vl_widgetParentIdx := f_EPTF_UIHandler_widgetRecIndex(pl_parentWidgetId);
      if(-1 == vl_widgetParentIdx){
        f_EPTF_UIHandler_warning(%definitionId&": The received parent widget with ID """&pl_parentWidgetId&""" does not exist!");
        vl_widgetParentIdx := 0;
      }
    }
    if(pl_appendTo_GUI_DescriptionDB == true) {
      f_EPTF_UIHandler_addWidgetWithParent(pl_parentWidgetId, pl_xul);
    }
    var Widgets vl_widgets := f_EPTF_UIHandler_XSD_decodeXUL(pl_xul);

    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug(%definitionId&": Decoded widgets: " & log2str(vl_widgets));
    }

    f_EPTF_UIHandler_updateOwnProgress(vl_progressInfo&" Done.");

    var boolean vl_widgetExists;

    //If the root element is a window, clear the GUI
    if(ischosen(vl_widgets.window)){
      f_EPTF_UIHandler_clearInternalWidgetDB();
      vl_clearGui := true;
    }

   //var EPTF_UIHandler_WidgetsList vl_widgetslist;
    v_UIHandler_widgetIdxList := {}
    v_UIHandler_actualParentIdx := -1;
    v_UIHandler_actualParentIdxIsFilled := false;
    //vl_widgetParentIdx := 0;
    v_UIHandler_customGUIProcess := true;
    var boolean vl_return := f_EPTF_UIHandler_Config_Parse(vl_widgets,
      vl_widgetParentIdx,
      vl_widgetExists);
    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug(%definitionId&": Widgets after: " & log2str(vl_widgets));
      f_EPTF_UIHandler_debug(%definitionId&": "&f_EPTF_UIHandler_XSD_encodeXUL(vl_widgets));
    }

    if (vl_clearGui) {
      f_EPTF_UIHandler_clearGUI(false);
    }

    if(not v_UIHandler_initToGUIClient and pl_send_to_RTGUI){

        var integer vl_UIHandler_widgetIdxList_size := sizeof(v_UIHandler_widgetIdxList);
        for(var integer vl_i := 0; vl_i < vl_UIHandler_widgetIdxList_size; vl_i := vl_i + 1) {
          var integer vl_parentWidgetIdx := f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].parentIdx);
          var charstring vl_parentWidgetId := "";
          if(vl_parentWidgetIdx != -1) {
            vl_parentWidgetId := v_UIHandler_guiItemList[vl_parentWidgetIdx].id;
          }
          // the valuelist should only be put on the GUI if its parent (distribution chart) was not already put:
          if (v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].widgetType == wtValuelist) {
            // put only to the GUI if its parent chart is not in the v_UIHandler_widgetIdxList
            var boolean vl_parentWasUpdated := false;
            for (var integer vl_j:=vl_i-1; vl_j>=0; vl_j := vl_j - 1 ) {
              if (vl_parentWidgetIdx == v_UIHandler_widgetIdxList[vl_j]) {
                vl_parentWasUpdated := true;
              }
            }
            if (vl_parentWasUpdated) {
              continue; // vl_i
            }
          }

          //valuelist xulsformat is in the distribution chart, so alredy in the gui
          // if the xulformat is empty, that means it is intervallimits, which is inside the distribution chart and generated by buildchildrenxul below
          //at tree: need to build the whole tree, RTGUI doesn't support add treecell element

          if(ispresent(v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].XULformat) and
             v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].widgetType != wtTreecell and
             v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].widgetType != wtTreecol) {
            //if(v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].widgetType == wtDistributionchart or
            //  v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].widgetType == wtTree) {
              var Widgets vl_xul;
              //buildchildrenxul cant handle window, f_EPTF_UIHandler_buildXUL makes the whole xul from the window.
              if(v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].widgetType == wtWindow){
                f_EPTF_UIHandler_buildXUL(vl_xul);
              } else {
                f_EPTF_UIHandler_buildchildrenXUL(v_UIHandler_widgetIdxList[vl_i], vl_xul, true)
              }
              f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, vl_parentWidgetId, vl_widgetExists,false);
            //} else {
            //  f_EPTF_UIHandler_XSD_addElementToGui(v_UIHandler_guiItemList[v_UIHandler_widgetIdxList[vl_i]].XULformat, vl_parentWidgetId, vl_widgetExists,false);
            //}
          }
        }
    }

    v_UIHandler_widgetIdxList := {};
    v_UIHandler_actualParentIdx := -1;
    v_UIHandler_actualParentIdxIsFilled := false;

    // wait to finish all getData handlers:
    f_EPTF_UIHandler_waitForProcessExternalData_handlers();

    // FIXME: if more progress info is added later, the progress variable has to be connected to the widget
    vl_return := f_EPTF_UIHandler_Config_connectAllVarsToWidget() and vl_return;
    v_UIHandler_createGUIRunning := false;

    var integer vl_sizeof_postponedPostProcDB := sizeof(v_UIHandler_postponedPostProcDB);
    for(var integer vl_i := 0; vl_i < vl_sizeof_postponedPostProcDB ; vl_i := vl_i + 1){
      f_EPTF_UIHandler_updateMenulistItemsFromExternaldata(v_UIHandler_postponedPostProcDB[vl_i].idx, v_UIHandler_postponedPostProcDB[vl_i].argList);
    }
    v_UIHandler_postponedPostProcDB := {};

    return vl_return;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_Config_Parse
  //
  //  Purpose:
  //    It parses the input xul into the database, replaces the iterator tags and handles datadescription tags.
  //  Parameters:
  //    - pl_xul          - *in* <Widgets>                     - incoming xml
  //    - pl_widgetsList  - *out* <EPTF_UIHandler_WidgetsList> - result xml
  //    - pl_parentIdx    - *in* *integer*                     - the id of the parent widget under that the xul should be inserted
  //    - pl_widgetExists - *out* *boolean*                    - Does any of the widgets defined in the incoming xml already exist on the GUI?
  //
  //  Return Value:
  //    *boolean* - All the widgets definied in the incoming xul is on the GUI and ready to run?
  //
  //  Errors:
  //    none
  //
  //  Detailed Comments:
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_Config_Parse (
    in Widgets pl_xul,
    in integer pl_parentIdx,
    inout boolean pl_widgetExists)
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    pl_widgetExists := false;
    var boolean vl_returnBool := false;
    if(ischosen(pl_xul.iterator )) {
      var Embeddedwidget vl_embeddedwidget := {iterator := pl_xul.iterator};
      return f_EPTF_UIHandler_Config_processIterator(vl_embeddedwidget, pl_parentIdx, true, pl_widgetExists);
    }
    else if(ischosen(pl_xul.externalvalue )) {
      var Embeddedwidget vl_embeddedwidget := {externalvalue := pl_xul.externalvalue};
      return f_EPTF_UIHandler_Config_processIterator(vl_embeddedwidget, pl_parentIdx, true, pl_widgetExists);
    }
    else if(ischosen(pl_xul.window )) {
      vl_returnBool := f_EPTF_UIHandler_appendAllWidgetIdsFromWindow(pl_xul.window, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.tabpages )) {
      vl_returnBool := f_EPTF_UIHandler_appendAllWidgetIdsFromTabpages(pl_xul.tabpages, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.tree )) {
      vl_returnBool := f_EPTF_UIHandler_appendAllWidgetIdsFromTree(pl_xul.tree, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.treecols )) {
      vl_returnBool := f_EPTF_UIHandler_appendAllWidgetIdsFromTreecols(pl_xul.treecols.treecolgroups.treecolgroup_list, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.treecol )) {
      vl_returnBool := -1 != f_EPTF_UIHandler_appendTreecol(pl_xul.treecol, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.treechildren )) {
      vl_returnBool := f_EPTF_UIHandler_appendAllWidgetIdsFromTreeItemGroups(pl_xul.treechildren.treeitemgroups.treeitemgroup_list, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.treeitem )) {
      vl_returnBool :=  f_EPTF_UIHandler_appendAllWidgetIdsFromTreeRowGroups(pl_xul.treeitem.treerowgroups.treerowgroup_list, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.treerow )) {
      vl_returnBool := f_EPTF_UIHandler_appendAllWidgetIdsFromTreeCellGroups(pl_xul.treerow.treecellgroups.treecellgroup_list, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.treecell )) {
      vl_returnBool := f_EPTF_UIHandler_appendCell(pl_xul.treecell, pl_parentIdx, pl_widgetExists, sizeof(v_UIHandler_guiItemList[pl_parentIdx].widgetData.treeData.columns)-1);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.hbox )) {
      vl_returnBool := f_EPTF_UIHandler_appendAllWidgetIdsFromHbox(pl_xul.hbox, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.label_ )) {
      vl_returnBool := f_EPTF_UIHandler_appendLabel(pl_xul.label_, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.spacer )) {
      vl_returnBool := f_EPTF_UIHandler_appendSpacer(pl_xul.spacer, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.button )) {
      vl_returnBool := f_EPTF_UIHandler_appendButton(pl_xul.button, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;

    }
    else if(ischosen(pl_xul.textbox )) {
      vl_returnBool := f_EPTF_UIHandler_appendTextbox(pl_xul.textbox, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.chart )) {
      vl_returnBool := f_EPTF_UIHandler_appendChart(pl_xul.chart, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.trace )) {
      vl_returnBool := f_EPTF_UIHandler_appendTrace(pl_xul.trace, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.toolbar )) {
      vl_returnBool := f_EPTF_UIHandler_appendToolbar(pl_xul.toolbar, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.toolbarbutton )) {
      vl_returnBool := f_EPTF_UIHandler_appendToolbarbutton(pl_xul.toolbarbutton, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;

    }
    else if(ischosen(pl_xul.toolbarelements )) {
      vl_returnBool := f_EPTF_UIHandler_appendToolbarelements(pl_xul.toolbarelements, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.tracelist )) {
      var boolean vl_ret := true;
      for(var integer vl_i := 0; vl_i < sizeof(pl_xul.tracelist.trace_list);vl_i := vl_i + 1){
        vl_ret := vl_ret and f_EPTF_UIHandler_appendTrace(pl_xul.tracelist.trace_list[vl_i], pl_parentIdx, pl_widgetExists);
      }
      return vl_ret;
    }
    else if(ischosen(pl_xul.tabpage )) {
      vl_returnBool := f_EPTF_UIHandler_appendAllWidgetIdsFromTabpage(pl_xul.tabpage, pl_parentIdx, pl_widgetExists)
      //vl_returnBool := vl_returnBool and f_EPTF_UIHandler_appendAllWidgetIdsFromEmbeddedwidgets(pl_xul.tabpage.embeddedwidgets, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.listbox )) {
      vl_returnBool := f_EPTF_UIHandler_appendListbox(pl_xul.listbox, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.listitem )) {
      vl_returnBool := f_EPTF_UIHandler_appendListitem(pl_xul.listitem, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.numericalwidget )) {
      vl_returnBool := f_EPTF_UIHandler_appendNumericalwidget(pl_xul.numericalwidget, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;

    }
    else if(ischosen(pl_xul.menulist )) {
      vl_returnBool :=  f_EPTF_UIHandler_appendMenulist(pl_xul.menulist, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.menuitem )) {
      vl_returnBool :=  f_EPTF_UIHandler_appendMenuitem(pl_xul.menuitem, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.distributionchart )) {
      vl_returnBool :=  f_EPTF_UIHandler_appendDistributionchart(pl_xul.distributionchart, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.valuelist )) {
      vl_returnBool :=  f_EPTF_UIHandler_appendValuelist(pl_xul.valuelist, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.image )) {
      vl_returnBool :=  f_EPTF_UIHandler_appendImage(pl_xul.image, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.pushbutton )) {
      vl_returnBool := f_EPTF_UIHandler_appendPushbutton(pl_xul.pushbutton, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;

    }
    else if(ischosen(pl_xul.togglebutton )) {
      vl_returnBool := f_EPTF_UIHandler_appendTogglebutton(pl_xul.togglebutton, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;

    }
    else if(ischosen(pl_xul.htmlcode )) {
      vl_returnBool := f_EPTF_UIHandler_appendHtmlcode(pl_xul.htmlcode, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    }
    else if(ischosen(pl_xul.tabpagelist)) {
      vl_returnBool := f_EPTF_UIHandler_appendAllWidgetIdsFromTabpagegroup_list(pl_xul.tabpagelist.tabpagegroups.tabpagegroup_list, pl_parentIdx, pl_widgetExists);
      return vl_returnBool;
    } else {
      f_EPTF_UIHandler_warning("Unhandled widget type in "&%definitionId&": "&log2str(pl_xul));
      return false;
    }
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_Config_processIterator
  //
  //  Purpose:
  //    It processes the Iterator widget: retrieves the iterator data from the DataSource Client - usnig the DataSource Server,
  //    into which the client has registered previously, copies the embedded widgets according to the number of the iterator-request
  //    result and replaces all %the iterator name%s to the current value of the iterator.
  //  Parameters:
  //    - pl_iterator     - *in* <Iterator> - iterator widget currently processed.
  //    - pl_result       - *out* <EPTF_UIHandler_WidgetsList> - result of the function, contains the embedded widgets processed.
  //    - pl_parentIdx    - *in* *integer*                     - the id of the parent widget under that the xul should be inserted
  //    - pl_widgetExists - *inout* *boolean*                  - Does any of the widgets defined in the intermediate xml already exist on the GUI?
  //    - pl_isExternalValue - *in* *boolean*                  - Is the processed item externalvalue or iterator
  //
  //  Return Value:
  //    *boolean* - All the widgets definied in the iterator is on the GUI and ready to run?
  //
  //  Errors:
  //    Configuration Error - iterator with same name or communication error.
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_Config_processIterator(
    in Embeddedwidget pl_embeddedWidget,
    in integer pl_parentIdx,
    in boolean pl_createMetaIterator := true,
    inout boolean pl_widgetExists)
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    var integer vl_iteratorVarIdx;
    var integer vl_nodePointer;
    var Iterator vl_iterator;
    var boolean vl_bool := false;
    var boolean vl_isExternalValue;
    if(ischosen(pl_embeddedWidget.iterator)) {
      vl_iterator := pl_embeddedWidget.iterator;
      vl_isExternalValue := false;
    } else if(ischosen(pl_embeddedWidget.externalvalue)) {
      vl_iterator := pl_embeddedWidget.externalvalue;
      vl_isExternalValue := true;
    } else {
      //from postproc
      var Embeddedwidgets vl_widgets := {embeddedwidget_list := {pl_embeddedWidget}};
      vl_bool := f_EPTF_UIHandler_appendAllWidgetIdsFromEmbeddedwidgets(vl_widgets,
        pl_parentIdx,
        pl_widgetExists);
      return vl_bool;
    }


    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug(%definitionId&": Started on : " & log2str(vl_iterator));
    }

    var integer vl_parentIdx;
    if(pl_createMetaIterator) {
      //insert the iterator with its meta information to database:
      f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_iterator.metadata));
      vl_parentIdx := f_EPTF_UIHandler_appendMetaIterator(pl_parentIdx, pl_widgetExists, iterator, vl_iteratorVarIdx, vl_nodePointer, vl_isExternalValue);
    } else {
      vl_parentIdx := pl_parentIdx;
    }
    vl_bool := true; // bugfix_artf361869_empty_iterator: continue processing for empty iterator
    for(var integer j := 0; j < sizeof(vl_iterator.embeddedwidgets.embeddedwidget_list); j := j + 1){
      var Embeddedwidget vl_widget := vl_iterator.embeddedwidgets.embeddedwidget_list[j];
      var Embeddedwidgets vl_widgets := {embeddedwidget_list := {vl_widget}};
      vl_bool := f_EPTF_UIHandler_appendAllWidgetIdsFromEmbeddedwidgets(vl_widgets,
        vl_parentIdx,
        pl_widgetExists);
    }
   return vl_bool;
  }

  private external function dec_Embeddedwidgets (in octetstring p_oct, out Embeddedwidgets.embeddedwidget_list p_widgets) return integer
  with {extension "prototype(backtrack) decode (XER:XER_EXTENDED) errorbehavior(ALL:WARNING)"}
  private external function enc_Embeddedwidgets (in Embeddedwidgets.embeddedwidget_list p_widgets) return octetstring
  with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_Config_processExternalData
  //
  //  Purpose:
  //      Processing externaldata tag : retrieving the Data from DataSource and DataSoureClient, after that we connect to WidgetId.
  //  Parameters:
  //    - pl_datadescription - *in* <Datadescription>  - datadescription of the widget
  //    - pl_widgetId        - *in* *charstring*                                                  - connect datasource to the widget identied by this id
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_Config_processExternalData(in Datadescription pl_datadescription,
    in charstring pl_widgetId)
  runs on EPTF_UIHandler_Private_CT{
    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug(%definitionId&": Started on : " & log2str(pl_datadescription));
    }
    // Ask the UIHandler about the datasource, then send him the question.
    var EPTF_DataSource_Params vl_dataparamList:= {};
    var charstring vl_varName  := "";
    if(ispresent(pl_datadescription.params)){
      for(var integer i := 0; i < sizeof(pl_datadescription.params.dataparam_list); i := i + 1 ){
        var integer vl_dataParamsSize := sizeof(vl_dataparamList);
        vl_dataparamList[vl_dataParamsSize].paramName := f_unichar2charstr(pl_datadescription.params.dataparam_list[i].name); // FIXME
        vl_dataparamList[vl_dataParamsSize].paramValue := f_unichar2charstr(pl_datadescription.params.dataparam_list[i].value_);
      }
    }
    var charstring vl_source := f_unichar2charstr(pl_datadescription.source);

    var charstring vl_ptcname := "";
    if(ispresent(pl_datadescription.ptcname)){ vl_ptcname := f_unichar2charstr(pl_datadescription.ptcname)}

    var charstring vl_element := f_unichar2charstr(pl_datadescription.element);


    var integer vl_widgetRecIdx := f_EPTF_UIHandler_widgetRecIndex(pl_widgetId);

    v_UIHandler_nofRunning_processExternalData_handlers := v_UIHandler_nofRunning_processExternalData_handlers + 1;
    f_EPTF_DataSource_getData_nonBlocking(
      pl_source := vl_source,
      pl_ptcName := vl_ptcname,
      pl_element := vl_element,
      pl_params := vl_dataparamList,
      pl_getDataHandler := {refers(f_EPTF_UIHandler_Config_processExternalData_handler), {vl_widgetRecIdx}}
    );

  }


  private function f_EPTF_UIHandler_waitForProcessExternalData_handlers() runs on EPTF_UIHandler_Private_CT {
    timer t_maxWait := tsp_EPTF_UIHandler_maxWaitTimer;
    t_maxWait.start;
    timer t_wait := 0.0;
    t_wait.start;
    alt {
      [v_UIHandler_nofRunning_processExternalData_handlers==0] t_wait.timeout;
      [] t_maxWait.timeout {
        f_EPTF_UIHandler_warning(%definitionId&": ProcessExternalData_handlers are still running, but maximum waiting time expired. Continuing anyway...");
      }
    }
  }

  private function f_EPTF_UIHandler_GUIFunctions_waitForProcessExternalData_handlers( in integer pl_idx) runs on EPTF_UIHandler_Private_CT {
    timer t_wait := 0.0;
    t_wait.start;
    alt {
      [v_UIHandler_GUIFunctions_nofRunning_processExternalData_handlers[pl_idx]==0] t_wait.timeout;
    }
  }

  private function f_EPTF_UIHandler_GUIFunctions_waitForProcessExternalData_handlers_reset() runs on EPTF_UIHandler_Private_CT {
    v_UIHandler_GUIFunctions_nofRunning_processExternalData_handlers := {};
  }

  private function f_EPTF_UIHandler_Config_processExternalData_handler(
    //request parameters:
    in charstring pl_source,
    in charstring pl_ptcName,                   // response may fill this if it was ""
    in charstring pl_element,
    in EPTF_DataSource_Params pl_params,
    // reponse parameters:
    in integer pl_errorCode,                    // error code in the response
    in charstring pl_remoteDataVarName,         // var name on the remote component. In case errorCode!=0: it contains the error message
    in EPTF_Var_CT/*EPTF_DataSourceClient_CT*/ pl_ownerCompRef,// reference to the remote component
    in integer pl_localDataVarId,               // var Id on the local component (contains the current value, not subscribed to remote!)
    in EPTF_Var_DirectContent pl_dataValue,     // the value of the data
    // user data
    in EPTF_IntegerList pl_userData             // user specific data given at the request
  ) runs on EPTF_UIHandler_Private_CT {

    var integer vl_widgetRecIdx := pl_userData[0];

    var EPTF_UIHandler_WidgetIdString pl_widgetId := v_UIHandler_guiItemList[vl_widgetRecIdx].id;
    var EPTF_UIHandler_GuiItemRec vl_widgetRec;
    var EPTF_Var_DirectContent vl_defaultValue;
    f_EPTF_UIHandler_getWidgetRec(pl_widgetId, vl_widgetRec)
    f_EPTF_UIhandler_simulation_getDefaultValue(vl_widgetRec, vl_defaultValue);

    // widget id is checked because it could happen that the widget or its parent is removed meanwhile (artf552584)
    if (pl_errorCode==0 and v_UIHandler_guiItemList[vl_widgetRecIdx].id != "") {

      var charstring vl_varDataName := f_EPTF_Var_getName(pl_localDataVarId);
      f_EPTF_UIHandler_simulation_getData( vl_varDataName,
        pl_source,
        pl_ptcName,
        pl_element,
        pl_params,
        -,
        -,
        vl_defaultValue );

      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": widgetId: " & log2str(pl_widgetId) & " varId: " & log2str(pl_localDataVarId));
      }
      f_EPTF_UIHandler_Config_registerVarToWidget(pl_widgetId, pl_localDataVarId, self, "",pl_dataValue);
      f_EPTF_Var_addSubsCanAdjustNotifyFn(pl_localDataVarId, {refers(f_EPTF_UIHandler_updateDisableStateByVarIdx), {}});// - called in f_EPTF_UIHandler_Config_connectAllVarsToWidget() as well
      f_EPTF_UIHandler_updateDisableStateByVarIdx(pl_localDataVarId, {});// - called in f_EPTF_UIHandler_Config_connectAllVarsToWidget() as well
    } else {
      if(v_EPTF_UIHandler_simulatonMode) {
        var charstring vl_dataVarName;
        //get the data from DB
        if(f_EPTF_UIHandler_simulation_getDataFromDB(vl_dataVarName, pl_source, pl_ptcName, pl_element, pl_params) != 0) {
          //create random data to simulate
          vl_dataVarName := log2str(vl_defaultValue);
          if(f_EPTF_Var_getId(vl_dataVarName) == -1) {
            f_EPTF_Var_newVar(log2str(vl_defaultValue), vl_defaultValue)
          }
        }
      } else {
        f_EPTF_UIHandler_warning(%definitionId&": Configuration error : Invalid dataSource parameters: \n"&
          "\nSource: "&pl_source&
          "\nPTC : "&pl_ptcName &
          "\nData Name : " &pl_element&
          "\nParams:" & log2str(pl_params)&
          "\nCheck the warnings above for more info.");
      }
    }

    v_UIHandler_nofRunning_processExternalData_handlers := v_UIHandler_nofRunning_processExternalData_handlers - 1;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_updateDisableStateByVarIdx
  //
  //  Purpose:
  //    Callback function for the variable's subsCanAdjust flag change event
  //
  //  Parameters:
  //    pl_idx - *in* *integer* - EPTF Variable index
  //    pl_argList - *in* <EPTF_IntegerList> - argument list
  //
  //  Detailed Comments:
  //    See f_EPTF_Var_addSubsCanAdjustNotifyFn
  ///////////////////////////////////////////////////////////
  function f_EPTF_UIHandler_updateDisableStateByVarIdx(in integer pl_idx, in EPTF_IntegerList pl_argList)
  runs on EPTF_UIHandler_Private_CT
  {
    if(f_EPTF_Var_getSubsCanAdjust(pl_idx)) {
      f_EPTF_UIHandler_enableAllWidgetsOfVar(pl_idx);
    } else {
      f_EPTF_UIHandler_disableAllWidgetsOfVar(pl_idx);
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_enableAllWidgetsOfVar
  //
  //  Purpose:
  //    Enables all widgets connected to the provided variable
  //
  //  Parameters:
  //    pl_varIdx - *in* *integer* - the ID of the variable
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_enableAllWidgetsOfVar(in integer pl_varIdx)
  runs on EPTF_UIHandler_Private_CT
  {
    if (not v_UIHandler_initialized){ return }
    var EPTF_UIHandler_OpenSubscriptions vl_varSubscriptions;
    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug(%definitionId&": "&f_EPTF_Var_getName(pl_varIdx));
    }

    if(f_EPTF_UIHandler_getSubscriptionsByVarIdx(pl_varIdx, vl_varSubscriptions))//there are some subscriptions to the variable
    {
      for(var integer i:=0; i<sizeof(vl_varSubscriptions);i:=i+1)
      {
        var integer vl_widgetIdx := f_EPTF_UIHandler_widgetRecIndex(vl_varSubscriptions[i].widgetId);
        if(-1 < vl_widgetIdx) {
          f_EPTF_UIHandler_updateguilist_enablewidget(vl_widgetIdx);
          if (v_UIHandler_guiConnected) {
            // f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_enableWidget(vl_varSubscriptions[i].widgetId));
            // check here
            if(f_EPTF_UIHandler_isWidgetEnabled(vl_widgetIdx) == true){
            f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_enableWidget(vl_varSubscriptions[i].widgetId));
            } else {
              f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_disableWidget(vl_varSubscriptions[i].widgetId));
            }
          }
        }
      }
    }
    else if(c_EPTF_Common_debugSwitch)
    {
      if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
        f_EPTF_UIHandler_debug(%definitionId&": no subscriptions can be found to the variable: " & f_EPTF_Var_getName(pl_varIdx));
      }
    }
  }
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_disableAllWidgetsOfVar
  //
  //  Purpose:
  //    Disables all widgets connected to the provided variable
  //
  //  Parameters:
  //    pl_varIdx - *in* *integer* - the ID of the variable
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_disableAllWidgetsOfVar(in integer pl_varIdx)
  runs on EPTF_UIHandler_Private_CT
  {
    if (not v_UIHandler_initialized){ return }
    var EPTF_UIHandler_OpenSubscriptions vl_varSubscriptions;
    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug(%definitionId&": "&f_EPTF_Var_getName(pl_varIdx));
    }

    if(f_EPTF_UIHandler_getSubscriptionsByVarIdx(pl_varIdx, vl_varSubscriptions))//there are some subscriptions to the variable
    {
      for(var integer i:=0; i<sizeof(vl_varSubscriptions);i:=i+1)
      {
        var integer vl_widgetIdx := f_EPTF_UIHandler_widgetRecIndex(vl_varSubscriptions[i].widgetId);
        if(-1 < vl_widgetIdx and f_EPTF_UIHandler_isWidgetEnabled(vl_widgetIdx)) {
          f_EPTF_UIHandler_updateguilist_disablewidget(vl_widgetIdx);
          if (v_UIHandler_guiConnected) {
            f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_disableWidget(vl_varSubscriptions[i].widgetId));
          }
        }
      }
    }
    else if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled())
    {
      f_EPTF_UIHandler_debug(%definitionId&": no subscriptions can be found to the variable: " & f_EPTF_Var_getName(pl_varIdx));
    }
  }

  group processIteratorDatas{

    private external function dec_Treecolgroups (in octetstring p_oct, out Treecolgroups.treecolgroup_list p_groups) return integer
    with {extension "prototype(backtrack) decode (XER:XER_EXTENDED) errorbehavior(ALL:WARNING)"}
    private external function enc_Treecolgroups (in Treecolgroups.treecolgroup_list p_groups) return octetstring
    with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}

    private function f_EPTF_UIHandler_Config_processTreecoliterator(
      in Treecolgroup pl_treecolgroup,
      in integer pl_parentIdx,
      in boolean pl_createMetaIterator := true,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT{
      var integer vl_iteratorVarIdx;
      var integer vl_nodePointer;
      var Treecoliterator vl_iterator;
      var boolean vl_isExternalValue;
      if(ischosen(pl_treecolgroup.iterator)) {
        vl_iterator := pl_treecolgroup.iterator;
        vl_isExternalValue := false;
      } else if(ischosen(pl_treecolgroup.externalvalue)) {
        vl_iterator := pl_treecolgroup.externalvalue;
        vl_isExternalValue := true;
      } else {
        //from postproc
        var Treecolgroups.treecolgroup_list vl_treecolgroup_list;
        vl_treecolgroup_list[0] := pl_treecolgroup;
        f_EPTF_UIHandler_appendAllWidgetIdsFromTreecols(vl_treecolgroup_list, pl_parentIdx, pl_widgetExists);
        return;
      }

      //creating iterator element in widget database for meta data
      var integer vl_parentIdx;
      if(pl_createMetaIterator == true) {
        //insert the iterator with its meta information to database:
        f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_iterator.metadata));
        vl_parentIdx := f_EPTF_UIHandler_appendMetaIterator(pl_parentIdx, pl_widgetExists, treecoliterator, vl_iteratorVarIdx, vl_nodePointer, vl_isExternalValue);
      } else {
        vl_parentIdx := pl_parentIdx;
      }

      f_EPTF_UIHandler_appendAllWidgetIdsFromTreecols(vl_iterator.treecolgroups.treecolgroup_list, vl_parentIdx, pl_widgetExists)

    }

    private external function dec_Treeitemgroups (in octetstring p_oct, out Treeitemgroups.treeitemgroup_list p_groups) return integer
    with {extension "prototype(backtrack) decode (XER:XER_EXTENDED) errorbehavior(ALL:WARNING)"}
    private external function enc_Treeitemgroups (in Treeitemgroups.treeitemgroup_list p_groups) return octetstring
    with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}

    private function f_EPTF_UIHandler_Config_processTreeItemiterator(
      in Treeitemgroup pl_treeitemgroup,
      in integer pl_parentIdx,
      in boolean pl_createMetaIterator := true,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT{
      var integer vl_iteratorVarIdx;
      var integer vl_nodePointer;
      var Treeitemiterator vl_iterator;
      var boolean vl_isExternalValue;
      if(ischosen(pl_treeitemgroup.iterator)) {
        vl_iterator := pl_treeitemgroup.iterator;
        vl_isExternalValue := false;
      } else if(ischosen(pl_treeitemgroup.externalvalue)) {
        vl_iterator := pl_treeitemgroup.externalvalue;
        vl_isExternalValue := true;
      } else {
        //from postproc
        var Treeitemgroups.treeitemgroup_list vl_treeitemgroup_list;
        vl_treeitemgroup_list[0] := pl_treeitemgroup;
        f_EPTF_UIHandler_appendAllWidgetIdsFromTreeItemGroups(vl_treeitemgroup_list, pl_parentIdx, pl_widgetExists);
        return;
      }

      //creating iterator element in widget database for meta data
      var integer vl_parentIdx;
      if(pl_createMetaIterator == true) {
        //insert the iterator with its meta information to database:
        f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_iterator.metadata));
        vl_parentIdx := f_EPTF_UIHandler_appendMetaIterator(pl_parentIdx, pl_widgetExists, treeitemiterator, vl_iteratorVarIdx, vl_nodePointer, vl_isExternalValue);
      } else {
        vl_parentIdx := pl_parentIdx;
      }

      f_EPTF_UIHandler_appendAllWidgetIdsFromTreeItemGroups(vl_iterator.treeitemgroups.treeitemgroup_list, vl_parentIdx, pl_widgetExists)


    }

    private external function dec_Treerowgroups (in octetstring p_oct, out Treerowgroups.treerowgroup_list p_groups) return integer
    with {extension "prototype(backtrack) decode (XER:XER_EXTENDED) errorbehavior(ALL:WARNING)"}
    private external function enc_Treerowgroups (in Treerowgroups.treerowgroup_list p_groups) return octetstring
    with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}


    private function f_EPTF_UIHandler_Config_processTreerowiterator(
      in Treerowgroup pl_treerowgroup,
      in integer pl_parentIdx,
      in boolean pl_createMetaIterator := true,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT{
      var integer vl_iteratorVarIdx;
      var integer vl_nodePointer;
      var Treerowiterator vl_iterator;
      var boolean vl_isExternalValue;

      if(ischosen(pl_treerowgroup.iterator)) {
        vl_iterator := pl_treerowgroup.iterator;
        vl_isExternalValue := false;
      } else if(ischosen(pl_treerowgroup.externalvalue)) {
        vl_iterator := pl_treerowgroup.externalvalue;
        vl_isExternalValue := true;
      } else {
        //from postproc
        var Treerowgroups.treerowgroup_list vl_treerowgroup_list;
        vl_treerowgroup_list[0] := pl_treerowgroup;
        f_EPTF_UIHandler_appendAllWidgetIdsFromTreeRowGroups(vl_treerowgroup_list, pl_parentIdx, pl_widgetExists);
        return;
      }

      //creating iterator element in widget database for meta data
      var integer vl_parentIdx;
      if(pl_createMetaIterator == true) {
        //insert the iterator with its meta information to database:
        f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_iterator.metadata));
        vl_parentIdx := f_EPTF_UIHandler_appendMetaIterator(pl_parentIdx, pl_widgetExists, treerowiterator, vl_iteratorVarIdx, vl_nodePointer, vl_isExternalValue);
      } else {
        vl_parentIdx := pl_parentIdx;
      }
      f_EPTF_UIHandler_appendAllWidgetIdsFromTreeRowGroups(vl_iterator.treerowgroups.treerowgroup_list, vl_parentIdx, pl_widgetExists)
    }

    private external function dec_Treecellgroups (in octetstring p_oct, out Treecellgroups.treecellgroup_list p_groups) return integer
    with {extension "prototype(backtrack) decode (XER:XER_EXTENDED) errorbehavior(ALL:WARNING)"}
    private external function enc_Treecellgroups (in Treecellgroups.treecellgroup_list p_groups) return octetstring
    with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}

    private function f_EPTF_UIHandler_Config_processTreecelliterator(
      inout Treecellgroup pl_treecellgroup,
      in integer pl_parentIdx,
      in boolean pl_createMetaIterator := true,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT{
      var integer vl_iteratorVarIdx;
      var integer vl_nodePointer;
      var Treecelliterator vl_iterator;
      var boolean vl_isExternalValue;
      if(ischosen(pl_treecellgroup.iterator)) {
        vl_iterator := pl_treecellgroup.iterator;
        vl_isExternalValue := false;
      } else if(ischosen(pl_treecellgroup.externalvalue)) {
        vl_iterator := pl_treecellgroup.externalvalue;
        vl_isExternalValue := true;
      } else {
        //from postproc
        var Treecellgroups.treecellgroup_list vl_treecellgroup_list;
        vl_treecellgroup_list[0] := pl_treecellgroup;
        f_EPTF_UIHandler_appendAllWidgetIdsFromTreeCellGroups(vl_treecellgroup_list, pl_parentIdx, pl_widgetExists, false);
        return;
      }

      //creating iterator element in widget database for meta data
      var integer vl_parentIdx;
      if(pl_createMetaIterator == true) {
        //insert the iterator with its meta information to database:
        f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_iterator.metadata));
        vl_parentIdx := f_EPTF_UIHandler_appendMetaIterator(pl_parentIdx, pl_widgetExists, treecelliterator, vl_iteratorVarIdx, vl_nodePointer, vl_isExternalValue);
      } else {
        vl_parentIdx := pl_parentIdx;
      }

      f_EPTF_UIHandler_appendAllWidgetIdsFromTreeCellGroups(vl_iterator.treecellgroups.treecellgroup_list, vl_parentIdx, pl_widgetExists, false)
    }

    private external function dec_Tabpagegroups (in octetstring p_oct, out Tabpagegroups.tabpagegroup_list p_groups) return integer
    with {extension "prototype(backtrack) decode (XER:XER_EXTENDED) errorbehavior(ALL:WARNING)"}
    private external function enc_Tabpagegroups (in Tabpagegroups.tabpagegroup_list p_groups) return octetstring
    with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}

    private function f_EPTF_UIHandler_Config_processTabpageiterator(
      in Tabpagegroup pl_tabpagegroup,
      in integer pl_parentIdx,
      in boolean pl_createMetaIterator := true,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT{
      var integer vl_iteratorVarIdx;
      var integer vl_nodePointer;
      var Tabpageiterator vl_iterator;
      var boolean vl_isExternalValue;
      if(ischosen(pl_tabpagegroup.iterator)) {
        vl_iterator := pl_tabpagegroup.iterator;
        vl_isExternalValue := false;
      } else if(ischosen(pl_tabpagegroup.externalvalue)) {
        vl_iterator := pl_tabpagegroup.externalvalue;
        vl_isExternalValue := true;
      } else {
        //from postproc
        var Tabpagegroups.tabpagegroup_list vl_tabpagegroup_list;
        vl_tabpagegroup_list[0] := pl_tabpagegroup;
        f_EPTF_UIHandler_appendAllWidgetIdsFromTabpagegroup_list(vl_tabpagegroup_list, pl_parentIdx, pl_widgetExists);
        return;
      }

      //creating iterator element in widget database for meta data
      var integer vl_parentIdx;

      if(pl_createMetaIterator == true) {
        //insert the iterator with its meta information to database:
        f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_iterator.metadata));
        vl_parentIdx := f_EPTF_UIHandler_appendMetaIterator(pl_parentIdx, pl_widgetExists, tabpageiterator, vl_iteratorVarIdx, vl_nodePointer, vl_isExternalValue);
      } else {
        vl_parentIdx := pl_parentIdx;
      }

      f_EPTF_UIHandler_appendAllWidgetIdsFromTabpagegroup_list(vl_iterator.tabpagegroups.tabpagegroup_list, vl_parentIdx, pl_widgetExists);
      return;

    }




    private external function dec_Externaldatagroups (in octetstring p_oct, out Externaldatagroups.externaldatagroup_list p_groups) return integer
    with {extension "prototype(backtrack) decode (XER:XER_EXTENDED) errorbehavior(ALL:WARNING)"}
    private external function enc_Externaldatagroups (in Externaldatagroups.externaldatagroup_list p_groups) return octetstring
    with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}

    private function f_EPTF_UIHandler_Config_processValueListiterator(
      in Externaldatagroup pl_externaldatagroup,
      inout Distributionchart pl_xul,
      in integer pl_parentIdx,
      in boolean pl_createMetaIterator := true,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT{
      var integer vl_iteratorVarIdx;
      var integer vl_nodePointer;
      var Externaldataiterator vl_iterator;
      var boolean vl_isExternalValue;
      if(ischosen(pl_externaldatagroup.iterator)) {
        vl_iterator := pl_externaldatagroup.iterator;
        vl_isExternalValue := false;
      } else if(ischosen(pl_externaldatagroup.externalvalue)) {
        vl_iterator := pl_externaldatagroup.externalvalue;
        vl_isExternalValue := true;
      } else {
        //from postproc
        var Externaldatagroups.externaldatagroup_list vl_externaldatagroup_list;
        vl_externaldatagroup_list[0] := pl_externaldatagroup;
        f_EPTF_UIHandler_appendAllWidgetIdsFromExternaldatagroup_list(vl_externaldatagroup_list, pl_parentIdx, pl_widgetExists, pl_xul);
        return;
      }

      //creating iterator element in widget database for meta data
      var integer vl_parentIdx;

      if(pl_createMetaIterator == true) {
        //insert the iterator with its meta information to database:
        f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_iterator.metadata));
        vl_parentIdx := f_EPTF_UIHandler_appendMetaIterator(pl_parentIdx, pl_widgetExists, valuelistiterator, vl_iteratorVarIdx, vl_nodePointer, vl_isExternalValue);
      } else {
        vl_parentIdx := pl_parentIdx;
      }
      f_EPTF_UIHandler_appendAllWidgetIdsFromExternaldatagroup_list(vl_iterator.externaldatagroups.externaldatagroup_list, vl_parentIdx, pl_widgetExists, pl_xul)

    }

    private external function dec_Listitemgroups (in octetstring p_oct, out Listitemgroups.listitemgroup_list p_groups) return integer
    with {extension "prototype(backtrack) decode (XER:XER_EXTENDED) errorbehavior(ALL:WARNING)"}
    private external function enc_Listitemgroups (in Listitemgroups.listitemgroup_list p_groups) return octetstring
    with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}

    private function f_EPTF_UIHandler_Config_processListitemiterator(
      in Listitemgroup pl_listitemgroup,
      in integer pl_parentIdx,
      in boolean pl_createMetaIterator := true,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT{
      var integer vl_iteratorVarIdx;
      var integer vl_nodePointer;
      var Listitemiterator vl_iterator;
      var boolean vl_isExternalValue;
      if(ischosen(pl_listitemgroup.iterator)) {
        vl_iterator := pl_listitemgroup.iterator;
        vl_isExternalValue := false;
      } else if(ischosen(pl_listitemgroup.externalvalue)) {
        vl_iterator := pl_listitemgroup.externalvalue;
        vl_isExternalValue := true;
      } else {
        //from postproc
        var Listitemgroups.listitemgroup_list vl_listitemgroup_list;
        vl_listitemgroup_list[0] := pl_listitemgroup;
        f_EPTF_UIHandler_Config_processListitemgroups(vl_listitemgroup_list, pl_parentIdx, pl_widgetExists);
        return;
      }

      //creating iterator element in widget database for meta data
      var integer vl_parentIdx;
      if(pl_createMetaIterator == true) {
        //insert the iterator with its meta information to database:
        f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_iterator.metadata));
        vl_parentIdx := f_EPTF_UIHandler_appendMetaIterator(pl_parentIdx, pl_widgetExists, listitemiterator, vl_iteratorVarIdx, vl_nodePointer, vl_isExternalValue);
      } else {
        vl_parentIdx := pl_parentIdx;
      }

      f_EPTF_UIHandler_Config_processListitemgroups(vl_iterator.listitemgroups.listitemgroup_list, vl_parentIdx, pl_widgetExists)
    }

    private external function dec_Menuitemgroups (in octetstring p_oct, out Menuitemgroups.menuitemgroup_list p_groups) return integer
    with {extension "prototype(backtrack) decode (XER:XER_EXTENDED) errorbehavior(ALL:WARNING)"}
    private external function enc_Menuitemgroups (in Menuitemgroups.menuitemgroup_list p_groups) return octetstring
    with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}

    private function f_EPTF_UIHandler_Config_processMenuitemiterator(
      in Menuitemgroup pl_menuitemgroup,
      in integer pl_parentIdx,
      in boolean pl_createMetaIterator := true,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT{
      var integer vl_iteratorVarIdx;
      var integer vl_nodePointer;
      var Menuitemiterator vl_iterator;
      var boolean vl_isExternalValue;
      if(ischosen(pl_menuitemgroup.iterator)) {
        vl_iterator := pl_menuitemgroup.iterator;
        vl_isExternalValue := false;
      } else if(ischosen(pl_menuitemgroup.externalvalue)) {
        vl_iterator := pl_menuitemgroup.externalvalue;
        vl_isExternalValue := true;
      } else {
        //from postproc
        var Menuitemgroups.menuitemgroup_list vl_menuitemgroup_list;
        vl_menuitemgroup_list[0] := pl_menuitemgroup;
        f_EPTF_UIHandler_appendMenuitemGroups(vl_menuitemgroup_list, pl_parentIdx, pl_widgetExists);
        return;
      }

      //creating iterator element in widget database for meta data
      var integer vl_parentIdx;
      if(pl_createMetaIterator == true) {
        //insert the iterator with its meta information to database:
        f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_iterator.metadata));
        vl_parentIdx := f_EPTF_UIHandler_appendMetaIterator(pl_parentIdx, pl_widgetExists, menuitemiterator, vl_iteratorVarIdx, vl_nodePointer, vl_isExternalValue);
      } else {
        vl_parentIdx := pl_parentIdx;
      }


      f_EPTF_UIHandler_appendMenuitemGroups(vl_iterator.menuitemgroups.menuitemgroup_list, vl_parentIdx, pl_widgetExists)
    }

    private external function dec_Tracegroups (in octetstring p_oct, out Tracegroups.tracegroup_list p_groups) return integer
    with {extension "prototype(backtrack) decode (XER:XER_EXTENDED) errorbehavior(ALL:WARNING)"}
    private external function enc_Tracegroups (in Tracegroups.tracegroup_list p_groups) return octetstring
    with {extension "prototype(convert) encode (XER:XER_EXTENDED)"}

    private function f_EPTF_UIHandler_Config_processTraceiterator(
      in Tracegroup pl_tracegroup,
      in integer pl_parentIdx,
      in boolean pl_createMetaIterator := true,
      inout boolean pl_widgetExists)
    runs on EPTF_UIHandler_Private_CT{
      var integer vl_iteratorVarIdx;
      var integer vl_nodePointer;
      var Traceiterator vl_iterator;
      var boolean vl_isExternalValue;
      if(ischosen(pl_tracegroup.iterator)) {
        vl_iterator := pl_tracegroup.iterator;
        vl_isExternalValue := false;
      } else if(ischosen(pl_tracegroup.externalvalue)) {
        vl_iterator := pl_tracegroup.externalvalue;
        vl_isExternalValue := true;
      } else {
        //from postproc
        var Tracegroups.tracegroup_list vl_tracegroup_list;
        vl_tracegroup_list[0] := pl_tracegroup;
        f_EPTF_UIHandler_Config_processTracegroups(vl_tracegroup_list, pl_parentIdx, pl_widgetExists);
        return;
      }

      //creating iterator element in widget database for meta data
      var integer vl_parentIdx;
      if(pl_createMetaIterator == true) {
        //insert the iterator with its meta information to database:
        f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_iterator.metadata));
        vl_parentIdx := f_EPTF_UIHandler_appendMetaIterator(pl_parentIdx, pl_widgetExists, traceiterator, vl_iteratorVarIdx, vl_nodePointer, vl_isExternalValue);
      } else {
        vl_parentIdx := pl_parentIdx;
      }

      f_EPTF_UIHandler_Config_processTracegroups(vl_iterator.tracegroups.tracegroup_list, vl_parentIdx, pl_widgetExists)
    }

  }//group

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_Config_registerVarToWidget
  //
  //  Purpose:
  //    Stores a widget-variable connection to a database
  //
  //  Parameters:
  //    pl_widgetId - *in* *charstring* - the widget id
  //    pl_varIdx - *inout* *integer* - the var index to connect to
  //    pl_provider - *inout* *EPTF_Var_CT* - the provider component
  //    pl_providedParamName - *inout* *charstring* - the provided param name
  //    pl_currentValue - *in* <EPTF_Var_DirectContent> - the current value of the var pl_varIdx
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_Config_registerVarToWidget(in charstring pl_widgetId,
    in integer pl_varIdx,
    in EPTF_Var_CT pl_provider,
    in charstring pl_providedParamName,
    in EPTF_Var_DirectContent pl_currentValue
  )
  runs on EPTF_UIHandler_Private_CT {

    if(f_EPTF_UIHandler_checkSubscriptCompatibility(pl_widgetId, pl_varIdx, pl_currentValue) == true) {
      var integer vl_size := sizeof(v_EPTF_UIHandler_Config_ConnectVarToWidgets);
      v_EPTF_UIHandler_Config_ConnectVarToWidgets[vl_size] := c_EPTF_UIHandler_Config_ConnectVarToWidget_init;
      v_EPTF_UIHandler_Config_ConnectVarToWidgets[vl_size].widgetId := pl_widgetId;
      v_EPTF_UIHandler_Config_ConnectVarToWidgets[vl_size].varIdx := pl_varIdx;
      v_EPTF_UIHandler_Config_ConnectVarToWidgets[vl_size].provider := pl_provider;
      v_EPTF_UIHandler_Config_ConnectVarToWidgets[vl_size].providedParamName := pl_providedParamName;
      v_EPTF_UIHandler_Config_ConnectVarToWidgets[vl_size].initialValue := pl_currentValue;
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_Config_connectAllVarsToWidget
  //
  //  Purpose:
  //    Connects all a widget-variable connections stored in the database
  //
  //  Parameters:
  //    -
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_Config_connectAllVarsToWidget()
  runs on EPTF_UIHandler_Private_CT return boolean {
    var boolean vl_ret := true;

    for(var integer i:=0; i<sizeof(v_EPTF_UIHandler_Config_ConnectVarToWidgets); i:=i+1) {
      vl_ret := vl_ret and f_EPTF_UIHandler_Config_connectToWidget(
        v_EPTF_UIHandler_Config_ConnectVarToWidgets[i].widgetId,
        v_EPTF_UIHandler_Config_ConnectVarToWidgets[i].varIdx,
        v_EPTF_UIHandler_Config_ConnectVarToWidgets[i].provider,
        v_EPTF_UIHandler_Config_ConnectVarToWidgets[i].providedParamName,
        v_EPTF_UIHandler_Config_ConnectVarToWidgets[i].initialValue
      );
      f_EPTF_Var_addPostProcFn(v_EPTF_UIHandler_Config_ConnectVarToWidgets[i].varIdx, {refers(f_EPTF_UIHandler_refreshVar),{}});
      f_EPTF_Var_addSubsCanAdjustNotifyFn(v_EPTF_UIHandler_Config_ConnectVarToWidgets[i].varIdx, {refers(f_EPTF_UIHandler_updateDisableStateByVarIdx),{}});
      f_EPTF_UIHandler_updateDisableStateByVarIdx(v_EPTF_UIHandler_Config_ConnectVarToWidgets[i].varIdx, {});
    }

    v_EPTF_UIHandler_Config_ConnectVarToWidgets := {};
    return vl_ret;
  }



  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_Config_connectToWidget
  //
  //  Purpose:
  //    Connects a widget id to a variable
  //
  //  Parameters:
  //    pl_widgetId - *in* *charstring* - the widget id
  //    pl_varIdx - *inout* *integer* - the var index to connect to
  //    pl_provider - *inout* *EPTF_Var_CT* - the provider component
  //    pl_providedParamName - *inout* *charstring* - the provided param name
  
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_Config_connectToWidget(in charstring pl_widgetId,
    in integer pl_varIdx,
    in EPTF_Var_CT pl_provider,
    in charstring pl_providedParamName,
    in EPTF_Var_DirectContent pl_initialValue := {unknownVal := {omit}} )
  runs on EPTF_UIHandler_Private_CT
  return boolean{

    if(f_EPTF_UIHandler_checkSubscriptCompatibility(pl_widgetId, pl_varIdx, pl_initialValue) != true) {
      return false;
    }
    // copied and simplified from f_EPTF_UIHandler_handleSubscriptNote, which handles subscribeMe requests
    // Does not handle remote subscription!!!!
    var EPTF_UIHandler_OpenSubscription vl_subs := c_UIHandler_defOpenSubscription;
    //log("DEBUG: ","------- connect to a widget -------",pl_msg.widgetId);
    //Check if the widget is already connected
    var integer vl_subsIdx := f_EPTF_UIHandler_getSubscriptionIdxByWidgetId(pl_widgetId);
    if(-1 != vl_subsIdx){
      if(v_UIHandler_openSubscriptions[vl_subsIdx].varIdx == pl_varIdx){
        f_EPTF_UIHandler_warning("The widget's already connected to the same variable!");
        return true;
      }
      f_EPTF_UIHandler_warning("The widget is already connected!");
      return false;
    }
    if( not f_EPTF_UIHandler_widgetTypeFromId(pl_widgetId, vl_subs)
      /*-1 == f_EPTF_UIHandler_widgetRecIndex(pl_msg.widgetId)*/
    ){
      f_EPTF_UIHandler_warning("The widget "&pl_widgetId&" affected in the subscription note does not exist.");
      return false;
    }

	var EPTF_UIHandler_GuiItemRec vl_wRec;
	f_EPTF_UIHandler_getWidgetRec(pl_widgetId, vl_wRec);
	if(vl_wRec.widgetType == wtTrace){
	  f_EPTF_UIHandler_createTraceHistory(vl_wRec.XULformat.trace.maxPoints, vl_wRec.id, pl_varIdx);
	}

    vl_subs.widgetId := pl_widgetId;
    vl_subs.provider := pl_provider;
    vl_subs.varIdx := pl_varIdx;
    vl_subs.providedParamName:=pl_providedParamName;
    f_EPTF_UIHandler_newSubscription(vl_subs);
    f_EPTF_UIHandler_refreshWidget(vl_subs, true,pl_initialValue);
    return true;
  }

  private function f_EPTF_UIHandler_Config_appendListitemFromList(
    inout EPTF_UIHandler_WidgetsList pl_widgets,
    in integer pl_parentIdx,
    inout boolean pl_widgetExists)
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    pl_widgetExists := false;
    var boolean vl_bool := false;
    for(var integer i := 0; i<sizeof(pl_widgets); i:= i + 1){
      var Listitem vl_xul := pl_widgets[i].listitem;
      vl_xul.id := f_EPTF_UIHandler_setWidgetID(vl_xul.id);
      vl_bool := vl_bool and -1 != f_EPTF_UIHandler_addWidgetRec({
          f_EPTF_UIHandler_unichar2charstring(vl_xul.id),
          wtListitem,
          omit,
          pl_parentIdx,
          {},
          omit,
          {listitem := f_EPTF_UIHandler_deleteChildrenFromListitem(vl_xul)}, false}, pl_widgetExists);
    }
    return vl_bool;
  }

}
group obsoleteXTDPAspFunctions{


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_XSD_addElementToGui
  //
  //  Purpose:
  //    if the element to add to the Runtime Gui proves to be valid (will not destroy consistency),
  //    function sends out singleAddElementToGUI XTDP addRequest to the Gui and also adds this new
  //    element to GUI item list. With call of f_EPTF_UIHandler_expandXML for XML handling.
  //
  //  Return Value:
  //    boolean
  //
  //  Detailed Comments:
  //    It returns true if new element proved to be valid, XTDP addRequest is sent.
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_XSD_addElementToGui(
    in Widgets pl_widgets,
    in EPTF_UIHandler_WidgetIdString pl_parentWidgetID := "",
    inout boolean pl_widgetExists,
    in boolean pl_updatedb := true)
  runs on EPTF_UIHandler_Private_CT
  return boolean {
    if (not v_UIHandler_initialized){ return false }
    var charstring vl_expandedXML;
    var charstring vl_xul := f_EPTF_UIHandler_XSD_encodeXUL(pl_widgets);
    var boolean vl_ret := true;
    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug(%definitionId&": Started on: " & log2str(vl_xul));
    }
    vl_ret := f_EPTF_UIHandler_expandXML(vl_expandedXML, vl_xul, pl_parentWidgetID);
    if(vl_ret == true) {
      if(vl_expandedXML != "") {
        // Convert into widgets, becouse iterators - optimal if check the metadata= exitence and if no pl_widgets
        var integer vl_separatorPos := f_strstr(vl_expandedXML,"metadata=");
        if (vl_separatorPos<0) {
          vl_ret := f_EPTF_UIHandler_XSD_addElementToGui_private(pl_widgets, pl_parentWidgetID, pl_widgetExists, pl_updatedb);
        } else {
          var Widgets vl_expandedXul := f_EPTF_UIHandler_XSD_decodeXUL(vl_expandedXML);
          vl_ret := f_EPTF_UIHandler_XSD_addElementToGui_private(vl_expandedXul, pl_parentWidgetID, pl_widgetExists, pl_updatedb);
        }
      } else {
        f_EPTF_UIHandler_warning("Invalid parent ID: "& pl_parentWidgetID);
        vl_ret := false;
      }
    } else {
      // XML Load error
      f_EPTF_UIHandler_error(%definitionId&": The received XML is invalid, it can not be decoded fully.\n"&
        "For further detailes see the log file above.");
    }
    return vl_ret;
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_XSD_addElementToGui_private
  //
  //  Purpose:
  //    if the element to add to the Runtime Gui proves to be valid (will not destroy consistency),
  //    function sends out singleAddElementToGUI XTDP addRequest to the Gui and also adds this new
  //    element to GUI item list.
  //
  //  Return Value:
  //    boolean
  //
  //  Detailed Comments:
  //    It returns true if new element proved to be valid, XTDP addRequest is sent.
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_XSD_addElementToGui_private(
    in Widgets pl_widgets,
    in EPTF_UIHandler_WidgetIdString pl_parentWidgetID := "",
    inout boolean pl_widgetExists,
    in boolean pl_updatedb := true)
  runs on EPTF_UIHandler_Private_CT
  return boolean{
    if(ischosen(pl_widgets.metaiterator)) {
      //no need to add metaiterator
      return true;
    }
    f_EPTF_UIHandler_waitForLayoutReady();
    pl_widgetExists := false;
    //If there is no parent ID, the main window will be the first element.
    var integer vl_parentIdx := v_UIHandler_windowIndex;
    if (pl_parentWidgetID != "") {
      vl_parentIdx := f_EPTF_UIHandler_widgetRecIndex(pl_parentWidgetID);
      if(-1 == vl_parentIdx){
        f_EPTF_UIHandler_warning("Invalid parent ID: "& pl_parentWidgetID);
        return false;
      }
      if(v_UIHandler_guiItemList[vl_parentIdx].widgetType == wtMetaIterator) {
        vl_parentIdx := f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(vl_parentIdx);
      }
    }
    if(not ischosen(pl_widgets.window)){
      if(-1 == vl_parentIdx){
        f_EPTF_UIHandler_warning("Adding widget to the window, but there is no window yet!");
        return false;
      }
      if (pl_updatedb){
        f_EPTF_UIHandler_addWidgetWithParent(pl_parentWidgetID,  f_EPTF_UIHandler_XSD_encodeXUL(pl_widgets));
        if (f_EPTF_UIHandler_appendAllWidgetIdsFromXul(pl_widgets, vl_parentIdx, pl_widgetExists)) {
          //send element to the GUI
          if (pl_parentWidgetID=="") {
            pl_parentWidgetID := v_UIHandler_guiItemList[v_UIHandler_windowIndex].id;
          }
          if(ischosen(pl_widgets.tabpage) and v_UIHandler_guiItemList[vl_parentIdx].widgetType == wtTabpage) {
            pl_parentWidgetID := v_UIHandler_guiItemList[v_UIHandler_guiItemList[vl_parentIdx].parentIdx].id;
          }
          if(not pl_widgetExists) {
            if(tsp_EPTF_UIHandler_enableBrowserGUI == true){
              var charstring vl_widgetId := "";
              f_EPTF_UIHandler_getWidgetID(pl_widgets, vl_widgetId);
              if(vl_widgetId == ""){
                f_EPTF_UIHandler_Browser_reportGUIChanged(pl_parentWidgetID);
              } else {
                f_EPTF_UIHandler_Browser_reportGUIChanged(vl_widgetId);
              }
            }
            f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleAddElementToGUI(pl_parentWidgetID, pl_widgets));
          } else {
          }
          return true;
        }
      } else {
        if (pl_parentWidgetID=="") {pl_parentWidgetID := v_UIHandler_guiItemList[v_UIHandler_windowIndex].id;}
        if(tsp_EPTF_UIHandler_enableBrowserGUI == true){
              var charstring vl_widgetId := "";
              f_EPTF_UIHandler_getWidgetID(pl_widgets, vl_widgetId);
              if(vl_widgetId == ""){
                f_EPTF_UIHandler_Browser_reportGUIChanged(pl_parentWidgetID);
              } else {
                f_EPTF_UIHandler_Browser_reportGUIChanged(vl_widgetId);
              }
        }
        f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleAddElementToGUI(pl_parentWidgetID, pl_widgets));
        return true;
      }
    } else {
      //This is a window
      if(-1 != v_UIHandler_windowIndex){
        if(v_UIHandler_guiItemList[v_UIHandler_windowIndex].id != pl_widgets.window.id){
          f_EPTF_UIHandler_warning("There is another window already!");
          return false;
        }
      }
      if (pl_updatedb){
        if(f_EPTF_UIHandler_appendAllWidgetIdsFromXul(pl_widgets, vl_parentIdx, pl_widgetExists)){
          if(not pl_widgetExists) {
            if(tsp_EPTF_UIHandler_enableBrowserGUI == true){
              var charstring vl_widgetId := "";
              f_EPTF_UIHandler_getWidgetID(pl_widgets, vl_widgetId);
              if(vl_widgetId == ""){
                f_EPTF_UIHandler_Browser_reportGUIChanged(pl_parentWidgetID);
              } else {
                f_EPTF_UIHandler_Browser_reportGUIChanged(vl_widgetId);
              }
            }
            f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleAddElementToGUI(omit, pl_widgets));
          }
        }
        return true;
      } else {
        if(tsp_EPTF_UIHandler_enableBrowserGUI == true){
              var charstring vl_widgetId := "";
              f_EPTF_UIHandler_getWidgetID(pl_widgets, vl_widgetId);
              if(vl_widgetId == ""){
                f_EPTF_UIHandler_Browser_reportGUIChanged(pl_parentWidgetID);
              } else {
                f_EPTF_UIHandler_Browser_reportGUIChanged(vl_widgetId);
              }
        }
        f_EPTF_UIHandler_send_XTDP(ts_ASP_XTDP_singleAddElementToGUI(omit, pl_widgets));
        return true;
      }
    }
    if(c_EPTF_Common_debugSwitch and f_EPTF_UIHandler_debugEnabled()){
      f_EPTF_UIHandler_debug(%definitionId&" failed");
    }
    return false;
  }
}

group RingBufferFunctions
{
	private function f_EPTF_UIHandler_createTraceHistory(in integer pl_maxPoints, in charstring pl_traceId, in integer pl_varId)runs on EPTF_UIHandler_Private_CT
	{
	  f_EPTF_UIHandler_ChartDataType_RB_init(v_EPTF_UIHandler_TraceRingBuffers[sizeof(v_EPTF_UIHandler_TraceRingBuffers)], pl_maxPoints);
	  var integer vl_i, vl_ringBufferIdx:=sizeof(v_EPTF_UIHandler_TraceRingBuffers)-1;
      f_EPTF_str2int_HashMap_Insert (v_EPTF_UIHandler_Traces_HashmapId, pl_traceId, vl_ringBufferIdx);
      var float vl_startTime := f_EPTF_Base_getAbsTimeInSecs();
      for(vl_i := 0; vl_i < pl_maxPoints; vl_i := vl_i+1){
        f_EPTF_UIHandler_ChartDataType_RB_push_front(v_EPTF_UIHandler_TraceRingBuffers[vl_ringBufferIdx], {0.0, vl_startTime});
      }
      var integer vl_traceIdx := f_EPTF_UIHandler_widgetRecIndex(pl_traceId);
      var integer vl_chartIdx := v_UIHandler_guiItemList[vl_traceIdx].parentIdx;
      f_EPTF_UIHandler_traceHistoryCallBack(pl_varId,{vl_ringBufferIdx, vl_chartIdx});
      f_EPTF_Var_addPostProcFn(pl_varId, {refers(f_EPTF_UIHandler_traceHistoryCallBack), {vl_ringBufferIdx, vl_chartIdx}});
	}

	private function f_EPTF_UIHandler_traceHistoryCallBack(in integer pl_idx, in EPTF_IntegerList pl_argList) runs on EPTF_UIHandler_Private_CT{
          if(not v_UIHandler_initialized) {
            return; // after UIHandler cleanup
          }
	  var float vl_timestamp := f_EPTF_Base_getAbsTimeInSecs();
	  var EPTF_Var_DirectContent vl_value;
	  f_EPTF_Var_getContent(pl_idx, vl_value);
	  var integer vl_ringBufferIdx := pl_argList[0];
	  var integer vl_chartIdx := pl_argList[1];
	  for( var integer i := 0; i < sizeof(v_UIHandler_guiItemList[vl_chartIdx].children); i := i + 1) {
	    var charstring vl_traceId := v_UIHandler_guiItemList[v_UIHandler_guiItemList[vl_chartIdx].children[i]].id;
	    var integer vl_currentRingBufferIdx;
	    if(not f_EPTF_str2int_HashMap_Find(v_EPTF_UIHandler_Traces_HashmapId, vl_traceId, vl_currentRingBufferIdx)) {
	      // error
	    } else {
	      var EPTF_Var_DirectContent vl_currentvalue := vl_value;
	      if(vl_currentRingBufferIdx != vl_ringBufferIdx) {
	        f_EPTF_UIHandler_getLatestValueOfTrace(vl_traceId, vl_currentvalue);
	        var charstring vl_currentstrValue := regexp(vl_currentvalue.charstringVal,c_EPTF_CLI_everything&":"&c_EPTF_CLI_floatNumber,1);
	        if(vl_currentstrValue != "") {
	          vl_currentvalue := { floatVal := str2float(vl_currentstrValue)}
	        }
 	      }
	      if(ischosen(vl_currentvalue.floatVal)){
            f_EPTF_UIHandler_ChartDataType_RB_push_front(v_EPTF_UIHandler_TraceRingBuffers[vl_currentRingBufferIdx], {vl_currentvalue.floatVal, vl_timestamp});
          }
          else if(ischosen(vl_currentvalue.intVal)){
            f_EPTF_UIHandler_ChartDataType_RB_push_front(v_EPTF_UIHandler_TraceRingBuffers[vl_currentRingBufferIdx], {int2float(vl_currentvalue.intVal), vl_timestamp});
          }
	    }
	  }


	}

	friend function f_EPTF_UIHandler_getHistoryOfTrace(in charstring pl_traceId, out EPTF_Var_DirectContent pl_content)runs on EPTF_UIHandler_Private_CT{
	  pl_content.charstringVal := "";
	  var integer vl_i, vl_ringBufferIdx := -1;
	  var UIHandler_ChartDataType vl_data;
	  f_EPTF_str2int_HashMap_Find(v_EPTF_UIHandler_Traces_HashmapId, pl_traceId, vl_ringBufferIdx);
	  for(vl_i := f_EPTF_UIHandler_ChartDataType_RB_capacity(v_EPTF_UIHandler_TraceRingBuffers[vl_ringBufferIdx])-1; vl_i>-1; vl_i := vl_i -1)
	  {
	    vl_data := f_EPTF_UIHandler_ChartDataType_RB_get(v_EPTF_UIHandler_TraceRingBuffers[vl_ringBufferIdx], vl_i);
	    pl_content.charstringVal := pl_content.charstringVal & float2str(vl_data.timestamp) & ":" & float2str(vl_data.data) & "_";
	  }
	  pl_content.charstringVal := substr(pl_content.charstringVal, 0, lengthof(pl_content.charstringVal)-1);
	}
	friend function f_EPTF_UIHandler_getLatestValueOfTrace(in charstring pl_traceId, out EPTF_Var_DirectContent pl_content)runs on EPTF_UIHandler_Private_CT{
	  pl_content.charstringVal := "";
	  var integer vl_ringBufferIdx := -1;
	  var UIHandler_ChartDataType vl_data;
	  f_EPTF_str2int_HashMap_Find(v_EPTF_UIHandler_Traces_HashmapId, pl_traceId, vl_ringBufferIdx);
	  vl_data := f_EPTF_UIHandler_ChartDataType_RB_front(v_EPTF_UIHandler_TraceRingBuffers[vl_ringBufferIdx]);
	  pl_content.charstringVal := float2str(vl_data.timestamp) & ":" & float2str(vl_data.data);
	}
}

////////////Dynamic iterator handling

///////////////////////////////////////////////////////////
//  Function: f_EPTF_UIHandler_addWidgetWithParent
//
//  Purpose:
//    Adding new element to GUI description database
//
//  Parameters:
//    pl_parentWidgetId - *in* *charstring* - the pl_parentWidgetId, where the xml described GUI part belongs
//    pl_xml_widgets - *in* *charstring* - the GUI description XML
//
//  Return Value:
//    -
//
///////////////////////////////////////////////////////////
private function f_EPTF_UIHandler_addWidgetWithParent(in charstring pl_parentWidgetId, in charstring pl_xml_widgets)
  runs on EPTF_UIHandler_Private_CT {
    v_UIHandler_GUI_DescriptionDB_Idx := sizeof(v_UIHandler_GUI_DescriptionDB);
    v_UIHandler_GUI_DescriptionDB[v_UIHandler_GUI_DescriptionDB_Idx] := c_UIHandler_GUI_DescriptionDB_Item;
    v_UIHandler_GUI_DescriptionDB[v_UIHandler_GUI_DescriptionDB_Idx].parentWidgetId := pl_parentWidgetId;
    v_UIHandler_GUI_DescriptionDB[v_UIHandler_GUI_DescriptionDB_Idx].xml_widgets := pl_xml_widgets;

  }


//FIXME: update the itarator variable created from a non-CharstringList variable (e.g in function f_EPTF_UIHandler_Config_processIterator and f_EPTF_UIHandler_Config_getIteratorData)

// this postproc rebuilds the GUI XML based on the custom XML using the new values of the iterator
private function f_EPTF_UIHandler_updateIterator_PostProc(in integer pl_idx, in EPTF_IntegerList pl_argList) runs on EPTF_UIHandler_Private_CT {
  var integer vl_iteratorVarIdx := pl_idx;
  var integer vl_metaIteratorIdx := pl_argList[0];
  // check if metaIterator exists:
  if (
    vl_metaIteratorIdx<sizeof(v_UIHandler_guiItemList)
    and ispresent(v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData)
    and ispresent(v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer)
    and ischosen(v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData)
    and v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.iteratorVarIdx == vl_iteratorVarIdx
  ) {
    // metaIterator found
    var integer vl_nodePointer := v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer;

    // check if value was changed:
    var EPTF_CharstringList vl_currentValue := v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.currentValue;
    var EPTF_CharstringList vl_newValue := f_EPTF_Var_getCharstringlistValue(v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.iteratorVarIdx);
    if (vl_currentValue == vl_newValue) {
      // no change
      return;
    } else {
      v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.currentValue := vl_newValue;
    }

    // get XML descriptor from custom XML:
    var integer vl_UIHandler_GUI_DescriptionDB_Idx := v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.GUI_DescriptionDB_Idx;

    var charstring vl_parentWidgetId :=  v_UIHandler_GUI_DescriptionDB[vl_UIHandler_GUI_DescriptionDB_Idx].parentWidgetId;
    var charstring vl_xml_widgets := v_UIHandler_GUI_DescriptionDB[vl_UIHandler_GUI_DescriptionDB_Idx].xml_widgets;
    var Widgets vl_widgets;
    var integer vl_retval;
    vl_retval := dec_Widgets(char2oct(vl_xml_widgets), vl_widgets);
    if(0 != vl_retval){
      // this should never happen
      f_EPTF_UIHandler_error(%definitionId&": The received XML is invalid, it can not be decoded fully.\n"&
        "Unable to update gui while updating the iterator "&int2str(vl_metaIteratorIdx)&" . The XML: "&vl_xml_widgets)
    }

    // clear all children of the metaIterator from database:
    var EPTF_IntegerList vl_childrens := v_UIHandler_guiItemList[vl_metaIteratorIdx].children;
    for(var integer vl_i := 0; vl_i < sizeof(vl_childrens); vl_i := vl_i + 1){
      f_EPTF_UIHandler_removeElementFromGuiByIdx(vl_childrens[vl_i], false, false);
    }



    //checking what parentid is removed. It's childrens need to be rebuild after the iterator refreshed. (If the parentIdx still exists)
    var EPTF_IntegerList vl_removedDescriptionDBIdxs := {};
    for(var integer vl_i := 0; vl_i < sizeof(v_UIHandler_GUI_DescriptionDB); vl_i := vl_i + 1) {
      if (f_EPTF_UIHandler_widgetRecIndex(v_UIHandler_GUI_DescriptionDB[vl_i].parentWidgetId) == -1) {
        vl_removedDescriptionDBIdxs[sizeof(vl_removedDescriptionDBIdxs)] := vl_i;
      }
    }

    //Rebuild the gui:
    var boolean vl_widgetExists;
    var charstring vl_widget_xml;
    var octetstring vl_widgetOctString;
    if(not f_EPTF_UIHandler_refreshedXMLforNode(vl_nodePointer, vl_widget_xml)) {
      f_EPTF_UIHandler_error(%definitionId&": Unable to generate the xml, after iterator is changed for nodepointer:"&log2str(vl_nodePointer))
    }

    select (v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.iteratorUnionType) {
      case(iterator) {
        vl_widget_xml := "<iterator xmlns=\"http://ttcn.ericsson.se/protocolModules/xtdp/xtdl\">" & vl_widget_xml & "</iterator>";
        vl_widgetOctString := char2oct(vl_widget_xml);

        var Embeddedwidgets.embeddedwidget_list vl_embeddedwidget_list;
        dec_Embeddedwidgets(vl_widgetOctString, vl_embeddedwidget_list);

        // rewrite to nodepointer with the actual value, and remove the metaiterator/externalvalue, it is already on the database
        if(ischosen(vl_embeddedwidget_list[0].iterator)) {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_embeddedwidget_list[0].iterator.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_embeddedwidget_list := vl_embeddedwidget_list[0].iterator.embeddedwidgets.embeddedwidget_list;
        } else {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_embeddedwidget_list[0].externalvalue.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_embeddedwidget_list := vl_embeddedwidget_list[0].externalvalue.embeddedwidgets.embeddedwidget_list;
        }

        var integer vl_embeddedwidget_list_size := sizeof(vl_embeddedwidget_list);
        for(var integer i := 0; i < vl_embeddedwidget_list_size; i := i + 1) {
          f_EPTF_UIHandler_Config_processIterator( vl_embeddedwidget_list[i], vl_metaIteratorIdx, true, vl_widgetExists);
        }
      }
      case(tabpageiterator) {
        vl_widget_xml := "<tabpagegroup_list xmlns=\"http://ttcn.ericsson.se/protocolModules/xtdp/xtdl\">" & vl_widget_xml & "</tabpagegroup_list>";
        vl_widgetOctString := char2oct(vl_widget_xml);

        var Tabpagegroups.tabpagegroup_list vl_tabpagegroup_list;
        dec_Tabpagegroups(vl_widgetOctString, vl_tabpagegroup_list);

        //rewrite to nodepointer with the actual value, and remove the metaiterator/externalvalue, it is already on the database
        if(ischosen(vl_tabpagegroup_list[0].iterator)) {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_tabpagegroup_list[0].iterator.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_tabpagegroup_list := vl_tabpagegroup_list[0].iterator.tabpagegroups.tabpagegroup_list;
        } else {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_tabpagegroup_list[0].externalvalue.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_tabpagegroup_list := vl_tabpagegroup_list[0].externalvalue.tabpagegroups.tabpagegroup_list;
        }

        var integer vl_tabpagegroup_list_size := sizeof(vl_tabpagegroup_list);
        for(var integer i := 0; i < vl_tabpagegroup_list_size; i := i + 1) {
          f_EPTF_UIHandler_Config_processTabpageiterator(vl_tabpagegroup_list[i], vl_metaIteratorIdx, false, vl_widgetExists);
        }
      }
      case(treecoliterator) {
        vl_widget_xml := "<treecolgroup_list xmlns=\"http://ttcn.ericsson.se/protocolModules/xtdp/xtdl\">" & vl_widget_xml & "</treecolgroup_list>";
        vl_widgetOctString := char2oct(vl_widget_xml);

        var Treecolgroups.treecolgroup_list vl_treecolgroup_list;
        dec_Treecolgroups(vl_widgetOctString, vl_treecolgroup_list);

        //rewrite to nodepointer with the actual value, and remove the metaiterator/externalvalue, it is already on the database
        if(ischosen(vl_treecolgroup_list[0].iterator)) {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_treecolgroup_list[0].iterator.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_treecolgroup_list := vl_treecolgroup_list[0].iterator.treecolgroups.treecolgroup_list;
        } else {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_treecolgroup_list[0].externalvalue.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_treecolgroup_list := vl_treecolgroup_list[0].externalvalue.treecolgroups.treecolgroup_list;
        }

        var integer vl_treecolgroup_list_size := sizeof(vl_treecolgroup_list);
        for(var integer i := 0; i < vl_treecolgroup_list_size; i := i + 1) {
          f_EPTF_UIHandler_Config_processTreecoliterator(vl_treecolgroup_list[i], vl_metaIteratorIdx, false, vl_widgetExists);
        }
      }
      case(treeitemiterator) {
        vl_widget_xml := "<treeitemgroup_list xmlns=\"http://ttcn.ericsson.se/protocolModules/xtdp/xtdl\">" & vl_widget_xml & "</treeitemgroup_list>";
        vl_widgetOctString := char2oct(vl_widget_xml);

        var Treeitemgroups.treeitemgroup_list vl_treeitemgroup_list;
        dec_Treeitemgroups(vl_widgetOctString, vl_treeitemgroup_list);

        //rewrite to nodepointer with the actual value, and remove the metaiterator/externalvalue, it is already on the database
        if(ischosen(vl_treeitemgroup_list[0].iterator)) {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_treeitemgroup_list[0].iterator.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_treeitemgroup_list := vl_treeitemgroup_list[0].iterator.treeitemgroups.treeitemgroup_list;
        } else {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_treeitemgroup_list[0].externalvalue.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_treeitemgroup_list := vl_treeitemgroup_list[0].externalvalue.treeitemgroups.treeitemgroup_list;
        }

        var integer vl_treeitemgroup_list_size := sizeof(vl_treeitemgroup_list);
        for(var integer i := 0; i < vl_treeitemgroup_list_size; i := i + 1) {
          f_EPTF_UIHandler_Config_processTreeItemiterator(vl_treeitemgroup_list[i], vl_metaIteratorIdx, false, vl_widgetExists);
        }

      }
      case(treerowiterator) {
        vl_widget_xml := "<treerowgroup_list xmlns=\"http://ttcn.ericsson.se/protocolModules/xtdp/xtdl\">" & vl_widget_xml & "</treerowgroup_list>";
        vl_widgetOctString := char2oct(vl_widget_xml);

        var Treerowgroups.treerowgroup_list vl_treerowgroup_list;
        dec_Treerowgroups(vl_widgetOctString, vl_treerowgroup_list);

        //rewrite to nodepointer with the actual value, and remove the metaiterator/externalvalue, it is already on the database
        if(ischosen(vl_treerowgroup_list[0].iterator)) {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_treerowgroup_list[0].iterator.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_treerowgroup_list := vl_treerowgroup_list[0].iterator.treerowgroups.treerowgroup_list;
        } else {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_treerowgroup_list[0].externalvalue.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_treerowgroup_list := vl_treerowgroup_list[0].externalvalue.treerowgroups.treerowgroup_list;
        }

        var integer vl_treerowgroup_list_size := sizeof(vl_treerowgroup_list);
        for(var integer i := 0; i < vl_treerowgroup_list_size; i := i + 1) {
          f_EPTF_UIHandler_Config_processTreerowiterator(vl_treerowgroup_list[i], vl_metaIteratorIdx, false, vl_widgetExists);
        }
      }
      case(treecelliterator) {
        vl_widget_xml := "<treecellgroup_list xmlns=\"http://ttcn.ericsson.se/protocolModules/xtdp/xtdl\">" & vl_widget_xml & "</treecellgroup_list>";
        vl_widgetOctString := char2oct(vl_widget_xml);

        var Treecellgroups.treecellgroup_list vl_treecellgroup_list;
        dec_Treecellgroups(vl_widgetOctString, vl_treecellgroup_list);

        //rewrite to nodepointer with the actual value, and remove the metaiterator/externalvalue, it is already on the database
        if(ischosen(vl_treecellgroup_list[0].iterator)) {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_treecellgroup_list[0].iterator.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_treecellgroup_list := vl_treecellgroup_list[0].iterator.treecellgroups.treecellgroup_list;
        } else {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_treecellgroup_list[0].externalvalue.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_treecellgroup_list := vl_treecellgroup_list[0].externalvalue.treecellgroups.treecellgroup_list;
        }

        var integer vl_treecellgroup_list_size := sizeof(vl_treecellgroup_list);
        for(var integer i := 0; i < vl_treecellgroup_list_size; i := i + 1) {
          f_EPTF_UIHandler_Config_processTreecelliterator(vl_treecellgroup_list[i], vl_metaIteratorIdx, false, vl_widgetExists);
        }
      }
      case(traceiterator) {
        vl_widget_xml := "<tracegroup_list xmlns=\"http://ttcn.ericsson.se/protocolModules/xtdp/xtdl\">" & vl_widget_xml & "</tracegroup_list>";
        vl_widgetOctString := char2oct(vl_widget_xml);

        var Tracegroups.tracegroup_list vl_tracegroup_list;
        dec_Tracegroups(vl_widgetOctString, vl_tracegroup_list);

        //rewrite to nodepointer with the actual value, and remove the metaiterator/externalvalue, it is already on the database
        if(ischosen(vl_tracegroup_list[0].iterator)) {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_tracegroup_list[0].iterator.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_tracegroup_list := vl_tracegroup_list[0].iterator.tracegroups.tracegroup_list;
        } else {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_tracegroup_list[0].externalvalue.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_tracegroup_list := vl_tracegroup_list[0].externalvalue.tracegroups.tracegroup_list;
        }

        var integer vl_tracegroup_list_size := sizeof(vl_tracegroup_list);
        for(var integer i := 0; i < vl_tracegroup_list_size; i := i + 1) {
          f_EPTF_UIHandler_Config_processTraceiterator(vl_tracegroup_list[i], vl_metaIteratorIdx, false, vl_widgetExists);
        }
      }
      case(listitemiterator) {
        vl_widget_xml := "<listitemgroup_list xmlns=\"http://ttcn.ericsson.se/protocolModules/xtdp/xtdl\">" & vl_widget_xml & "</listitemgroup_list>";
        vl_widgetOctString := char2oct(vl_widget_xml);

        var Listitemgroups.listitemgroup_list vl_listitemgroup_list;
        dec_Listitemgroups(vl_widgetOctString, vl_listitemgroup_list);

        //rewrite to nodepointer with the actual value, and remove the metaiterator/externalvalue, it is already on the database
        if(ischosen(vl_listitemgroup_list[0].iterator)) {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_listitemgroup_list[0].iterator.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_listitemgroup_list := vl_listitemgroup_list[0].iterator.listitemgroups.listitemgroup_list;
        } else {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_listitemgroup_list[0].externalvalue.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_listitemgroup_list := vl_listitemgroup_list[0].externalvalue.listitemgroups.listitemgroup_list;
        }

        var integer vl_listitemgroup_list_size := sizeof(vl_listitemgroup_list);
        for(var integer i := 0; i < vl_listitemgroup_list_size; i := i + 1) {
          f_EPTF_UIHandler_Config_processListitemiterator(vl_listitemgroup_list[i], vl_metaIteratorIdx, false, vl_widgetExists);
        }
      }
      case(menuitemiterator) {
        vl_widget_xml := "<listitemgroup_list xmlns=\"http://ttcn.ericsson.se/protocolModules/xtdp/xtdl\">" & vl_widget_xml & "</listitemgroup_list>";
        vl_widgetOctString := char2oct(vl_widget_xml);

        var Menuitemgroups.menuitemgroup_list vl_menuitemgroup_list;
        dec_Menuitemgroups(vl_widgetOctString, vl_menuitemgroup_list);

        //rewrite to nodepointer with the actual value, and remove the metaiterator/externalvalue, it is already on the database
        if(ischosen(vl_menuitemgroup_list[0].iterator)) {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_menuitemgroup_list[0].iterator.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_menuitemgroup_list := vl_menuitemgroup_list[0].iterator.menuitemgroups.menuitemgroup_list;
        } else {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_menuitemgroup_list[0].externalvalue.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_menuitemgroup_list := vl_menuitemgroup_list[0].externalvalue.menuitemgroups.menuitemgroup_list;
        }

        var integer vl_menuitemgroup_list_size := sizeof(vl_menuitemgroup_list);
        for(var integer i := 0; i < vl_menuitemgroup_list_size; i := i + 1) {
          f_EPTF_UIHandler_Config_processMenuitemiterator(vl_menuitemgroup_list[i], vl_metaIteratorIdx, false, vl_widgetExists);
        }
      }
      case(externaldataiterator) {
        vl_widget_xml := "<externaldatagroup_list xmlns=\"http://ttcn.ericsson.se/protocolModules/xtdp/xtdl\">" & vl_widget_xml & "</externaldatagroup_list>";
        vl_widgetOctString := char2oct(vl_widget_xml);

        var Externaldatagroups.externaldatagroup_list vl_externaldatagroup_list;
        dec_Externaldatagroups(vl_widgetOctString, vl_externaldatagroup_list);

        //rewrite to nodepointer with the actual value, and remove the metaiterator/externalvalue, it is already on the database
        if(ischosen(vl_externaldatagroup_list[0].iterator)) {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_externaldatagroup_list[0].iterator.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_externaldatagroup_list := vl_externaldatagroup_list[0].iterator.externaldatagroups.externaldatagroup_list;
        } else {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_externaldatagroup_list[0].externalvalue.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_externaldatagroup_list := vl_externaldatagroup_list[0].externalvalue.externaldatagroups.externaldatagroup_list;
        }

        var Distributionchart vl_xul;
        var integer vl_externaldatagroup_list_size := sizeof(vl_externaldatagroup_list);
        for(var integer i := 0; i < vl_externaldatagroup_list_size; i := i + 1) {
          f_EPTF_UIHandler_Config_processValueListiterator(vl_externaldatagroup_list[i], vl_xul, vl_metaIteratorIdx, false, vl_widgetExists);
        }
      }
      case(valuelistiterator) {
        vl_widget_xml := "<externaldatagroup_list xmlns=\"http://ttcn.ericsson.se/protocolModules/xtdp/xtdl\">" & vl_widget_xml & "</externaldatagroup_list>";
        vl_widgetOctString := char2oct(vl_widget_xml);

        var Externaldatagroups.externaldatagroup_list vl_externaldatagroup_list;
        dec_Externaldatagroups(vl_widgetOctString, vl_externaldatagroup_list);

        //rewrite to nodepointer with the actual value, and remove the metaiterator/externalvalue, it is already on the database
        if(ischosen(vl_externaldatagroup_list[0].iterator)) {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_externaldatagroup_list[0].iterator.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_externaldatagroup_list := vl_externaldatagroup_list[0].iterator.externaldatagroups.externaldatagroup_list;
        } else {
          f_EPTF_UIHandler_parseIteratorMetadata(vl_nodePointer,vl_iteratorVarIdx,f_unichar2charstr(vl_externaldatagroup_list[0].externalvalue.metadata));
          v_UIHandler_guiItemList[vl_metaIteratorIdx].widgetData.metaIteratorData.nodePointer := vl_nodePointer;
          vl_externaldatagroup_list := vl_externaldatagroup_list[0].externalvalue.externaldatagroups.externaldatagroup_list;
        }

        var Distributionchart vl_xul;
        var integer vl_externaldatagroup_list_size := sizeof(vl_externaldatagroup_list);
        for(var integer i := 0; i < vl_externaldatagroup_list_size; i := i + 1) {
          f_EPTF_UIHandler_Config_processValueListiterator(vl_externaldatagroup_list[i], vl_xul, vl_metaIteratorIdx, false, vl_widgetExists);
        }
      }
    }

    // notify the GUI about the update:
    var charstring vl_iteratorParentId := "";
    if(v_UIHandler_guiItemList[vl_metaIteratorIdx].parentIdx != -1) {
      var integer vl_iteratorNotMetaParentIdx := f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(v_UIHandler_guiItemList[vl_metaIteratorIdx].parentIdx);
      vl_iteratorParentId := v_UIHandler_guiItemList[vl_iteratorNotMetaParentIdx].id;
    }
    if(tsp_EPTF_UIHandler_enableBrowserGUI == true){
      f_EPTF_UIHandler_Browser_reportGUIChanged(vl_iteratorParentId);
    }

    //rebuild the runtimeGUI:
    if(v_UIHandler_guiConnected){
      var Widgets vl_widgets_to_send;
      f_EPTF_UIHandler_buildXUL(vl_widgets_to_send, true);
      f_EPTF_UIHandler_clearGUI(false);
      //var integer vl_notMetaParentIdx := f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(vl_metaIteratorIdx);
      // Ez itt ujra beolvastatja a widget kezelovel a teljes lapot - private helyette
      f_EPTF_UIHandler_XSD_addElementToGui_private(vl_widgets_to_send, "", vl_widgetExists,false);
    }

  // wait to finish all getData handlers:
  f_EPTF_UIHandler_waitForProcessExternalData_handlers()
  f_EPTF_UIHandler_Config_connectAllVarsToWidget();

  } else {
    // if not remove the postproc:
    f_EPTF_Var_removePostProcFn(pl_idx, {refers(f_EPTF_UIHandler_updateIterator_PostProc), {vl_metaIteratorIdx}});
    return; // no metaiterator found
  }
}

friend function f_EPTF_UIHandler_getNonEmptyParentId(in integer pl_parentIdx, out charstring pl_widgetid) runs on EPTF_UIHandler_Private_CT
return integer{
  pl_widgetid := "";
  var integer vl_parentIdx :=  f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(pl_parentIdx);
  if(vl_parentIdx != -1){
    pl_widgetid := v_UIHandler_guiItemList[vl_parentIdx].id;
    while(pl_widgetid == "" and vl_parentIdx != -1){
      vl_parentIdx := f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(v_UIHandler_guiItemList[vl_parentIdx].parentIdx);
      if(vl_parentIdx != -1){
        pl_widgetid := v_UIHandler_guiItemList[vl_parentIdx].id;
      }
    }
  }
  return vl_parentIdx;
}

///////////////////////////////////////////////////////////
//  Function: f_EPTF_UIHandler_appendTreeRow
//
//  Purpose:
//    appending the treerow widget to the widget database
//
//  Parameters:
//    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
//    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
//
///////////////////////////////////////////////////////////
private function f_EPTF_UIHandler_appendTreeRow(
  in integer pl_parentIdx,
  inout boolean pl_widgetExists)
runs on EPTF_UIHandler_Private_CT
return integer{

  pl_widgetExists := false;
  var charstring vl_id := f_EPTF_UIHandler_unichar2charstring(f_EPTF_UIHandler_getrandomid(true));
  var integer vl_treerowIdx := f_EPTF_UIHandler_addWidgetRec({
      "",
      wtTreerow,
      omit,
      pl_parentIdx,
      { },
      omit,
      {treerow := { treecellgroups := {treecellgroup_list := {}}}}, false}, pl_widgetExists);
  return vl_treerowIdx;
}

///////////////////////////////////////////////////////////
//  Function: f_EPTF_UIHandler_appendMetaIterator
//
//  Purpose:
//    appending the iterator widget to the widget database
//
//  Parameters:
//    pl_parentIdx - *in* *integer* the idx of the parent widget in the gui items' list
//    pl_widgetExists - *inout* *boolean* returns true if the widget already exists
//    pl_iteratorVarIdx - *in* *integer* - the index of the iterator variable the new metaIterator belongs to
///////////////////////////////////////////////////////////
private function f_EPTF_UIHandler_appendMetaIterator(
  in integer pl_parentIdx,
  inout boolean pl_widgetExists,
  in EPTF_UIHandler_IteratorUnionType pl_iteratorUnionType,
  in integer pl_iteratorVarIdx,
  in integer pl_nodePointer,
  in boolean pl_isExternalValue)
runs on EPTF_UIHandler_Private_CT
return integer{

  if (pl_iteratorVarIdx<0) {
    pl_iteratorVarIdx := f_EPTF_Var_getId("NonexistentIterator");
    if (pl_iteratorVarIdx == -1) {
      f_EPTF_Var_newCharstringlist("NonexistentIterator", {}, pl_iteratorVarIdx);
    }
  }
  
  pl_widgetExists := false;
  var charstring vl_id := "metaiterator_" & f_EPTF_UIHandler_unichar2charstring(f_EPTF_UIHandler_getrandomid());

  var EPTF_Var_DirectContent vl_currentContent;
  f_EPTF_Var_getContent(pl_iteratorVarIdx, vl_currentContent);
  // if its externalvalue or iterator vith single variable
  if( pl_isExternalValue == true or not ischosen(vl_currentContent.charstringlistVal)) {
    var charstring vl_varName := f_EPTF_Var_getName(pl_iteratorVarIdx);
    pl_iteratorVarIdx := f_EPTF_Var_getId(vl_varName&cg_ExternalVariableSign);
    if(pl_iteratorVarIdx == -1){
      f_EPTF_Var_newCharstringlist(vl_varName&cg_ExternalVariableSign, {vl_varName}, pl_iteratorVarIdx);
    }
  }

  var EPTF_CharstringList vl_currentValue := f_EPTF_Var_getCharstringlistValue(pl_iteratorVarIdx);

  //var charstring vl_id := "metaiterator_" & int2str(v_UIHandler_GUI_DescriptionDB_Idx) & "_" & int2str(vl_iteratorumber);
  var integer vl_metaIteratorIdx := f_EPTF_UIHandler_addWidgetRec({
      vl_id,
      wtMetaIterator,
      omit,
      pl_parentIdx,
      { },
      {metaIteratorData := {v_UIHandler_GUI_DescriptionDB_Idx, pl_iteratorUnionType, pl_iteratorVarIdx, vl_currentValue, pl_nodePointer}},
      {metaiterator := { id := vl_id }}, false}, pl_widgetExists);
  f_EPTF_Var_addPostProcFn(pl_iteratorVarIdx, {refers(f_EPTF_UIHandler_updateIterator_PostProc), {vl_metaIteratorIdx}});
  return vl_metaIteratorIdx;

}

friend function f_EPTF_UIHAndler_getNotMetaiteratorParentIdx(in integer pl_widgetIdx)
runs on EPTF_UIHandler_Private_CT
return integer{
  var integer vl_widgetIdx := pl_widgetIdx;
  while(vl_widgetIdx != -1 and v_UIHandler_guiItemList[vl_widgetIdx].widgetType == wtMetaIterator) {
    vl_widgetIdx := v_UIHandler_guiItemList[vl_widgetIdx].parentIdx;
  }
  return vl_widgetIdx;
}

///////////////////////////////////////////////////////////
//  Function: f_EPTF_UIHandler_getNonMetaChildren
//
//  Purpose:
//    Returns the list of all children. If one child is a metaiterator
//    it returns its non-meta children
//
//  Parameters:
//    pl_itemIdx - *in* *integer* - the idx of the GUI item
//
//  Return Value:
//    EPTF_IntegerList - list of non-meta children indexes
//
///////////////////////////////////////////////////////////
private function f_EPTF_UIHandler_getNonMetaChildren(
  in integer pl_itemIdx
) runs on EPTF_UIHandler_Private_CT return EPTF_IntegerList {
  var EPTF_IntegerList vl_nonMetaChildren := {};

  var EPTF_IntegerList vl_children := v_UIHandler_guiItemList[pl_itemIdx].children;

  for(var integer i:=0; i<sizeof(vl_children); i:=i+1) {
    if (v_UIHandler_guiItemList[vl_children[i]].widgetType == wtMetaIterator) {
      vl_nonMetaChildren := vl_nonMetaChildren & f_EPTF_UIHandler_getNonMetaChildren(vl_children[i]);
    } else {
      vl_nonMetaChildren[sizeof(vl_nonMetaChildren)] := vl_children[i];
    }
  }
  return vl_nonMetaChildren;
}

private function f_EPTF_UIHandler_parseIteratorMetadata(out integer pl_nodepointer, out integer pl_iteratorVarIdx, in charstring pl_metadata, in charstring pl_separator := "_") {
    var integer vl_separatorPos := f_strstr(pl_metadata,pl_separator);
    if (vl_separatorPos<0) {
      return; //error: no separator found
    }

    pl_nodepointer := str2int(substr(pl_metadata,0,vl_separatorPos));
    pl_iteratorVarIdx := str2int(substr(pl_metadata,vl_separatorPos+1,lengthof(pl_metadata)-vl_separatorPos-1));
}




public external function f_EPTF_UIHandler_GUIFunctions_Tests() return charstring

} // end of module
