Sap Tree Control

来源:互联网 发布:mac 隐藏文件夹显示 编辑:程序博客网 时间:2024/04/30 14:24
*//1,屏幕中建立container,用以存储cl_gui_custom_container
*//2.建立容器对象cl_gui_custom_container,需要1中屏幕建立的container
*//3.创建树对象cl_gui_simple_tree,需要3中的容器对象
*//4.建立节点结构mtreesnode,并根据节点结构建立节点表,通过树对象方法add_nodes将建立好的节点表放入树对象中
*//5.定义对象树的事件类型放入cntl_simple_event结构中,再将对应的事件结构放入事件表cntl_simple_events中。
*//6.调用树对象的方法set_registered_events,设置树对象的相应事件
*//7.创建事件处理函数,处理节点树的事件,如node_double_click事件
*//8.注册事件 SET HANDLER
*//树对象常用方法:get_selected_node(获取当前节点),delete_node(删除节点),add_nodes(添加节点),node_set_text(修改节点),expand_node(设置树默认展开)
*//树对象常用事件: FOR EVENT node_double_click OF cl_gui_simple_tree IMPORTING node_key. 双击事件
*// FOR EVENT node_context_menu_request OF cl_gui_simple_tree IMPORTING node_key menu. 右键事件,通过menu的add_function来添加右键菜单
*// FOR EVENT node_context_menu_select OF cl_gui_simple_tree IMPORTING node_key fcode.   选择按钮事件,获取右键功能键和当前节点
*//事件注册前需调用set_ctx_menu_select_event_appl,然后调用set_registered_events











REPORT ytest001. 
DATA: save_ok TYPE sy- ucomm,
      ok_code
 TYPE sy-ucomm .
DATA: text01 (18) TYPE c.

DATA: wa_container TYPE scrfname VALUE 'C_TEXTEDIT',

      wa_custom_container
 TYPE REF TO cl_gui_custom_container,
      wa_tree
 TYPE REF TO cl_gui_simple_tree.

DATA: node_table LIKE TABLE OF mtreesnode "//TREE内表
      anode_table
 LIKE TABLE OF mtreesnode,
node1
 TYPE mtreesnode.   "//TREE工作区 
DATA: node2 TYPE mtreesnode. 

DATA: wa_spfli TYPE TABLE OF spfli. 
DATA: nodekey (200) VALUE 'NODE', 
      nodetext
( 200) VALUE 'NONE',
      nodekeyold
( 200) VALUE 'NONE',
      renew
( 200).
DATA: getkey (200). 

DATA: menustr (10) VALUE ''. 

CLASS lcl_application DEFINITION DEFERRED.
*----------------------------------------------------------------------* 
*       CLASS LCL_APPLICATION DEFINITION 
*----------------------------------------------------------------------* 
*
*----------------------------------------------------------------------* 
CLASS lcl_application DEFINITION .
 
 PUBLIC SECTION.
   
 METHODS : handle_node_double_click
   
 FOR EVENT node_double_click OF cl_gui_simple_tree IMPORTING node_key.

   
 METHODS :handle_node_context_menu_req
   
 FOR EVENT node_context_menu_request OF cl_gui_simple_tree IMPORTING node_key menu.

   
 METHODS : handle_node_context_menu_sel
   
 FOR EVENT node_context_menu_select OF cl_gui_simple_tree IMPORTING node_key fcode.
ENDCLASS.                    "LCL_APPLICATION DEFINITION 
*----------------------------------------------------------------------* 
*       CLASS lcl_application IMPLEMENTATION 
*----------------------------------------------------------------------* 
*
*----------------------------------------------------------------------* 
CLASS lcl_application IMPLEMENTATION .
 
 METHOD handle_node_double_click. 
   
 MESSAGE i208(00 ) WITH 'DOUBLE' .
    nodekey
 = node_key.
   
 READ TABLE node_table WITH KEY node_key = node_key INTO node1.
    nodetext
 = node1-text .
 
 ENDMETHOD.                    "handle_node_double_click 

 
 METHOD handle_node_context_menu_req.      "//右键事件处理方法 
   
 CALL METHOD menu->add_function
     
 EXPORTING 
       
 text  = '增加本级节点'
        fcode
 = 'CODE1'.

   
 CALL METHOD menu->add_function
     
 EXPORTING 
       
 text  = '增加子节点'
        fcode
 = 'CODE2'.

   
 CALL METHOD menu->add_function
     
 EXPORTING 
       
 text  = '修改当前节点'
        fcode
 = 'CODE3'.

   
 CALL METHOD menu->add_function
     
 EXPORTING 
       
 text  = '删除当前节点'
        fcode
 = 'CODE4'.

 
 ENDMETHOD.                    "handle_node_context_menu_req 

 
 METHOD handle_node_context_menu_sel.     "//选择事件处理方法 

   
 DATA : str1 TYPE tv_nodekey.
   
 CALL METHOD wa_tree->get_selected_node
     
 IMPORTING 
        node_key
 = str1.

   
 IF sy- subrc = 0 .
      menustr
 = fcode.
      nodekey
 = str1.
      nodekeyold
 = str1.

*      nodetext = menustr. 

     
 READ TABLE node_table WITH KEY node_key = str1 INTO node1.
      nodetext
 = node1-text .
     
 IF fcode = 'CODE4' .
       
 CALL METHOD wa_tree->delete_node
         
 EXPORTING 
            node_key
 = node1 -node_key. 
       
 DELETE node_table WHERE node_key = node_key. 

     
 ENDIF .

   
 ENDIF .


 
 ENDMETHOD.                    "handle_node_context_menu_sel 


ENDCLASS.                    "lcl_application IMPLEMENTATION 

DATA: g_application TYPE REF TO lcl_application. 

START-OF-SELECTION.
 
 CREATE OBJECT g_application. 
 
 CALL SCREEN 0100. 

*简单树的建立 

*&---------------------------------------------------------------------* 
*&      Module  USER_COMMAND_0100  INPUT 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
MODULE user_command_0100 INPUT .
 
 DATA: str1 TYPE tv_nodekey. 
  save_ok
 = ok_code. 
 
 CLEAR ok_code. 
 
 CASE save_ok. 
   
 WHEN 'EXIT'.
     
 LEAVE PROGRAM .
   
 WHEN 'TEST'.
      text01
 = 'TEST'.
   
 WHEN 'BACK'.
*      CALL SCREEN 0000. 

   
 WHEN 'RENEW'.
*      LEAVE PROGRAM. 
     
 IF ( menustr = 'CODE1' ) OR ( menustr = 'CODE2' ).
       
 READ TABLE node_table WITH KEY node_key = nodekey INTO node1.
       
 IF sy-subrc = 0. 
         
 MESSAGE e208(00 ) WITH '键值重复' .
       
 ENDIF .
     
 ENDIF .
     
 CASE menustr.
       
 WHEN : 'CODE1'. 
         
 READ TABLE node_table WITH KEY  node_key = nodekeyold INTO node2.
         
 CLEAR node1.
          node1
- node_key = nodekey .
          node1
- relatkey = node2 -relatkey. 
          node1
- isfolder = 'X' .
          node1
- text = nodetext .
         
 APPEND node1 TO node_table .
         
 CLEAR anode_table.
         
 APPEND node1 TO anode_table .
         
 CALL METHOD wa_tree->add_nodes
           
 EXPORTING
              table_structure_name
 = 'MTREESNODE' 
              node_table          
 = anode_table. 


       
 WHEN : 'CODE2'. 
         
 CLEAR : node1. 
          node1
- node_key = nodekey .
          node1
- relatkey = nodekeyold .
          node1
- isfolder = 'X' .
          node1
- text = nodetext .
         
 APPEND node1 TO node_table .
         
 CLEAR anode_table.
         
 APPEND node1 TO anode_table .
         
 CALL METHOD wa_tree->add_nodes
           
 EXPORTING
              table_structure_name
 = 'MTREESNODE' 
              node_table          
 = anode_table. 
       
 WHEN : 'CODE3'. 
          node1
- node_key = nodekeyold .
         
 CALL METHOD wa_tree->node_set_text
           
 EXPORTING
              node_key
 = node1 -node_key
             
 text     = nodetext.



     
 ENDCASE .



   
 WHEN 'GETKEY'.
     
 CALL METHOD wa_tree->get_selected_node
       
 IMPORTING 
          node_key
 = str1.
     
 IF sy-subrc = 0. 
        nodekeyold
 = str1.
     
 ENDIF .




 
 ENDCASE.

ENDMODULE.                 " USER_COMMAND_0100  INPUT 
*&---------------------------------------------------------------------* 
*&      Module  STATUS_0100  OUTPUT 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
MODULE status_0100 OUTPUT .
 
 SET PF-STATUS '0100'. 

 
 IF wa_custom_container IS INITIAL .
   
 PERFORM create_tree.
 
 ENDIF.
*  SET TITLEBAR 'xxx'. 

ENDMODULE.                 " STATUS_0100  OUTPUT 
*&---------------------------------------------------------------------* 
*&      Module  EXIT  INPUT 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
MODULE exit INPUT.
 
 LEAVE PROGRAM.
ENDMODULE.                 " EXIT  INPUT
*&---------------------------------------------------------------------* 
*&      Form  CREATE_TREE 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
*  -->  p1        text 
*  <--  p2        text 
*----------------------------------------------------------------------* 
FORM create_tree . 

 
 DATA: events TYPE cntl_simple_events,
        event1
 TYPE cntl_simple_event.

 
 CREATE OBJECT wa_custom_container
   
 EXPORTING 
      container_name
 = wa_container.

 
 CREATE OBJECT wa_tree
   
 EXPORTING 
      parent             
 = wa_custom_container
      node_selection_mode
 = cl_gui_simple_tree=>node_sel_mode_single .

*    节点的建立 
 
 CLEAR node1. 
  node1
-node_key = 'COUNTRY'.     "//根节点
*  CLEAR node1-relatkey. 
*  CLEAR node1-relatship. 
*  node1-hidden = ''. 
*  node1-disabled = ''. 
  node1
-isfolder = 'X'.
*  CLEAR node1-n_image. 
*  CLEAR node1-exp_image. 
*  CLEAR node1-expander. 
  node1
-text = '中国'.
 
 APPEND node1 TO node_table.

 
 CLEAR node1. 
  node1
-node_key = 'CITYBEIJING'.     "//城市节点北京
  node1
-relatkey = 'COUNTRY'.
  node1
-isfolder = 'X'.
  node1
-text = '北京'.
 
 APPEND node1 TO node_table.

 
 CLEAR node1. 
  node1
-node_key = 'CITYSHANGHAI'.     "//城市节点上海
  node1
-relatkey = 'COUNTRY'.
  node1
-isfolder = 'X'.
  node1
-text = '上海'.
 
 APPEND node1 TO node_table.


 
 CLEAR node1. 
  node1
-node_key = 'KEYCHONGWEN'.     "//地区节点 北京--崇文区
  node1
-relatkey = 'CITYBEIJING'.
*  node1-relatship =   CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD. 
  node1
-isfolder = ''.
  node1
-text = '崇文区'.
 
 CLEAR node1- expander.
 
 APPEND node1 TO node_table.


 
 CALL METHOD wa_tree-> add_nodes
   
 EXPORTING 
      table_structure_name
 = 'MTREESNODE'
      node_table          
 = node_table .

  event1
-eventid = cl_gui_simple_tree=>eventid_node_double_click .
  event1
-appl_event = 'X'.
 
 APPEND event1 TO events .



 
 CLEAR event1. 
  event1
-eventid = cl_gui_simple_tree=>eventid_node_context_menu_req .
  event1
-appl_event = ''.
 
 APPEND event1 TO events .

 
 CALL METHOD wa_tree-> set_ctx_menu_select_event_appl
   
 EXPORTING 
      appl_event
 = 'X'.


*  CLEAR event1. 
*  event1-eventid = cl_gui_simple_tree=>eventid_node_context_menu_req. 
*  event1-appl_event = ''. 
*  APPEND event1 TO events. 

 
 CALL METHOD wa_tree-> set_registered_events
   
 EXPORTING 
     
 events = events. 

 
 SET HANDLER g_application-> handle_node_double_click FOR wa_tree .

 
 SET HANDLER g_application-> handle_node_context_menu_req FOR wa_tree .

 
 SET HANDLER g_application-> handle_node_context_menu_sel FOR wa_tree .



ENDFORM.                    " CREATE_TREE*

REPORT ytest001. 
DATA: save_ok TYPE sy- ucomm,
      ok_code
 TYPE sy-ucomm .
DATA: text01 (18) TYPE c.

DATA: wa_container TYPE scrfname VALUE 'C_TEXTEDIT',

      wa_custom_container
 TYPE REF TO cl_gui_custom_container,
      wa_tree
 TYPE REF TO cl_gui_simple_tree.

DATA: node_table LIKE TABLE OF mtreesnode "//TREE内表
      anode_table
 LIKE TABLE OF mtreesnode,
node1
 TYPE mtreesnode.   "//TREE工作区 
DATA: node2 TYPE mtreesnode. 

DATA: wa_spfli TYPE TABLE OF spfli. 
DATA: nodekey (200) VALUE 'NODE', 
      nodetext
( 200) VALUE 'NONE',
      nodekeyold
( 200) VALUE 'NONE',
      renew
( 200).
DATA: getkey (200). 

DATA: menustr (10) VALUE ''. 

CLASS lcl_application DEFINITION DEFERRED.
*----------------------------------------------------------------------* 
*       CLASS LCL_APPLICATION DEFINITION 
*----------------------------------------------------------------------* 
*
*----------------------------------------------------------------------* 
CLASS lcl_application DEFINITION .
 
 PUBLIC SECTION.
   
 METHODS : handle_node_double_click
   
 FOR EVENT node_double_click OF cl_gui_simple_tree IMPORTING node_key.

   
 METHODS :handle_node_context_menu_req
   
 FOR EVENT node_context_menu_request OF cl_gui_simple_tree IMPORTING node_key menu.

   
 METHODS : handle_node_context_menu_sel
   
 FOR EVENT node_context_menu_select OF cl_gui_simple_tree IMPORTING node_key fcode.
ENDCLASS.                    "LCL_APPLICATION DEFINITION 
*----------------------------------------------------------------------* 
*       CLASS lcl_application IMPLEMENTATION 
*----------------------------------------------------------------------* 
*
*----------------------------------------------------------------------* 
CLASS lcl_application IMPLEMENTATION .
 
 METHOD handle_node_double_click. 
   
 MESSAGE i208(00 ) WITH 'DOUBLE' .
    nodekey
 = node_key.
   
 READ TABLE node_table WITH KEY node_key = node_key INTO node1.
    nodetext
 = node1-text .
 
 ENDMETHOD.                    "handle_node_double_click 

 
 METHOD handle_node_context_menu_req.      "//右键事件处理方法 
   
 CALL METHOD menu->add_function
     
 EXPORTING 
       
 text  = '增加本级节点'
        fcode
 = 'CODE1'.

   
 CALL METHOD menu->add_function
     
 EXPORTING 
       
 text  = '增加子节点'
        fcode
 = 'CODE2'.

   
 CALL METHOD menu->add_function
     
 EXPORTING 
       
 text  = '修改当前节点'
        fcode
 = 'CODE3'.

   
 CALL METHOD menu->add_function
     
 EXPORTING 
       
 text  = '删除当前节点'
        fcode
 = 'CODE4'.

 
 ENDMETHOD.                    "handle_node_context_menu_req 

 
 METHOD handle_node_context_menu_sel.     "//选择事件处理方法 

   
 DATA : str1 TYPE tv_nodekey.
   
 CALL METHOD wa_tree->get_selected_node
     
 IMPORTING 
        node_key
 = str1.

   
 IF sy- subrc = 0 .
      menustr
 = fcode.
      nodekey
 = str1.
      nodekeyold
 = str1.

*      nodetext = menustr. 

     
 READ TABLE node_table WITH KEY node_key = str1 INTO node1.
      nodetext
 = node1-text .
     
 IF fcode = 'CODE4' .
       
 CALL METHOD wa_tree->delete_node
         
 EXPORTING 
            node_key
 = node1 -node_key. 
       
 DELETE node_table WHERE node_key = node_key. 

     
 ENDIF .

   
 ENDIF .


 
 ENDMETHOD.                    "handle_node_context_menu_sel 


ENDCLASS.                    "lcl_application IMPLEMENTATION 

DATA: g_application TYPE REF TO lcl_application. 

START-OF-SELECTION.
 
 CREATE OBJECT g_application. 
 
 CALL SCREEN 0100. 

*简单树的建立 

*&---------------------------------------------------------------------* 
*&      Module  USER_COMMAND_0100  INPUT 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
MODULE user_command_0100 INPUT .
 
 DATA: str1 TYPE tv_nodekey. 
  save_ok
 = ok_code. 
 
 CLEAR ok_code. 
 
 CASE save_ok. 
   
 WHEN 'EXIT'.
     
 LEAVE PROGRAM .
   
 WHEN 'TEST'.
      text01
 = 'TEST'.
   
 WHEN 'BACK'.
*      CALL SCREEN 0000. 

   
 WHEN 'RENEW'.
*      LEAVE PROGRAM. 
     
 IF ( menustr = 'CODE1' ) OR ( menustr = 'CODE2' ).
       
 READ TABLE node_table WITH KEY node_key = nodekey INTO node1.
       
 IF sy-subrc = 0. 
         
 MESSAGE e208(00 ) WITH '键值重复' .
       
 ENDIF .
     
 ENDIF .
     
 CASE menustr.
       
 WHEN : 'CODE1'. 
         
 READ TABLE node_table WITH KEY  node_key = nodekeyold INTO node2.
         
 CLEAR node1.
          node1
- node_key = nodekey .
          node1
- relatkey = node2 -relatkey. 
          node1
- isfolder = 'X' .
          node1
- text = nodetext .
         
 APPEND node1 TO node_table .
         
 CLEAR anode_table.
         
 APPEND node1 TO anode_table .
         
 CALL METHOD wa_tree->add_nodes
           
 EXPORTING
              table_structure_name
 = 'MTREESNODE' 
              node_table          
 = anode_table. 


       
 WHEN : 'CODE2'. 
         
 CLEAR : node1. 
          node1
- node_key = nodekey .
          node1
- relatkey = nodekeyold .
          node1
- isfolder = 'X' .
          node1
- text = nodetext .
         
 APPEND node1 TO node_table .
         
 CLEAR anode_table.
         
 APPEND node1 TO anode_table .
         
 CALL METHOD wa_tree->add_nodes
           
 EXPORTING
              table_structure_name
 = 'MTREESNODE' 
              node_table          
 = anode_table. 
       
 WHEN : 'CODE3'. 
          node1
- node_key = nodekeyold .
         
 CALL METHOD wa_tree->node_set_text
           
 EXPORTING
              node_key
 = node1 -node_key
             
 text     = nodetext.



     
 ENDCASE .



   
 WHEN 'GETKEY'.
     
 CALL METHOD wa_tree->get_selected_node
       
 IMPORTING 
          node_key
 = str1.
     
 IF sy-subrc = 0. 
        nodekeyold
 = str1.
     
 ENDIF .




 
 ENDCASE.

ENDMODULE.                 " USER_COMMAND_0100  INPUT 
*&---------------------------------------------------------------------* 
*&      Module  STATUS_0100  OUTPUT 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
MODULE status_0100 OUTPUT .
 
 SET PF-STATUS '0100'. 

 
 IF wa_custom_container IS INITIAL .
   
 PERFORM create_tree.
 
 ENDIF.
*  SET TITLEBAR 'xxx'. 

ENDMODULE.                 " STATUS_0100  OUTPUT 
*&---------------------------------------------------------------------* 
*&      Module  EXIT  INPUT 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
MODULE exit INPUT.
 
 LEAVE PROGRAM.
ENDMODULE.                 " EXIT  INPUT
*&---------------------------------------------------------------------* 
*&      Form  CREATE_TREE 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
*  -->  p1        text 
*  <--  p2        text 
*----------------------------------------------------------------------* 
FORM create_tree . 

 
 DATA: events TYPE cntl_simple_events,
        event1
 TYPE cntl_simple_event.

 
 CREATE OBJECT wa_custom_container
   
 EXPORTING 
      container_name
 = wa_container.

 
 CREATE OBJECT wa_tree
   
 EXPORTING 
      parent             
 = wa_custom_container
      node_selection_mode
 = cl_gui_simple_tree=>node_sel_mode_single .

*    节点的建立 
 
 CLEAR node1. 
  node1
-node_key = 'COUNTRY'.     "//根节点
*  CLEAR node1-relatkey. 
*  CLEAR node1-relatship. 
*  node1-hidden = ''. 
*  node1-disabled = ''. 
  node1
-isfolder = 'X'.
*  CLEAR node1-n_image. 
*  CLEAR node1-exp_image. 
*  CLEAR node1-expander. 
  node1
-text = '中国'.
 
 APPEND node1 TO node_table.

 
 CLEAR node1. 
  node1
-node_key = 'CITYBEIJING'.     "//城市节点北京
  node1
-relatkey = 'COUNTRY'.
  node1
-isfolder = 'X'.
  node1
-text = '北京'.
 
 APPEND node1 TO node_table.

 
 CLEAR node1. 
  node1
-node_key = 'CITYSHANGHAI'.     "//城市节点上海
  node1
-relatkey = 'COUNTRY'.
  node1
-isfolder = 'X'.
  node1
-text = '上海'.
 
 APPEND node1 TO node_table.


 
 CLEAR node1. 
  node1
-node_key = 'KEYCHONGWEN'.     "//地区节点 北京--崇文区
  node1
-relatkey = 'CITYBEIJING'.
*  node1-relatship =   CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD. 
  node1
-isfolder = ''.
  node1
-text = '崇文区'.
 
 CLEAR node1- expander.
 
 APPEND node1 TO node_table.


 
 CALL METHOD wa_tree-> add_nodes
   
 EXPORTING 
      table_structure_name
 = 'MTREESNODE'
      node_table          
 = node_table .

  event1
-eventid = cl_gui_simple_tree=>eventid_node_double_click .
  event1
-appl_event = 'X'.
 
 APPEND event1 TO events .



 
 CLEAR event1. 
  event1
-eventid = cl_gui_simple_tree=>eventid_node_context_menu_req .
  event1
-appl_event = ''.
 
 APPEND event1 TO events .

 
 CALL METHOD wa_tree-> set_ctx_menu_select_event_appl
   
 EXPORTING 
      appl_event
 = 'X'.


*  CLEAR event1. 
*  event1-eventid = cl_gui_simple_tree=>eventid_node_context_menu_req. 
*  event1-appl_event = ''. 
*  APPEND event1 TO events. 

 
 CALL METHOD wa_tree-> set_registered_events
   
 EXPORTING 
     
 events = events. 

 
 SET HANDLER g_application-> handle_node_double_click FOR wa_tree .

 
 SET HANDLER g_application-> handle_node_context_menu_req FOR wa_tree .

 
 SET HANDLER g_application-> handle_node_context_menu_sel FOR wa_tree .



ENDFORM.                    " CREATE_TREE

0 0
原创粉丝点击