Skip to content

Instantly share code, notes, and snippets.

@alezhu
Created February 8, 2021 13:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alezhu/f4cd6aa5b23b3df75e728ada5407a065 to your computer and use it in GitHub Desktop.
Save alezhu/f4cd6aa5b23b3df75e728ada5407a065 to your computer and use it in GitHub Desktop.
SALV toolbar with dropdown button
class ZCL_ALV_GUI_BUILDER definition
public
inheriting from CL_ALV_GUI_INSTANCE_BUILDER
create public .
public section.
data MO_ALV_GRID type ref to CL_GUI_ALV_GRID read-only .
events ON_GRID_CREATE
exporting
value(IO_GRID) type ref to CL_GUI_ALV_GRID .
methods CONSTRUCTOR .
class-methods REGISTER_BUILDER_ONCE
returning
value(RO_BUILDER) type ref to ZCL_ALV_GUI_BUILDER .
class-methods REGISTER_BUILDER
returning
value(RO_BUILDER) type ref to ZCL_ALV_GUI_BUILDER .
methods CREATE_ALV_DATA_SOURCE
redefinition .
methods CREATE_ALV_GRID_AT_PBO
redefinition .
methods GET_ALV_CLASSIC_INSTANCE
redefinition .
methods IS_IDA_ACTIVE
redefinition .
PROTECTED SECTION.
TYPES tv_prev_builder TYPE classname.
DATA mo_prev_builder TYPE REF TO cl_alv_gui_instance_builder .
DATA mv_prev_builder_class TYPE tv_prev_builder.
DATA mv_restore_on_grid_create TYPE abap_bool.
PRIVATE SECTION.
ENDCLASS.
CLASS ZCL_ALV_GUI_BUILDER IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_ALV_GUI_BUILDER->CONSTRUCTOR
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD constructor.
super->constructor( ).
* mo_prev_builder = cl_alv_gui_ist_builder_factory=>new_alv_gui_instance_builder(
* iv_inst_builder_classname = sv_prev_builder_class
* ).
* CLEAR sv_prev_builder_class.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_ALV_GUI_BUILDER->CREATE_ALV_DATA_SOURCE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_TABLE_NAME TYPE DBTABL
* | [--->] IO_FIELD_STRUCTURE TYPE REF TO CL_ABAP_STRUCTDESCR(optional)
* | [<-()] RO_DATA_SOURCE TYPE REF TO IF_ALV_GUI_DATA_SOURCE
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD create_alv_data_source.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_ALV_GUI_BUILDER->CREATE_ALV_GRID_AT_PBO
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_SHELLSTYLE TYPE I (default =0)
* | [--->] I_LIFETIME TYPE I(optional)
* | [--->] I_PARENT TYPE REF TO CL_GUI_CONTAINER
* | [--->] I_APPL_EVENTS TYPE CHAR01 (default =SPACE)
* | [--->] I_PARENTDBG TYPE REF TO CL_GUI_CONTAINER(optional)
* | [--->] I_APPLOGPARENT TYPE REF TO CL_GUI_CONTAINER(optional)
* | [--->] I_GRAPHICSPARENT TYPE REF TO CL_GUI_CONTAINER(optional)
* | [--->] I_NAME TYPE STRING(optional)
* | [--->] I_FCAT_COMPLETE TYPE SAP_BOOL (default =SPACE)
* | [<-()] RO_ALV_GRID TYPE REF TO CL_GUI_ALV_GRID
* | [EXC!] ERROR_CNTL_CREATE
* | [EXC!] ERROR_CNTL_INIT
* | [EXC!] ERROR_CNTL_LINK
* | [EXC!] ERROR_DP_CREATE
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD create_alv_grid_at_pbo.
IF mo_prev_builder IS NOT BOUND.
mo_prev_builder = cl_alv_gui_ist_builder_factory=>new_alv_gui_instance_builder(
iv_inst_builder_classname = mv_prev_builder_class
).
ENDIF.
mo_prev_builder->create_alv_grid_at_pbo(
EXPORTING
i_shellstyle = i_shellstyle
i_lifetime = i_lifetime
i_parent = i_parent
i_appl_events = i_appl_events
i_parentdbg = i_parentdbg
i_applogparent = i_applogparent
i_graphicsparent = i_graphicsparent
i_name = i_name
i_fcat_complete = i_fcat_complete
RECEIVING
ro_alv_grid = ro_alv_grid
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5
).
CASE sy-subrc.
WHEN 1.
RAISE error_cntl_create.
WHEN 2.
RAISE error_cntl_init.
WHEN 3.
RAISE error_cntl_link.
WHEN 4.
RAISE error_dp_create .
WHEN 5.
ASSERT 1 = 2.
ENDCASE.
mo_alv_grid = ro_alv_grid.
IF mv_restore_on_grid_create = abap_true.
mv_restore_on_grid_create = abap_false.
cl_alv_z_params=>set_parameter(
EXPORTING
param_name = cl_alv_z_params=>c_param-alv_gui_instance_builder " Parameter name
* user = SY-UNAME " User Name
* seqno = seqno
param_value = CONV #( mv_prev_builder_class )
).
cl_alv_gui_ist_builder_factory=>new_alv_gui_instance_builder( ).
ENDIF.
RAISE EVENT on_grid_create
EXPORTING
io_grid = mo_alv_grid
.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_ALV_GUI_BUILDER->GET_ALV_CLASSIC_INSTANCE
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RO_ALV_GRID TYPE REF TO CL_GUI_ALV_GRID
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD get_alv_classic_instance.
ro_alv_grid = mo_alv_grid.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_ALV_GUI_BUILDER->IS_IDA_ACTIVE
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RV_ACTIVE TYPE ABAP_BOOL
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD is_ida_active.
rv_active = abap_false.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_ALV_GUI_BUILDER=>REGISTER_BUILDER
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RO_BUILDER TYPE REF TO ZCL_ALV_GUI_BUILDER
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD register_builder.
DATA(lo_prev_builder) = cl_alv_gui_ist_builder_factory=>get_alv_gui_instance_builder( ).
DATA(lo_type) = cl_abap_datadescr=>describe_by_data( VALUE tv_prev_builder( ) ).
DATA(lv_name) = lo_type->absolute_name.
REPLACE '\CLASS=' IN lv_name WITH ''.
FIND FIRST OCCURRENCE OF '\' IN lv_name MATCH OFFSET DATA(lv_offset).
IF sy-subrc = 0.
DATA(lv_self_name) = CONV cl_alv_z_params=>y_param_value( lv_name(lv_offset) ).
ELSE.
lv_self_name = lv_name. "Hmm
ENDIF.
cl_alv_z_params=>set_parameter(
EXPORTING
param_name = cl_alv_z_params=>c_param-alv_gui_instance_builder " Parameter name
* user = SY-UNAME " User Name
* seqno = seqno
param_value = lv_self_name
).
ro_builder ?= cl_alv_gui_ist_builder_factory=>new_alv_gui_instance_builder( ).
ro_builder->mo_prev_builder = lo_prev_builder.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_ALV_GUI_BUILDER=>REGISTER_BUILDER_ONCE
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RO_BUILDER TYPE REF TO ZCL_ALV_GUI_BUILDER
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD register_builder_once.
DATA(lv_prev_builder_class) = cl_alv_z_params=>get_parameter( cl_alv_z_params=>c_param-alv_gui_instance_builder ).
ro_builder = register_builder( ).
ro_builder->mv_prev_builder_class = lv_prev_builder_class.
ro_builder->mv_restore_on_grid_create = abap_true.
ENDMETHOD.
ENDCLASS.
class ZCL_SALV_DRODOWN_TLB definition
public
create public .
public section.
types:
BEGIN OF ts_button ,
function TYPE ui_func,
icon TYPE iconname,
quickinfo TYPE iconquick,
text TYPE text40,
after TYPE ui_func,
t_subitem TYPE ttb_button,
END OF ts_button .
types:
tt_button TYPE HASHED TABLE OF ts_button WITH UNIQUE KEY function .
data MO_GRID type ref to CL_GUI_ALV_GRID read-only .
methods CONSTRUCTOR .
methods ADD_BUTTON
importing
!IS_BUTTON type TS_BUTTON .
methods SET_DISABLED
importing
!IV_BUTTON type UI_FUNC
!IV_SUBITEM type UI_FUNC
!IV_DISABLED type ABAP_BOOL default ABAP_TRUE .
methods SET_SELECTED
importing
!IV_BUTTON type UI_FUNC
!IV_SUBITEM type UI_FUNC .
protected section.
data MT_BUTTON type TT_BUTTON .
data MO_ALV_BUILDER type ref to ZCL_ALV_GUI_BUILDER .
methods _ON_TOOLBAR
for event TOOLBAR of CL_GUI_ALV_GRID
importing
!E_OBJECT
!E_INTERACTIVE .
methods _ON_GRID_CREATE
for event ON_GRID_CREATE of ZCL_ALV_GUI_BUILDER
importing
!IO_GRID .
methods _ON_MENU_BUTTON
for event MENU_BUTTON of CL_GUI_ALV_GRID
importing
!E_OBJECT
!E_UCOMM .
private section.
ENDCLASS.
CLASS ZCL_SALV_DRODOWN_TLB IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SALV_DRODOWN_TLB->ADD_BUTTON
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_BUTTON TYPE TS_BUTTON
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD ADD_BUTTON.
INSERT is_button INTO TABLE mt_button.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SALV_DRODOWN_TLB->CONSTRUCTOR
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD constructor.
mo_alv_builder = zcl_alv_gui_builder=>register_builder_once( ).
SET HANDLER _on_grid_create FOR mo_alv_builder.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SALV_DRODOWN_TLB->SET_DISABLED
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_BUTTON TYPE UI_FUNC
* | [--->] IV_SUBITEM TYPE UI_FUNC
* | [--->] IV_DISABLED TYPE ABAP_BOOL (default =ABAP_TRUE)
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD SET_DISABLED.
READ TABLE mt_button REFERENCE INTO DATA(lps_button) WITH KEY
function = iv_button
.
IF sy-subrc = 0.
READ TABLE lps_button->t_subitem REFERENCE INTO DATA(lps_subitem) WITH KEY
function = iv_subitem
.
IF sy-subrc = 0.
lps_subitem->disabled = iv_disabled.
ENDIF.
ENDIF.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SALV_DRODOWN_TLB->SET_SELECTED
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_BUTTON TYPE UI_FUNC
* | [--->] IV_SUBITEM TYPE UI_FUNC
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD set_selected.
READ TABLE mt_button REFERENCE INTO DATA(lps_button) WITH KEY
function = iv_button
.
IF sy-subrc = 0.
LOOP AT lps_button->t_subitem REFERENCE INTO DATA(lps_subitem).
IF lps_subitem->function = iv_subitem.
lps_subitem->checked = abap_true.
ELSE.
lps_subitem->checked = abap_false.
ENDIF.
ENDLOOP.
ENDIF.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Protected Method ZCL_SALV_DRODOWN_TLB->_ON_GRID_CREATE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IO_GRID LIKE
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD _on_grid_create.
mo_grid = io_grid.
SET HANDLER _on_grid_create FOR mo_alv_builder ACTIVATION space.
CLEAR mo_alv_builder.
SET HANDLER _on_toolbar FOR mo_grid.
SET HANDLER _on_menu_button FOR mo_grid.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Protected Method ZCL_SALV_DRODOWN_TLB->_ON_MENU_BUTTON
* +-------------------------------------------------------------------------------------------------+
* | [--->] E_OBJECT LIKE
* | [--->] E_UCOMM LIKE
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD _on_menu_button.
READ TABLE mt_button REFERENCE INTO DATA(lps_button) WITH KEY
function = e_ucomm
.
IF sy-subrc = 0.
LOOP AT lps_button->t_subitem REFERENCE INTO DATA(lps_subitem).
e_object->add_function(
EXPORTING
fcode = lps_subitem->function
text = lps_subitem->text " Function text
icon = CONV #( lps_subitem->icon ) " Icons
* ftype = lps_subitem->butn_type
disabled = lps_subitem->disabled " Inactive
checked = lps_subitem->checked " Selected
* accelerator = accelerator " Fastpath
* insert_at_the_top = space " Insert at Start (Default: Insert at End)
).
ENDLOOP.
ENDIF.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Protected Method ZCL_SALV_DRODOWN_TLB->_ON_TOOLBAR
* +-------------------------------------------------------------------------------------------------+
* | [--->] E_OBJECT LIKE
* | [--->] E_INTERACTIVE LIKE
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD _on_toolbar.
LOOP AT mt_button REFERENCE INTO DATA(lps_button).
READ TABLE e_object->mt_toolbar TRANSPORTING NO FIELDS WITH KEY
function = lps_button->after
.
IF sy-subrc = 0.
DATA(lv_index) = sy-tabix + 1.
ELSE.
lv_index = lines( e_object->mt_toolbar ).
ENDIF.
DATA(lv_text) = lps_button->text.
READ TABLE lps_button->t_subitem REFERENCE INTO DATA(lps_subitem) WITH KEY
checked = abap_true
.
IF sy-subrc NE 0.
READ TABLE lps_button->t_subitem REFERENCE INTO lps_subitem INDEX 1.
ENDIF.
IF sy-subrc = 0.
lv_text = lps_subitem->text.
ENDIF.
INSERT VALUE stb_button(
BASE CORRESPONDING #( lps_button->* )
text = lv_text
butn_type = '1'
) INTO e_object->mt_toolbar INDEX lv_index.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment