*
&---------------------------------------------------------------------*
*& Include SIMPLE_TREE_CONTROL_DEMOTOP * *& * *&---------------------------------------------------------------------* REPORT SAPSIMPLE_TREE_CONTROL_DEMO MESSAGE-ID TREE_CONTROL_MSG. CLASS LCL_APPLICATION DEFINITION DEFERRED. CLASS CL_GUI_CFW DEFINITION LOAD. TYPES: NODE_TABLE_TYPE LIKE STANDARD TABLE OF MTREESNODE WITH DEFAULT KEY. * CAUTION: MTREESNODE is the name of the node structure which must * be defined by the programmer. DO NOT USE MTREESNODE! DATA: G_APPLICATION TYPE REF TO LCL_APPLICATION, G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER, G_TREE TYPE REF TO CL_GUI_SIMPLE_TREE, G_OK_CODE TYPE SY-UCOMM. * Fields on Dynpro 100 DATA: G_EVENT(30), G_NODE_KEY TYPE TV_NODEKEY. CONSTANTS: BEGIN OF c_nodekey, root type tv_nodekey value 'Root', "#EC NOTEXT child1 TYPE tv_nodekey VALUE 'Child1', "#EC NOTEXT * child2 type tv_nodekey value 'Child2', "#EC NOTEXT new1 TYPE tv_nodekey VALUE 'New1', "#EC NOTEXT new2 TYPE tv_nodekey VALUE 'New2', "#EC NOTEXT * new3 type tv_nodekey value 'New3', "#EC NOTEXT * new4 type tv_nodekey value 'New4', "#EC NOTEXT END OF c_nodekey. *** INCLUDE SIMPLE_TREE_CONTROL_DEMOTOP
*----------------------------------------------------------------------*
*   INCLUDE SIMPLE_TREE_CONTROL_DEMOCL1                                *
*----------------------------------------------------------------------*

CLASS LCL_APPLICATION DEFINITION.

  PUBLIC SECTION.
    METHODS:
      HANDLE_NODE_DOUBLE_CLICK
        FOR EVENT NODE_DOUBLE_CLICK
        OF CL_GUI_SIMPLE_TREE
        IMPORTING NODE_KEY,
      HANDLE_EXPAND_NO_CHILDREN
        FOR EVENT EXPAND_NO_CHILDREN
        OF CL_GUI_SIMPLE_TREE
        IMPORTING NODE_KEY.
ENDCLASS.

CLASS LCL_APPLICATION IMPLEMENTATION.

  METHOD  HANDLE_NODE_DOUBLE_CLICK.
    " this method handles the node double click event of the tree
                                       " control instance

    " show the key of the double clicked node in a dynpro field
    G_EVENT = 'NODE_DOUBLE_CLICK'.
    G_NODE_KEY = NODE_KEY.
  ENDMETHOD.

  METHOD HANDLE_EXPAND_NO_CHILDREN.
    " this method handles the expand no children event of the tree
                                       " control instance
    DATA: NODE_TABLE TYPE NODE_TABLE_TYPE,
          NODE TYPE MTREESNODE.

    " show the key of the double clicked node in a dynpro field
    G_EVENT = 'EXPAND_NO_CHILDREN'.
    G_NODE_KEY = NODE_KEY.

    if node_key = 'Child1'.
* add two nodes to the tree control (the children of 'Child1')

* Node with key 'New1'
      CLEAR NODE.
      NODE-NODE_KEY = c_nodekey-New1.
      NODE-RELATKEY = c_nodekey-Child1.
      NODE-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
      NODE-ISFOLDER = ' '.
      NODE-TEXT = 'New1'(ne1).
      APPEND NODE TO NODE_TABLE.

* Node with key 'New2'
      CLEAR NODE.
      NODE-NODE_KEY = c_nodekey-New2.
      NODE-RELATKEY = c_nodekey-Child1.
      NODE-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
      NODE-N_IMAGE = '@10@'.
      NODE-EXPANDER = ' '.
      NODE-TEXT = 'New2'(ne2).
      APPEND NODE TO NODE_TABLE.

      CALL METHOD G_TREE->ADD_NODES
        EXPORTING
          TABLE_STRUCTURE_NAME = 'MTREESNODE'
          NODE_TABLE           = NODE_TABLE
        EXCEPTIONS
          FAILED                         = 1
          ERROR_IN_NODE_TABLE            = 2
          DP_ERROR                       = 3
          TABLE_STRUCTURE_NAME_NOT_FOUND = 4
          OTHERS                         = 5.
      IF SY-SUBRC <> 0.
        MESSAGE A000.
      ENDIF.
    endif.
  ENDMETHOD.

ENDCLASS.
*-------------------------------------------------------------------
***INCLUDE simple_tree_control_demoO01 .
*-------------------------------------------------------------------
*&---------------------------------------------------------------------*
*&      Module  PBO_0400  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE PBO_100 OUTPUT.
  SET PF-STATUS 'MAIN'.
  IF G_TREE IS INITIAL.
    " The Tree Control has not been created yet.
    " Create a Tree Control and insert nodes into it.
    PERFORM CREATE_AND_INIT_TREE.
  ENDIF.
ENDMODULE.                 " PBO_0100  OUTPUT
*** INCLUDE simple_tree_control_demoO01
*-------------------------------------------------------------------
***INCLUDE simple_tree_control_demoI01 .
*-------------------------------------------------------------------
*&---------------------------------------------------------------------*
*&      Module  PAI_0400  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE PAI_100 INPUT.
  data: return_code type i.
* CL_GUI_CFW=>DISPATCH must be called if events are registered
* that trigger PAI
* this method calls the event handler method of an event
  CALL METHOD CL_GUI_CFW=>DISPATCH
    importing return_code = return_code.
  if return_code <> cl_gui_cfw=>rc_noevent.
    " a control event occured => exit PAI
    clear g_ok_code.
    exit.
  endif.

  CASE G_OK_CODE.
    when 'TEST'. call method g_tree->expand_node
      exporting node_key = c_nodekey-New1.
    WHEN 'BACK'. " Finish program
      IF NOT G_CUSTOM_CONTAINER IS INITIAL.
        " destroy tree container (detroys contained tree control, too)
        CALL METHOD G_CUSTOM_CONTAINER->FREE
          EXCEPTIONS
            CNTL_SYSTEM_ERROR = 1
            CNTL_ERROR        = 2.
        IF SY-SUBRC <> 0.
          MESSAGE A000.
        ENDIF.
        CLEAR G_CUSTOM_CONTAINER.
        CLEAR G_TREE.
      ENDIF.
      LEAVE PROGRAM.
  ENDCASE.

* CAUTION: clear ok code!
  CLEAR G_OK_CODE.
ENDMODULE.                 " PAI_0100  INPUT
*** INCLUDE simple_tree_control_demoI01
*-------------------------------------------------------------------
***INCLUDE simple_tree_control_demoF01 .
*-------------------------------------------------------------------

*&---------------------------------------------------------------------*
*&      Form  CREATE_AND_INIT_TREE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM CREATE_AND_INIT_TREE.
  DATA: NODE_TABLE TYPE NODE_TABLE_TYPE,
        EVENTS TYPE CNTL_SIMPLE_EVENTS,
        event type cntl_simple_event.

* create a container for the tree control
  CREATE OBJECT G_CUSTOM_CONTAINER
    EXPORTING
      " the container is linked to the custom control with the
      " name 'TREE_CONTAINER' on the dynpro
      CONTAINER_NAME = 'TREE_CONTAINER'
    EXCEPTIONS
      CNTL_ERROR = 1
      CNTL_SYSTEM_ERROR = 2
      CREATE_ERROR = 3
      LIFETIME_ERROR = 4
      LIFETIME_DYNPRO_DYNPRO_LINK = 5.
  IF SY-SUBRC <> 0.
    MESSAGE A000.
  ENDIF.


* create a tree control
  CREATE OBJECT G_TREE
    EXPORTING
      PARENT              = G_CUSTOM_CONTAINER
      " single node selection is used
      NODE_SELECTION_MODE = CL_GUI_SIMPLE_TREE=>NODE_SEL_MODE_SINGLE
    EXCEPTIONS
      LIFETIME_ERROR              = 1
      CNTL_SYSTEM_ERROR           = 2
      CREATE_ERROR                = 3
      FAILED                      = 4
      ILLEGAL_NODE_SELECTION_MODE = 5.
  IF SY-SUBRC <> 0.
    MESSAGE A000.
  ENDIF.

* define the events which will be passed to the backend
  " node double click
  event-eventid = CL_GUI_SIMPLE_TREE=>EVENTID_NODE_DOUBLE_CLICK.
  event-appl_event = 'X'. " process PAI if event occurs
  APPEND event to events.

  " expand no children
  event-eventid = CL_GUI_SIMPLE_TREE=>EVENTID_EXPAND_NO_CHILDREN.
  event-appl_event = 'X'.
  APPEND event to events.

  CALL METHOD G_TREE->SET_REGISTERED_EVENTS
    EXPORTING
      EVENTS = EVENTS
    EXCEPTIONS
      CNTL_ERROR                = 1
      CNTL_SYSTEM_ERROR         = 2
      ILLEGAL_EVENT_COMBINATION = 3.
  IF SY-SUBRC <> 0.
    MESSAGE A000.
  ENDIF.

* assign event handlers in the application class to each desired event
  SET HANDLER G_APPLICATION->HANDLE_NODE_DOUBLE_CLICK FOR G_TREE.
  SET HANDLER G_APPLICATION->HANDLE_EXPAND_NO_CHILDREN FOR G_TREE.


* add some nodes to the tree control
* NOTE: the tree control does not store data at the backend. If an
* application wants to access tree data later, it must store the
* tree data itself.

  PERFORM BUILD_NODE_TABLE USING NODE_TABLE.

* node_table_structure_name     = 'MTREESNODE'
*   A programmer using the tree control must create a structure in the
*   dictionary. This structure must include the structure TREEV_NODE
*   and must contain a character field with the name 'TEXT'.

  CALL METHOD G_TREE->ADD_NODES
    EXPORTING
      TABLE_STRUCTURE_NAME = 'MTREESNODE'
      NODE_TABLE           = NODE_TABLE
    EXCEPTIONS
      FAILED                         = 1
      ERROR_IN_NODE_TABLE            = 2
      DP_ERROR                       = 3
      TABLE_STRUCTURE_NAME_NOT_FOUND = 4
      OTHERS                         = 5.
  IF SY-SUBRC <> 0.
    MESSAGE A000.
  ENDIF.

ENDFORM.                    " CREATE_AND_INIT_TREE
*&---------------------------------------------------------------------*
*&      Form  build_node_table
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*

FORM BUILD_NODE_TABLE
  USING
    NODE_TABLE TYPE NODE_TABLE_TYPE.

  DATA: NODE LIKE MTREESNODE.

* Build the node table.

* Caution: The nodes are inserted into the tree according to the order
* in which they occur in the table. In consequence, a node must not
* occur in the node table before its parent node.

* Node with key 'Root'
  NODE-NODE_KEY = c_nodekey-Root.
                            " Key of the node
  CLEAR NODE-RELATKEY.      " Special case: A root node has no parent
  CLEAR NODE-RELATSHIP.     " node.

  NODE-HIDDEN = ' '.        " The node is visible,
  NODE-DISABLED = ' '.      " selectable,
  NODE-ISFOLDER = 'X'.      " a folder.
  CLEAR NODE-N_IMAGE.       " Folder-/ Leaf-Symbol in state "closed":
                            " use default.
  CLEAR NODE-EXP_IMAGE.     " Folder-/ Leaf-Symbol in state "open":
                            " use default
  CLEAR NODE-EXPANDER.      " see below.
  NODE-TEXT = 'Root'(roo).
  APPEND NODE TO NODE_TABLE.

* Node with key 'Child1'
  NODE-NODE_KEY = c_nodekey-Child1.
                            " Key of the node
  " Node is inserted as child of the node with key 'Root'.
  NODE-RELATKEY = c_nodekey-Root.
  NODE-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.

  NODE-HIDDEN = ' '.
  NODE-DISABLED = ' '.
  NODE-ISFOLDER = 'X'.
  CLEAR NODE-N_IMAGE.
  CLEAR NODE-EXP_IMAGE.
  NODE-EXPANDER = 'X'. " The node is marked with a '+', although
                       " it has no children. When the user clicks on the
                       " + to open the node, the event
                       " expand_no_children is fired. The programmer can
                       " add the children of the
                       " node within the event handler of the
                       " expand_no_children event
                       " (see method handle_expand_no_children
                       " of class lcl_application)

  NODE-TEXT = 'Child1'(ch1).
  NODE-STYLE = CL_GUI_SIMPLE_TREE=>STYLE_EMPHASIZED_POSITIVE.
  APPEND NODE TO NODE_TABLE.

ENDFORM.                    " build_node_table


*** INCLUDE simple_tree_control_demoF01
  START-OF-SELECTION.
* create the application object
* this object is needed to handle the ABAP Objects Events of
* Controls
  CREATE OBJECT G_APPLICATION.

  SET SCREEN 100.

 

posted on 2020-09-11 09:09  姬如千泷  阅读(187)  评论(0编辑  收藏  举报