TYPES: ty_it_events TYPE STANDARD TABLE OF cntl_simple_event WITH DEFAULT KEY.
TYPES: BEGIN OF ty_menuitem,
fcode TYPE ui_func,
checked TYPE cua_active,
text TYPE gui_text,
END OF ty_menuitem.
TYPES: ty_it_menuitems TYPE STANDARD TABLE OF ty_menuitem WITH DEFAULT KEY.
DATA: it_menuitems TYPE ty_it_menuitems.
CLASS lcl_events DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
on_function_selected FOR EVENT function_selected OF cl_gui_toolbar
IMPORTING
fcode
sender.
CLASS-METHODS:
on_dropdown_clicked FOR EVENT dropdown_clicked OF cl_gui_toolbar
IMPORTING
fcode
posx
posy
sender.
ENDCLASS.
CLASS lcl_events IMPLEMENTATION.
* Toolbar: Button oder Menüpunktgeklickt
METHOD on_function_selected.
* Checked-Status eines Dropdown-Menüpunktes umschalten
IF line_exists( it_menuitems[ fcode = fcode ] ).
ASSIGN it_menuitems[ fcode = fcode ] TO FIELD-SYMBOL(<mc>).
<mc>-checked = COND #( WHEN <mc>-checked = abap_true THEN abap_false ELSE abap_true ).
ENDIF.
* Funktionscode auswerten
CASE fcode.
WHEN 'BTN_CLOSE'.
LEAVE PROGRAM.
WHEN 'BTN_DROP'.
WHEN 'M1'.
WHEN 'M2'.
ENDCASE.
* fcode ausgeben
MESSAGE fcode TYPE 'S'.
ENDMETHOD.
* Toolbar: Dropdown aktiviert
METHOD on_dropdown_clicked.
* Menü erzeugen
DATA(o_ctx_menu) = NEW cl_ctmenu( ).
LOOP AT it_menuitems ASSIGNING FIELD-SYMBOL(<m>).
o_ctx_menu->add_function( fcode = <m>-fcode
checked = <m>-checked
text = <m>-text ).
ENDLOOP.
* Kontextmenü an der akt. Position anzeigen
sender->track_context_menu( context_menu = o_ctx_menu
posx = posx
posy = posy ).
ENDMETHOD.
ENDCLASS.
INITIALIZATION.
it_menuitems = VALUE #( ( fcode = 'M1'
checked = abap_false
text = 'Punkt1' )
( fcode = 'M2'
checked = abap_true
text = 'Punkt2' ) ).
* Splitter erzeugen
DATA(o_splitter) = NEW cl_gui_splitter_container( parent = cl_gui_container=>default_screen
no_autodef_progid_dynnr = abap_true
rows = 2
columns = 1 ).
* Absoluter Modus für Zeilenhöhe
o_splitter->set_row_mode( mode = cl_gui_splitter_container=>mode_absolute ).
* Höhe absolut 24 Pixel für Splitter oben
o_splitter->set_row_height( id = 1 height = 24 ).
* Splitter für oberen Container fest und verborgen
o_splitter->set_row_sash( id = 1
type = cl_gui_splitter_container=>type_movable
value = cl_gui_splitter_container=>false ).
o_splitter->set_row_sash( id = 1
type = cl_gui_splitter_container=>type_sashvisible
value = cl_gui_splitter_container=>false ).
DATA(o_container_top) = o_splitter->get_container( row = 1 column = 1 ).
DATA(o_container_bottom) = o_splitter->get_container( row = 2 column = 1 ).
* Toolbar hoizontal
DATA(o_tool) = NEW cl_gui_toolbar( parent = o_container_top
display_mode = cl_gui_toolbar=>m_mode_horizontal ).
* Eventtypten müssen gesondert registriert werden
DATA(it_events) = VALUE ty_it_events( ( eventid = cl_gui_toolbar=>m_id_function_selected
appl_event = abap_true )
( eventid = cl_gui_toolbar=>m_id_dropdown_clicked
appl_event = abap_true ) ).
o_tool->set_registered_events( events = it_events ).
* Toolbar-Buttons hinzufügen
* Buttontypen sind in Typgruppe CNTB definiert
o_tool->add_button( fcode = 'BTN_DROP'
icon = icon_activate
butn_type = cntb_btype_dropdown
text = 'Menü'
quickinfo = 'Menü anzeigen'
is_checked = abap_false
is_disabled = abap_false ).
o_tool->add_button( fcode = ''
icon = ''
butn_type = cntb_btype_sep
text = ''
quickinfo = ''
is_checked = abap_false
is_disabled = abap_false ).
o_tool->add_button( fcode = 'BTN_CLOSE'
icon = icon_close
butn_type = cntb_btype_button
text = 'Schließen'
quickinfo = 'Schließen'
is_checked = abap_false
is_disabled = abap_false ).
* Eventhandler registrieren
SET HANDLER lcl_events=>on_function_selected FOR o_tool.
SET HANDLER lcl_events=>on_dropdown_clicked FOR o_tool.
* im unteren Splitter Beispieldaten anzeigen
DATA: it_sflight TYPE STANDARD TABLE OF sflight.
SELECT * FROM sflight INTO TABLE @it_sflight.
DATA: o_salv TYPE REF TO cl_salv_table.
cl_salv_table=>factory( EXPORTING
r_container = o_container_bottom
IMPORTING
r_salv_table = o_salv
CHANGING
t_table = it_sflight ).
o_salv->get_functions( )->set_all( ).
o_salv->display( ).
* leere Standard-Toolbar ausblenden
cl_abap_list_layout=>suppress_toolbar( ).
* Ausgabe von cl_gui_container=>default_screen erzwingen
WRITE: space.
Weiterführender Link zur Ideen-Quelle: Link