08-29-2014 4:55 PM
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
08-29-2014 5:01 PM
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
08-29-2014 5:01 PM
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
08-29-2014 5:09 PM
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
08-29-2014 5:58 PM
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
09-01-2014 10:53 AM