///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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_UIHandlerVariableUI_Functions
// 
//  Purpose:
//    This module contains VariableUI functions of EPTF CLL UIHandler.
// 
//  Module Parameters:
// 
//  Module depends on:
//    <EPTF_CLL_UIHandlerClient_Functions>
//    <EPTF_CLL_UIHandler_Definitions>
//    <XTDP_PDU_Defs>
//    <EPTF_CLL_UIHandler_VariableUI_Definitions>
//    <EPTF_CLL_UIHandler_Widget_Functions>
//    <EPTF_CLL_Logging_Definitions>
//    <EPTF_CLL_Logging_Functions>
//    <EPTF_CLL_LoggingUI_Definitions>
//    <EPTF_CLL_LoggingUI_Functions>
//    <EPTF_CLL_LoggingUIClient_Functions>
//    <EPTF_CLL_UIHandlerClient_Definitions>
//    <EPTF_CLL_Base_Functions>
//    <EPTF_CLL_Variable_Definitions>
//    <EPTF_CLL_Variable_Functions>
// 
//  Current Owner:
//     Zsolt Szalai (EZSOSZA)
// 
//  Last Review Date:
//    2010-xx-xx
//
//  Detailed Comments:
//    -
//
///////////////////////////////////////////////////////////////
module EPTF_CLL_UIHandlerVariableUI_Functions
// [.objid{ itu_t(0) identified_organization(4) etsi(0) 
// identified_organization(127) ericsson(5) testing(0)
// <put further nodes here if needed>}]
{
//  import EPTF_CLL_UIHandler_VariableUI_Definitions all;
import from EPTF_CLL_UIHandlerClient_Functions all;
import from EPTF_CLL_UIHandler_Definitions all;
import from EPTF_CLL_UIHandlerVariableUI_Definitions all;
import from EPTF_CLL_UIHandler_WidgetFunctions all;
import from EPTF_CLL_Logging_Definitions all;
import from EPTF_CLL_Logging_Functions all;
import from EPTF_CLL_LoggingUI_Definitions all;
import from EPTF_CLL_LoggingUIClient_Functions all;
import from EPTF_CLL_UIHandlerClient_Definitions all;
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_Variable_Definitions all;
import from ttcn_ericsson_se_protocolModules_xtdp_xtdl all;

//===========================================================================
// Module parameters
//===========================================================================
modulepar boolean tsp_debug_EPTF_UIHandler_VariableUI := false;


///////////////////////////////////////////////////////////
//  Function: f_EPTF_UIHandler_VariableUI_init_CT
//
//  Purpose:
//    Initialize the component
//
//  Parameters:
//    pl_selfName - *in* *charstring* -  the name of the component
//    pl_UIHandler - *in* <EPTF_UIHandler_CT> -  The UIHandler component of the application
//
//  Detailed Comments:
//    -
///////////////////////////////////////////////////////////
public function f_EPTF_UIHandler_VariableUI_init_CT(in charstring pl_selfName,
  in EPTF_UIHandler_CT pl_UIHandler,
  in EPTF_LoggingUI_CT pl_loggingUi_compRef := null)
runs on EPTF_UIHandler_VariableUI_CT {
  
  if(pl_loggingUi_compRef != null) {
    f_EPTF_LoggingUIClient_init_CT(pl_selfName, pl_loggingUi_compRef, pl_UIHandler);
  } else {
    f_EPTF_Logging_init_CT(pl_selfName);
  }
  v_UIHandler_VariableUI_loggingMaskId := f_EPTF_Logging_registerComponentMasks(tsp_EPTF_UIHandler_VariableUI_loggingComponentMask, c_EPTF_UIHandler_loggingEventClasses, EPTF_Logging_CLL);
  if(tsp_debug_EPTF_UIHandler_VariableUI) {
    f_EPTF_Logging_enableLocalMask(v_UIHandler_VariableUI_loggingMaskId, c_EPTF_UIHandler_loggingClassIdx_Debug);
  } else {
    f_EPTF_Logging_disableLocalMask(v_UIHandler_VariableUI_loggingMaskId, c_EPTF_UIHandler_loggingClassIdx_Debug);
  }
  
  if (true != v_VariableUI_initialized) {
    //      f_EPTF_Var_init_CT(pl_selfName);
    f_EPTF_UIHandlerClient_init_CT(pl_selfName, pl_UIHandler);
    f_EPTF_Logging_init_CT(pl_selfName);
    v_VariableUI_UIHandler := pl_UIHandler;
    v_VariableUI_initialized := true;
    f_EPTF_Base_registerCleanup(refers(f_EPTF_UIHandler_VariableUI_cleanup_CT));
    f_EPTF_UIHandler_VariableUI_debug("----CLL_UIHandler_VariableUI INIT DONE----");
  }
}

///////////////////////////////////////////////////////////
//  Function: f_EPTF_UIHandler_VariableUI_logAll
//
//  Purpose:
//    Log all internal variables in EPTF_UIHandler_VariableUI_CT
//
//  Parameters:
//    -
//
//  Detailed Comments:
//    -
///////////////////////////////////////////////////////////
public function f_EPTF_UIHandler_VariableUI_logAll() 
runs on EPTF_UIHandler_VariableUI_CT
{
  log("------Content of EPTF_UIHandler_VariableUI_CT: -------");
  log("v_VariableUI_initialized: ",v_VariableUI_initialized)
  log("v_VariableUI_UIHandler: ",v_VariableUI_UIHandler);
  log("v_VariableUI_connections: ", v_VariableUI_connections);
  log("v_VariableUI_holdingwidgets: ",v_VariableUI_holdingwidgets);
  log("v_VariableUI_initparent: ", v_VariableUI_initparent);
  log("v_VariableUI_lastput: ", v_VariableUI_lastput);
  log("------Finished Content of EPTF_UIHandler_VariableUI_CT -------");
}//f_

private function f_EPTF_UIHandler_VariableUI_cleanup_CT() runs on EPTF_UIHandler_VariableUI_CT{
  v_VariableUI_initialized := false;
}

group PutFunctions{
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_putVarbyName
  //
  //  Purpose:
  //    Puts the given(by name) variable to the GUI.
  //
  //  Parameters:
  //    pl_var - *in* *charstring* -  the name of the variable
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_putVarbyName(in charstring pl_var) runs on EPTF_UIHandler_VariableUI_CT{
    for (var integer i:=0;i<sizeof(v_VariableUI_connections);i:=i+1){
      if (v_VariableUI_connections[i].variablename == pl_var){
        f_EPTF_UIHandler_VariableUI_putVar(v_VariableUI_connections[i]);
      }
    }
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_putconnections
  //
  //  Purpose:
  //    Puts all the variables from the database to the GUI.
  //
  //  Parameters:
  //    -
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_putconnections() runs on EPTF_UIHandler_VariableUI_CT{
    for(var integer i:=0;i<sizeof(v_VariableUI_connections);i:=i+1){
      f_EPTF_UIHandler_VariableUI_putVar(v_VariableUI_connections[i]);
    }
    v_VariableUI_lastput := sizeof(v_VariableUI_connections);
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_putlastconnections
  //
  //  Purpose:
  //    Puts the new variables from the database to the GUI.
  //
  //  Parameters:
  //    -
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_putlastconnections() runs on EPTF_UIHandler_VariableUI_CT{
    var integer vl_startIndex := v_VariableUI_lastput; 
    var integer vl_stopIndex := sizeof(v_VariableUI_connections); 
    v_VariableUI_lastput := vl_stopIndex; 
    
    for(var integer i := vl_startIndex; i < vl_stopIndex; i := i + 1) 
    { 
      f_EPTF_UIHandler_VariableUI_putVar(v_VariableUI_connections[i]); 
    }
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_putsimpleconnection
  //
  //  Purpose:
  //    Puts a variable to the GUI, the item won't be updated the database
  //
  //  Parameters:
  //    pl_varname - *in* *charstring* -  the name of the variable
  //    pl_widgetid - *in* *charstring* - the widgetid that should be connected to.
  //    pl_subsMode - *in* <EPTF_Var_SubscriptionMode> - the mode of the subscription [default: timeLine]
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_putsimpleconnection(in charstring pl_varname, in charstring pl_widgetid,  in EPTF_Var_SubscriptionMode pl_subsMode := timeLine)
  runs on EPTF_UIHandler_VariableUI_CT {
    var EPTF_UIHandler_VariableUI_Connection conn :=  c_EPTF_emptyEPTF_UIHandler_VariableUI_Connection;
    
    conn.variablename := pl_varname;
    conn.widgetid := pl_widgetid;
    conn.subsMode := pl_subsMode;
    
    f_EPTF_UIHandler_VariableUI_putVar(conn);
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_putwidgetconnection
  //
  //  Purpose:
  //    Puts a connection to GUI, database not updated.
  //
  //  Parameters:
  //    pl_varname - *in* *charstring* -  the name of the variable
  //    pl_widgetid - *in* *charstring* - the widgetid that should be connected to.
  //    pl_widget - *in* *XTDP_XML_Tag* - the widget that should be connected to.
  //    pl_parentid - *in* *charstring* - the parent widgetid
  //    pl_holdingname - *in* *charstring* - the name of the holding widget, optional
  //    pl_subsMode - *in* <EPTF_Var_SubscriptionMode> - the mode of the subscription [default: timeLine]
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_putwidgetconnection(in charstring pl_varname, 
    in charstring pl_widgetid,
    in Widgets pl_widget,
    in charstring pl_parentid,
    in charstring pl_holdingname := "JajO5&%AR.z>r$;!oN7Lvc_f",
    in EPTF_Var_SubscriptionMode pl_subsMode := timeLine)
  
  runs on EPTF_UIHandler_VariableUI_CT{
    var EPTF_UIHandler_VariableUI_Connection conn := c_EPTF_emptyEPTF_UIHandler_VariableUI_Connection;
    
    conn.variablename := pl_varname;
    conn.widgetid := pl_widgetid;
    conn.widget := pl_widget;
    conn.parentid := pl_parentid;
    conn.holdingwidgetRef := f_EPTF_UIHandler_VariableUI_searchholding(pl_holdingname);
    conn.subsMode := pl_subsMode;
    
    f_EPTF_UIHandler_VariableUI_putVar(conn);
  }
  
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_putsimpleconnectionList
  //
  //  Purpose:
  //    Adds multiple connections to the GUI, database not updated
  //
  //  Parameters:
  //    pl_connlist - *in* <EPTF_UIHandler_VariableUI_SimpleConnectionList> -  the connections
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////    
  public function f_EPTF_UIHandler_VariableUI_putsimpleconnectionList(in EPTF_UIHandler_VariableUI_SimpleConnectionList pl_connlist) 
  runs on EPTF_UIHandler_VariableUI_CT{
    for (var integer i:=0; i<sizeof(pl_connlist); i:=i+1){
      f_EPTF_UIHandler_VariableUI_putsimpleconnection(pl_connlist[i].variablename, pl_connlist[i].widgetid);
    }
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_putsimpleconnectionWithSubsModeList
  //
  //  Purpose:
  //    Adds multiple connections (with subscription mode informations) to the GUI, database not updated
  //
  //  Parameters:
  //    pl_connlist - *in* <EPTF_UIHandler_VariableUI_SimpleConnectionWithSubsModeList> -  the connections
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////    
  public function f_EPTF_UIHandler_VariableUI_putsimpleconnectionWithSubsModeList(in EPTF_UIHandler_VariableUI_SimpleConnectionWithSubsModeList pl_connlist) 
  runs on EPTF_UIHandler_VariableUI_CT{
    for (var integer i:=0; i<sizeof(pl_connlist); i:=i+1){
      if (pl_connlist[i].subsMode == omit){
        f_EPTF_UIHandler_VariableUI_putsimpleconnection(pl_connlist[i].variablename, pl_connlist[i].widgetid);
      }
      else{
        f_EPTF_UIHandler_VariableUI_putsimpleconnection(pl_connlist[i].variablename, pl_connlist[i].widgetid, pl_connlist[i].subsMode);
      }
    }
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_putsinglewidgetconnectionList
  //
  //  Purpose:
  //    Adds multiple connections to the GUI, with a single widget, database not updated
  //
  //  Parameters:
  //    pl_connlist - *in* <EPTF_UIHandler_VariableUI_SimpleConnectionList> -  the connections
  //    pl_widget - *in* *XTDP_XML_Tag* - the widget
  //    pl_parentid - *in* *charstring* - the parent widgetid
  //    pl_holdingname - *in* *charstring* - the name of the holding widget, optional
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////    
  public function f_EPTF_UIHandler_VariableUI_putsinglewidgetconnectionList(in EPTF_UIHandler_VariableUI_SimpleConnectionList pl_connlist,
    in Widgets pl_widget,
    in charstring pl_parentid,
    in charstring pl_holdingname := "JajO5&%AR.z>r$;!oN7Lvc_f")
  runs on EPTF_UIHandler_VariableUI_CT{
    if (sizeof(pl_connlist)>0){
      f_EPTF_UIHandler_VariableUI_putwidgetconnection(pl_connlist[0].variablename,
        pl_connlist[0].widgetid,
        pl_widget,
        pl_parentid,
        pl_holdingname);
      for (var integer i:=1; i<sizeof(pl_connlist); i:=i+1){
        f_EPTF_UIHandler_VariableUI_putsimpleconnection(pl_connlist[i].variablename, pl_connlist[i].widgetid);
      }
    } else {
      f_EPTF_UIHandler_VariableUI_putwidgetconnection("",
        "",
        pl_widget,
        pl_parentid,
        pl_holdingname);
    }
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_putsinglewidgetconnectionWithSubsModeList
  //
  //  Purpose:
  //    Adds multiple connections (with subscription mode informations) to the GUI, with a single widget, database not updated
  //
  //  Parameters:
  //    pl_connlist - *in* <EPTF_UIHandler_VariableUI_SimpleConnectionWithSubsModeList> -  the connections
  //    pl_widget - *in* *XTDP_XML_Tag* - the widget
  //    pl_parentid - *in* *charstring* - the parent widgetid
  //    pl_holdingname - *in* *charstring* - the name of the holding widget, optional
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////    
  public function f_EPTF_UIHandler_VariableUI_putsinglewidgetconnectionWithSubsModeList(in EPTF_UIHandler_VariableUI_SimpleConnectionWithSubsModeList pl_connlist,
    in Widgets pl_widget,
    in charstring pl_parentid,
    in charstring pl_holdingname := "JajO5&%AR.z>r$;!oN7Lvc_f")
  runs on EPTF_UIHandler_VariableUI_CT{
    if (sizeof(pl_connlist)>0){
      if (pl_connlist[0].subsMode == omit){
        f_EPTF_UIHandler_VariableUI_putwidgetconnection(pl_connlist[0].variablename,
          pl_connlist[0].widgetid,
          pl_widget,
          pl_parentid,
          pl_holdingname);
      }
      else{
        f_EPTF_UIHandler_VariableUI_putwidgetconnection(pl_connlist[0].variablename,
          pl_connlist[0].widgetid,
          pl_widget,
          pl_parentid,
          pl_holdingname,
          pl_connlist[0].subsMode);
      }
      for (var integer i:=1; i<sizeof(pl_connlist); i:=i+1){
        if (pl_connlist[i].subsMode == omit){
          f_EPTF_UIHandler_VariableUI_putsimpleconnection(pl_connlist[i].variablename, pl_connlist[i].widgetid);
        }
        else{
          f_EPTF_UIHandler_VariableUI_putsimpleconnection(pl_connlist[i].variablename, pl_connlist[i].widgetid, pl_connlist[i].subsMode);
        }
      }
    } else {
      f_EPTF_UIHandler_VariableUI_putwidgetconnection("",
        "",
        pl_widget,
        pl_parentid,
        pl_holdingname,
        timeLine);
    }
  }
  
  /*    function f_EPTF_UIHandler_VariableUI_putparentwidget(in charstring pl_widget,
  in charstring pl_parent) 
  runs on EPTF_UIHandler_VariableUI_CT{
  if (pl_widget != ""){
  var EPTF_UIHandlerClient_SubsRet addresult :=
  f_EPTF_UIHandlerClient_addElementToGUI(f_EPTF_UIHandler_decodeXUL(pl_widget), pl_parent);
  if(not (addresult == sr_Exists or addresult == sr_Success)){
  f_EPTF_Logging_error(true, "Adding the widget failed!");
  }
  v_VariableUI_initparent := true;
  }
  }*/
  
}

group Databasefunctions{
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_addsimpleconnection
  //
  //  Purpose:
  //    Adds a connection to the database
  //
  //  Parameters:
  //    pl_varname - *in* *charstring* -  the name of the variable
  //    pl_widgetid - *in* *charstring* - the widgetid that should be connected to.
  //    pl_subsMode - *in* <EPTF_Var_SubscriptionMode> - the mode of the subscription. [default: timeLine]
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_addsimpleconnection(in charstring pl_varname, in charstring pl_widgetid, in EPTF_Var_SubscriptionMode pl_subsMode := timeLine) 
  runs on EPTF_UIHandler_VariableUI_CT
  return integer{
    return f_EPTF_UIHandler_VariableUI_addconnection({pl_varname, pl_widgetid, omit, omit, omit, pl_subsMode});
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_addsimpleconnectionList
  //
  //  Purpose:
  //    Adds multiple connections to the database
  //
  //  Parameters:
  //    pl_connlist - *in* - <EPTF_UIHandler_VariableUI_SimpleConnectionList> - The list of connections
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_addsimpleconnectionList(in EPTF_UIHandler_VariableUI_SimpleConnectionList pl_connlist)
  runs on EPTF_UIHandler_VariableUI_CT
  return integer{
    var integer idx:=0;
    for (var integer i:=0; i< sizeof(pl_connlist); i:=i+1){
      idx := f_EPTF_UIHandler_VariableUI_addconnection({pl_connlist[i].variablename, pl_connlist[i].widgetid, omit, omit, omit, timeLine});
    }
    return idx;
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_addsimpleconnectionWithSubsModeList
  //
  //  Purpose:
  //    Adds multiple connections to the database
  //
  //  Parameters:
  //    pl_connlist - *in* - <EPTF_UIHandler_VariableUI_SimpleConnectionWithSubsModeList> - The list of connections
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_addsimpleconnectionWithSubsModeList(in EPTF_UIHandler_VariableUI_SimpleConnectionWithSubsModeList pl_connlist)
  runs on EPTF_UIHandler_VariableUI_CT
  return integer{
    var integer idx:=0;
    for (var integer i:=0; i< sizeof(pl_connlist); i:=i+1){
      if (pl_connlist[i].subsMode == omit){
        idx := f_EPTF_UIHandler_VariableUI_addconnection({pl_connlist[i].variablename, pl_connlist[i].widgetid, omit, omit, omit, omit});
      }
      else{
        idx := f_EPTF_UIHandler_VariableUI_addconnection({pl_connlist[i].variablename, pl_connlist[i].widgetid, omit, omit, omit, pl_connlist[i].subsMode});
      }
      
    }
    return idx;
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_widgetaddconnection
  //
  //  Purpose:
  //    Adds a connection to the database
  //
  //  Parameters:
  //    pl_varname - *in* *charstring* -  the name of the variable
  //    pl_widgetid - *in* *charstring* - the widgetid that should be connected to.
  //    pl_widget - *in* *XTDP_XML_Tag* - the widget that should be connected to.
  //    pl_parentid - *in* *charstring* - the parent widgetid
  //    pl_subsmode - *in* <EPTF_Var_SubscriptionMode> - the mode of the subscription. [default: timeLine]
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_addwidgetconnection(in charstring pl_varname, 
    in charstring pl_widgetid,
    in Widgets pl_widget,
    in charstring pl_parentid,
    in EPTF_Var_SubscriptionMode pl_subsMode := timeLine) 
  runs on EPTF_UIHandler_VariableUI_CT
  return integer{
    return f_EPTF_UIHandler_VariableUI_addconnection({pl_varname, pl_widgetid, pl_widget, pl_parentid, omit, pl_subsMode});
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_addwidgetconnectionList
  //
  //  Purpose:
  //    Adds multiple connections to the database
  //
  //  Parameters:
  //    pl_connlist - *in* - <EPTF_UIHandler_VariableUI_WidgetConnectionList> - The list of connections
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_addwidgetconnectionList(in EPTF_UIHandler_VariableUI_WidgetConnectionList pl_connlist)
  runs on EPTF_UIHandler_VariableUI_CT
  return integer{
    var integer idx:=0;
    for (var integer i:=0; i< sizeof(pl_connlist); i:=i+1){
      if (pl_connlist[i].subsMode == omit){
        idx := f_EPTF_UIHandler_VariableUI_addconnection({pl_connlist[i].variablename, 
            pl_connlist[i].widgetid, 
            pl_connlist[i].widget, 
            pl_connlist[i].parentid,
            omit,
            omit});
      }
      else{
        idx := f_EPTF_UIHandler_VariableUI_addconnection({pl_connlist[i].variablename, 
            pl_connlist[i].widgetid, 
            pl_connlist[i].widget, 
            pl_connlist[i].parentid,
            omit,
            pl_connlist[i].subsMode});
      }
    }
    return idx;
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_addholdingwidget
  //
  //  Purpose:
  //    Adds a holding widget to the database
  //
  //  Parameters:
  //    pl_name - *in* *charstring* -  the name of the holdingitem
  //    pl_widget - *in* *XTDP_XML_Tag* - the holding widget.
  //    pl_parentid - *in* *charstring* - the parent widgetid
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_addholdingwidget(in charstring pl_name, in Widgets pl_widget, in charstring pl_parentid)
  runs on EPTF_UIHandler_VariableUI_CT
  return integer{
    return f_EPTF_UIHandler_VariableUI_addfullholdingwidget({pl_name, false, pl_widget, pl_parentid});
  }
  
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_assignholdingwidget
  //
  //  Purpose:
  //    Assigns a connection to a holding widget, by names
  //
  //  Parameters:
  //    pl_varname - *in* *charstring* -  the name of the variable
  //    pl_holdingname - *in* *charstring* - the name of the holding item
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_assignholdingwidget(in charstring pl_varname, in charstring pl_holdingname) runs on EPTF_UIHandler_VariableUI_CT
  return boolean{
    return f_EPTF_UIHandler_VariableUI_assignholding(f_EPTF_UIHandler_VariableUI_getconnectionIdx(pl_varname),f_EPTF_UIHandler_VariableUI_getholdingwidgetIdx(pl_holdingname));
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_assignholding
  //
  //  Purpose:
  //    Assigns a connection to a holding widget, by indexes.
  //
  //  Parameters:
  //    pl_connidx - *in* *integer* -  the connection's index
  //    pl_holdingidx - *in* *integer* - the holdingitem's index
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_assignholding(in integer pl_connidx, in integer pl_holdingidx) runs on EPTF_UIHandler_VariableUI_CT
  return boolean{
    if (sizeof(v_VariableUI_holdingwidgets)>pl_holdingidx and pl_holdingidx>=0 and sizeof(v_VariableUI_connections)>pl_connidx and pl_connidx >= 0){
      v_VariableUI_connections[pl_connidx].holdingwidgetRef := pl_holdingidx;
      return true;
    } else {
      f_EPTF_UIHandler_VariableUI_warning("Outbound index numbers!");
      return false;
    }
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_removeconnection
  //
  //  Purpose:
  //    Removes a connection.
  //
  //  Parameters:
  //    pl_varname - *in* *charstring* -  the name of the variable
  //
  //  Detailed Comments:
  //    -
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandler_VariableUI_removeconnection(in charstring pl_varname)
  runs on EPTF_UIHandler_VariableUI_CT{
    var EPTF_UIHandler_VariableUI_ConnectionList connections:={};
    for (var integer i:=0;i<sizeof(v_VariableUI_connections);i:=i+1){
      if (v_VariableUI_connections[i].variablename != pl_varname){
        connections[sizeof(connections)]:=v_VariableUI_connections[i];
      }
    }
    v_VariableUI_connections := connections;
  }
}

group PrivateFunctions{
  
  // puts the widget on, if a xul is given and not present in the GUI
  // than connects it to the variable if it is not connected already
  private function f_EPTF_UIHandler_VariableUI_putVar(inout EPTF_UIHandler_VariableUI_Connection pl_var)
  runs on EPTF_UIHandler_VariableUI_CT
  {
    if (not f_EPTF_UIHandler_VariableUI_putHoldingwidget(pl_var)){
      f_EPTF_UIHandler_VariableUI_warning("Error while putting up the HoldingWidget!");
      return;
    }
    if (ispresent(pl_var.widget)){
      if (ispresent(pl_var.parentid)){
        var Widgets widget := pl_var.widget;
        var charstring widgetid := f_EPTF_UIHandler_VariableUI_getidfromXUL(widget);
        if (widgetid == ""){ widgetid := pl_var.widgetid;}
        if (f_EPTF_UIHandlerClient_widgetExists(widgetid) == wtUnknown){
          var EPTF_UIHandlerClient_SubsRet addresult :=
          f_EPTF_UIHandlerClient_XSD_addElementToGUI(widget, pl_var.parentid);
          if(not (addresult == sr_Exists or addresult == sr_Success)){
            f_EPTF_UIHandler_VariableUI_warning("Adding the widget failed!");
            return;
          }
        }
      } else {
        f_EPTF_UIHandler_VariableUI_warning("Widget give, but it's parent not!");
        return;
      }
    }
    
    if(not (pl_var.variablename == "" and pl_var.widgetid == "")){
      if (pl_var.subsMode == omit){
        f_EPTF_UIHandlerClient_subscribeMe(pl_var.variablename,
          pl_var.variablename,
          pl_var.widgetid);
      }
      else{
        f_EPTF_UIHandlerClient_subscribeMe(pl_var.variablename,
          pl_var.variablename,
          pl_var.widgetid,
          pl_var.subsMode);
      }
    }
  }
  
  private function f_EPTF_UIHandler_VariableUI_putHoldingwidget(in EPTF_UIHandler_VariableUI_Connection pl_var) 
  runs on EPTF_UIHandler_VariableUI_CT
  return boolean{
    if (ispresent(pl_var.holdingwidgetRef)){
      var integer holdingref := pl_var.holdingwidgetRef
      if (sizeof(v_VariableUI_holdingwidgets)>holdingref and holdingref>=0){
        if (not v_VariableUI_holdingwidgets[holdingref].initialized){
          f_EPTF_UIHandler_VariableUI_debug(log2str("FOOO", v_VariableUI_holdingwidgets, holdingref));
          if (f_EPTF_UIHandlerClient_widgetExists(f_EPTF_UIHandler_VariableUI_getidfromXUL(v_VariableUI_holdingwidgets[holdingref].widget)) 
            == wtUnknown){
            var EPTF_UIHandlerClient_SubsRet addresult :=
            f_EPTF_UIHandlerClient_XSD_addElementToGUI(v_VariableUI_holdingwidgets[holdingref].widget, v_VariableUI_holdingwidgets[holdingref].parentid);
            if(not (addresult == sr_Exists or addresult == sr_Success)){
              f_EPTF_UIHandler_VariableUI_warning("Adding the Holding widget failed!");
              return false;
            }
          }
          v_VariableUI_holdingwidgets[holdingref].initialized := true;
        } else {
          f_EPTF_UIHandler_VariableUI_debug("Holdingwidget already initialized!");  // switch it to false;
          return true;
        }
      } else {
        f_EPTF_UIHandler_VariableUI_warning("No such Refererence exists among the Holdigwidgets");
        if (holdingref == -1){ return true; }
        return false;
      }
    } else {
      return true;
    }
    return true;
  }
  
  // Adding Connections
  private function f_EPTF_UIHandler_VariableUI_addconnection(in EPTF_UIHandler_VariableUI_Connection pl_connection)
  runs on EPTF_UIHandler_VariableUI_CT
  return integer{
    var integer size := sizeof(v_VariableUI_connections);
    v_VariableUI_connections[size] := pl_connection;
    return size;
  }
  
  private function f_EPTF_UIHandler_VariableUI_addfullholdingwidget(in EPTF_UIHandler_VariableUI_Holdingwidget pl_holdingwidget)
  runs on EPTF_UIHandler_VariableUI_CT
  return integer{
    var integer size := sizeof(v_VariableUI_holdingwidgets);
    v_VariableUI_holdingwidgets[size] := pl_holdingwidget;
    return size;
  }
  
  private function f_EPTF_UIHandler_VariableUI_getconnectionIdx(in charstring pl_varname) runs on EPTF_UIHandler_VariableUI_CT return integer{
    for (var integer i:=0; i<sizeof(v_VariableUI_connections);i:=i+1){
      if (v_VariableUI_connections[i].variablename == pl_varname){
        return i;
      }
    }
    return -1;
  }
  
  function f_EPTF_UIHandler_VariableUI_getholdingwidgetIdx(in charstring pl_holdingname) runs on EPTF_UIHandler_VariableUI_CT return integer{
    for (var integer i:=0; i<sizeof(v_VariableUI_holdingwidgets);i:=i+1){
      if (v_VariableUI_holdingwidgets[i].name == pl_holdingname){
        return i;
      }
    }
    return -1;
  }
  
  private function f_EPTF_UIHandler_VariableUI_searchholding(in charstring pl_holdingname) runs on EPTF_UIHandler_VariableUI_CT
  return integer{
    if (pl_holdingname=="JajO5&%AR.z>r$;!oN7Lvc_f") {return -1;}
    for (var integer i:=0; i<sizeof(v_VariableUI_holdingwidgets);i:=i+1){
      if (v_VariableUI_holdingwidgets[i].name == pl_holdingname){return i;}
    }
    return -1;
  }
  
  private function f_EPTF_UIHandler_VariableUI_getidfromXUL(in Widgets pl_widget) 
  runs on EPTF_UIHandler_VariableUI_CT
  return charstring {
    select(pl_widget){
      case({window := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.window.id});
      }
      case({tabpages := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.tabpages.id});
      }
      /* 	case({tabs := ?}){ */
      /* 	  return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.tabs.id}); */
      /* 	} */
      case({tabpage := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.tabpage.id});
      }
      /* 	case({tabpanels := ?}){ */
      /* 	  return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.tabpanels.id}); */
      /* 	} */
      /* 	case({tabpanel := ?}){ */
      /* 	  return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.tabpanel.id}); */
      /* 	} */
      case({tree := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.tree.id});
      }
      /* 	case({treecols := ?}){ */
      /* 	  return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.treecols.id}); */
      /* 	} */
      case({treecol := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.treecol.id});
      }
      /* 	case({treechildren := ?}){ */
      /* 	  return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.treechildren.id}); */
      /* 	} */
      /* 	case({treeitem := ?}){ */
      /* 	  return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.treeitem.id}); */
      /* 	} */
      /* 	case({treerow := ?}){ */
      /* 	  return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.treerow.id}); */
      /* 	} */
      case({treecell := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.treecell.id});
      }
      case({hbox := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.hbox.id});
      }
      case({label_ := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.label_.id});
      }
      case({spacer := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.spacer.id});
      }
      case({button := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.button.id});
      }
      case({textbox := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.textbox.id});
      }
      case({chart := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.chart.id});
      }
      /* 	case({tracelist := ?}){ */
      /* 	  return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.tracelist.id}); */
      /* 	} */
      case({toolbar := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.toolbar.id});
      }
      /* 	case({toolbarelements := ?}){ */
      /* 	  return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.toolbarelements.id}); */
      /* 	} */
      case({toolbarbutton := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.toolbarbutton.id});
      }
      /* 	case({separator := ?}){ */
      /* 	  return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.separator.id}); */
      /* 	} */
      case({listbox := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.listbox.id});
      }
      case({listitem := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.listitem.id});
      }
      case({numericalwidget := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.numericalwidget.id});
      }
      case({menulist := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.menulist.id});
      }
      case({menuitem := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.menuitem.id});
      }
      case({image := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.image.id});
      }
      case ({distributionchart := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.distributionchart.id});
      }
      case ({valuelist := ?}){
        return f_EPTF_UIHandler_XULWidgetId2charstr({pl_widget.valuelist.id});
      }
      case else{
        f_EPTF_UIHandler_VariableUI_debug("Unhandled widget, or widget with no id field");
        return "";
      }
    }
  }
}

group Logging {
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUIr_error
  // 
  //  Purpose:
  //    Function to log an error from UIHandler_VariableUI feature.
  //
  //  Parameters:
  //    - pl_message - *in* *charstring* - the message to log
  //
  //  Return Value:
  //    -
  //
  //  Errors & assertions:
  //    - 
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_VariableUI_error(in charstring pl_message)
  runs on EPTF_UIHandler_VariableUI_CT
  {
    f_EPTF_Logging_error(true, tsp_EPTF_UIHandler_VariableUI_loggingComponentMask&": "&pl_message);
    f_EPTF_Base_stopAll();
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_warning
  // 
  //  Purpose:
  //    Function to log a warning from UIHandler_VariableUI feature.
  //
  //  Parameters:
  //    - pl_message - *in* *charstring* - the message to log
  //
  //  Return Value:
  //    -
  //
  //  Errors & assertions:
  //    - 
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_VariableUI_warning(in @lazy charstring pl_message)
  runs on EPTF_UIHandler_VariableUI_CT
  {
    f_EPTF_Logging_warningV2(pl_message, v_UIHandler_VariableUI_loggingMaskId, {c_EPTF_UIHandler_loggingClassIdx_Warning});
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandler_VariableUI_debug
  // 
  //  Purpose:
  //    Function to log a debug message from UIHandler_VariableUI feature.
  //
  //  Parameters:
  //    - pl_message - *in* *charstring* - the message to log
  //
  //  Return Value:
  //    -
  //
  //  Errors & assertions:
  //    - 
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_VariableUI_debug(in @lazy charstring pl_message)
  runs on EPTF_UIHandler_VariableUI_CT
  {
    f_EPTF_Logging_debugV2(pl_message, v_UIHandler_VariableUI_loggingMaskId, {c_EPTF_UIHandler_loggingClassIdx_Debug});
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_UIHandler_VariableUI_UIHandler_debugEnabled
  // 
  //  Purpose:
  //    Function to check if debug is enabled for UIHandler_VariableUI
  //
  //  Parameters:
  //    -
  //
  //  Return Value:
  //    *boolean* - true if debug enalbed
  //
  //  Errors & assertions:
  //    - 
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandler_VariableUI_debugEnabled()
  runs on EPTF_UIHandler_VariableUI_CT
  return boolean
  {
    return f_EPTF_Logging_isEnabled(v_UIHandler_VariableUI_loggingMaskId, c_EPTF_UIHandler_loggingClassIdx_Debug);
  }
} // group Logging

}
