1. 程式人生 > 實用技巧 >SAP Drag or drop tree

SAP Drag or drop tree

  1 *&---------------------------------------------------------------------*
  2 *& Report  RSDEMO_DRAG_DROP_EDIT_TREE                                  *
  3 *&                                                                     *
  4 *&---------------------------------------------------------------------*
5 *& * 6 *& * 7 *&---------------------------------------------------------------------* 8 9 REPORT rsdemo_drag_drop_edit_tree . 10 DATA
ok_code TYPE sy-ucomm. 11 DATA node_itab_left LIKE node_str OCCURS 0. 12 DATA node_itab_right LIKE node_str OCCURS 0. 13 DATA node LIKE node_str. 14 15 DATA container TYPE REF TO cl_gui_custom_container. 16 DATA splitter TYPE REF TO cl_gui_easy_splitter_container. 17 DATA right TYPE REF TO cl_gui_container.
18 DATA left TYPE REF TO cl_gui_container. 19 20 DATA tree_right TYPE REF TO cl_gui_simple_tree. 21 DATA tree_left TYPE REF TO cl_gui_simple_tree. 22 23 DATA behaviour_left TYPE REF TO cl_dragdrop. 24 DATA behaviour_right TYPE REF TO cl_dragdrop. 25 26 DATA handle_tree_left TYPE i. 27 DATA handle_tree_right TYPE i. 28 29 *---------------------------------------------------------------------* 30 * CLASS lcl_treeobject DEFINITION 31 *---------------------------------------------------------------------* 32 * Definition of Data Container * 33 *---------------------------------------------------------------------* 34 CLASS lcl_drag_object DEFINITION. 35 PUBLIC SECTION. 36 DATA text TYPE STANDARD TABLE OF mtreesnode-text. 37 ENDCLASS. 38 39 40 *---------------------------------------------------------------------* 41 * CLASS dragdrop_receiver DEFINITION 42 *---------------------------------------------------------------------* 43 * ........ * 44 *---------------------------------------------------------------------* 45 CLASS lcl_dragdrop_receiver DEFINITION. 46 PUBLIC SECTION. 47 METHODS: 48 flavor_select FOR EVENT on_drop_get_flavor OF cl_gui_simple_tree 49 IMPORTING node_key flavors drag_drop_object, 50 left_drag FOR EVENT on_drag_multiple OF cl_gui_simple_tree 51 IMPORTING node_key_table drag_drop_object, 52 right_drop FOR EVENT on_drop OF cl_gui_simple_tree 53 IMPORTING node_key drag_drop_object, 54 drop_complete FOR EVENT on_drop_complete_multiple OF 55 cl_gui_simple_tree 56 IMPORTING node_key_table drag_drop_object. 57 58 ENDCLASS. 59 60 ************************************************************************ 61 62 63 ************************************************************************ 64 65 START-OF-SELECTION. 66 CALL SCREEN 100. 67 *&---------------------------------------------------------------------* 68 *& Module START OUTPUT 69 *&---------------------------------------------------------------------* 70 * text 71 *----------------------------------------------------------------------* 72 MODULE start OUTPUT. 73 SET PF-STATUS 'BASE'. 74 IF container is initial. 75 CREATE OBJECT container 76 EXPORTING container_name = 'CONTAINER'. 77 CREATE OBJECT splitter 78 EXPORTING parent = container 79 orientation = 1. 80 left = splitter->top_left_container. 81 right = splitter->bottom_right_container. 82 CREATE OBJECT tree_right 83 EXPORTING parent = right 84 node_selection_mode = tree_right->node_sel_mode_multiple. 85 CREATE OBJECT tree_left 86 EXPORTING parent = left 87 node_selection_mode = tree_left->node_sel_mode_multiple. 88 89 * Definition of drag drop behaviour 90 CREATE OBJECT behaviour_left. 91 CALL METHOD behaviour_left->add 92 EXPORTING 93 flavor = 'Tree_move' 94 dragsrc = 'X' 95 droptarget = ' ' 96 effect = cl_dragdrop=>copy. 97 CALL METHOD behaviour_left->add 98 EXPORTING 99 flavor = 'Tree_copy' 100 dragsrc = 'X' 101 droptarget = ' ' 102 effect = cl_dragdrop=>copy. 103 104 CALL METHOD behaviour_left->get_handle 105 IMPORTING handle = handle_tree_left. 106 107 * Drag Drop behaviour of tree control nodes are defined in the node 108 * structure 109 PERFORM fill_tree CHANGING handle_tree_left node_itab_left. 110 CALL METHOD tree_left->add_nodes 111 EXPORTING node_table = node_itab_left 112 table_structure_name = 'NODE_STR'. 113 114 CREATE OBJECT behaviour_right. 115 116 CALL METHOD behaviour_right->add 117 EXPORTING 118 flavor = 'Tree_copy' 119 dragsrc = ' ' 120 droptarget = 'X' 121 effect = cl_dragdrop=>copy. 122 CALL METHOD behaviour_right->add 123 EXPORTING 124 flavor = 'Tree_move' 125 dragsrc = ' ' 126 droptarget = 'X' 127 effect = cl_dragdrop=>copy. 128 CALL METHOD behaviour_right->get_handle 129 IMPORTING handle = handle_tree_right. 130 131 PERFORM fill_tree CHANGING handle_tree_right node_itab_right. 132 CALL METHOD tree_right->add_nodes 133 EXPORTING node_table = node_itab_right 134 table_structure_name = 'NODE_STR'. 135 136 * registration of drag and drop events 137 DATA dragdrop TYPE REF TO lcl_dragdrop_receiver. 138 CREATE OBJECT dragdrop. 139 SET HANDLER dragdrop->flavor_select FOR tree_right. 140 SET HANDLER dragdrop->left_drag FOR tree_left. 141 SET HANDLER dragdrop->right_drop FOR tree_right. 142 SET HANDLER dragdrop->drop_complete FOR tree_left. 143 144 145 CALL METHOD tree_left->expand_node 146 EXPORTING node_key = 'Root'. 147 CALL METHOD tree_right->expand_node 148 EXPORTING node_key = 'Root'. 149 150 ENDIF. 151 ENDMODULE. " START OUTPUT 152 *&---------------------------------------------------------------------* 153 *& Module EXIT INPUT 154 *&---------------------------------------------------------------------* 155 * text 156 *----------------------------------------------------------------------* 157 MODULE exit INPUT. 158 LEAVE PROGRAM. 159 ENDMODULE. " EXIT INPUT 160 *&---------------------------------------------------------------------* 161 *& Form fill_tree 162 *&---------------------------------------------------------------------* 163 * text 164 *----------------------------------------------------------------------* 165 * --> p1 text 166 * <-- p2 text 167 *----------------------------------------------------------------------* 168 FORM fill_tree CHANGING handle_tree TYPE i 169 node_itab LIKE node_itab_left. 170 DATA: node LIKE mtreesnode. 171 172 * node table of the left tree 173 CLEAR node. 174 node-node_key = 'Root'. 175 node-isfolder = 'X'. 176 node-text = 'Texte'. 177 node-dragdropid = ' '. 178 APPEND node TO node_itab. 179 180 CLEAR node. 181 node-node_key = 'Child1'. 182 node-relatkey = 'Root'. 183 node-isfolder = 'X'. 184 node-relatship = cl_gui_simple_tree=>relat_last_child. 185 node-text = 'DragDrop Text 1'. 186 node-dragdropid = handle_tree. " handle of behaviour 187 APPEND node TO node_itab. 188 189 CLEAR node. 190 node-node_key = 'Child2'. 191 node-relatkey = 'Root'. 192 node-isfolder = 'X'. 193 node-relatship = cl_gui_simple_tree=>relat_last_child. 194 node-text = 'DragDrop Text 2'. 195 node-dragdropid = handle_tree. " handle of behaviour 196 APPEND node TO node_itab. 197 198 199 ENDFORM. " fill_tree 200 *&---------------------------------------------------------------------* 201 *& Module USER_COMMAND_0100 INPUT 202 *&---------------------------------------------------------------------* 203 * text 204 *----------------------------------------------------------------------* 205 MODULE user_command_0100 INPUT. 206 CALL METHOD cl_gui_cfw=>dispatch. 207 ENDMODULE. " USER_COMMAND_0100 INPUT 208 209 210 *---------------------------------------------------------------------* 211 * CLASS DRAGDROP_RECEIVER IMPLEMENTATION 212 *---------------------------------------------------------------------* 213 * ........ * 214 *---------------------------------------------------------------------* 215 CLASS lcl_dragdrop_receiver IMPLEMENTATION. 216 METHOD flavor_select. 217 IF node_key <> 'Root'. 218 SEARCH flavors FOR 'Tree_move'. 219 IF sy-subrc = 0. 220 CALL METHOD drag_drop_object->set_flavor 221 EXPORTING newflavor = 'Tree_move'. 222 ELSE. 223 CALL METHOD drag_drop_object->abort. 224 ENDIF. 225 ELSE. 226 SEARCH flavors FOR 'Tree_copy'. 227 IF sy-subrc = 0. 228 CALL METHOD drag_drop_object->set_flavor 229 EXPORTING newflavor = 'Tree_copy'. 230 ELSE. 231 CALL METHOD drag_drop_object->abort. 232 ENDIF. 233 ENDIF. 234 235 ENDMETHOD. 236 METHOD left_drag. 237 DATA drag_object TYPE REF TO lcl_drag_object. 238 DATA node_key TYPE node_str-node_key. 239 CREATE OBJECT drag_object. 240 LOOP AT node_key_table INTO node_key. 241 READ TABLE node_itab_left WITH KEY node_key = node_key 242 INTO node. 243 244 APPEND node-text TO drag_object->text. 245 ENDLOOP. 246 drag_drop_object->object = drag_object. 247 ENDMETHOD. 248 249 METHOD right_drop. 250 DATA drag_object TYPE REF TO lcl_drag_object. 251 data new_nodes like node_itab_right. 252 data new_node type node_str. 253 CATCH SYSTEM-EXCEPTIONS move_cast_error = 1. 254 drag_object ?= drag_drop_object->object. 255 ENDCATCH. 256 IF sy-subrc = 1. 257 " data object has unexpected class 258 " => cancel Drag & Drop operation 259 CALL METHOD drag_drop_object->abort. 260 EXIT. 261 ENDIF. 262 loop at drag_object->text into new_node-text. 263 perform add_node changing node_key new_node new_nodes 264 node_itab_left. 265 endloop. 266 call method tree_right->add_nodes 267 exporting node_table = new_nodes 268 table_structure_name = 'NODE_STR'. 269 ENDMETHOD. 270 METHOD drop_complete. 271 DATA node_key TYPE node_str-node_key. 272 IF drag_drop_object->flavor = 'Tree_move_to_Edit'. 273 LOOP AT node_key_table INTO node_key. 274 CALL METHOD tree_left->delete_node 275 EXPORTING node_key = node_key. 276 DELETE node_itab_left WHERE node_key = node_key. 277 ENDLOOP. 278 ENDIF. 279 280 ENDMETHOD. 281 ENDCLASS. 282 283 *&---------------------------------------------------------------------* 284 *& Form ADD_NODE 285 *&---------------------------------------------------------------------* 286 * text 287 *----------------------------------------------------------------------* 288 * <--P_NEW_NODE text 289 * <--P_NEW_NODES text 290 * <--P_NODE_ITAB_LEFT text 291 *----------------------------------------------------------------------* 292 FORM ADD_NODE CHANGING node_key 293 NEW_NODE type node_str 294 NEW_NODES like node_itab_left 295 NODE_ITAB_LEFT like node_itab_left. 296 data lines type i. 297 describe table node_itab_left lines lines. 298 new_node-node_key = lines. 299 new_node-isfolder = 'X'. 300 new_node-dragdropid = handle_tree_right. 301 new_node-relatkey = node_key. 302 303 APPEND new_node TO new_nodes. 304 append new_node to node_itab_left. 305 306 ENDFORM. " ADD_NODE