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 .