Example of Drag and Drop Programming
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.
CREATE OBJECT tree
EXPORTING parent = left
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.