Example of Drag and Drop Programming

Use

This example program uses a SAP Simple Tree Control and a SAP Textedit Control. The aim is to enable the user to move texts from the tree control into the textedit control.

The example has the program name RSDEMO_DRAG_DROP_EDIT_TREE.

*&-------------------------------------------------------------------*
*& Report   RSDEMO_DRAG_DROP_EDIT_TREE
*& *--------------------------------------------------------------------*
REPORT  rsdemo_drag_drop_edit_tree.
DATA ok_code TYPE sy-ucomm.
DATA node_itab LIKE node_str OCCURS 0.
DATA node LIKE node_str.
DATA container TYPE REF TO cl_gui_custom_container.
DATA splitter TYPE REF TO cl_gui_easy_splitter_container.
DATA right TYPE REF TO cl_gui_container.
DATA left TYPE REF TO cl_gui_container.
DATA editor TYPE REF TO cl_gui_textedit.
DATA tree TYPE REF TO cl_gui_simple_tree.
DATA behaviour_left TYPE REF TO cl_dragdrop.
DATA behaviour_right TYPE REF TO cl_dragdrop.
DATA handle_tree TYPE i.
*--------------------------------------------------------------------*
*               CLASS lcl_treeobject DEFINITION
*       container class for drag object
*--------------------------------------------------------------------*
CLASS lcl_drag_object DEFINITION.
        PUBLIC SECTION.
                DATA text TYPE mtreesnode-text.
ENDCLASS.
*---------------------------------------------------------------------*
*               CLASS dragdrop_receiver DEFINITION
*       event handler class for drag&drop events
*---------------------------------------------------------------------*
CLASS lcl_dragdrop_receiver DEFINITION.
        PUBLIC SECTION.
                METHODS:
                        flavor_select FOR EVENT on_get_flavor OF cl_gui_textedit
                                        IMPORTING index line pos flavors
dragdrop_object,
                        left_drag FOR EVENT on_drag OF cl_gui_simple_tree
                                        IMPORTING node_key drag_drop_object,
                        right_drop FOR EVENT ON_DROP OF cl_gui_textedit
                                        IMPORTING index line pos dragdrop_object,
                        drop_complete FOR EVENT on_drop_complete OF cl_gui_simple_tree
                                        IMPORTING node_key drag_drop_object.
ENDCLASS.
START-OF-SELECTION.
        CALL SCREEN 100.
*&-------------------------------------------------------------------*
*&                  Module  START   OUTPUT
*&-------------------------------------------------------------------*
MODULE start OUTPUT.
        SET PF-STATUS 'BASE'.
        IF container is initial.
                CREATE OBJECT container
                        EXPORTING container_name = 'CONTAINER'.
                CREATE OBJECT splitter
                        EXPORTING parent = container
                                orientation = 1.
                left = splitter->top_left_container.
                right = splitter->bottom_right_container.
                CREATE OBJECT editor
                        EXPORTING parent = right.
                CREXPORTING parent = left
                        EATE OBJECT tree
>node_selection_mode = tree->node_sel_mode_single.
* Definition of drag drop behaviour for tree
        CREATE OBJECT behaviour_left.
        CALL METHOD behaviour_left->add
                EXPORTING
                        flavor = 'Tree_move_to_Edit'
                        dragsrc = 'X'
                        droptarget = ' '
                        effect = cl_dragdrop=>copy.
        CALL METHOD behaviour_left->add
                EXPORTING
                        flavor = 'Tree_copy_to_Edit'
                        dragsrc = 'X'
                        droptarget = ' '
                        effect = cl_dragdrop=>copy.
        CALL METHOD behaviour_left->get_handle
                IMPORTING handle = handle_tree.
* Drag Drop behaviour of tree control nodes are defined in the node
* structure
        PERFORM fill_tree.
        CALL METHOD tree->add_nodes
                EXPORTING node_table = node_itab
                        table_structure_name = 'NODE_STR'.
* Definition of drag drop behaviour for tree
        CREATE OBJECT behaviour_right.
CALL METHOD behaviour_right->add
                EXPORTING
                        flavor = 'Tree_move_to_Edit'
                        dragsrc = ' '
                        droptarget = 'X'
                        effect = cl_dragdrop=>copy.
        CALL METHOD behaviour_right->add
                EXPORTING
                        flavor = 'Tree_copy_to_Edit'
                        dragsrc = ' '
                        droptarget = 'X'
                        effect = cl_dragdrop=>copy.
        CALL METHOD editor->set_dragdrop
                EXPORTING dragdrop = behaviour_right.
* registration of drag and drop events
                SET HANDLER dragdrop=>flavor_select FOR editor.
                SET HANDLER dragdrop=>left_drag FOR tree.
                SET HANDLER dragdrop=>right_drop FOR editor.
                SET HANDLER dragdrop=>drop_complete for TREE.
        ENDIF.
ENDMODULE.                              " START  OUTPUT
*&-------------------------------------------------------------------*
*&                  Module  EXIT    INPUT
*&-------------------------------------------------------------------*
MODULE exit INPUT.
        LEAVE PROGRAM.
ENDMODULE.                              " EXIT  INPUT
*&-------------------------------------------------------------------*
*&                  Form    fill_tree
*&-------------------------------------------------------------------*
FORM fill_tree.
        DATA: node LIKE mtreesnode.
        CLEAR node.
        node-node_key = 'Root'.
        node-isfolder = 'X'.
        node-text = 'Text'.
        node-dragdropid = ' '.
        APPEND node TO node_itab.
        CLEAR node.
        node-node_key = 'Child1'.
        node-relatkey = 'Root'.
        node-relatship = cl_gui_simple_tree=>relat_last_child.
        node-text = 'DragDrop Text 1'.
        node-dragdropid = handle_tree.  " handle of behaviour
        APPEND node TO node_itab.
        CLEAR node.
        node-node_key = 'Child2'.
        node-relatkey = 'Root'.
        node-relatship = cl_gui_simple_tree=>relat_last_child.
        node-text = 'DragDrop Text 2'.
        node-dragdropid = handle_tree.  " handle of behaviour   APPEND node TO node_itab.
ENDFORM.                                " fill_tree
*&-------------------------------------------------------------------* 
*&                  Module  USER_COMMAND_0100       INPUT
*&-------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
        CALL METHOD cl_gui_cfw=>dispatch.
ENDMODULE.                              "
USER_COMMAND_0100  INPUT
*--------------------------------------------------------------------*
*               CLASS DRAGDROP_RECEIVER IMPLEMENTATION
*--------------------------------------------------------------------* 
CLASS lcl_dragdrop_receiver IMPLEMENTATION.
        METHOD flavor_select.   " set the right flavor
                IF line > 5.
                        SEARCH flavors FOR 'Tree_move_to_Edit'.
                        IF sy-subrc = 0.
                                CALL METHOD dragDROP_OBJECT->SET_FLAVOR
                                        EXPORTING newflavor = 'Tree_move_to_Edit'.
                        ELSE.
                                CALL METHOD dragdrop_object->abort.
                        ENDIF.
                ELSE.
                        SEARCH flavors FOR 'Tree_copy_to_Edit'.
                        IF sy-subrc = 0.
                                CALL METHOD dragdrop_object->set_flavor
                                        EXPORTING newflavor = 'Tree_copy_to_Edit'.
                        ELSE.
                                CALL METHOD dragdrop_object->abort.
                        ENDIF.
                ENDIF.
        ENDMETHOD.
        METHOD left_drag. " define drag object
                DATA drag_object TYPE REF TO lcl_drag_object.
                READ TABLE node_itab WITH KEY node_key = node_key
                                        INTO node.
                CREATE OBJECT drag_object.
                drag_object->text = node-text.
                drag_drop_object->object = drag_object.
ENDMETHOD.
        METHOD right_drop. " action in the drop object
                DATA textline(256).
                DATA text_table LIKE STANDARD TABLE OF textline.
                DATA drag_object TYPE REF TO lcl_drag_object.
                CATCH SYSTEM-EXCEPTIONS move_cast_error = 1.
                        drag_object ?= dragdrop_object->object.
                ENDCATCH.
                IF sy-subrc = 1.
                        " data object has unexpected class
                                                " => cancel Drag & Drop operation
                        CALL METHOD dragdrop_object->abort.
                        EXIT.
                ENDIF.
                CALL METHOD editor->get_text_as_stream
                        IMPORTING text  = text_table.
* Synchronize Automation Queue after Get Methods
        CALL METHOD cl_gui_cfw=>flush.
        textline = drag_object->text.
* Insert text in internal table
        INSERT textline INTO text_table INDEX 1.
* Send modified table to frontend
        CALL METHOD editor->set_text_as_stream
                EXPORTING  text = text_table
                EXCEPTIONS error_dp      = 1
                        error_dp_create  = 2.
        ENDMETHOD.
        METHOD drop_complete.
" do something after drop
                IF drag_drop_object->flavor = 'Tree_move_to_Edit'.
                        CALL METHOD tree->delete_node
                                EXPORTING node_key = node_key.
                        delete node_itab where node_key = node_key.
                ENDIF.
                ENDMETHOD.
ENDCLASS.