Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Drag and drop using Custom container

alpesh_saparia3
Active Contributor
0 Likes
1,377

Drag and drop using class cl_dragdrop allows both the side drag and drop OR only one side?

I am able to do drag n drop from Left to Right, but from Right to Left events getting triggered but Tree hierarchy is not getting updated.

Thanks/Alpesh

Drag and drop using class cl_dragdrop allows both the side drag and drop OR only one side?

I am able to do drag n drop from Left to Right, but from Right to Left events getting triggered but Tree hierarchy is not getting updated.

Thanks/Alpesh

2 REPLIES 2
Read only

0 Likes
968

Hi Rajesh,

Following is code I have used. I am using Simple tree. Facing problem in drag and drop in right to left.

TABLES  ZMATH1.

TABLES  ZMATH2.

TABLES  ZMATH1L.

TABLES  ZMATH2L.

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 tree_right TYPE REF TO cl_gui_simple_tree.

DATA tree_left  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_left     TYPE i.

DATA handle_tree_right    TYPE i.

DATA node_itab_left       LIKE node_str OCCURS 0.

DATA node_itab_right      LIKE node_str OCCURS 0.

DATA node                 LIKE node_str.

TYPES: BEGIN OF TY_DRAG,

        NODE_KEY   LIKE NODE_STR-NODE_KEY,

        TEXT       LIKE NODE_STR-TEXT,

        END OF  TY_DRAG.

data new_nodes like node_itab_right.

*---------------------------------------------------------------------*

*       CLASS lcl_treeobject DEFINITION

*---------------------------------------------------------------------*

*       Definition of Data Container                                  *

*---------------------------------------------------------------------*

CLASS lcl_drag_object DEFINITION.

   PUBLIC SECTION.

     DATA NODES TYPE STANDARD TABLE OF TY_DRAG.

ENDCLASS.                    "lcl_drag_object DEFINITION

*---------------------------------------------------------------------*

*       CLASS dragdrop_receiver DEFINITION

*---------------------------------------------------------------------*

*       ........                                                      *

*---------------------------------------------------------------------*

CLASS lcl_dragdrop_receiver DEFINITION.

   PUBLIC SECTION.

     METHODS:

        flavor_select FOR EVENT on_drop_get_flavor OF cl_gui_simple_tree

                       IMPORTING node_key flavors drag_drop_object,

        left_drag     FOR EVENT on_drag_multiple OF cl_gui_simple_tree

                       IMPORTING node_key_table drag_drop_object,

        right_drop    FOR EVENT on_drop OF cl_gui_simple_tree

                       IMPORTING node_key drag_drop_object,

        right_drag    FOR EVENT on_drag_multiple OF cl_gui_simple_tree

                       IMPORTING node_key_table drag_drop_object,

        left_drop     FOR EVENT on_drop OF cl_gui_simple_tree

                       IMPORTING node_key drag_drop_object,

        drop_complete_left FOR EVENT on_drop_complete_multiple OF

                       cl_gui_simple_tree

                       IMPORTING node_key_table drag_drop_object,

        drop_complete_right FOR EVENT on_drop_complete_multiple OF

                       cl_gui_simple_tree

                       IMPORTING node_key_table drag_drop_object.

ENDCLASS.                    "lcl_dragdrop_receiver DEFINITION

DATA dragdrop         TYPE REF TO lcl_dragdrop_receiver.

*                               -------------- )

CALL SCREEN 100.

*                               -------------- )

*&---------------------------------------------------------------------*

*&      Module  STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

MODULE STATUS_0100 OUTPUT.

   SET PF-STATUS '100'.

   SET TITLEBAR '100'.

   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 tree_right

       EXPORTING

         parent              = right

         node_selection_mode = tree_right->node_sel_mode_multiple.

     CREATE OBJECT tree_left

       EXPORTING

         parent              = left

         node_selection_mode = tree_left->node_sel_mode_multiple.

*   Definition of drag drop behaviour  -------------------

     CREATE OBJECT behaviour_left.

*   Definition of drag drop behaviour  -------------------

     CREATE OBJECT behaviour_right.

     CALL METHOD behaviour_left->add

          EXPORTING

                flavor = 'Tree_copy'

                dragsrc = 'X'

                droptarget = ' '

                effect = cl_dragdrop=>copy.

      CALL METHOD behaviour_left->add

         EXPORTING

               flavor = 'Tree_move'

               dragsrc = 'X'

               droptarget = 'X'

               effect = cl_dragdrop=>copy.

     CALL METHOD behaviour_right->add

            EXPORTING

                  flavor = 'Tree_copy'

                  dragsrc = ' '

                  droptarget = 'X'

                  effect = cl_dragdrop=>copy.

     CALL METHOD behaviour_right->add

            EXPORTING

                  flavor = 'Tree_move'

                  dragsrc = 'X'

                  droptarget = 'X'

                  effect = cl_dragdrop=>copy.

     CALL METHOD behaviour_left->get_handle

       IMPORTING

         handle = handle_tree_left.

*   -----------------------------------------

     PERFORM fill_tree_left CHANGING handle_tree_left node_itab_left.

     CALL METHOD tree_left->add_nodes

       EXPORTING

         node_table           = node_itab_left

         table_structure_name = 'NODE_STR'.

     CALL METHOD tree_left->expand_node

       EXPORTING

         node_key = 'HIER2'.

     CALL METHOD behaviour_right->get_handle

          IMPORTING handle = handle_tree_right.

     CALL METHOD behaviour_right->get_handle

       IMPORTING

         handle = handle_tree_right.

*   -----------------------------------------

     PERFORM fill_tree_RIGHT CHANGING handle_tree_right node_itab_right.

     CALL METHOD tree_right->add_nodes

       EXPORTING

         node_table           = node_itab_right

         table_structure_name = 'NODE_STR'.

     CALL METHOD tree_right->expand_node

       EXPORTING

         node_key = 'HIER1'.

     CREATE OBJECT dragdrop.

     SET HANDLER dragdrop->flavor_select FOR tree_right.

     SET HANDLER dragdrop->left_drag FOR tree_left.

     SET HANDLER dragdrop->right_drop FOR tree_right.

     SET HANDLER dragdrop->drop_complete_left FOR tree_left.

     SET HANDLER dragdrop->flavor_select FOR tree_left.

     SET HANDLER dragdrop->right_drag FOR tree_right.

     SET HANDLER dragdrop->left_drop FOR tree_left.

     SET HANDLER dragdrop->drop_complete_right FOR tree_right.

   ENDIF.

ENDMODULE.                 " STATUS_0100  OUTPUT

*---------------------------------------------------------------------*

*       CLASS DRAGDROP_RECEIVER IMPLEMENTATION

*---------------------------------------------------------------------*

*       ........                                                      *

*---------------------------------------------------------------------*

CLASS lcl_dragdrop_receiver IMPLEMENTATION.

   METHOD flavor_select.

     BREAK-POINT.

*    IF node_key <> 'Root'.

*      SEARCH flavors FOR 'Tree_move'.

*      IF sy-subrc = 0.

*        CALL METHOD drag_drop_object->set_flavor

*             EXPORTING newflavor = 'Tree_move'.

*      ELSE.

*        CALL METHOD drag_drop_object->abort.

*      ENDIF.

*    ELSE.

*      SEARCH flavors FOR 'Tree_copy'.

*      IF sy-subrc = 0.

*        CALL METHOD drag_drop_object->set_flavor

*             EXPORTING newflavor = 'Tree_copy'.

*      ELSE.

*        CALL METHOD drag_drop_object->abort.

*      ENDIF.

*    ENDIF.

   ENDMETHOD.                    "flavor_select

* %%%%%%%%%%%%%%%%%%%%%%%%%%%%

   METHOD left_drag.

     DATA drag_object TYPE REF TO lcl_drag_object.

     DATA node_key TYPE node_str-node_key.

     DATA: LS_NODE TYPE TY_DRAG.

     CREATE OBJECT drag_object.

     LOOP AT node_key_table INTO node_key.

       READ TABLE node_itab_left WITH KEY node_key = node_key

                            INTO node.

       LS_NODE-node_key = node_key.

       LS_NODE-TEXT = NODE-TEXT.

       APPEND LS_NODE TO drag_object->NODES.

     ENDLOOP.

     drag_drop_object->object = drag_object.

   ENDMETHOD.                    "left_drag

* %%%%%%%%%%%%%%%%%%%%%%%%%%%%* %%%%%%%%%%%%%%%%%%%%%%%%%%%%

   METHOD right_drop.

     DATA drag_object TYPE REF TO lcl_drag_object.

     data new_node type TY_DRAG.

     CATCH SYSTEM-EXCEPTIONS move_cast_error = 1.

       drag_object ?= drag_drop_object->object.

     ENDCATCH.

     IF sy-subrc = 1.

       " data object has unexpected class

       " => cancel Drag & Drop operation

       CALL METHOD drag_drop_object->abort.

       EXIT.

     ENDIF.

     refresh new_nodes.

     loop at drag_object->NODES into new_node.

       CLEAR node.

       node-node_key = new_node-node_key.

       node-relatkey = node_key.

       NODE-TEXT     = new_node-TEXT.

*      node-relatship = cl_gui_simple_tree=>relat_last_child.

       node-isfolder = ' '.

       node-dragdropid = handle_tree_right.

       APPEND node TO node_itab_RIGHT.

       APPEND NODE TO NEW_NODES.

     endloop.

     call method tree_right->add_nodes

       EXPORTING

         node_table           = new_nodes

         table_structure_name = 'NODE_STR'.

   ENDMETHOD.                    "right_drop

* %%%%%%%%%%%%%%%%%%%%%%%%%%%%* %%%%%%%%%%%%%%%%%%%%%%%%%%%%

   METHOD right_drag.

*    BREAK-POINT.

     DATA drag_object TYPE REF TO lcl_drag_object.

     DATA node_key TYPE node_str-node_key.

     DATA: LS_NODE TYPE TY_DRAG.

     CREATE OBJECT drag_object.

     LOOP AT node_key_table INTO node_key.

       READ TABLE node_itab_right WITH KEY node_key = node_key

                            INTO node.

       LS_NODE-node_key = node_key.

       LS_NODE-TEXT = NODE-TEXT.

       APPEND LS_NODE TO drag_object->NODES.

     ENDLOOP.

     drag_drop_object->object = drag_object.

   ENDMETHOD.

* %%%%%%%%%%%%%%%%%%%%%%%%%%%%* %%%%%%%%%%%%%%%%%%%%%%%%%%%%

   METHOD left_drop.

*    BREAK-POINT.

     DATA drag_object TYPE REF TO lcl_drag_object.

     data new_node type TY_DRAG.

     CATCH SYSTEM-EXCEPTIONS move_cast_error = 1.

       drag_object ?= drag_drop_object->object.

     ENDCATCH.

     IF sy-subrc = 1.

       " data object has unexpected class

       " => cancel Drag & Drop operation

       CALL METHOD drag_drop_object->abort.

       EXIT.

     ENDIF.

     refresh new_nodes.

     loop at drag_object->NODES into new_node.

       CLEAR node.

       node-node_key = new_node-node_key.

       node-relatkey = 'HIER2'.

       NODE-TEXT     = new_node-TEXT.

       node-relatship = cl_gui_simple_tree=>relat_last_child.

       node-isfolder = ' '.

       node-dragdropid = handle_tree_left.

       APPEND node TO node_itab_left.

       APPEND NODE TO NEW_NODES.

     endloop.

     call method tree_left->add_nodes

       EXPORTING

         node_table           = new_nodes

         table_structure_name = 'NODE_STR'.

   ENDMETHOD.

* %%%%%%%%%%%%%%%%%%%%%%%%%%%%* %%%%%%%%%%%%%%%%%%%%%%%%%%%%

   METHOD drop_complete_left.

     DATA node_key TYPE node_str-node_key.

*    IF drag_drop_object->flavor = 'Tree_move_to_Edit'.

       LOOP AT node_key_table INTO node_key.

         CALL METHOD tree_left->delete_node

                EXPORTING node_key = node_key.

         DELETE node_itab_left WHERE node_key = node_key.

       ENDLOOP.

*    ENDIF.

   ENDMETHOD.                    "drop_complete

* %%%%%%%%%%%%%%%%%%%%%%%%%%%%* %%%%%%%%%%%%%%%%%%%%%%%%%%%%

   METHOD drop_complete_right.

     DATA node_key TYPE node_str-node_key.

     LOOP AT node_key_table INTO node_key.

       CALL METHOD tree_left->delete_node

              EXPORTING node_key = node_key.

       DELETE node_itab_right WHERE node_key = node_key.

     ENDLOOP.

   ENDMETHOD.                    "drop_complete

ENDCLASS.                    "lcl_dragdrop_receiver IMPLEMENTATION

*&---------------------------------------------------------------------*

*&      Module  USER_COMMAND_0100  INPUT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

MODULE USER_COMMAND_0100 INPUT.

*  IF sy-ucomm eq 'ADD'.

*      CLEAR node.

*      node-node_key = '900'.

*      node-relatkey = 'HIER2'.

*      NODE-TEXT     = 'Test'.

*      node-isfolder = ' '.

*      node-dragdropid = handle_tree_right.

**      APPEND node TO node_itab_RIGHT.

*      APPEND NODE TO NEW_NODES.

*

*    call method tree_left->add_nodes

*      EXPORTING

*        node_table           = new_nodes

*        table_structure_name = 'NODE_STR'.

*  ENDIF.

   CALL METHOD cl_gui_cfw=>dispatch.

ENDMODULE.                 " USER_COMMAND_0100  INPUT

*----------------------------------------------------------------------*

*  MODULE exit INPUT

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

MODULE exit INPUT.

   LEAVE PROGRAM.

ENDMODULE.                             " EXIT  INPUT

*&---------------------------------------------------------------------*

*&      Form  FILL_TREE_LEFT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      <--P_HANDLE_TREE_LEFT  text

*      <--P_NODE_ITAB_LEFT  text

*----------------------------------------------------------------------*

FORM FILL_TREE_LEFT  CHANGING handle_tree TYPE i

                         node_itab LIKE node_itab_left.

   DATA: node LIKE mtreesnode.

   CLEAR node.

   node-node_key = 'HIER2'.

   node-text     = 'Hierarchy Level 2'.

   node-dragdropid = handle_tree.       " handle of behaviour

   node-isfolder = 'X'.

   APPEND node TO node_itab.

   SELECT * FROM ZMATH2.

     SELECT SINGLE * FROM ZMATH1L

       WHERE HIER2 EQ ZMATH2-HIER2.

     CHECK SY-SUBRC NE 0.

     CLEAR node.

     node-node_key   = ZMATH2-HIER2.

     node-relatkey   = 'HIER2'.

     node-text(3)    = ZMATH2-HIER2.

     node-text+4(1= '-'.

     node-text+6(10) = ZMATH2-SHORT.

     node-relatship  = cl_gui_simple_tree=>relat_last_child.

     node-dragdropid = handle_tree.       " handle of behaviour

     APPEND node TO node_itab.

   ENDSELECT.

ENDFORM.                    " FILL_TREE_LEFT

*&---------------------------------------------------------------------*

*&      Form  FILL_TREE_RIGHT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      <--P_HANDLE_TREE_RIGHT  text

*      <--P_NODE_ITAB_RIGHT  text

*----------------------------------------------------------------------*

FORM FILL_TREE_RIGHT  CHANGING handle_tree TYPE i

                         node_itab LIKE node_itab_left.

   DATA: node LIKE mtreesnode.

   CLEAR node.

   node-node_key = 'HIER1'.

   node-text     = 'Hierarchy Level 1'.

   node-isfolder = 'X'.

   APPEND node TO node_itab.

   SELECT * FROM ZMATH1.

     CLEAR node.

     node-node_key   = ZMATH1-HIER1.

     node-relatkey   = 'HIER1'.

     "node-relatship  = cl_gui_simple_tree=>relat_last_child.

     node-text(3)    = ZMATH1-HIER1.

     node-text+4(1= '-'.

     node-text+6(10) = ZMATH1-SHORT.

     node-isfolder   = 'X'.

     node-dragdropid = handle_tree.       " handle of behaviour

     APPEND node TO node_itab.

     SELECT * FROM ZMATH1L

       WHERE HIER1 EQ ZMATH1-HIER1.

       CLEAR node.

       node-node_key = ZMATH1L-HIER2.

       node-relatkey = ZMATH1L-HIER1.

       SELECT SINGLE * FROM ZMATH2

         WHERE HIER2 EQ ZMATH1L-HIER2.

       IF SY-SUBRC EQ 0.

         node-text(3)    = ZMATH2-HIER2.

         node-text+4(1= '-'.

         node-text+6(10) = ZMATH2-SHORT.

       ENDIF.

       node-relatship = cl_gui_simple_tree=>relat_last_child.

       node-isfolder = ' '.

       node-dragdropid = handle_tree.       " handle of behaviour

       APPEND node TO node_itab.

     ENDSELECT.

   ENDSELECT.

ENDFORM.                    " FILL_TREE_RIGHT

Regards,

Alpesh