///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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_UIHandlerClient_Functions
// 
//  Purpose:
//    This module contains the implementation of generic CLL_UIHandlerClient functions.
// 
//  Module depends on:
//    <EPTF_CLL_UIHandler_MsgDefinitions>
//    <EPTF_CLL_UIHandlerClient_Definitions>
//    <EPTF_CLL_UIHandler_Definitions>
//    <EPTF_CLL_Variable_Functions>
//    <EPTF_CLL_Base_Functions>
//    <EPTF_CLL_Semaphore_Functions>
//    <EPTF_CLL_Logging_Definitions>
//    <EPTF_CLL_Logging_Functions>
// 
//  Current Owner:
//    Laszlo Skumat (ELSZSKU)
// 
//  Last Review Date:
//    2007-xx-xx
//
//  Detailed Comments:
//    This module contains the interface functions for the EPTF_UIHandlerClient_CT. 
//
///////////////////////////////////////////////////////////////
module EPTF_CLL_UIHandlerClient_Functions
// [.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_UIHandlerClient_Definitions all;
import from EPTF_CLL_UIHandler_Definitions all;
import from EPTF_CLL_Variable_Definitions all;
import from EPTF_CLL_Variable_Functions all;
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_Semaphore_Functions all;
import from EPTF_CLL_Logging_Definitions all;
import from EPTF_CLL_Logging_Functions all;
import from ttcn_ericsson_se_protocolModules_xtdp_xtdl all;
import from EPTF_CLL_UIHandler_ConvertFunctions all;

//=========================================================================
// Module Parameters
//=========================================================================
modulepar boolean tsp_debug_EPTF_UIHandlerClient_Functions := false;
modulepar float tsp_EPTF_UIHandlerClient_MaxWaitTime := 3.0;
//=========================================================================
// Functions
//=========================================================================
group Public_Functions{
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_init_CT
  //
  //  Purpose:
  //    Initialises the EPTF_UIHandlerClient_CT component
  //
  //  Parameters:
  //    pl_selfName - *in* *charstring* - The name of the component.
  //    pl_DefaultUIHandler - *in* <EPTF_UIHandler_CT> - The default UIHandler 
  //
  //  Detailed Comments:
  //    This function should be called before using the EPTF_UIHandlerClient_CT
  //    component. It initializes the extended EPTF_Var_CT component.
  //    If you use only one UIHandler, you can use the  version of 
  //    subscription functions where there are no subscriber in the parameter list. That
  //    functions will use the default UIHandler as subscriber.
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_init_CT(
    in charstring pl_selfName,
    in EPTF_UIHandler_CT pl_DefaultUIHandler) runs on EPTF_UIHandlerClient_CT {
    if (v_UIHandlerClient_initialized) {
      return;
    }
    f_EPTF_Var_init_CT(pl_selfName);
    f_EPTF_Semaphore_init_CT(pl_selfName);
    f_EPTF_Logging_init_CT(pl_selfName);
    v_UIHandlerClient_loggingMaskId := f_EPTF_Logging_registerComponentMasks(
      tsp_EPTF_UIHandlerClient_loggingComponentMask,
      c_EPTF_UIHandler_loggingEventClasses,
      EPTF_Logging_CLL);
    if(tsp_debug_EPTF_UIHandlerClient_Functions) {
      f_EPTF_Logging_enableLocalMask(v_UIHandlerClient_loggingMaskId, c_EPTF_UIHandler_loggingClassIdx_Debug);
    } else {
      f_EPTF_Logging_disableLocalMask(v_UIHandlerClient_loggingMaskId, c_EPTF_UIHandler_loggingClassIdx_Debug);
    }

    v_UIHandlerClient_pendingMsgCounter := 0;
    v_UIHandlerClient_hangingConnections := {};
    v_UIHandlerClient_openUIConnections := {};
    v_UIHandlerClient_subsRetList := {};
    v_UIHandlerClient_widgetExistsRespList := {};
    v_UIHandlerClient_DefaultUIHandler := pl_DefaultUIHandler;
    v_UIHandlerClient_def := activate(as_handle_main_EPTF_UIHandlerClient_MgmtIf());
    v_UIHandlerClient_initialized := true;
    // register cleanup function
    f_EPTF_Base_registerCleanup(refers(f_EPTF_UIHandlerClient_cleanup_CT));
    //      log("DEBUG: ","----CLL_UIHandlerClient INIT DONE----");
    f_EPTF_UIHandlerClient_debug("----CLL_UIHandlerClient INIT DONE----");
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_defaultUIHandler
  //  Purpose:
  //    Returns the default UIHandler component
  //
  //  Detailed Comments:
  //    See <f_SendSubscribeNoteTo>
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_defaultUIHandler()
  runs on EPTF_UIHandlerClient_CT return EPTF_UIHandler_CT {
    return v_UIHandlerClient_DefaultUIHandler;
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_subscribeMe
  //  Purpose:
  //    Orders the default UIHandler to subscribe to a specified variable 
  //    on this component and optionally connect to a widget
  //
  //  Detailed Comments:
  //    See <f_SendSubscribeNoteTo>
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_subscribeMe ( 
    in charstring pl_providedParamName,
    in charstring pl_destParamName := "",
    in EPTF_UIHandler_WidgetIdString pl_widgetId := "",
    in EPTF_Var_SubscriptionMode pl_subsMode := timeLine,
    in integer pl_refreshRate := -1)
  runs on EPTF_UIHandlerClient_CT{
    f_EPTF_UIHandlerClient_subscribeMeTo( 
      v_UIHandlerClient_DefaultUIHandler, 
      pl_providedParamName,
      pl_destParamName,
      pl_widgetId,
      pl_subsMode,
      pl_refreshRate);
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_subscribeMeTo
  //  Purpose:
  //    Orders an UIHandler to subscribe to a specified variable
  //    on this component and optionally connect to a widget
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_subscribeMeTo ( 
    in EPTF_UIHandler_CT  pl_subscriber,
    in charstring pl_providedParamName,
    in charstring pl_destParamName := "",
    in EPTF_UIHandler_WidgetIdString pl_widgetId := "",
    in EPTF_Var_SubscriptionMode pl_subsMode := timeLine,
    in integer pl_refreshRate := -1)
  runs on EPTF_UIHandlerClient_CT{
    f_EPTF_UIHandlerClient_subscribeTo( 
      v_UIHandlerClient_DefaultUIHandler, 
      self,
      pl_providedParamName,
      pl_destParamName,
      pl_widgetId,
      pl_subsMode,
      pl_refreshRate);
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_subscribe
  //  Purpose:
  //    Orders the default UIHandler to subscribe to a specified variable
  //    on a specified component and optionally connect to a widget
  //
  //  Detailed Comments:
  //    See <f_SendSubscribeNoteTo>
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_subscribe ( 
    in EPTF_Var_CT pl_remoteCompRef,
    in charstring pl_providedParamName,
    in charstring pl_destParamName := "",
    in EPTF_UIHandler_WidgetIdString pl_widgetId := "",
    in EPTF_Var_SubscriptionMode pl_subsMode := timeLine,
    in integer pl_refreshRate := -1)
  runs on EPTF_UIHandlerClient_CT{
    f_EPTF_UIHandlerClient_subscribeTo( 
      v_UIHandlerClient_DefaultUIHandler, 
      pl_remoteCompRef,
      pl_providedParamName,
      pl_destParamName,
      pl_widgetId,
      pl_subsMode,
      pl_refreshRate);
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_subscribeTo
  //  Purpose:
  //    Orders an UIHandler to subscribe to a specified variable
  //    on a specified component and optionally connect to a widget
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_subscribeTo ( 
    in EPTF_UIHandler_CT  pl_subscriber,
    in EPTF_Var_CT pl_remoteCompRef,
    in charstring pl_providedParamName,
    in charstring pl_destParamName := "",
    in EPTF_UIHandler_WidgetIdString pl_widgetId := "",
    in EPTF_Var_SubscriptionMode pl_subsMode := timeLine,
    in integer pl_refreshRate := -1)
  runs on EPTF_UIHandlerClient_CT{
    if (v_UIHandlerClient_maxTimeoutReached) {
      return;
    }
    
    var integer vl_semaphoreId := f_EPTF_Semaphore_new();
    var integer vl_msgId := vl_semaphoreId;//f_EPTF_UIHandlerClient_getMsgId();
    f_EPTF_UIHandlerClient_addVarConnection(
      pl_subscriber, 
      pl_providedParamName,
      vl_msgId);
    v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter + 1;

    v_UIHandlerClient_adminPortIf.send({
        subscribeNoteMsg := {
          remoteCompRef := pl_remoteCompRef,
          providedParamName := pl_providedParamName,
          destParamName := pl_destParamName,
          widgetId := pl_widgetId,
          subsMode := pl_subsMode,
          messageId := vl_msgId,
          refreshRate := pl_refreshRate
        }
      }) to pl_subscriber;
    // wait until subscribe finishes
    if(f_EPTF_Semaphore_waitForUnlock(vl_semaphoreId,tsp_EPTF_UIHandlerClient_MaxWaitTime)) {
      f_EPTF_UIHandlerClient_debug(log2str(%definitionId&
          ": MaxWaitTime expired. No reponse received for subscribeNoteMsg with Id ",vl_semaphoreId, ". Going on..."));
      v_UIHandlerClient_maxTimeoutReached := true;
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_subscribeVariable
  //  Purpose:
  //    Orders the default UIHandler to subscribe to a specified variable
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_subscribeVariable( 
    in charstring             pl_providedParamName,
    in charstring             pl_destParamName,
    in EPTF_Var_SubscriptionMode pl_subsMode := timeLine,
    in integer pl_refreshRate := -1) 
  runs on EPTF_UIHandlerClient_CT{
    f_EPTF_UIHandlerClient_subscribeVariableTo(
      v_UIHandlerClient_DefaultUIHandler, 
      pl_providedParamName, 
      pl_destParamName,
      pl_subsMode,
      pl_refreshRate); 
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_subscribeVariableTo
  //  Purpose:
  //    Orders an UIHandler to subscribe to a specified variable
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_subscribeVariableTo ( 
    in EPTF_UIHandler_CT  pl_subscriber,
    in charstring             pl_providedParamName,
    in charstring             pl_destParamName,
    in EPTF_Var_SubscriptionMode pl_subsMode := timeLine,
    in integer pl_refreshRate := -1) 
  runs on EPTF_UIHandlerClient_CT{
    if (v_UIHandlerClient_maxTimeoutReached) {
      return;
    }
    var integer vl_semaphoreId := f_EPTF_Semaphore_new();
    var integer vl_msgId := vl_semaphoreId;//f_EPTF_UIHandlerClient_getMsgId();
    f_EPTF_UIHandlerClient_addVarConnection(pl_subscriber, pl_providedParamName, vl_msgId);
    v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter + 1;
    v_UIHandlerClient_adminPortIf.send({
        subscribeNoteMsg := {
          remoteCompRef := self,
          providedParamName := pl_providedParamName,
          destParamName := pl_destParamName,
          widgetId := omit,
          subsMode := pl_subsMode,
          messageId := vl_semaphoreId,
          refreshRate := pl_refreshRate
        }
      }) to pl_subscriber;
    // wait until subscribe finishes
    if (f_EPTF_Semaphore_waitForUnlock(vl_semaphoreId,tsp_EPTF_UIHandlerClient_MaxWaitTime)) {
      // max wait time expired, no response received
      f_EPTF_UIHandlerClient_debug(log2str(%definitionId&
          ": MaxWaitTime expired. No reponse received for subscribeNoteMsg with Id ",vl_semaphoreId, ". Going on..."));
      v_UIHandlerClient_maxTimeoutReached := true;
    }
  }

  
  // XSD begin

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_XSD_addElementToGUI
  //  Purpose:
  //    Orders the default UIHandler to add a widget to the runtime GUI
  //    connected to the UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_XSD_addElementToGUI(
    in Widgets pl_xul, 
    in EPTF_UIHandler_WidgetIdString pl_parentWidgetId)
  runs on EPTF_UIHandlerClient_CT
  return EPTF_UIHandlerClient_SubsRet{
    return f_EPTF_UIHandlerClient_XSD_addElementToGUITo( pl_xul, pl_parentWidgetId, v_UIHandlerClient_DefaultUIHandler );
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_XSD_addElementToGUITo
  //  Purpose:
  //    Orders an UIHandler to add a widget to the runtime GUI
  //    connected to the UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_XSD_addElementToGUITo(
    in Widgets pl_xul,
    in EPTF_UIHandler_WidgetIdString pl_parentWidgetId, 
    in EPTF_UIHandler_CT pl_UIHandler)
  runs on EPTF_UIHandlerClient_CT
  return EPTF_UIHandlerClient_SubsRet{  
    if (v_UIHandlerClient_maxTimeoutReached) {
      return sr_Fail;
    }
    var integer vl_semaphoreId := f_EPTF_Semaphore_new();
    f_EPTF_UIHandlerClient_connectUIHandler(pl_UIHandler);
    v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter + 1;
    v_UIHandlerClient_adminPortIf.send(
      t_UIHandler_AdminAddElementToGUI(
        pl_parentWidgetId, 
        vl_semaphoreId, 
        pl_xul)) to pl_UIHandler;
    // wait until reponse is received:
    if (f_EPTF_Semaphore_waitForUnlock(vl_semaphoreId,tsp_EPTF_UIHandlerClient_MaxWaitTime)) {
      f_EPTF_UIHandlerClient_debug(log2str(%definitionId&
          ": MaxWaitTime expired. No reponse received for AddElementToGUI with Id ",vl_semaphoreId, ". Going on..."));
      v_UIHandlerClient_maxTimeoutReached := true;
      return sr_Fail; // max wait timer expired, no response received in time
    }
    return v_UIHandlerClient_subsRetList[vl_semaphoreId];
  }

  // XSD end

  ///////////////////////////////////////////////////////////
  //  Altstep: as_EPTF_UIHandlerClient_handleAddElementToGUIResp
  //  Purpose:
  //    Handles the responses to AddElementToGUI
  ///////////////////////////////////////////////////////////
  private altstep as_EPTF_UIHandlerClient_handleAddElementToGUIResp() runs on EPTF_UIHandlerClient_CT {
    var EPTF_UIHandler_WidgetMsg vl_msg;
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminAddElementToGUIAck(?,?))-> value vl_msg{
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      if(vl_msg.addElementToGUIAck.widgetExists){
        v_UIHandlerClient_subsRetList[vl_msg.addElementToGUIAck.messageID] := sr_Exists;
      }else{
        v_UIHandlerClient_subsRetList[vl_msg.addElementToGUIAck.messageID] := sr_Success;
      }
      f_EPTF_Semaphore_unlock(vl_msg.addElementToGUIAck.messageID);
      repeat;
    };
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminAddElementToGUINAck(?))-> value vl_msg{
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      v_UIHandlerClient_subsRetList[vl_msg.addElementToGUINAck.messageID] := sr_Fail;
      f_EPTF_Semaphore_unlock(vl_msg.addElementToGUINAck.messageID);
      repeat;
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_removeElementFromGUI
  //  Purpose:
  //    Orders the default UIHandler to remove a widget from the runtime GUI
  //    connected to the UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_removeElementFromGUI(
    in EPTF_UIHandler_WidgetIdString pl_Widget2Remove)
  runs on EPTF_UIHandlerClient_CT{
    f_EPTF_UIHandlerClient_removeElementFromGUITo( pl_Widget2Remove, v_UIHandlerClient_DefaultUIHandler );
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_removeElementFromGUITo
  //  Purpose:
  //    Orders an UIHandler to remove a widget from the runtime GUI
  //    connected to the UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_removeElementFromGUITo(
    in EPTF_UIHandler_WidgetIdString pl_Widget2Remove,
    in EPTF_UIHandler_CT pl_UIHandler)
  runs on EPTF_UIHandlerClient_CT{
    if (v_UIHandlerClient_maxTimeoutReached) {
      return;
    }
    f_EPTF_UIHandlerClient_connectUIHandler(pl_UIHandler);
    v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter + 1;
    v_UIHandlerClient_adminPortIf.send(t_UIHandler_AdminRemoveElementFromGUI(pl_Widget2Remove,f_EPTF_UIHandlerClient_getMsgId())) to pl_UIHandler;
    /*     alt{ */
    /*       [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminRemoveElementFromGUIAck(?)){}; */
    /*       [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminRemoveElementFromGUINAck(?)){ */
    /*       } */
    /*     }   */
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_enableGUIElement
  //  Purpose:
  //    Orders the default UIHandler to enable a widget on the runtime GUI
  //    connected to the UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_enableGUIElement(
    in EPTF_UIHandler_WidgetIdString pl_WidgetID)
  runs on EPTF_UIHandlerClient_CT{
    f_EPTF_UIHandlerClient_enableGUIElementTo( pl_WidgetID, v_UIHandlerClient_DefaultUIHandler );
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_enableGUIElementTo
  //  Purpose:
  //    Orders an UIHandler to enable a widget on the runtime GUI
  //    connected to the UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_enableGUIElementTo(
    in EPTF_UIHandler_WidgetIdString pl_WidgetID,
    in EPTF_UIHandler_CT pl_UIHandler)
  runs on EPTF_UIHandlerClient_CT{
    if (v_UIHandlerClient_maxTimeoutReached) {
      return;
    }
    f_EPTF_UIHandlerClient_connectUIHandler(pl_UIHandler);
    v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter + 1;
    v_UIHandlerClient_adminPortIf.send(t_UIHandler_AdminEnableWidgetByWidgetName(pl_WidgetID,f_EPTF_UIHandlerClient_getMsgId())) to pl_UIHandler;
    /*     alt{ */
    /*       [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminEnableWidgetAck(?)){}; */
    /*       [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminEnableWidgetNAck(?)){ */
    /*       } */
    /*     }   */
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_disableGUIElement
  //  Purpose:
  //    Orders the defalut UIHandler to disable a widget on the runtime GUI
  //    connected to the UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_disableGUIElement(
    in EPTF_UIHandler_WidgetIdString pl_WidgetID)
  runs on EPTF_UIHandlerClient_CT{
    f_EPTF_UIHandlerClient_disableGUIElementTo( pl_WidgetID, v_UIHandlerClient_DefaultUIHandler );
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_disableGUIElementTo
  //  Purpose:
  //    Orders an UIHandler to disable a widget on the runtime GUI
  //    connected to the UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_disableGUIElementTo(
    in EPTF_UIHandler_WidgetIdString pl_WidgetID,
    in EPTF_UIHandler_CT pl_UIHandler)
  runs on EPTF_UIHandlerClient_CT{
    if (v_UIHandlerClient_maxTimeoutReached) {
      return;
    }
    f_EPTF_UIHandlerClient_connectUIHandler(pl_UIHandler);
    v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter + 1;
    v_UIHandlerClient_adminPortIf.send(t_UIHandler_AdminDisableWidgetByWidgetName(pl_WidgetID,f_EPTF_UIHandlerClient_getMsgId())) to pl_UIHandler;
    /*     alt{ */
    /*       [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminDisableWidgetAck(*)){}; */
    /*       [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminDisableWidgetNAck(*)){ */
    /*       } */
    /*     }   */
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_setFocusToGUIElement
  //  Purpose:
  //    Orders the default UIHandler to set a widget being focused on the runtime GUI
  //    connected to the UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_setFocusToGUIElement(
    in EPTF_UIHandler_WidgetIdString pl_WidgetID)
  runs on EPTF_UIHandlerClient_CT{
    f_EPTF_UIHandlerClient_setFocusToGUIElementTo( pl_WidgetID, v_UIHandlerClient_DefaultUIHandler );
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_setFocusToGUIElementTo
  //  Purpose:
  //    Orders an UIHandler to set a widget being focused on the runtime GUI
  //    connected to the UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_setFocusToGUIElementTo(
    in EPTF_UIHandler_WidgetIdString pl_WidgetID,
    in EPTF_UIHandler_CT pl_UIHandler)
  runs on EPTF_UIHandlerClient_CT{
    if (v_UIHandlerClient_maxTimeoutReached) {
      return;
    }
    f_EPTF_UIHandlerClient_connectUIHandler(pl_UIHandler);
    v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter + 1;
    v_UIHandlerClient_adminPortIf.send(t_UIHandler_AdminSetFocusToWidget(pl_WidgetID,f_EPTF_UIHandlerClient_getMsgId())) to pl_UIHandler;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_setFocusToTab
  //  Purpose:
  //    Orders the default UIHandler to select a particular tab
  //    of a tabbox on the runtime GUI connected to the UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_setFocusToTab(
    in EPTF_UIHandler_WidgetIdString pl_TabboxID,
    in integer pl_TabIndex)
  runs on EPTF_UIHandlerClient_CT{
    f_EPTF_UIHandlerClient_setFocusToTabTo( pl_TabboxID, pl_TabIndex, v_UIHandlerClient_DefaultUIHandler );
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_setFocusToTabTo
  //  Purpose:
  //    Orders an UIHandler to select a particular tab of a tabbox
  //    of a tabbox on the runtime GUI connected to the UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_setFocusToTabTo(
    in EPTF_UIHandler_WidgetIdString pl_TabboxID,
    in integer pl_TabIndex,
    in EPTF_UIHandler_CT pl_UIHandler)
  runs on EPTF_UIHandlerClient_CT{
    if (v_UIHandlerClient_maxTimeoutReached) {
      return;
    }
    f_EPTF_UIHandlerClient_connectUIHandler(pl_UIHandler);
    v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter + 1;
    v_UIHandlerClient_adminPortIf.send(t_UIHandler_AdminSetFocusToWidget(
        pl_TabboxID,f_EPTF_UIHandlerClient_getMsgId(), pl_TabIndex)) to pl_UIHandler;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_widgetExists
  //  Purpose:
  //    Checks whether the widget exists on the runtime GUI
  //    connected to the default UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_widgetExists(
    in EPTF_UIHandler_WidgetIdString pl_WidgetID)
  runs on EPTF_UIHandlerClient_CT
  return EPTF_UIHandler_HandledWidgetType{
    return f_EPTF_UIHandlerClient_widgetExistsOn(pl_WidgetID,v_UIHandlerClient_DefaultUIHandler );  
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_widgetExistsOn
  //  Purpose:
  //    Checks whether the widget exists on the runtime GUI
  //    connected to the specified UIHandler
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_widgetExistsOn(
    in EPTF_UIHandler_WidgetIdString pl_WidgetID,
    in EPTF_UIHandler_CT pl_UIHandler)
  runs on EPTF_UIHandlerClient_CT
  return EPTF_UIHandler_HandledWidgetType{
    if (v_UIHandlerClient_maxTimeoutReached) {
      return wtUnknown;
    }
    var integer vl_semaphoreId := f_EPTF_Semaphore_new();
    var EPTF_UIHandler_WidgetMsg vl_msg;
    f_EPTF_UIHandlerClient_connectUIHandler(pl_UIHandler);
    v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter + 1;
    v_UIHandlerClient_adminPortIf.send(t_UIHandler_AdminWidgetExists(pl_WidgetID,vl_semaphoreId)) to pl_UIHandler;
    // wait until reponse is received:
    if (f_EPTF_Semaphore_waitForUnlock(vl_semaphoreId,tsp_EPTF_UIHandlerClient_MaxWaitTime)) {
      f_EPTF_UIHandlerClient_debug(log2str(%definitionId&
          ": MaxWaitTime expired. No reponse received for WidgetExists with Id ",vl_semaphoreId, ". Going on..."));
      v_UIHandlerClient_maxTimeoutReached := true;
      return wtUnknown; // max wait timer expired, no response received in time
    }
    return v_UIHandlerClient_widgetExistsRespList[vl_semaphoreId];
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_createGUI
  //  Purpose:
  //    Handles the responses to createGUI
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_createGUI(
    in charstring pl_xul,
    in charstring pl_parentWidgetId := "" )
  runs on EPTF_UIHandlerClient_CT
  return EPTF_UIHandlerClient_SubsRet {
    if (v_UIHandlerClient_maxTimeoutReached) {
      return sr_Fail;
    }
    var integer vl_semaphoreId := f_EPTF_Semaphore_new();
    f_EPTF_UIHandlerClient_connectUIHandler(v_UIHandlerClient_DefaultUIHandler);
    v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter + 1;
    v_UIHandlerClient_adminPortIf.send(
      t_UIHandler_AdminCreateGUI( pl_xul, pl_parentWidgetId, vl_semaphoreId )) to v_UIHandlerClient_DefaultUIHandler;
    // wait until reponse is received:
    if (f_EPTF_Semaphore_waitForUnlock(vl_semaphoreId,tsp_EPTF_UIHandlerClient_MaxWaitTime)) {
      f_EPTF_UIHandlerClient_debug(log2str(%definitionId&
          ": MaxWaitTime expired. No reponse received for createGUI with Id ",vl_semaphoreId, ". Going on..."));
      v_UIHandlerClient_maxTimeoutReached := true;
      return sr_Fail; // max wait timer expired, no response received in time
    }
    return v_UIHandlerClient_subsRetList[vl_semaphoreId];
  }

  ///////////////////////////////////////////////////////////
  //  Altstep: as_EPTF_UIHandlerClient_handleCreateGUIResp
  //  Purpose:
  //    Handles the responses to createGUI
  ///////////////////////////////////////////////////////////
  private altstep as_EPTF_UIHandlerClient_handleCreateGUIResp() runs on EPTF_UIHandlerClient_CT {
    var EPTF_UIHandler_WidgetMsg vl_msg;
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminCreateGUIAck(?))-> value vl_msg{
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      v_UIHandlerClient_subsRetList[vl_msg.createGUIAck.messageID] := sr_Success;
      f_EPTF_Semaphore_unlock(vl_msg.createGUIAck.messageID);
      repeat;
    };
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminCreateGUINAck(?))-> value vl_msg{
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      v_UIHandlerClient_subsRetList[vl_msg.createGUINAck.messageID] := sr_Fail;
      f_EPTF_Semaphore_unlock(vl_msg.createGUINAck.messageID);
      repeat;
    }
  }
  
  ///////////////////////////////////////////////////////////
  //  Altstep: as_EPTF_UIHandlerClient_handleWidgetExistsResp
  //  Purpose:
  //    Handles the response to the WidgetExists message
  ///////////////////////////////////////////////////////////
  private altstep as_EPTF_UIHandlerClient_handleWidgetExistsResp() runs on EPTF_UIHandlerClient_CT {
    var EPTF_UIHandler_WidgetMsg vl_msg;
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminWidgetExistsResp(*, *, *))-> value vl_msg{
      v_UIHandlerClient_widgetExistsRespList[vl_msg.widgetExistsResp.messageID] := vl_msg.widgetExistsResp.widgetType;
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      f_EPTF_Semaphore_unlock(vl_msg.widgetExistsResp.messageID);
      repeat;
    }
  }

  ///////////////////////////////////////////////////////////
  //  Group: GUIConvenienceFunctions
  //  Purpose:
  //    This group of functions allows adding different kind of 
  //    widgets to the GUI easely
  ///////////////////////////////////////////////////////////
  group GUIConvenienceFunctions {

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_XUL_addButton
    //  Purpose:
    //    Adds a new button to the GUI
    ///////////////////////////////////////////////////////////
    public function f_EPTF_UIHandlerClient_XUL_addButton(
      in charstring pl_parentWidgetId,
      in charstring pl_widgetId,
      in charstring pl_label,
      in template float pl_flex := omit, 
      in boolean pl_checked := false,
      in boolean pl_disabled := false,
      in template charstring pl_type := omit, 
      in template charstring pl_imageId := omit) 
    runs on EPTF_UIHandlerClient_CT
    return boolean
    {
      var Widgets vl_xul := {
        button := {
          /*checked :=*/ pl_checked,
          /*customclass := */ omit,
          /*disabled :=*/ pl_disabled,
          /*disabledongui := */ omit,
          /*flex :=*/ valueof(pl_flex),
          /*id :=*/ pl_widgetId,
          /*imageid :=*/ valueof(pl_imageId),
          /*label_ :=*/ pl_label,
          /*tooltiptext :=*/ omit,
          /*type_ :=*/ valueof(pl_type),
          /*externaldata :=*/ omit
        }
      }
      return f_EPTF_UIHandlerClient_XUL_XSD_addWidget(vl_xul, pl_parentWidgetId); 
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_XUL_addSpacer
    //  Purpose:
    //    Adds a new spacer to the GUI
    ///////////////////////////////////////////////////////////
    public function f_EPTF_UIHandlerClient_XUL_addSpacer(in charstring pl_parentWidgetId, in float pl_flex)
    runs on EPTF_UIHandlerClient_CT
    return boolean
    {
      var Widgets vl_xul := {
        spacer := {
          /*flex :=*/ pl_flex,
          /*id :=*/ omit
        }
      }
      return f_EPTF_UIHandlerClient_XUL_XSD_addWidget(vl_xul, pl_parentWidgetId); 
    }


    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_XUL_addLabel
    //  Purpose:
    //    Adds a new taxt label to the GUI
    ///////////////////////////////////////////////////////////
    public function f_EPTF_UIHandlerClient_XUL_addLabel(in charstring pl_parentWidgetId, in charstring pl_text)
    runs on EPTF_UIHandlerClient_CT
    return boolean
    {
      var Widgets vl_xul := {
        label_ := {
          /*customclass := */ omit,
          /*disabled :=*/ omit,
          /*disabledongui := */ omit,
          /*flex :=*/ omit,
          /*id:=*/ omit,
          /*style:=*/ omit,
          /*tooltiptext :=*/ omit,
          /*value_ :=*/ pl_text,
          /*externaldata :=*/ omit
        }
      }
      return f_EPTF_UIHandlerClient_XUL_XSD_addWidget(vl_xul, pl_parentWidgetId); 
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_XUL_addEmptyHbox
    //  Purpose:
    //    Adds a new empty HBox to the GUI
    ///////////////////////////////////////////////////////////
    public function f_EPTF_UIHandlerClient_XUL_addEmptyHbox(
      in charstring pl_parentWidgetId,
      in template charstring pl_widgetId, 
      in template float pl_flex := omit, 
      in boolean pl_horizontal := true,
      in template boolean pl_disabled := omit,
      in template boolean pl_scrollable := omit,
      in template Fixedpositions pl_fixedPosition := omit)
    runs on EPTF_UIHandlerClient_CT
    return boolean
    {
      var template Widgets vl_xul := {
        hbox := {
          /*customclass := */ omit,
          /*disabled :=*/ pl_disabled,
          /*disabledongui := */ omit,
          /*fixedposition :=*/ pl_fixedPosition,
          /*flex :=*/ pl_flex,
          /*id :=*/ pl_widgetId,
          /*orientation :=*/ vertical,
          /*scrollable :=*/ pl_scrollable,
          /*embeddedwidgets :=*/ {{}}
        }
      }
      if(pl_horizontal) { vl_xul.hbox.orientation := horizontal; }
      return f_EPTF_UIHandlerClient_XUL_XSD_addWidget(valueof(vl_xul), pl_parentWidgetId); 
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_XUL_addEmptyTabbox
    //  Purpose:
    //    Adds a new TabBox to the GUI
    ///////////////////////////////////////////////////////////
    public function f_EPTF_UIHandlerClient_XUL_XSD_addEmptyTabbox(
      in charstring pl_parentWidgetId,
      in charstring pl_widgetId,
      in template float pl_flex:=omit, 
      in template Tablayout pl_listcard:=omit,
      in template boolean pl_disabled := omit)
    runs on EPTF_UIHandlerClient_CT
    return boolean
    {
      template Widgets vl_xul := {
        tabpages := {
          /*customclass := */ omit,
          /*disabled :=*/ omit,
          /*disabledongui := */ omit,
          /*flex :=*/ pl_flex,
          /*id :=*/ pl_widgetId,
          /*layout :=*/ pl_listcard,
          /*tabpages :=*/ {{}}
        }
      }
      return f_EPTF_UIHandlerClient_XUL_XSD_addWidget(valueof(vl_xul), pl_parentWidgetId); 
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_XUL_addEmptyTabpages
    //  Purpose:
    //    Adds a new TabBox to the GUI
    ///////////////////////////////////////////////////////////
    public function f_EPTF_UIHandlerClient_XUL_XSD_addEmptyTabpages(
      in charstring pl_parentWidgetId,
      in charstring pl_widgetId,
      in template float pl_flex:=omit, 
      in template Tablayout pl_listcard:=omit,
      in template boolean pl_disabled := omit)
    runs on EPTF_UIHandlerClient_CT
    return boolean
    {
      template Widgets vl_xul := {
        tabpages := {
          /*customclass := */ omit,
          /*disabled :=*/ omit,
          /*disabledongui := */ omit,
          /*flex :=*/ pl_flex,
          /*id :=*/ pl_widgetId,
          /*layout :=*/ pl_listcard,
          /*tabpages :=*/ {{}}
        }
      }
      return f_EPTF_UIHandlerClient_XUL_XSD_addWidget(valueof(vl_xul), pl_parentWidgetId); 
    }
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_XUL_addTabpanel
    //  Purpose:
    //    Adds a new TabPanel to the GUI
    ///////////////////////////////////////////////////////////
    public function f_EPTF_UIHandlerClient_XUL_addTabpanel(
      in charstring pl_parentWidgetId,
      in charstring pl_widgetId,
      in template float pl_maxheight:=omit, 
      in boolean pl_horizontal := true)
    runs on EPTF_UIHandlerClient_CT
    return boolean
    {
      template Widgets vl_xul := {
        tabpage := {
          /*customclass := */ omit,
          /*disabledongui := */ omit,
          /*id :=*/ pl_widgetId,
          /* label := */ "",
          /*maxheight :=*/ pl_maxheight,
          /*orientation :=*/ vertical,
          /*tooltiptext :=*/ omit,
          /*embeddedwidgets :=*/ {{}}
        }
      }
      if(pl_horizontal) { 

        //vl_xul.xtdp_tabpanel.orient := "horizontal"; 
        f_EPTF_UIHandlerClient_warning(log2str(%definitionId&
            ": horizontal tabpanel is not allowed"));
      }
      return f_EPTF_UIHandlerClient_XUL_XSD_addWidget(valueof(vl_xul), pl_parentWidgetId); 
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_XUL_addTab
    //  Purpose:
    //    Adds a new Tab to the GUI
    ///////////////////////////////////////////////////////////
    public function f_EPTF_UIHandlerClient_XUL_addTab(
      in charstring pl_parentWidgetId,
      in charstring pl_widgetId,
      in charstring pl_label)
    runs on EPTF_UIHandlerClient_CT
    return boolean
    { 
     
      var Widgets vl_xul := { tabpage := c_EPTF_UIHandler_emptyTabpage };
      vl_xul.tabpage.id := pl_widgetId;
      vl_xul.tabpage.label_ := pl_label;
      vl_xul.tabpage.orientation := vertical;
/*
    XSD.String customclass optional,
    XSD.Boolean disabledongui optional,
+    XSD.String id optional,
+    XSD.String label_,
    XSD.Decimal maxheight optional,
+    Orientation orientation optional,
    XSD.String tooltiptext optional,
    Embeddedwidgets embeddedwidgets
*/       
      vl_xul.tabpage.customclass := omit;
      vl_xul.tabpage.disabledongui := omit;
      vl_xul.tabpage.maxheight := omit;
      vl_xul.tabpage.tooltiptext := omit;
      vl_xul.tabpage.embeddedwidgets := {};
      return f_EPTF_UIHandlerClient_XUL_XSD_addWidget(vl_xul, pl_parentWidgetId); 
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_XUL_addEmptyChart
    //  Purpose:
    //    Adds a new chart to the GUI
    ///////////////////////////////////////////////////////////
    public function f_EPTF_UIHandlerClient_XUL_addEmptyChart(
      in charstring pl_parentWidgetId,
      in charstring pl_chartWidgetId,
      in template float pl_flex := omit,
      in charstring pl_title := "Zoomable History chart (click to zoom out)",
      in boolean pl_zoomable := true,
      in template charstring pl_axisXType := omit,
      in template charstring pl_axisYType := omit,
      in template charstring pl_fgColor := omit,
      in template charstring pl_bgColor := omit,
      in template charstring pl_gridColor := omit
    )
    runs on EPTF_UIHandlerClient_CT 
    return boolean
    {
      var template Widgets vl_xul := {
        chart := {
          /*axisXType :=*/ omit,
          /*axisYType :=*/ omit,
          /*backgroundColor :=*/ pl_fgColor,
          /*customclass := */ omit,
          /*disabled :=*/ omit,
          /*disabledongui := */ omit,
          /*flex :=*/ pl_flex,
          /*foregroundColor :=*/  pl_fgColor,
          /*gridColor :=*/ pl_gridColor,
          /*gridX :=*/ true,
          /*gridY :=*/ true,
          /*id :=*/ pl_chartWidgetId,
          /*title :=*/ pl_title,
          /*tooltiptext :=*/ omit,
          /*zoomable :=*/ pl_zoomable ,
          /*choice_list :=*/ {{}}
        }
      }

      var AxisType vl_axisXType;

      // Gigahack with ethjgi's recommendation was log2str!= omit 
      if ( isvalue(pl_axisXType)) {
        f_EPTF_UIHandler_convertAxisType(valueof(pl_axisXType), vl_axisXType);
        vl_xul.chart.axisXType := vl_axisXType
      }

      var AxisType vl_axisYType;

      // Gigahack with ethjgi's recommendation was log2str!= omit 
      if ( isvalue(pl_axisYType)) {
        f_EPTF_UIHandler_convertAxisType(valueof(pl_axisYType), vl_axisYType);
        vl_xul.chart.axisYType := vl_axisYType
      }

      return f_EPTF_UIHandlerClient_XUL_XSD_addWidget(valueof(vl_xul), pl_parentWidgetId); 
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_XUL_addTrace2Chart
    //  Purpose:
    //    Adds a new trace to a chart on the GUI
    ///////////////////////////////////////////////////////////
    public function f_EPTF_UIHandlerClient_XUL_addTrace2Chart(
      in charstring pl_parentWidgetId,
      in charstring pl_traceWidgetId,
      in charstring pl_name,
      in template charstring pl_unitX := "Time",
      in template charstring pl_unitY := "Value",
      in template integer pl_maxpoints:=omit,
      in template charstring pl_color := omit,
      in template boolean pl_fill := false  
    )
    runs on EPTF_UIHandlerClient_CT 
    return boolean
    {
      var template Widgets vl_xul := {
        trace := {
          /*color :=*/ pl_color,
          /*fill :=*/ pl_fill,
          /*id :=*/ pl_traceWidgetId,
          /*maxPoints :=*/ omit,
          /*name :=*/ pl_name,
          /*physicalUnitX :=*/ pl_unitX,
          /*physicalUnitY :=*/ pl_unitY,
          /*tooltiptext :=*/ omit,
          /*externaldata :=*/ omit,
          /*choice_list :=*/ {}
        }
      }

      // Gigahack with ethjgi's recommendation was log2str!= omit 
      if ( isvalue(pl_maxpoints)) {
        vl_xul.trace.maxPoints := valueof(pl_maxpoints);
      }

      return f_EPTF_UIHandlerClient_XUL_XSD_addWidget(valueof(vl_xul), pl_parentWidgetId); 
    }

  } // end of convenience functions group

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_logAll
  //  Purpose:
  //    Logs all internal variable in EPTF_UIHandlerClient_CT
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_logAll() runs on EPTF_UIHandlerClient_CT {
    log("------Content of EPTF_UIHandlerClient_CT: -------");

    log("v_UIHandlerClient_initialized: ", v_UIHandlerClient_initialized);
    log("f_EPTF_Base_selfName(): ",f_EPTF_Base_selfName());
    log("v_UIHandlerClient_hangingConnections: ", v_UIHandlerClient_hangingConnections);
    log("v_UIHandlerClient_openUIConnections: ",v_UIHandlerClient_openUIConnections);
    log("v_UIHandlerClient_def: ",v_UIHandlerClient_def);
    log("v_UIHandlerClient_DefaultUIHandler: ",v_UIHandlerClient_DefaultUIHandler);
    log("v_UIHandlerClient_lastRequest: ",v_UIHandlerClient_lastRequest);
    log("------Finished Content of EPTF_UIHandlerClient_CT -------");
  }//f_
} // end of public functions group

//------------------------------------------------------------------------------
// private
//------------------------------------------------------------------------------
group EPTF_UIHandlerClient_Private_Functions{
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_getMsgId
  //  Purpose:
  //    Increases the message counter and retrieves the new value
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandlerClient_getMsgId()  
  runs on EPTF_UIHandlerClient_CT 
  return integer{
    v_UIHandlerClient_lastRequest := v_UIHandlerClient_lastRequest + 1;
    return v_UIHandlerClient_lastRequest;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_handleSubsNoteAck
  // 
  //  Purpose:
  //    Handles the acceptance response for a sent subscription note.
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandlerClient_handleSubsNoteAck(
    in integer pl_msgId,
    in EPTF_UIHandler_CT pl_EPTF_CLL_UISubscMgmtMsg_sender)
  runs on EPTF_UIHandlerClient_CT {
    if( not f_EPTF_UIHandlerClient_removeHangingVarConnection(pl_msgId)){ 
      //      log("ERROR: "",Invalid hanging connection response!");
      f_EPTF_UIHandlerClient_error("Invalid hanging connection response!");
      //f_EPTF_Base_stop(); 
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_handleSubsNoteNAck
  // 
  //  Purpose:
  //    Handles the refusion response for a sent subscription note.
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandlerClient_handleSubsNoteNAck(
    in integer pl_messageId,
    in EPTF_UIHandler_CT pl_EPTF_CLL_UISubscMgmtMsg_sender)
  runs on EPTF_UIHandlerClient_CT {
    var EPTF_UIHandlerClient_HangingConnection vl_conn;
    if(f_EPTF_UIHandlerClient_getVarConnection(pl_messageId, vl_conn)){
      //      log("ERROR: ","Subscription note to variable ",vl_conn.varName," has been refused.");
      f_EPTF_UIHandlerClient_error("Subscription note to the variable has been refused.");
    }else{
      //      log("ERROR: "",Invalid hanging connection response!");
      f_EPTF_UIHandlerClient_error( "Invalid hanging connection response!");
      //f_EPTF_Base_stop(); 
    }
  }

  ///////////////////////////////////////////////////////////
  //  Altstep: as_UIHandlerClient_handleSubsNoteResp
  // 
  //  Purpose:
  //    Handles the responses for a sent subscription note.
  ///////////////////////////////////////////////////////////
  private altstep as_UIHandlerClient_handleSubsNoteResp() 
  runs on EPTF_UIHandlerClient_CT{
    var EPTF_UIHandler_WidgetMsg vl_EPTF_CLL_UISubscMgmtMsg;
    var EPTF_UIHandler_CT vl_EPTF_CLL_UISubscMgmtMsg_sender;
    //There is no NAck, then it simple stops
    [] v_UIHandlerClient_adminPortIf.receive( {subscribeAck := ?} ) -> 
    value vl_EPTF_CLL_UISubscMgmtMsg 
    sender vl_EPTF_CLL_UISubscMgmtMsg_sender {
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      f_EPTF_UIHandlerClient_handleSubsNoteAck(
        vl_EPTF_CLL_UISubscMgmtMsg.subscribeAck.requestId,
        vl_EPTF_CLL_UISubscMgmtMsg_sender);
      f_EPTF_Semaphore_unlock(vl_EPTF_CLL_UISubscMgmtMsg.subscribeAck.requestId);
      repeat;
    }
    [] v_UIHandlerClient_adminPortIf.receive( {subscribeNAck := ?} ) -> 
    value vl_EPTF_CLL_UISubscMgmtMsg 
    sender vl_EPTF_CLL_UISubscMgmtMsg_sender {
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      f_EPTF_UIHandlerClient_handleSubsNoteNAck(
        vl_EPTF_CLL_UISubscMgmtMsg.subscribeNAck.requestId,
        vl_EPTF_CLL_UISubscMgmtMsg_sender);
      f_EPTF_Semaphore_unlock(vl_EPTF_CLL_UISubscMgmtMsg.subscribeNAck.requestId);
      repeat;
    }
  }

  ///////////////////////////////////////////////////////////
  //  Altstep: as_handle_main_EPTF_UIHandlerClient_MgmtIf
  // 
  //  Purpose:
  //    The main altstep of the UIHandlerClient.
  ///////////////////////////////////////////////////////////
  private altstep as_handle_main_EPTF_UIHandlerClient_MgmtIf() runs on EPTF_UIHandlerClient_CT {
    [] as_UIHandlerClient_handleSubsNoteResp();
    [] as_EPTF_UIHandlerClient_handleAddElementToGUIResp();
    [] as_EPTF_UIHandlerClient_handleCreateGUIResp();
    [] as_EPTF_UIHandlerClient_handleWidgetExistsResp();
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminEnableWidgetAck(?)){
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      repeat;
    }; 
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminEnableWidgetNAck(?)){
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      repeat;
    }; 
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminDisableWidgetAck(*)){
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      repeat;
    }; 
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminDisableWidgetNAck(*)){
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      repeat;
    }; 
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminSetFocusToWidgetAck(*)){
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      repeat;
    }; 
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminSetFocusToWidgetNAck(*)){
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      repeat;
    }; 
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminRemoveElementFromGUIAck(?)){
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      repeat;
    }; 
    [] v_UIHandlerClient_adminPortIf.receive(t_UIHandler_AdminRemoveElementFromGUINAck(?)){
      v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
      repeat;
    }; 
  }
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_cleanup_CT
  //  Purpose:
  //    Closes the open management ports
  //  Detailed Comments:
  //    This function mustn't be called directly. You must call f_EPTF_Base_cleanup_CT instead.
  ///////////////////////////////////////////////////////////
  private function f_EPTF_UIHandlerClient_cleanup_CT() runs on EPTF_UIHandlerClient_CT {
    if (v_UIHandlerClient_initialized) {

      // wait for receiving all pending messages
      timer t_wait := 0.0;
      t_wait.start;
      timer t_maxWait := tsp_EPTF_UIHandlerClient_maxKillTime;
      t_maxWait.start;
      f_EPTF_UIHandlerClient_debug(log2str(%definitionId&": Waiting for all UIHandler Clients to stop..."));
      var EPTF_UIHandler_WidgetMsg vl_msg;
      alt {
        [v_UIHandlerClient_pendingMsgCounter == 0 or v_UIHandlerClient_maxTimeoutReached] t_wait.timeout;
        [] t_maxWait.timeout {
          f_EPTF_UIHandlerClient_warning(log2str(%definitionId&
              ": MaxWaitTime expired. Not all the pending messages received (still pending:",v_UIHandlerClient_pendingMsgCounter,"). Exiting anyway..."));
        }
        // drop all messages to prevent deadlock (cleanup blocks the function in the alt that calls TP.receive to wait for answer e.g: subscribeMe):
        [] v_UIHandlerClient_adminPortIf.receive(?) -> value vl_msg{
          v_UIHandlerClient_pendingMsgCounter := v_UIHandlerClient_pendingMsgCounter - 1;
          f_EPTF_UIHandlerClient_debug(log2str(
              ": Unexpected message received during cleanup. Message dropped: ",vl_msg));
          repeat;
        }; 
      }

      // iterate through the connected UIHandlers and disconnect them
      for( var integer i := 0; i < sizeof(v_UIHandlerClient_openUIConnections); i := i + 1 ){
        if(v_UIHandlerClient_openUIConnections[i] != null) {
          f_EPTF_UIHandlerClient_closeUIPortToIdx(i);
        }
      }
    }
    v_UIHandlerClient_pendingMsgCounter := 0;
    v_UIHandlerClient_hangingConnections := {};
    //v_openConnections := {};
    v_UIHandlerClient_openUIConnections := {};
    v_UIHandlerClient_initialized := false;
    deactivate(v_UIHandlerClient_def)
    //    log("DEBUG: ","----CLL_UIHandlerClient cleanup DONE----");
    f_EPTF_UIHandlerClient_debug("----CLL_UIHandlerClient cleanup DONE----");
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_UIHandlerClient_XUL_addWidget
  //  Purpose:
  //    Adds a widget to the GUI
  //  Detailed Comments:
  //    This function is used by the convenience functions.
  ///////////////////////////////////////////////////////////
  public function f_EPTF_UIHandlerClient_XUL_XSD_addWidget(in Widgets pl_xul, in charstring pl_parentWidgetId) 
  runs on EPTF_UIHandlerClient_CT
  return boolean 
  {
    if(sr_Success != f_EPTF_UIHandlerClient_XSD_addElementToGUI(pl_xul, pl_parentWidgetId)) {
      f_EPTF_UIHandlerClient_debug(log2str("Could not add element to GUI: ", pl_xul, ", parent:", pl_parentWidgetId));
      return false;
    }
    return true;
  } 

  ///////////////////////////////////////////////////////////
  //  Group: UIHandlerClient_SubscriptionAdministration
  //  Purpose:
  //    Administers the hanging subscriptions from sending to 
  //    the arrival of the ACK or the NACK 
  ///////////////////////////////////////////////////////////
  group UIHandlerClient_SubscriptionAdministration{
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_removeHangingVarConnection
    //  Purpose:
    //    Clears the record about the given subscription
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandlerClient_removeHangingVarConnection(in integer pl_messageId) 
    runs on EPTF_UIHandlerClient_CT
    return boolean{
      var integer vl_i := f_EPTF_UIHandlerClient_varConnectionIndex(pl_messageId);
      if(-1 == vl_i){ return false;};
      v_UIHandlerClient_hangingConnections[vl_i] := {null,"",-1};
      return true;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_varConnectionIndex
    //  Purpose:
    //    Returns the index of the hanging subscription note record
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandlerClient_varConnectionIndex(in integer pl_messageId) 
    runs on EPTF_UIHandlerClient_CT
    return integer {
      for( var integer i := 0; i < sizeof(v_UIHandlerClient_hangingConnections); i := i + 1 ){
        if(v_UIHandlerClient_hangingConnections[i].messagId == pl_messageId) { return i; }
      }
      return -1;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_getVarConnection
    //  Purpose:
    //    Returns the hanging subscription note record
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandlerClient_getVarConnection(
      in integer pl_messageId, 
      out EPTF_UIHandlerClient_HangingConnection pl_hangingConnection) 
    runs on EPTF_UIHandlerClient_CT 
    return boolean{
      var integer vl_connIdx := f_EPTF_UIHandlerClient_varConnectionIndex(pl_messageId);
      if(-1 == vl_connIdx){
        pl_hangingConnection := v_UIHandlerClient_hangingConnections[vl_connIdx];
      }
      return -1 != vl_connIdx;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_addVarConnection
    //  Purpose:
    //    Adds a record about the subscription note to the list
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandlerClient_addVarConnection(
      in EPTF_UIHandler_CT pl_RemoteCompRef,
      in charstring pl_ProvidedParamName,
      in integer pl_messageId) 
    runs on EPTF_UIHandlerClient_CT {
      var EPTF_UIHandlerClient_HangingConnection vl_hangingConnection := {pl_RemoteCompRef,pl_ProvidedParamName,pl_messageId};
      if( -1 == f_EPTF_UIHandlerClient_varConnectionIndex(pl_messageId) ) {
        v_UIHandlerClient_hangingConnections[sizeof(v_UIHandlerClient_hangingConnections)] := vl_hangingConnection;
      };
      f_EPTF_UIHandlerClient_connectUIHandler(pl_RemoteCompRef);
    }
  }  // end of subscription admin group 

  ///////////////////////////////////////////////////////////
  //  Group: UIHandlerClient_PortAdministration
  //  Purpose:
  //    Administers the connected <v_UIHandlerClient_adminPortIf> ports
  ///////////////////////////////////////////////////////////
  group UIHandlerClient_PortAdministration{

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_connectUIHandler
    //  Purpose:
    //    Connects the v_UIHandlerClient_adminPortIf port to the specified 
    //    UIHandler and registers the connection
    ///////////////////////////////////////////////////////////
    //UI connection handling
    private function f_EPTF_UIHandlerClient_connectUIHandler(
      in EPTF_UIHandler_CT pl_RemoteCompRef) 
    runs on EPTF_UIHandlerClient_CT {
      if( -1 == f_EPTF_UIHandlerClient_connectionIndex(pl_RemoteCompRef) ) {
        connect(self:v_UIHandlerClient_adminPortIf,pl_RemoteCompRef:EPTF_adminPort_CP);
        v_UIHandlerClient_openUIConnections[sizeof(v_UIHandlerClient_openUIConnections)] := pl_RemoteCompRef;
      };
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_connectionIndex
    //  Purpose:
    //    Returns the index of the open connection record
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandlerClient_connectionIndex(in EPTF_UIHandler_CT pl_handler) 
    runs on EPTF_UIHandlerClient_CT
    return integer {
      for( var integer i := 0; i < sizeof(v_UIHandlerClient_openUIConnections); i := i + 1 ){
        if(v_UIHandlerClient_openUIConnections[i] == pl_handler) { return i; }
      }
      return -1;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_closeUIPortToIdx
    //  Purpose:
    //    Closes the specified connection
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandlerClient_closeUIPortToIdx(in integer pl_handlerIdx)
    runs on EPTF_UIHandlerClient_CT{
      disconnect(self:v_UIHandlerClient_adminPortIf, v_UIHandlerClient_openUIConnections[pl_handlerIdx]:EPTF_adminPort_CP); 
      v_UIHandlerClient_openUIConnections[pl_handlerIdx] := null;
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_closeUIPortToUIHandler
    //  Purpose:
    //    Closes the specified connection
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandlerClient_closeUIPortToUIHandler(in EPTF_UIHandler_CT pl_handler) 
    runs on EPTF_UIHandlerClient_CT
    return boolean{
      var integer i := f_EPTF_UIHandlerClient_connectionIndex(pl_handler);
      if(-1 == i){ return false;};
      f_EPTF_UIHandlerClient_closeUIPortToIdx(i);
      return true;
    }
  }  // end of port administration group

  group Logging {
    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_error
    // 
    //  Purpose:
    //    Function to log an error from UIHandlerClient feature.
    //
    //  Parameters:
    //    - pl_message - *in* *charstring* - the message to log
    //
    //  Return Value:
    //    -
    //
    //  Errors & assertions:
    //    - 
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandlerClient_error(in charstring pl_message)
    runs on EPTF_UIHandlerClient_CT
    {
      f_EPTF_Logging_error(true, tsp_EPTF_UIHandlerClient_loggingComponentMask&": "&pl_message);
      f_EPTF_Base_stopAll();
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_warning
    // 
    //  Purpose:
    //    Function to log a warning from UIHandlerClient feature.
    //
    //  Parameters:
    //    - pl_message - *in* *charstring* - the message to log
    //
    //  Return Value:
    //    -
    //
    //  Errors & assertions:
    //    - 
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandlerClient_warning(in @lazy charstring pl_message)
    runs on EPTF_UIHandlerClient_CT
    {
      f_EPTF_Logging_warningV2(pl_message, v_UIHandlerClient_loggingMaskId, {c_EPTF_UIHandler_loggingClassIdx_Warning});
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_debug
    // 
    //  Purpose:
    //    Function to log a debug message from UIHandlerClient feature.
    //
    //  Parameters:
    //    - pl_message - *in* *charstring* - the message to log
    //
    //  Return Value:
    //    -
    //
    //  Errors & assertions:
    //    - 
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandlerClient_debug(in @lazy charstring pl_message)
    runs on EPTF_UIHandlerClient_CT
    {
      f_EPTF_Logging_debugV2(pl_message, v_UIHandlerClient_loggingMaskId, {c_EPTF_UIHandler_loggingClassIdx_Debug});
    }

    ///////////////////////////////////////////////////////////
    //  Function: f_EPTF_UIHandlerClient_debugEnabled
    // 
    //  Purpose:
    //    Function to check if debug is enabled for UIHandlerClient
    //
    //  Parameters:
    //    -
    //
    //  Return Value:
    //    *boolean* - true if debug enalbed
    //
    //  Errors & assertions:
    //    - 
    //
    //  Detailed Comments:
    //    -
    //
    ///////////////////////////////////////////////////////////
    private function f_EPTF_UIHandlerClient_debugEnabled()
    runs on EPTF_UIHandlerClient_CT
    return boolean
    {
      return f_EPTF_Logging_isEnabled(v_UIHandlerClient_loggingMaskId, c_EPTF_UIHandler_loggingClassIdx_Debug);
    }

  }  // end of logging group

}  // end of private group

}  // end of module
