Entering content frame

This graphic is explained in the accompanying textExample of Drag and Drop Programming Locate the document in its SAP Library structure

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.

Leaving content frame