Está en la página 1de 8

REPORT z_tree_dock_template.

*** CLASSES ***


CLASS:
cl_tree_events DEFINITION DEFERRED,
cl_gui_cfw
DEFINITION LOAD.

*** INTERNAL TABLES ***


DATA:
v_nodes TYPE treev_node,
i_nodes TYPE treev_ntab,
i_items TYPE STANDARD TABLE OF mtreeitm,
v_items TYPE mtreeitm.

*** OBJECTS ***


DATA:
o_tree_listener TYPE REF TO cl_tree_events,
o_tree
TYPE REF TO cl_gui_column_tree.

*** DATA ***


DATA:
v_ok_code TYPE sy-ucomm.

************************************************************************
***
*** CLASSES
***
************************************************************************

*---------------------------------------------------------------------*
CLASS CL_TREE_EVENTS DEFINITION
*---------------------------------------------------------------------* [+] Class for handling events on o_tree
*---------------------------------------------------------------------CLASS cl_tree_events DEFINITION.
PUBLIC SECTION.
METHODS:
handle_node_double_click
FOR EVENT node_double_click
OF cl_gui_column_tree
IMPORTING node_key,
handle_checkbox_change
FOR EVENT checkbox_change
OF cl_gui_column_tree
IMPORTING node_key item_name checked.
ENDCLASS.

"cl_tree_events DEFINITION

*---------------------------------------------------------------------*
CLASS CL_TREE_EVENTS IMPLEMENTATION
*---------------------------------------------------------------------* [+] Class for handling events on o_tree
*---------------------------------------------------------------------CLASS cl_tree_events IMPLEMENTATION.

*---------------------------------------------------------------------*
*
METHOD HANDLE_NODE_DOUBLE_CLICK
*---------------------------------------------------------------------*
* [+] Processes a double-click on a node
*---------------------------------------------------------------------*
METHOD handle_node_double_click.
WRITE: / node_key.
ENDMETHOD.
"handle_node_double_click

*---------------------------------------------------------------------*
*
METHOD HANDLE_CHECKBOX_CHANGE
*---------------------------------------------------------------------*
* [+] Processes a double-click on a node
*---------------------------------------------------------------------*
METHOD handle_checkbox_change.
WRITE: / node_key.
WRITE: / item_name.
WRITE: / checked.
ENDMETHOD.
"handle_checkbox_change

ENDCLASS.

"cl_tree_events IMPLEMENTATION

************************************************************************
***
*** MAIN PROCESSING
***
************************************************************************

*&---------------------------------------------------------------------*
*&
START_OF_SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
* Create the event listener object
CREATE OBJECT o_tree_listener.
SET SCREEN 100.

************************************************************************
***
*** DOCKING AND TREE OBJECT METHODS
***

************************************************************************

*---------------------------------------------------------------------*
FORM BUILD_DOCKED_WINDOW
*---------------------------------------------------------------------* [+] Constructs and loads the data into the docked window...
*
[+] Builds the dock
*
[+] Builds the tree
*
[+] Loads the tree nodes
*---------------------------------------------------------------------FORM build_docked_window.
* Local variables
DATA: li_events TYPE
lv_events TYPE
lo_dock
TYPE
lv_repid TYPE
lv_tree_header

cntl_simple_events, "events
cntl_simple_event, "events
REF TO cl_gui_docking_container, "docked window
syrepid, "report ID
TYPE treev_hhdr.

* Setting variables
lv_repid = sy-repid.

* Create the dock window object


CREATE OBJECT lo_dock
EXPORTING
repid
= lv_repid
dynnr
= sy-dynnr
side
= lo_dock->dock_at_left
extension = 400.

* header of the tree


lv_tree_header-heading = 'My Tree :)'.
lv_tree_header-width = 30.

* Create the tree object


CREATE OBJECT o_tree
EXPORTING
parent
node_selection_mode
item_selection
hierarchy_column_name
hierarchy_header

=
=
=
=
=

lo_dock
cl_gui_column_tree=>node_sel_mode_single
'X'
'TreeColumn'
" the column that contains the node names
lv_tree_header.

* Define the columns (excluding the column with the node names 'TreeColumn')
*
code
size name
PERFORM define_column USING 'Column1' 5 'Check'.
PERFORM define_column USING 'Column2' 15 'My Column 2'.

* Define the events to listen for


lv_events-eventid = cl_gui_column_tree=>eventid_node_double_click.

lv_events-appl_event = 'X'. " process PAI if event occurs


APPEND lv_events TO li_events.
lv_events-eventid = cl_gui_column_tree=>eventid_checkbox_change.
lv_events-appl_event = 'X'.
APPEND lv_events TO li_events.
CALL METHOD o_tree->set_registered_events
EXPORTING
events = li_events.

* Set the event listeners


SET HANDLER o_tree_listener->handle_node_double_click FOR o_tree.
SET HANDLER o_tree_listener->handle_checkbox_change
FOR o_tree.

* Build the tree


PERFORM build_tree.

* expand the node with key 'Root'


CALL METHOD o_tree->expand_node
EXPORTING
node_key = 'Root'.
ENDFORM.

"build_docked_window

*---------------------------------------------------------------------*
FORM BUILD_TREE
*---------------------------------------------------------------------* [+] Loads the tree nodes
*---------------------------------------------------------------------FORM build_tree.
* NODES ARE INSERTED IN THE ORDER SHOWN.
* DO NOT DEFINE A CHILD BEFORE ITS PARENT NODE!
CLEAR:
i_nodes,
v_nodes,
i_items,
v_items.
REFRESH:
i_nodes,
i_items.

** CREATE ROOT NODE ***


CLEAR v_nodes.
v_nodes-node_key = 'Root'.
v_nodes-isfolder = 'X'.
APPEND v_nodes TO i_nodes.

PERFORM add_text_column USING 'Root' 'TreeColumn' 'Root Node'.

** CREATE BRANCHES **
*

folder code
PERFORM add_node USING 'X' 'Branch1'
PERFORM add_node USING ' ' 'Leaf1'
PERFORM add_node USING ' ' 'Leaf2'

parent
'Root'
'Branch1'
'Branch1'

image
name
''
'Branch Node 1'.
''
'Leaf Node 1'.
'@10@' 'Leaf Node 2'.

PERFORM add_node USING 'X' 'Branch2' 'Root'


'' 'Branch Node 2'.
PERFORM add_node USING ' ' 'Leaf3'
'Branch2' '' 'Leaf Node 3'.

** CREATE COLUMNS **
*

node
column
PERFORM add_checkbox_column USING 'Leaf1' 'Column1'.

value

PERFORM add_checkbox_column USING 'Leaf2' 'Column1'.


PERFORM add_text_column
USING 'Leaf2' 'Column2' 'Hello World!'.
PERFORM add_checkbox_column USING 'Leaf3' 'Column1'.
PERFORM add_text_column
USING 'Leaf3' 'Column2' 'Guess What?'.

* Adds the nodes to the tree.


CALL METHOD o_tree->add_nodes_and_items
EXPORTING
node_table
= i_nodes
item_table
= i_items
item_table_structure_name = 'MTREEITM'.

ENDFORM.

"build_tree

*---------------------------------------------------------------------*
FORM DEFINE_COLUMN
*---------------------------------------------------------------------* [+] Defines a column
*---------------------------------------------------------------------FORM define_column
USING
p_code TYPE c
p_size TYPE i
p_name TYPE c.
CALL METHOD o_tree->add_column
EXPORTING
name
= p_code
width
= p_size
header_text = p_name.
ENDFORM.

"define_column

*---------------------------------------------------------------------*
FORM ADD_CHECKBOX_COLUMN
*---------------------------------------------------------------------* [+] Adds a checkbox column to a node
*---------------------------------------------------------------------FORM add_checkbox_column
USING
p_node_name
TYPE c
p_column_name TYPE c.
CLEAR v_items.
v_items-node_key
v_items-item_name
v_items-class
v_items-editable
APPEND v_items TO
ENDFORM.

= p_node_name.
= p_column_name.
= cl_gui_column_tree=>item_class_checkbox.
= 'X'.
i_items.
"add_checkbox_column

*---------------------------------------------------------------------*
FORM ADD_TEXT_COLUMN
*---------------------------------------------------------------------* [+] Adds a text column to a node
*---------------------------------------------------------------------FORM add_text_column
USING
p_node_name
TYPE c
p_column_name TYPE c
p_value
TYPE c.
CLEAR v_items.
v_items-node_key
v_items-item_name
v_items-text
v_items-class
APPEND v_items TO
ENDFORM.

= p_node_name.
= p_column_name.
= p_value.
= cl_gui_column_tree=>item_class_text.
i_items.
"add_text_column

*---------------------------------------------------------------------*
FORM ADD_NODE
*---------------------------------------------------------------------* [+] Adds a node to the tree
* [+] Adds a single column for the node
*---------------------------------------------------------------------FORM add_node
USING
p_folder TYPE c
p_code
TYPE c
p_parent TYPE c
p_image TYPE c
p_name
TYPE c.

CLEAR:
v_nodes,
v_items.
* add the node
v_nodes-node_key
v_nodes-relatkey
v_nodes-relatship
v_nodes-isfolder
v_nodes-n_image

=
=
=
=
=

p_code.
p_parent.
cl_gui_column_tree=>relat_last_child.
p_folder.
p_image.

APPEND v_nodes TO i_nodes.


* add the column that displays the node name
v_items-node_key = p_code.
v_items-item_name = 'TreeColumn'.
v_items-text
= p_name.
v_items-class
= cl_gui_column_tree=>item_class_text.
APPEND v_items TO i_items.

ENDFORM.

"add_node

************************************************************************
***
*** MODULES
***
************************************************************************

*---------------------------------------------------------------------*
MODULE LOAD_DOCK
*---------------------------------------------------------------------* [+] Loads the docked window and tree
*---------------------------------------------------------------------MODULE load_dock OUTPUT.
SET PF-STATUS 'MAIN'.

IF o_tree IS INITIAL.
build the tree/dock
PERFORM build_docked_window.
ENDIF.

ENDMODULE.

"load_dock OUTPUT

*---------------------------------------------------------------------*
MODULE PROCESS_EVENTS_0100
*---------------------------------------------------------------------* [+] Processes the events from the dock/tree
*---------------------------------------------------------------------MODULE process_events_0100 INPUT.

DATA: lv_tree_return_code TYPE i.


* If the tree made an event that affects PAI,
* then dont process the event here.
CALL METHOD cl_gui_cfw=>dispatch
IMPORTING
return_code = lv_tree_return_code.
IF lv_tree_return_code <> cl_gui_cfw=>rc_noevent.
CLEAR v_ok_code.
EXIT.
ENDIF.
* Otherwise, the user didn't click the tree, they clicked something
* else (such as a button), so process as normal.
CASE v_ok_code.
WHEN 'BACK'.
CLEAR o_tree.
LEAVE TO SCREEN 0.
ENDCASE.
CLEAR v_ok_code.
ENDMODULE.

"process_events_0100 INPUT

También podría gustarte