**********************************************************************
*
* Datentypen, Variablen, Konstanten
*
**********************************************************************
TYPES: ty_it_events TYPE STANDARD TABLE OF cntl_simple_event WITH DEFAULT KEY.
TYPES: ty_it_nodes TYPE STANDARD TABLE OF mtreesnode WITH DEFAULT KEY.
DATA: o_splitter_main TYPE REF TO cl_gui_splitter_container.
DATA: o_container_l TYPE REF TO cl_gui_container.
DATA: o_container_r TYPE REF TO cl_gui_container.
DATA: o_tree TYPE REF TO cl_gui_simple_tree.
DATA: o_salv TYPE REF TO cl_salv_table.
DATA: it_tree_spfli TYPE STANDARD TABLE OF spfli.
DATA: it_salv_spfli TYPE STANDARD TABLE OF spfli.
DATA: it_nodes TYPE ty_it_nodes.
**********************************************************************
*
* Eventhandler
*
**********************************************************************
CLASS lcl_events DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: on_selection_changed FOR EVENT selection_changed OF cl_gui_simple_tree
IMPORTING
node_key
sender.
ENDCLASS.
CLASS lcl_events IMPLEMENTATION.
* Klick auf ein aktives Baumelement
METHOD on_selection_changed.
IF o_salv IS BOUND.
* Element in der Nodes-Tabelle lesen
ASSIGN it_nodes[ node_key = node_key ] TO FIELD-SYMBOL(<fs_node>).
* iTab für SALV-Table neu aufbauen, abhängig vom gewählten Baumelement
it_salv_spfli = VALUE #( FOR l IN it_tree_spfli WHERE ( carrid = <fs_node>-text )
( mandt = l-mandt
carrid = l-carrid
connid = l-connid
countryfr = l-countryfr
cityfrom = l-cityfrom
airpfrom = l-airpfrom
countryto = l-countryto
cityto = l-cityto
airpto = l-airpto
fltime = l-fltime
deptime = l-deptime
arrtime = l-arrtime
distance = l-distance
distid = l-distid
fltype = l-fltype
period = l-period ) ).
* SALV-Table neu anzeigen
o_salv->refresh( ).
ENDIF.
ENDMETHOD.
ENDCLASS.
**********************************************************************
*
* SELECTION-SCREEN
*
**********************************************************************
* leeres Selektionsbild als Dummy für die Container-Objekte (o_splitter_main ...)
SELECTION-SCREEN BEGIN OF SCREEN 2000.
SELECTION-SCREEN END OF SCREEN 2000.
**********************************************************************
*
* INITIALIZATION
*
**********************************************************************
INITIALIZATION.
SELECT * INTO TABLE it_tree_spfli FROM spfli.
**********************************************************************
*
* START-OF-SELECTION
*
**********************************************************************
START-OF-SELECTION.
* leeres Selektionbild 2000 anzeigen
CALL SELECTION-SCREEN 2000.
**********************************************************************
*
* AT SELECTION-SCREEN OUTPUT
*
**********************************************************************
AT SELECTION-SCREEN OUTPUT.
* Doppelte Objekterzeugung unterbinden
IF NOT o_splitter_main IS BOUND.
* Splitter auf default_screen (SELECTION-SCREEN 2000) erzeugen
o_splitter_main = NEW #( parent = cl_gui_container=>default_screen
rows = 1
columns = 2 ).
* Breite in % (linke Spalte für den Tree)
o_splitter_main->set_column_width( id = 1 width = 15 ).
* linken und rechten Splitcontainer holen
o_container_l = o_splitter_main->get_container( row = 1 column = 1 ).
o_container_r = o_splitter_main->get_container( row = 1 column = 2 ).
* Tree-Objekt erzeugen
o_tree = NEW #( parent = o_container_l
node_selection_mode = cl_gui_simple_tree=>node_sel_mode_single ).
* Eventtypten müssen gesondert registriert werden
DATA(it_events) = VALUE ty_it_events( ( eventid = cl_gui_simple_tree=>eventid_selection_changed
appl_event = abap_true ) ).
o_tree->set_registered_events( events = it_events ).
SET HANDLER lcl_events=>on_selection_changed FOR o_tree.
* Root-Node einfügen
it_nodes = VALUE #( ( node_key = 'ROOT' " Node-Bezeichner
relatship = cl_gui_simple_tree=>relat_last_child
disabled = abap_true
isfolder = abap_true " Typ Ordner für Root-Element
n_image = icon_folder " Icon Ordner
exp_image = icon_open_folder " Icon geöffneter Ordner
style = cl_gui_simple_tree=>style_default
text = 'Airlines' ) ).
* Childs an Root-Node anhängen
LOOP AT it_tree_spfli ASSIGNING FIELD-SYMBOL(<fs_line>).
* bei Änderung der carrid neue carrid als Child anhängen
AT NEW carrid.
APPEND VALUE #( node_key = |NODE{ sy-tabix }| " Node-Bezeichner
relatship = cl_gui_simple_tree=>relat_last_child
relatkey = 'ROOT' " an ROOT-Element anhängen
style = cl_gui_simple_tree=>style_intensified
text = |{ <fs_line>-carrid }| ) TO it_nodes.
ENDAT.
ENDLOOP.
* Nodes im Baum einfügen
o_tree->add_nodes( table_structure_name = 'MTREESNODE' " Typ muss gleich mit Zeilentyp von ty_it_nodes sein
node_table = it_nodes ).
* Root-Nodes des Trees expandieren
o_tree->expand_root_nodes( ).
* leeres SALV-Grid erzeugen
cl_salv_table=>factory( EXPORTING
r_container = o_container_r
IMPORTING
r_salv_table = o_salv
CHANGING
t_table = it_salv_spfli ).
o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
o_salv->get_columns( )->set_optimize( abap_true ).
o_salv->get_functions( )->set_all( ).
o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).
o_salv->display( ).
ENDIF.
**********************************************************************
*
* AT SELECTION-SCREEN
*
**********************************************************************
AT SELECTION-SCREEN.
* wenn "Ausführen" (F8) geklickt wurde
IF sy-ucomm = 'CRET'.
* Selektionbild 2000 wieder anzeigen
CALL SELECTION-SCREEN 2000.
ENDIF.