事件处理
事件定义
*--------------------------------------------------------------*
* INCLUDE BCALV_TREE_EVENT_RECEIVER *
*--------------------------------------------------------------*
CLASS lcl_tree_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS handle_node_ctmenu_request
FOR EVENT node_context_menu_request OF cl_gui_alv_tree
IMPORTING node_key
menu.
METHODS handle_node_ctmenu_selected
FOR EVENT node_context_menu_selected OF cl_gui_alv_tree
IMPORTING node_key
fcode.
METHODS handle_item_ctmenu_request
FOR EVENT item_context_menu_request OF cl_gui_alv_tree
IMPORTING node_key
fieldname
menu.
METHODS handle_item_ctmenu_selected
FOR EVENT item_context_menu_selected OF cl_gui_alv_tree
IMPORTING node_key
fieldname
fcode.
METHODS handle_item_double_click
FOR EVENT item_double_click OF cl_gui_alv_tree
IMPORTING node_key
fieldname.
METHODS handle_button_click
FOR EVENT button_click OF cl_gui_alv_tree
IMPORTING node_key
fieldname.
METHODS handle_link_click
FOR EVENT link_click OF cl_gui_alv_tree
IMPORTING node_key
fieldname.
METHODS handle_header_click
FOR EVENT header_click OF cl_gui_alv_tree
IMPORTING fieldname.
ENDCLASS.
*---------------------------------------------------------------------*
* CLASS lcl_tree_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS lcl_tree_event_receiver IMPLEMENTATION.
METHOD handle_node_ctmenu_request.
* append own functions
CALL METHOD menu->add_function
EXPORTING fcode = 'USER1'
text = 'Usercmd 1'. "#EC NOTEXT
CALL METHOD menu->add_function
EXPORTING fcode = 'USER2'
text = 'Usercmd 2'. "#EC NOTEXT
CALL METHOD menu->add_function
EXPORTING fcode = 'USER3'
text = 'Usercmd 3'. "#EC NOTEXT
ENDMETHOD.
METHOD handle_node_ctmenu_selected.
CASE fcode.
WHEN 'USER1' OR 'USER2' OR 'USER3'.
MESSAGE i000(0h) WITH 'Node-Context-Menu on Node ' node_key
'fcode : ' fcode. "#EC NOTEXT
ENDCASE.
ENDMETHOD.
METHOD handle_item_ctmenu_request .
* append own functions
CALL METHOD menu->add_function
EXPORTING fcode = 'USER1'
text = 'Usercmd 1'.
CALL METHOD menu->add_function
EXPORTING fcode = 'USER2'
text = 'Usercmd 2'.
CALL METHOD menu->add_function
EXPORTING fcode = 'USER3'
text = 'Usercmd 3'.
ENDMETHOD.
METHOD handle_item_ctmenu_selected.
CASE fcode.
WHEN 'USER1' OR 'USER2' OR 'USER3'.
MESSAGE i000(0h) WITH 'Item-Context-Menu on Node ' node_key
'Fieldname : ' fieldname. "#EC NOTEXT
ENDCASE.
ENDMETHOD.
METHOD handle_item_double_click.
* Processing for when user double clicks on ALVtree
ENDMETHOD.
METHOD handle_button_click.
* Processing when user clicks button
ENDMETHOD.
METHOD handle_link_click.
* ??
ENDMETHOD.
METHOD handle_header_click.
* Processing for when user clicks on ALVtree column headers
ENDMETHOD.
ENDCLASS.
注册事件
*&-------------------------------------------------------------*
*& REGISTER_EVENTS
*&-------------------------------------------------------------*
* define the events which will be passed to the backend
data: lt_events type cntl_simple_events,
l_event type cntl_simple_event.
* define the events which will be passed to the backend
l_event-eventid = cl_gui_column_tree=>eventid_expand_no_children.
append l_event to lt_events.
l_event-eventid = cl_gui_column_tree=>eventid_checkbox_change.
append l_event to lt_events.
l_event-eventid = cl_gui_column_tree=>eventid_header_context_men_req.
append l_event to lt_events.
l_event-eventid = cl_gui_column_tree=>eventid_node_context_menu_req.
append l_event to lt_events.
l_event-eventid = cl_gui_column_tree=>eventid_item_context_menu_req.
append l_event to lt_events.
l_event-eventid = cl_gui_column_tree=>eventid_item_double_click.
append l_event to lt_events.
l_event-eventid = cl_gui_column_tree=>eventid_header_click.
append l_event to lt_events.
l_event-eventid = cl_gui_column_tree=>eventid_item_keypress.
append l_event to lt_events.
call method gd_tree->set_registered_events
exporting
events = lt_events
exceptions
cntl_error = 1
cntl_system_error = 2
illegal_event_combination = 3.
if sy-subrc <> 0.
message x208(00) with 'ERROR'. "#EC NOTEXT
endif.
* set Handler
data: l_event_receiver type ref to lcl_tree_event_receiver.
create object l_event_receiver.
set handler l_event_receiver->handle_node_ctmenu_request for gd_tree.
set handler l_event_receiver->handle_node_ctmenu_selected for gd_tree.
set handler l_event_receiver->handle_item_ctmenu_request for gd_tree.
set handler l_event_receiver->handle_item_ctmenu_selected for gd_tree.
set handler l_event_receiver->handle_item_double_click for gd_tree.
set handler l_event_receiver->handle_header_click for gd_tree.
ALVtree 工具栏处理
INCLUDE ZTEST_TOOLBAR_EVENT_RECEIVER. :Toobar Process
定义类来处理用户定义的 ALVtree 工具栏按钮。
*--------------------------------------------------------------*
* INCLUDE ZTEST_TOOLBAR_EVENT_RECEIVER *
*--------------------------------------------------------------*
data mr_toolbar type ref to cl_gui_toolbar. "Add to top include
CLASS lcl_toolbar_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS: on_function_selected
FOR EVENT function_selected OF cl_gui_toolbar
IMPORTING fcode,
on_toolbar_dropdown
FOR EVENT dropdown_clicked OF cl_gui_toolbar
IMPORTING fcode
posx
posy.
ENDCLASS.
*-------------------------------------------------------------*
* CLASS lcl_toolbar_event_receiver IMPLEMENTATION
*-------------------------------------------------------------*
CLASS lcl_toolbar_event_receiver IMPLEMENTATION.
METHOD on_function_selected.
DATA: ls_sflight TYPE sflight.
DATA: lt_list_commentary TYPE slis_t_listheader,
l_logo TYPE sdydo_value.
* Processing for user defined tollbar button goes here
CASE fcode.
WHEN 'NEXT'.
WHEN 'DELETE'.
DATA: lt_selected_node TYPE lvc_t_nkey.
DATA: e_selected_node TYPE lvc_nkey,
e_fieldname TYPE lvc_fname.
DATA: lt_outtab_line(100) TYPE c,
lt_node_text TYPE lvc_value.
CALL METHOD gd_tree->get_selected_nodes
CHANGING
ct_selected_nodes = lt_selected_node.
WHEN 'INSERT_LC'.
* Code for function code INSERT_LC goes here
WHEN 'INSERT_FC'.
* Code for function code INSERT_FC goes here
WHEN 'INSERT_FS'.
* Code for function code INSERT_FS goes here
WHEN 'INSERT_LS'.
* Code for function code INSERT_LS goes here
WHEN 'INSERT_NS'.
* Code for function code INSERT_NS goes here
ENDCASE.
* update frontend
CALL METHOD gd_tree->frontend_update.
ENDMETHOD.
METHOD on_toolbar_dropdown.
* create contextmenu
DATA: l_menu TYPE REF TO cl_ctmenu,
l_fc_handled TYPE as4flag.
CREATE OBJECT l_menu.
CLEAR l_fc_handled.
* Setup Insert button so options are displayed as drop doan menu
CASE fcode.
WHEN 'INSERT_LC'.
l_fc_handled = 'X'.
* insert as last child
CALL METHOD l_menu->add_function
EXPORTING fcode = 'INSERT_LC'
text = 'Insert New Line as Last Child'. "#EC NOTEXT
* insert as first child
CALL METHOD l_menu->add_function
EXPORTING fcode = 'INSERT_FC'
text = 'Insert New Line as First Child'. "#EC NOTEXT
* insert as next sibling
CALL METHOD l_menu->add_function
EXPORTING fcode = 'INSERT_NS'
text = 'Insert New Line as Next Sibling'."#EC NOTEXT
* insert as last sibling
CALL METHOD l_menu->add_function
EXPORTING fcode = 'INSERT_LS'
text = 'Insert New Line as Last Sibling'."#EC NOTEXT
* insert as first sibling
CALL METHOD l_menu->add_function
EXPORTING fcode = 'INSERT_FS'
text = 'Insert New Line as First Sibling'. "#EC NOTEXT
ENDCASE.
* show dropdownbox
IF l_fc_handled = 'X'.
CALL METHOD mr_toolbar->track_context_menu
EXPORTING
context_menu = l_menu
posx = posx
posy = posy.
ENDIF.
ENDMETHOD.
ENDCLASS.
CHANGE_TOOLBAR
在 CALL METHOD gd_tree->set_table_for_first_display 之后执行。
*&-------------------------------------------------------------*
*& CHANGE_TOOLBAR
*&-------------------------------------------------------------*
* get toolbar control
call method gd_tree->get_toolbar_object
importing
er_toolbar = mr_toolbar.
check not mr_toolbar is initial.
* add seperator to toolbar
call method mr_toolbar->add_button
exporting
fcode = ''
icon = ''
butn_type = cntb_btype_sep
text = ''
quickinfo = 'This is a Seperator'. "#EC NOTEXT
* add Standard Button to toolbar (for Delete Subtree)
call method mr_toolbar->add_button
exporting
fcode = 'DELETE' "Function code of button
icon = '@18@' "Icon ID (see )
butn_type = cntb_btype_button "Button type
text = '' "Button text
quickinfo = 'Delete subtree'. "Quick info text
* add Dropdown Button to toolbar (for Insert Line)
call method mr_toolbar->add_button
exporting
fcode = 'INSERT_LC' "Function code of button
icon = '@17@' "Icon ID (see )
butn_type = cntb_btype_dropdown "Button type
text = '' "Button text
quickinfo = 'Insert Line'. "Quick info text
* set event-handler for toolbar-control
data: toolbar_event_receiver type ref to lcl_toolbar_event_receiver.
create object toolbar_event_receiver.
set handler toolbar_event_receiver->on_function_selected for mr_toolbar.
set handler toolbar_event_receiver->on_toolbar_dropdown for mr_toolbar.