Application Development 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: 

2x ALV TREEs with Drag and Drop

Former Member
0 Kudos

Hello gurus,

I need to create 2 ALV TREEs with drag and drop IN BOTH DIRECTIONS. Is this possible? Does anyone got an example?

The class used is CL_GUI_ALV_TREE.

Thanks a lot!,

Eloi Rossell

1 ACCEPTED SOLUTION

Former Member
0 Kudos

Yes

The demo program RSDEMO_DRAG_DROP_TREE_MULTI shows Drag and Drop control from tree on right->tree on left, but the same can be done for opposite direction

Max

4 REPLIES 4

Former Member
0 Kudos

Yes

The demo program RSDEMO_DRAG_DROP_TREE_MULTI shows Drag and Drop control from tree on right->tree on left, but the same can be done for opposite direction

Max

0 Kudos

Hello Max,

I try it but I can't do it backwards. Are you sure this option is available in the program?

I'm in 7.40 Version.

Thanks,

Eloi

0 Kudos

I've done some modifications in demo program, try this:


report  rsdemo_drag_drop_edit_tree    .

data ok_code type sy-ucomm.

data node_itab_left like node_str occurs 0.

data node_itab_right 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 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.

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

*       CLASS lcl_treeobject DEFINITION

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

*       Definition of Data Container                                  *

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

class lcl_drag_object definition.

   public section.

     data text type standard table of mtreesnode-text.

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,

        drop_complete for event on_drop_complete_multiple of

                       cl_gui_simple_tree

                       importing node_key_table drag_drop_object.

   private section.

     data: which_tree(1) type c.

endclass.                    "lcl_dragdrop_receiver DEFINITION

************************************************************************

************************************************************************

start-of-selection.

   call screen 100.

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

*&      Module  START  OUTPUT

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

*       text

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

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 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.

     call method behaviour_left->add

       exporting

         flavor     = 'Tree_move'

         dragsrc    = 'X'

         droptarget = ' '

         effect     = cl_dragdrop=>copy.

     call method behaviour_left->add

       exporting

         flavor     = 'Tree_copy'

         dragsrc    = 'X'

         droptarget = ' '

         effect     = cl_dragdrop=>copy.

     call method behaviour_left->add

       exporting

         flavor     = 'Tree_mov2'

         dragsrc    = ' '

         droptarget = 'X'

         effect     = cl_dragdrop=>copy.

     call method behaviour_left->add

       exporting

         flavor     = 'Tree_cop2'

         dragsrc    = ' '

         droptarget = 'X'

         effect     = cl_dragdrop=>copy.

     call method behaviour_left->get_handle

       importing

         handle = handle_tree_left.

* Drag Drop behaviour of tree control nodes are defined in the node

* structure

     perform fill_tree changing handle_tree_left node_itab_left.

     call method tree_left->add_nodes

       exporting

         node_table           = node_itab_left

         table_structure_name = 'NODE_STR'.

     create object behaviour_right.

     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    = ' '

         droptarget = 'X'

         effect     = cl_dragdrop=>copy.

     call method behaviour_right->add

       exporting

         flavor     = 'Tree_cop2'

         dragsrc    = 'X'

         droptarget = ' '

         effect     = cl_dragdrop=>copy.

     call method behaviour_right->add

       exporting

         flavor     = 'Tree_mov2'

         dragsrc    = 'X'

         droptarget = ' '

         effect     = cl_dragdrop=>copy.

     call method behaviour_right->get_handle

       importing

         handle = handle_tree_right.

     perform fill_tree changing handle_tree_right node_itab_right.

     call method tree_right->add_nodes

       exporting

         node_table           = node_itab_right

         table_structure_name = 'NODE_STR'.

* registration of drag and drop events

     data dragdrop type ref to lcl_dragdrop_receiver.

     create object dragdrop.

     set handler dragdrop->flavor_select for tree_right.

     set handler dragdrop->flavor_select for tree_left.

     set handler dragdrop->left_drag for tree_left.

     set handler dragdrop->right_drop for tree_right.

     set handler dragdrop->left_drag for tree_right.

     set handler dragdrop->right_drop for tree_left.

     set handler dragdrop->drop_complete for tree_left.

     set handler dragdrop->drop_complete for tree_right.

     call method tree_left->expand_node

       exporting

         node_key = 'Root'.

     call method tree_right->expand_node

       exporting

         node_key = 'Root'.

   endif.

endmodule.                             " START  OUTPUT

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

*&      Module  EXIT  INPUT

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

*       text

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

module exit input.

   leave program.

endmodule.                             " EXIT  INPUT

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

*&      Form  fill_tree

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

*       text

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

*  -->  p1        text

*  <--  p2        text

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

form fill_tree changing handle_tree type i

                         node_itab like node_itab_left.

   data: node like mtreesnode.

* node table of the left tree

   clear node.

   node-node_key = 'Root'.

   node-isfolder = 'X'.

   node-text = 'Texte'.

   node-dragdropid = ' '.

   append node to node_itab.

   clear node.

   node-node_key = 'Child1'.

   node-relatkey = 'Root'.

   node-isfolder = 'X'.

   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-isfolder = 'X'.

   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

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

*       text

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

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.

     clear which_tree.

     if node_key <> 'Root'.

       search flavors for 'Tree_move'.

       if sy-subrc = 0.

         which_tree = 'L'.

         call method drag_drop_object->set_flavor

           exporting

             newflavor = 'Tree_move'.

       else.

         search flavors for 'Tree_mov2'.

         if sy-subrc = 0.

           which_tree = 'R'.

           call method drag_drop_object->set_flavor

             exporting

               newflavor = 'Tree_mov2'.

         else.

           call method drag_drop_object->abort.

         endif.

       endif.

     else.

       search flavors for 'Tree_copy'.

       if sy-subrc = 0.

         which_tree = 'L'.

         call method drag_drop_object->set_flavor

           exporting

             newflavor = 'Tree_copy'.

       else.

         search flavors for 'Tree_cop2'.

         if sy-subrc = 0.

           which_tree = 'R'.

           call method drag_drop_object->set_flavor

             exporting

               newflavor = 'Tree_cop2'.

         else.

           call method drag_drop_object->abort.

         endif.

       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.

     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.

       append node-text to drag_object->text.

     endloop.

     drag_drop_object->object = drag_object.

   endmethod.                    "left_drag

   method right_drop.

     data drag_object type ref to lcl_drag_object.

     data new_nodes like node_itab_right.

     data new_node type node_str.

     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.

     loop at drag_object->text into new_node-text.

       case which_tree.

         when 'L'.

           perform add_node changing node_key new_node new_nodes

                                     node_itab_left.

         when 'R'.

           perform add_node changing node_key new_node new_nodes

                                     node_itab_right.

       endcase.

     endloop.

     case which_tree.

       when 'L'.

         call method tree_right->add_nodes

           exporting

             node_table           = new_nodes

             table_structure_name = 'NODE_STR'.

       when 'R'.

         call method tree_left->add_nodes

           exporting

             node_table           = new_nodes

             table_structure_name = 'NODE_STR'.

     endcase.

   endmethod.                    "right_drop

   method drop_complete.

     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.

         case which_tree.

           when 'L'.

             call method tree_left->delete_node

               exporting

                 node_key = node_key.

             delete node_itab_left where node_key = node_key.

           when 'R'.

             call method tree_right->delete_node

               exporting

                 node_key = node_key.

             delete node_itab_right where node_key = node_key.

         endcase.

       endloop.

     endif.

   endmethod.                    "drop_complete

endclass.                    "lcl_dragdrop_receiver IMPLEMENTATION

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

*&      Form  ADD_NODE

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

*       text

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

*      <--P_NEW_NODE  text

*      <--P_NEW_NODES  text

*      <--P_NODE_ITAB_LEFT  text

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

form add_node changing node_key

                        new_node type node_str

                        new_nodes like node_itab_left

                        node_itab_left like node_itab_left.

   data lines type i.

   describe table node_itab_left lines lines.

   new_node-node_key = lines.

   new_node-isfolder = 'X'.

   new_node-dragdropid = handle_tree_right.

   new_node-relatkey = node_key.

   append new_node to new_nodes.

   append new_node to node_itab_left.

endform.                    " ADD_NODE

Max

0 Kudos

Thanks a lot for the code. So useful!