2013 Oct 21 6:36 PM
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
2013 Oct 21 7:16 PM
Hi Alpesh,
Refer the sample code. It may helpful to you.
http://help.sap.com/saphelp_erp2004/helpdata/en/c0/64b4c7c74411d2bd93080009b4534c/content.htm
http://help.sap.com/saphelp_nw73ehp1/helpdata/en/4d/70ce50a9e24cb2e10000000a42189c/content.htm
http://smoschid.tripod.com/APPL_SAP_SOURCE_CODE/Z_ALV_GRID_CTRLS_DRAG_DROP.txt
Regards,
Rajesh
2013 Oct 22 6:25 AM
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
| User | Count |
|---|---|
| 3 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |