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 cntl_simple_events, "events lv_events TYPE cntl_simple_event, "events lo_dock TYPE REF TO cl_gui_docking_container, "docked window lv_repid TYPE syrepid, "report ID lv_tree_header 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 = lo_dock node_selection_mode = cl_gui_column_tree=>node_sel_mode_single item_selection = 'X' hierarchy_column_name = 'TreeColumn' " the column that contains the node names hierarchy_header = 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 parent image name PERFORM add_node USING 'X' 'Branch1' 'Root' '' 'Branch Node 1'. PERFORM add_node USING ' ' 'Leaf1' 'Branch1' '' 'Leaf Node 1'. PERFORM add_node USING ' ' 'Leaf2' 'Branch1' '@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 value PERFORM add_checkbox_column USING 'Leaf1' 'Column1'. 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 = p_node_name. v_items-item_name = p_column_name. v_items-class = cl_gui_column_tree=>item_class_checkbox. v_items-editable = 'X'. APPEND v_items TO i_items. ENDFORM. "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 = p_node_name. v_items-item_name = p_column_name. v_items-text = p_value. v_items-class = cl_gui_column_tree=>item_class_text. APPEND v_items TO i_items. ENDFORM. "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 = p_code. v_nodes-relatkey = p_parent. v_nodes-relatship = cl_gui_column_tree=>relat_last_child. v_nodes-isfolder = p_folder. v_nodes-n_image = 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