SAP ABAP 标题左边 GOS文件菜单 自定义 CL_GUI_GOS_CONTAINER MENU Gos based menu GOS BUTTON

SAP ABAP 标题左边 GOS文件菜单 自定义 CL_GUI_GOS_CONTAINER MENU Gos based menu GOS BUTTON

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

*&---------------------------------------------------------------------*
*&  包含                LZFG_FI_EISF01
*&---------------------------------------------------------------------*
CONSTANTS: c_butf TYPE stb_button-function VALUE 'BUTF_GOS_ATTACHMENT',
           c_menu TYPE stb_button-function VALUE 'MENU_GOS_ATTACHMENT'.
DATA: g_eui_menu TYPE REF TO zcl_eui_menu,
      gw_object  TYPE sibflporb,
      gv_mode    TYPE sgs_rwmod VALUE 'D'.
*----------------------------------------------------------------------*
*       CLASS lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODS: on_function_selected FOR EVENT function_selected OF cl_gui_toolbar IMPORTING fcode.
ENDCLASS.                    "lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
  METHOD on_function_selected.
    PERFORM frm_on_function_selected USING fcode.
  ENDMETHOD.                    "on_function_selected
ENDCLASS.                    "lcl_handle_events IMPLEMENTATION
*&---------------------------------------------------------------------*
*&      Form  FRM_ON_FUNCTION_SELECTED
*&---------------------------------------------------------------------*
FORM frm_on_function_selected  USING uv_fcode.
  IF uv_fcode = c_butf OR uv_fcode = c_menu.
    SET PARAMETER ID 'DEL_SHOW' FIELD 'X'.
    CALL FUNCTION 'GOS_ATTACHMENT_LIST_POPUP'
      EXPORTING
        is_object = gw_object
        ip_mode   = gv_mode.
  ENDIF.
ENDFORM.                    " FRM_ON_FUNCTION_SELECTED
FUNCTION zfi_gos_change_mode.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_MODE) TYPE  SGS_RWMOD
*"----------------------------------------------------------------------
  gv_mode = iv_mode.
ENDFUNCTION.
FUNCTION zfi_add_buttion_as_gos.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_INSTID) TYPE  SIBFBORIID
*"     REFERENCE(IV_TYPEID) TYPE  SIBFTYPEID
*"     REFERENCE(IV_CATID) TYPE  SIBFCATID DEFAULT 'BO'
*"----------------------------------------------------------------------
  DATA: lw_menu    TYPE zcl_eui_menu=>ts_menu,
        lt_menu    TYPE zcl_eui_menu=>tt_menu,
        l_handle   TYPE REF TO lcl_handle_events.
  IF g_eui_menu IS INITIAL .
    lw_menu-function  = c_butf.
    lw_menu-icon      = icon_system_service_filled.
    lw_menu-butn_type = cntb_btype_dropdown.
    lw_menu-quickinfo = text-t01.     "对象的服务
    APPEND lw_menu TO lt_menu.
    CLEAR: lw_menu.
    lw_menu-par_function = c_butf.
    lw_menu-function     = c_menu.
    lw_menu-text         = text-t02.  "附件清单
    APPEND lw_menu TO lt_menu.
    CLEAR: lw_menu.
    CREATE OBJECT l_handle.
    CREATE OBJECT g_eui_menu
      EXPORTING
        io_handler = l_handle.
    g_eui_menu->create_toolbar( it_menu = lt_menu ).
  ENDIF.
  gw_object-instid = iv_instid.
  gw_object-typeid = iv_typeid.
  gw_object-catid  = iv_catid.
ENDFUNCTION.
CLASS zcl_eui_menu DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    TYPE-POOLS abap .

    TYPES:
      BEGIN OF ts_menu.
            INCLUDE TYPE stb_button.
    TYPES:
      " For menu
      par_function TYPE ui_func,
      ftype        TYPE cua_ftyp,
      hidden       TYPE cua_ftyp,
      accelerator  TYPE cua_path,
      "top          TYPE flag,
      " Do not show
      hide         TYPE abap_bool,
      END OF ts_menu .
    TYPES:
      tt_menu TYPE STANDARD TABLE OF ts_menu WITH DEFAULT KEY .

    METHODS constructor
      IMPORTING
        !io_container TYPE REF TO cl_gui_container OPTIONAL
        !io_handler TYPE REF TO object OPTIONAL .
    METHODS create_toolbar
      IMPORTING
        !it_menu TYPE tt_menu
        !iv_width TYPE i OPTIONAL
        !iv_check_tcode TYPE abap_bool DEFAULT abap_true
      RETURNING
        VALUE(ro_menu) TYPE REF TO zcl_eui_menu .
    METHODS get_container
      RETURNING
        VALUE(ro_container) TYPE REF TO cl_gui_container .
    METHODS get_toolbar
      RETURNING
        VALUE(ro_toolbar) TYPE REF TO cl_gui_toolbar .
    METHODS add_handler
      IMPORTING
        !io_handler TYPE REF TO object .
    METHODS change_handler
      IMPORTING
        !io_handler TYPE REF TO object .
    CLASS-METHODS can_show
      RETURNING
        VALUE(rv_ok) TYPE abap_bool .
  PROTECTED SECTION.
  PRIVATE SECTION.
    DATA mo_toolbar TYPE REF TO cl_gui_toolbar .
    DATA mo_container TYPE REF TO cl_gui_container .
    DATA mo_event_caller TYPE REF TO zcl_eui_event_caller .

    METHODS on_function_selected
      FOR EVENT function_selected OF cl_gui_toolbar
      IMPORTING
        !sender
        !fcode .
ENDCLASS.



CLASS ZCL_EUI_MENU IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EUI_MENU->ADD_HANDLER
* +-------------------------------------------------------------------------------------------------+
* | [--->] IO_HANDLER                     TYPE REF TO OBJECT
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD add_handler.
    DATA lo_error TYPE REF TO zcx_eui_exception.

    CHECK io_handler IS NOT INITIAL.

    TRY.
        " Specify receiver
        IF mo_event_caller IS INITIAL.
          CREATE OBJECT mo_event_caller.
        ENDIF.

        mo_event_caller->add_handler( io_handler ).
      CATCH zcx_eui_exception INTO lo_error.
        zcx_eui_exception=>raise_dump( io_error = lo_error ).
    ENDTRY.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_EUI_MENU=>CAN_SHOW
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RV_OK                          TYPE        ABAP_BOOL
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD can_show.
    DATA:
      lp_dialog_status TYPE char1,
      lp_gui           TYPE char1,
      lp_cat           TYPE char1.

    " if we are called by RFC in a dialogless BAPI or in update task or in batch suppress the starter
    GET PARAMETER ID 'FLAG_DIALOG_STATUS' FIELD lp_dialog_status.

    CALL FUNCTION 'CAT_IS_ACTIVE'
      IMPORTING
        active = lp_cat.

    CALL FUNCTION 'RFC_IS_GUI_ON'
      IMPORTING
        on = lp_gui.

    CHECK  " TODO sy-binpt IS INITIAL
           sy-batch IS INITIAL
       AND sy-oncom <> 'V'
       AND lp_dialog_status IS INITIAL
       AND lp_cat = space
       AND lp_gui = 'Y'.

    rv_ok = abap_true.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EUI_MENU->CHANGE_HANDLER
* +-------------------------------------------------------------------------------------------------+
* | [--->] IO_HANDLER                     TYPE REF TO OBJECT
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD change_handler.
    DATA lo_error TYPE REF TO zcx_eui_exception.

    CLEAR mo_event_caller.
    CHECK io_handler IS NOT INITIAL.

    TRY.
        " Specify receiver
        CREATE OBJECT mo_event_caller.
        mo_event_caller->add_handler( io_handler ).
      CATCH zcx_eui_exception INTO lo_error.
        zcx_eui_exception=>raise_dump( io_error = lo_error ).
    ENDTRY.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EUI_MENU->CONSTRUCTOR
* +-------------------------------------------------------------------------------------------------+
* | [--->] IO_CONTAINER                   TYPE REF TO CL_GUI_CONTAINER(optional)
* | [--->] IO_HANDLER                     TYPE REF TO OBJECT(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD constructor.
    " Use SUPPLIED container
    IF io_container IS NOT INITIAL.
      mo_container = io_container.
    ENDIF.

    change_handler( io_handler ).
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EUI_MENU->CREATE_TOOLBAR
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_MENU                        TYPE        TT_MENU
* | [--->] IV_WIDTH                       TYPE        I(optional)
* | [--->] IV_CHECK_TCODE                 TYPE        ABAP_BOOL (default =ABAP_TRUE)
* | [<-()] RO_MENU                        TYPE REF TO ZCL_EUI_MENU
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD create_toolbar.
    DATA:
      lt_stb_menu TYPE SORTED TABLE OF stb_btnmnu WITH UNIQUE KEY function,
      ls_stb_menu TYPE stb_btnmnu,
      lv_icon     TYPE icon-id,
      lv_width    TYPE i,
      ls_event    TYPE REF TO cntl_simple_event,
      lt_event    TYPE cntl_simple_events.
    FIELD-SYMBOLS:
      <ls_menu>     LIKE LINE OF it_menu,
      <ls_stb_menu> TYPE stb_btnmnu.

    " For syntax like --->  new ZCL_EUI_MENU( lo_container )->CREATE_TOOLBAR( )->GET_TOOLBAR( )
    ro_menu = me.

    " Do not work in standard transactions (except SE38, SE80 ...)
    IF iv_check_tcode = abap_true.
      CHECK sy-tcode CP 'Z*'
         OR sy-tcode CP 'Y*'
         OR sy-tcode CP 'SE*'.
    ENDIF.

    CHECK can_show( ) = abap_true.

**********************************************************************
    " Calc new width
**********************************************************************
    lv_width = iv_width.
    IF lv_width = 0.
      LOOP AT it_menu ASSIGNING <ls_menu> WHERE hide <> abap_true
                                            AND par_function IS INITIAL.
        CASE <ls_menu>-butn_type.
          WHEN cntb_btype_menu OR cntb_btype_dropdown.
            ADD 51 TO lv_width.                          "#EC NUMBER_OK

          WHEN cntb_btype_sep.
            ADD 6 TO lv_width.                           "#EC NUMBER_OK

          WHEN OTHERS.
            ADD 41 TO lv_width.                          "#EC NUMBER_OK
        ENDCASE.
      ENDLOOP.
    ENDIF.

**********************************************************************
    " Create new toolbar. Could be different buttons each time
**********************************************************************

    IF mo_toolbar IS NOT INITIAL.
      mo_toolbar->delete_all_buttons( ).
    ENDIF.

    " Create new container if needed
    IF mo_container IS INITIAL. " have to recretae for GOS. bug with contaoner width
      CREATE OBJECT mo_container TYPE cl_gui_gos_container
        EXPORTING
          width                   = lv_width
          no_autodef_progid_dynnr = abap_true
        EXCEPTIONS
          OTHERS                  = 5.
      CHECK sy-subrc = 0.
    ENDIF.

    " New toolbar
    IF mo_toolbar IS INITIAL.
      CREATE OBJECT mo_toolbar
        EXPORTING
          parent = mo_container.

      " 1 event only
      APPEND INITIAL LINE TO lt_event REFERENCE INTO ls_event.
      ls_event->appl_event = abap_true.
      ls_event->eventid = cl_gui_toolbar=>m_id_function_selected.
      mo_toolbar->set_registered_events( events = lt_event ).

      " Set new handler
      SET HANDLER on_function_selected FOR mo_toolbar ACTIVATION abap_true.
    ENDIF.

**********************************************************************
    " Create buttons
**********************************************************************
    LOOP AT it_menu ASSIGNING <ls_menu> WHERE hide <> abap_true.
      " No search in ICON table
      lv_icon = <ls_menu>-icon.

      IF <ls_menu>-par_function IS INITIAL.
        mo_toolbar->add_button(
          fcode       = <ls_menu>-function
          icon        = <ls_menu>-icon
          is_disabled = <ls_menu>-disabled
          butn_type   = <ls_menu>-butn_type
          text        = <ls_menu>-text
          quickinfo   = <ls_menu>-quickinfo
          is_checked  = <ls_menu>-checked ).
        " CHECK ERRORS
      ELSE.
        " Instead of CL_GUI_TOOLBAR=>M_TABLE_CTXMENU[]
        READ TABLE lt_stb_menu ASSIGNING <ls_stb_menu>
           WITH TABLE KEY function = <ls_menu>-par_function.

        " Create new one
        IF sy-subrc <> 0.
          CREATE OBJECT ls_stb_menu-ctmenu.
          ls_stb_menu-function = <ls_menu>-par_function.
          INSERT ls_stb_menu INTO TABLE lt_stb_menu ASSIGNING <ls_stb_menu>.
        ENDIF.

        CASE <ls_menu>-butn_type.
          WHEN cntb_btype_sep.
            <ls_stb_menu>-ctmenu->add_separator( ).

          WHEN cntb_btype_menu.
            " Save for sub menu
            CREATE OBJECT ls_stb_menu-ctmenu.
            ls_stb_menu-function = <ls_menu>-function.
            INSERT ls_stb_menu INTO TABLE lt_stb_menu.

            " And add it
            <ls_stb_menu>-ctmenu->add_submenu(
              menu        = ls_stb_menu-ctmenu " <-- sub menu
              icon        = lv_icon
              disabled    = <ls_menu>-disabled
              text        = <ls_menu>-text
              hidden      = <ls_menu>-hidden
              accelerator = <ls_menu>-accelerator ).

          WHEN OTHERS.
            <ls_stb_menu>-ctmenu->add_function( " CALL METHOD <ls_stb_menu>-ctmenu->('ADD_FUNCTION')
              fcode             = <ls_menu>-function
              icon              = lv_icon
              disabled          = <ls_menu>-disabled
              text              = <ls_menu>-text
              checked           = <ls_menu>-checked
              ftype             = <ls_menu>-ftype
              hidden            = <ls_menu>-hidden
              accelerator       = <ls_menu>-accelerator
              " insert_at_the_top = <ls_menu>-top  " <---  From 7.02, no param older versions
            ).
        ENDCASE.

        " Set menu or delete it
        mo_toolbar->set_static_ctxmenu(
         EXPORTING
          fcode     = <ls_menu>-par_function
          ctxmenu   = <ls_stb_menu>-ctmenu
         EXCEPTIONS
          OTHERS    = 1 ).
      ENDIF.
    ENDLOOP.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EUI_MENU->GET_CONTAINER
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RO_CONTAINER                   TYPE REF TO CL_GUI_CONTAINER
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD get_container.
    ro_container = me->mo_container.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EUI_MENU->GET_TOOLBAR
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RO_TOOLBAR                     TYPE REF TO CL_GUI_TOOLBAR
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD get_toolbar.
    ro_toolbar = me->mo_toolbar.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_EUI_MENU->ON_FUNCTION_SELECTED
* +-------------------------------------------------------------------------------------------------+
* | [--->] SENDER                         LIKE
* | [--->] FCODE                          LIKE
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD on_function_selected.
    CHECK mo_event_caller IS NOT INITIAL.

    mo_event_caller->call_handlers(
     iv_of_class     = 'CL_GUI_TOOLBAR'
     iv_for_event    = 'FUNCTION_SELECTED'
     iv_param_nam_00 = 'SENDER'          iv_param_val_00 = sender
     iv_param_nam_01 = 'FCODE'           iv_param_val_01 = fcode ).
  ENDMETHOD.
ENDCLASS.
CLASS zcl_eui_event_caller DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    TYPE-POOLS abap .

    METHODS add_handler
      IMPORTING
        !io_handler TYPE REF TO object
        !iv_handlers_map TYPE csequence OPTIONAL
        !iv_first TYPE abap_bool DEFAULT abap_false
        !iv_activate TYPE abap_bool DEFAULT abap_true
      RAISING
        zcx_eui_exception .
    METHODS call_handlers
      IMPORTING
        !iv_of_class TYPE abap_classname
        !iv_for_event TYPE abap_evntname
        !iv_param_nam_00 TYPE csequence OPTIONAL
        !iv_param_val_00 TYPE any OPTIONAL
        !iv_param_nam_01 TYPE csequence OPTIONAL
        !iv_param_val_01 TYPE any OPTIONAL
        !iv_param_nam_02 TYPE csequence OPTIONAL
        !iv_param_val_02 TYPE any OPTIONAL
        !iv_param_nam_03 TYPE csequence OPTIONAL
        !iv_param_val_03 TYPE any OPTIONAL
        !iv_param_nam_04 TYPE csequence OPTIONAL
        !iv_param_val_04 TYPE any OPTIONAL
        !iv_param_nam_05 TYPE csequence OPTIONAL
        !iv_param_val_05 TYPE any OPTIONAL
        !iv_param_nam_06 TYPE csequence OPTIONAL
        !iv_param_val_06 TYPE any OPTIONAL
        !iv_param_nam_07 TYPE csequence OPTIONAL
        !iv_param_val_07 TYPE any OPTIONAL
        !iv_param_nam_08 TYPE csequence OPTIONAL
        !iv_param_val_08 TYPE any OPTIONAL
        !iv_param_nam_09 TYPE csequence OPTIONAL
        !iv_param_val_09 TYPE any OPTIONAL
        !iv_param_nam_10 TYPE csequence OPTIONAL
        !iv_param_val_10 TYPE any OPTIONAL
        !iv_param_nam_11 TYPE csequence OPTIONAL
        !iv_param_val_11 TYPE any OPTIONAL
        !iv_param_nam_12 TYPE csequence OPTIONAL
        !iv_param_val_12 TYPE any OPTIONAL
        !iv_param_nam_13 TYPE csequence OPTIONAL
        !iv_param_val_13 TYPE any OPTIONAL
        !iv_param_nam_14 TYPE csequence OPTIONAL
        !iv_param_val_14 TYPE any OPTIONAL .
    METHODS has_handler
      IMPORTING
        !iv_of_class TYPE abap_classname
        !iv_for_event TYPE abap_evntname
      RETURNING
        VALUE(rv_ok) TYPE abap_bool .
  PROTECTED SECTION.
  PRIVATE SECTION.
    TYPES:
     BEGIN OF ts_listener,
      listener    TYPE REF TO object,
      t_methdescr TYPE abap_methdescr_tab,
      t_friend    TYPE abap_frndtypes_tab,
    END OF ts_listener .
    TYPES:
      tt_listener TYPE STANDARD TABLE OF ts_listener WITH DEFAULT KEY .

    DATA mt_listener TYPE tt_listener .
ENDCLASS.



CLASS ZCL_EUI_EVENT_CALLER IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EUI_EVENT_CALLER->ADD_HANDLER
* +-------------------------------------------------------------------------------------------------+
* | [--->] IO_HANDLER                     TYPE REF TO OBJECT
* | [--->] IV_HANDLERS_MAP                TYPE        CSEQUENCE(optional)
* | [--->] IV_FIRST                       TYPE        ABAP_BOOL (default =ABAP_FALSE)
* | [--->] IV_ACTIVATE                    TYPE        ABAP_BOOL (default =ABAP_TRUE)
* | [!CX!] ZCX_EUI_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD add_handler.
    DATA:
      lt_event        TYPE STANDARD TABLE OF abap_methname,
      lo_object_descr TYPE REF TO cl_abap_classdescr,
      lv_tabix        TYPE sytabix,
      ls_method       TYPE REF TO abap_methdescr,
      ls_item         LIKE LINE OF mt_listener.
    FIELD-SYMBOLS:
       <ls_event> LIKE LINE OF lt_event.

    " No need to call anything
    CHECK io_handler IS NOT INITIAL.

    " Deactivate
    IF iv_activate <> abap_true.
      DELETE mt_listener WHERE listener = io_handler.
      RETURN.
    ENDIF.

    " Already exist ?
    READ TABLE mt_listener TRANSPORTING NO FIELDS
     WITH KEY listener = io_handler.
    CHECK sy-subrc <> 0.

    " Call public methods of ...
    ls_item-listener = io_handler.

    " Get all handler methods
    lo_object_descr ?= cl_abap_objectdescr=>describe_by_object_ref( ls_item-listener ).
    ls_item-t_methdescr = lo_object_descr->methods.
    ls_item-t_friend    = lo_object_descr->get_friend_types( ).
    DELETE ls_item-t_methdescr WHERE for_event IS INITIAL.

    " Exact only specefic methods
    IF iv_handlers_map IS NOT INITIAL.
      SPLIT iv_handlers_map AT ';' INTO TABLE lt_event.

      " Check declared or not
      LOOP AT lt_event ASSIGNING <ls_event>.
        READ TABLE ls_item-t_methdescr TRANSPORTING NO FIELDS
         WITH TABLE KEY name = <ls_event>.
        CHECK sy-subrc <> 0.

        MESSAGE s007(zeui_message) WITH <ls_event> INTO sy-msgli.
        zcx_eui_exception=>raise_sys_error( ).
      ENDLOOP.

      " Could be many similar EVENT handlers
      SORT lt_event BY table_line.
      LOOP AT ls_item-t_methdescr REFERENCE INTO ls_method.
        lv_tabix = sy-tabix.

        " Delete unnecessary
        READ TABLE lt_event TRANSPORTING NO FIELDS BINARY SEARCH
         WITH KEY table_line = ls_method->name.
        CHECK sy-subrc <> 0.

        DELETE ls_item-t_methdescr INDEX lv_tabix.
      ENDLOOP.
    ENDIF.

    " More proiority
    IF iv_first = abap_true.
      INSERT ls_item INTO mt_listener INDEX 1.
    ELSE.
      APPEND ls_item TO mt_listener.
    ENDIF.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EUI_EVENT_CALLER->CALL_HANDLERS
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_OF_CLASS                    TYPE        ABAP_CLASSNAME
* | [--->] IV_FOR_EVENT                   TYPE        ABAP_EVNTNAME
* | [--->] IV_PARAM_NAM_00                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_00                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_01                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_01                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_02                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_02                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_03                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_03                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_04                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_04                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_05                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_05                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_06                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_06                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_07                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_07                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_08                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_08                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_09                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_09                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_10                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_10                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_11                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_11                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_12                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_12                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_13                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_13                TYPE        ANY(optional)
* | [--->] IV_PARAM_NAM_14                TYPE        CSEQUENCE(optional)
* | [--->] IV_PARAM_VAL_14                TYPE        ANY(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD call_handlers.
    DATA:
      lt_param_input TYPE abap_parmbind_tab,
      lt_param_call  LIKE lt_param_input,
      ls_param       TYPE abap_parmbind,
      lo_error       TYPE REF TO cx_sy_dyn_call_error,
      lv_is_friend   TYPE abap_bool.
    FIELD-SYMBOLS:
      <ls_param>     LIKE LINE OF lt_param_input,
      <ls_methdescr> TYPE abap_methdescr,
      <ls_parameter> LIKE LINE OF <ls_methdescr>-parameters,
      <ls_item>      LIKE LINE OF mt_listener.


**********************************************************************
    DATA          lv_index   TYPE numc2.
    DATA          lv_name    TYPE string.
    FIELD-SYMBOLS <lv_name>  TYPE csequence.
    FIELD-SYMBOLS <lv_value> TYPE any.

    DO 15 TIMES.                                         "#EC NUMBER_OK
      " get next parameter
      lv_index = sy-index - 1.
      CONCATENATE 'IV_PARAM_NAM_' lv_index INTO lv_name.
      ASSIGN (lv_name) TO <lv_name>.

      " Stop no params
      IF <lv_name> IS INITIAL.
        EXIT.
      ENDIF.

      CONCATENATE 'IV_PARAM_VAL_' lv_index INTO lv_name.
      ASSIGN (lv_name) TO <lv_value>.

      ls_param-name = <lv_name>.
      ls_param-kind = cl_abap_objectdescr=>exporting.
      GET REFERENCE OF <lv_value> INTO ls_param-value.

      INSERT ls_param INTO TABLE lt_param_input.
    ENDDO.
**********************************************************************

    LOOP AT mt_listener ASSIGNING <ls_item>.
      " Public or friend
      lv_is_friend = abap_false.
      READ TABLE <ls_item>-t_friend TRANSPORTING NO FIELDS
       WITH KEY table_line->absolute_name = '\CLASS=ZCL_EUI_EVENT_CALLER'.
      IF sy-subrc = 0.
        lv_is_friend = abap_true.
      ENDIF.

      LOOP AT <ls_item>-t_methdescr ASSIGNING <ls_methdescr>
         WHERE of_class  = iv_of_class
           AND for_event = iv_for_event.

        " Make method public!
        IF <ls_methdescr>-visibility <> cl_abap_objectdescr=>public AND lv_is_friend <> abap_true.
          MESSAGE s008(zeui_message) WITH <ls_methdescr>-name INTO sy-msgli.
          zcx_eui_exception=>raise_dump( iv_message = sy-msgli ).
        ENDIF.

        " Fill each time
        CLEAR lt_param_call.
        LOOP AT <ls_methdescr>-parameters ASSIGNING <ls_parameter>.
          " If have decalaration in method
          READ TABLE lt_param_input ASSIGNING <ls_param>
           WITH TABLE KEY name = <ls_parameter>-name.
          CHECK sy-subrc = 0.

          INSERT <ls_param> INTO TABLE lt_param_call.
        ENDLOOP.

        TRY.
            CALL METHOD <ls_item>-listener->(<ls_methdescr>-name)
              PARAMETER-TABLE
              lt_param_call.
          CATCH cx_sy_dyn_call_error INTO lo_error.
            zcx_eui_exception=>raise_dump( io_error = lo_error ).
        ENDTRY.
      ENDLOOP.
    ENDLOOP.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EUI_EVENT_CALLER->HAS_HANDLER
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_OF_CLASS                    TYPE        ABAP_CLASSNAME
* | [--->] IV_FOR_EVENT                   TYPE        ABAP_EVNTNAME
* | [<-()] RV_OK                          TYPE        ABAP_BOOL
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD has_handler.
    FIELD-SYMBOLS <ls_item> LIKE LINE OF mt_listener.

    rv_ok = abap_false.
    LOOP AT mt_listener ASSIGNING <ls_item>.
      READ TABLE <ls_item>-t_methdescr TRANSPORTING NO FIELDS
        WITH KEY of_class  = iv_of_class
                 for_event = iv_for_event.

      " Use the method for express test
      CHECK sy-subrc = 0.
      rv_ok = abap_true.
      RETURN.
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.
CLASS zcx_eui_exception DEFINITION
  PUBLIC
  INHERITING FROM cx_static_check
  CREATE PUBLIC .

  PUBLIC SECTION.

*"* public components of class ZCX_EUI_EXCEPTION
*"* do not include other source files here!!!
    TYPE-POOLS abap .

    INTERFACES if_t100_message .

    CONSTANTS:
      BEGIN OF zcx_eui_exception,
        msgid TYPE symsgid VALUE 'ZEUI_MESSAGE',
        msgno TYPE symsgno VALUE '000',
        attr1 TYPE scx_attrname VALUE 'MSGV1',
        attr2 TYPE scx_attrname VALUE 'MSGV2',
        attr3 TYPE scx_attrname VALUE 'MSGV3',
        attr4 TYPE scx_attrname VALUE 'MSGV4',
      END OF zcx_eui_exception .
    DATA msgv1 TYPE msgv1 .
    DATA msgv2 TYPE msgv2 .
    DATA msgv3 TYPE msgv3 .
    DATA msgv4 TYPE msgv4 .

    METHODS constructor
      IMPORTING
        !textid LIKE if_t100_message=>t100key OPTIONAL
        !previous LIKE previous OPTIONAL
        !msgv1 TYPE msgv1 OPTIONAL
        !msgv2 TYPE msgv2 OPTIONAL
        !msgv3 TYPE msgv3 OPTIONAL
        !msgv4 TYPE msgv4 OPTIONAL .
    CLASS-METHODS raise_sys_error
      IMPORTING
        !iv_message TYPE csequence OPTIONAL
        VALUE(io_error) TYPE REF TO cx_root OPTIONAL
      RAISING
        zcx_eui_exception .
    CLASS-METHODS raise_dump
      IMPORTING
        !iv_message TYPE csequence OPTIONAL
        !io_error TYPE REF TO cx_root OPTIONAL .
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

令狐九剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值