CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
INTERFACES: if_salv_ida_calc_field_handler.
METHODS: on_cell_action FOR EVENT cell_action OF if_salv_gui_field_display_opt
IMPORTING
ev_field_name
eo_row_data
sender.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_calc_field,
icon TYPE char4,
button TYPE lvc_value,
END OF ty_calc_field.
TYPES: BEGIN OF ty_line.
INCLUDE TYPE sflight.
INCLUDE TYPE ty_calc_field.
TYPES: END OF ty_line.
ENDCLASS.
CLASS lcl_event_handler IMPLEMENTATION.
METHOD on_cell_action.
DATA: lv_row TYPE ty_line.
eo_row_data->get_row_data( EXPORTING
iv_request_type = if_salv_gui_selection_ida=>cs_request_type-all_fields
IMPORTING
es_row = lv_row ).
cl_salv_ida_show_data_row=>display( iv_text = |Datenfeld: { ev_field_name }|
is_data = lv_row ).
ENDMETHOD.
METHOD if_salv_ida_calc_field_handler~get_calc_field_structure.
* Struktur-Deklaration für zus. Felder ICON und BUTTON zurückgeben
ro_calc_field_structure = CAST cl_abap_structdescr( cl_abap_structdescr=>describe_by_name( 'TY_CALC_FIELD' ) ).
ENDMETHOD.
METHOD if_salv_ida_calc_field_handler~get_requested_fields.
ENDMETHOD.
METHOD if_salv_ida_calc_field_handler~calculate_line.
* Daten akt. Zeile holen
DATA(lv_sflight) = CONV sflight( is_data_base_line ).
* Freie Sitze ausrechnen
DATA(lv_cnt_free_seats) = lv_sflight-seatsmax - lv_sflight-seatsocc.
* Calculated Fields bestimmen
es_calculated_fields = COND ty_calc_field( WHEN lv_cnt_free_seats = 0 THEN VALUE #( icon = icon_red_light button = icon_delete )
WHEN lv_cnt_free_seats > 10 THEN VALUE #( icon = icon_green_light button = icon_okay )
ELSE VALUE #( icon = icon_yellow_light button = space )
).
ENDMETHOD.
METHOD if_salv_ida_calc_field_handler~start_page.
ENDMETHOD.
METHOD if_salv_ida_calc_field_handler~end_page.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(o_handler) = NEW lcl_event_handler( ).
DATA(o_alv) = cl_salv_gui_table_ida=>create( iv_table_name = 'SFLIGHT'
io_calc_field_handler = o_handler ). " Referenz für Fieldhandler
* Single-Selection
o_alv->selection( )->set_selection_mode( if_salv_gui_selection_ida=>cs_selection_mode-single ).
* Tooltips für Icons
DATA(it_icon_tooltip) = VALUE if_salv_gui_types_ida=>yts_icon_tooltip( ( icon = icon_yellow_light
tooltip = 'Weniger als 10 Sitze.' )
( icon = icon_green_light
tooltip = 'Ausreichend Sitze.' )
( icon = icon_red_light
tooltip = 'Keine Sitze mehr frei.' ) ).
* Tooltips setzen: Feldname 'ICON' muss identisch mit ty_calc_field-icon sein!
o_alv->field_catalog( )->display_options( )->set_tooltip_for_icons( iv_field_name = 'ICON'
its_tooltips = it_icon_tooltip ).
* Überschrift für Spalte 'ICON': Feldname 'ICON' muss identisch mit ty_calc_field-icon sein!
o_alv->field_catalog( )->set_field_header_texts( iv_field_name = 'ICON'
iv_header_text = 'Status' ).
* Zellen der Spalte 'ICON' sind klickbar: Feldname 'ICON' muss identisch mit ty_calc_field-icon sein!
o_alv->field_catalog( )->display_options( )->display_as_link_to_action( iv_field_name = 'ICON' ).
* Tooltips für Buttons: Feldname 'BUTTON' muss identisch mit ty_calc_field-icon sein!
o_alv->field_catalog( )->display_options( )->set_tooltip_for_icons( iv_field_name = 'BUTTON'
iv_use_standard_tooltip = abap_true ).
* Wenn leere Buttonwerte in der Funktion if_salv_ida_calc_field_handler~calculate_line erzeugt werden (INITIAL),
* dann keine Buttons anzeigen
* Feldname 'BUTTON' muss identisch mit ty_calc_field-button sein!
o_alv->field_catalog( )->display_options( )->display_as_button( iv_field_name = 'BUTTON'
iv_hide_if_value_is_initial = abap_true ).
* Überschrift für Spalte 'BUTTON': Feldname 'BUTTON' muss identisch mit ty_calc_field-button sein!
o_alv->field_catalog( )->set_field_header_texts( iv_field_name = 'BUTTON'
iv_header_text = 'Aktion' ).
* Click-Handler für Icons und Buttons aktivieren
SET HANDLER o_handler->on_cell_action FOR o_alv->field_catalog( )->display_options( ).
* Tabelle anzeigen
o_alv->fullscreen( )->display( ).