13
Adding custom context menu in classical list By Joyjit Ghosh, IBM India *&---------------------------------------------------------------* *& Report Z_CONTEXT_MENU_DEMO *& *&---------------------------------------------------------------* *& published at SAPTechnical.COM *& *&---------------------------------------------------------------* REPORT z_context_menu_demo. * Table declaration DATA: i_vbak TYPE STANDARD TABLE OF vbak INITIAL SIZE 0, i_vbap TYPE STANDARD TABLE OF vbap INITIAL SIZE 0. * Workarea declaration DATA: w_vbak TYPE vbak, w_vbap TYPE vbap. START-OF-SELECTION. * Set custom status SET PF-STATUS 'BASIC'. * Fetch header data SELECT * FROM vbak INTO TABLE i_vbak UP TO 50 ROWS. IF sy-subrc = 0. * Fetch line item data SELECT * FROM vbap INTO TABLE i_vbap FOR ALL ENTRIES IN i_vbap WHERE vbeln = i_vbap-vbeln. CHECK sy-subrc = 0. * Display basic list LOOP AT i_vbak INTO w_vbak. FORMAT COLOR COL_HEADING. WRITE : /10 w_vbak-vbeln, 20 w_vbak-erdat, 35 w_vbak-erzet, 55 w_vbak-ernam. HIDE: w_vbak-vbeln. ENDLOOP. ENDIF. AT USER-COMMAND. * Handle user command

Adding Custom Context Menu in Classical List

Embed Size (px)

Citation preview

Page 1: Adding Custom Context Menu in Classical List

Adding custom context menu in classical list

By Joyjit Ghosh, IBM India

*&---------------------------------------------------------------**& Report Z_CONTEXT_MENU_DEMO*&*&---------------------------------------------------------------**& published at SAPTechnical.COM*&*&---------------------------------------------------------------*REPORT z_context_menu_demo.* Table declarationDATA: i_vbak TYPE STANDARD TABLE OF vbak INITIAL SIZE 0, i_vbap TYPE STANDARD TABLE OF vbap INITIAL SIZE 0.* Workarea declarationDATA: w_vbak TYPE vbak, w_vbap TYPE vbap.START-OF-SELECTION.* Set custom status SET PF-STATUS 'BASIC'.* Fetch header data SELECT * FROM vbak INTO TABLE i_vbak UP TO 50 ROWS. IF sy-subrc = 0.* Fetch line item data SELECT * FROM vbap INTO TABLE i_vbap FOR ALL ENTRIES IN i_vbap WHERE vbeln = i_vbap-vbeln. CHECK sy-subrc = 0.* Display basic list LOOP AT i_vbak INTO w_vbak. FORMAT COLOR COL_HEADING. WRITE : /10 w_vbak-vbeln, 20 w_vbak-erdat, 35 w_vbak-erzet, 55 w_vbak-ernam. HIDE: w_vbak-vbeln. ENDLOOP. ENDIF.AT USER-COMMAND.* Handle user command CASE sy-ucomm. WHEN 'DETAIL'. CHECK NOT w_vbak IS INITIAL.* Display detail list LOOP AT i_vbap INTO w_vbap WHERE vbeln = w_vbak-vbeln. FORMAT COLOR COL_HEADING. WRITE : /10 w_vbap-vbeln, 25 w_vbap-posnr, 35 w_vbap-matnr, 55 w_vbap-matwa.

Page 2: Adding Custom Context Menu in Classical List

ENDLOOP. WINDOW STARTING AT 20 20 ENDING AT 120 110. ENDCASE.*&---------------------------------------------------------------**& Form on_ctmenu_request*&---------------------------------------------------------------** Creation of custom context menu- It is called dynamically* by ABAP runtime*----------------------------------------------------------------** -->L_MENU Handle for context menu*----------------------------------------------------------------*FORM on_ctmenu_request USING l_menu TYPE REF TO cl_ctmenu. DATA lin TYPE i. GET CURSOR LINE lin. IF lin > 2 AND sy-lsind = 0.* Add menu CALL METHOD l_menu->add_function EXPORTING fcode = 'DETAIL' text = text-001. ENDIF.* Add menu CALL METHOD l_menu->add_function EXPORTING fcode = 'BACK' text = text-002.ENDFORM. "on_ctmenu_request

How SAP calls the routine ON_CTMENU_REQUEST:

Whenever user presses right mouse button or shift + F10 key combinations sap triggers system event and calls the method DISPATCH_SYSTEM_EVENTS of class CL_GUI_CFW. Within it, it calls the method DISPATCH of class LCL_DYNPRO_PROXY (defined within the class pool of CL_GUI_CFW).

Page 3: Adding Custom Context Menu in Classical List

 

 

Page 4: Adding Custom Context Menu in Classical List

From this method (DISPATCH) it calls the routine ON_CTMENU_REQUEST which is defined in our program.

Page 5: Adding Custom Context Menu in Classical List

 

Output:  

Basic list:

Page 6: Adding Custom Context Menu in Classical List

 

Detail list:

Add custom sub-menu in ALV context menu By Joyjit Ghosh,Kolkata, India.

Code:

REPORT z_alv_context_menu NO STANDARD PAGE HEADING.

************************************************************************ Type pool declaration***********************************************************************

TYPE-POOLS: slis.

Page 7: Adding Custom Context Menu in Classical List

************************************************************************ Internal table declaration***********************************************************************DATA: BEGIN OF gt_outtab OCCURS 0.

INCLUDE STRUCTURE sflight.

DATA: END OF gt_outtab.

data: gt_events TYPE slis_t_event.

*********************************************************************** Structure / Variable declaration**********************************************************************DATA: g_repid LIKE sy-repid,

event TYPE slis_alv_event.

*********************************************************************** Event: START-OF-SELECTION**********************************************************************START-OF-SELECTION.

* Storing the program nameg_repid = sy-repid.

* Building ALV event tableCALL FUNCTION 'REUSE_ALV_EVENTS_GET'

EXPORTING

i_list_type = 4

IMPORTING

et_events = gt_events

EXCEPTIONS

list_type_wrong = 1

OTHERS = 2.

IF sy-subrc = 0.

REFRESH gt_events.

Page 8: Adding Custom Context Menu in Classical List

* Adding records for CONTEXT_MENU eventevent-name = 'CONTEXT_MENU'.

event-form = 'CONTEXT_MENU'.

APPEND event TO gt_events.

ENDIF.

* Data SelectionSELECT * FROM sflight INTO CORRESPONDING FIELDS

OF TABLE gt_outtab

UP TO 00030 ROWS.

* Display ALV gridCALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

EXPORTING

i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'

i_callback_program = g_repid

i_callback_user_command = 'USER_COMMAND'

i_structure_name = 'SFLIGHT'

it_events = gt_events

TABLES

t_outtab = gt_outtab

EXCEPTIONS

program_error = 1

OTHERS = 2.

IF sy-subrc <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

Page 9: Adding Custom Context Menu in Classical List

ENDIF.

************************************************************************ FORM html_top_of_page***********************************************************************FORM html_top_of_page USING top TYPE REF TO cl_dd_document.

CALL METHOD top->add_text

EXPORTING

text = 'Hello world '

sap_style = 'heading'.

CALL METHOD top->add_gap

EXPORTING

width = 200.

CALL METHOD top->add_picture

EXPORTING

picture_id = 'ENJOYSAP_LOGO'.

ENDFORM. "html_top_of_page

************************************************************************ Form context_menu***********************************************************************FORM context_menu USING e_object TYPE REF TO cl_ctmenu.

DATA: l_smenu TYPE REF TO cl_ctmenu.

IF e_object IS BOUND.

* Create custom Sub-menu to hide column on which right* mouse button will be clickedCREATE OBJECT l_smenu.

CALL METHOD l_smenu->add_function

EXPORTING

Page 10: Adding Custom Context Menu in Classical List

fcode = 'ZFN1'

text = 'Hide Column'(001).

CALL METHOD e_object->add_submenu

EXPORTING

menu = l_smenu

text = 'Hide'(002).

ENDIF.

ENDFORM. "CONTEXT_MENU

************************************************************************ Form user_command***********************************************************************FORM user_command USING r_ucomm TYPE sy-ucomm

ls_selfield TYPE slis_selfield.

DATA: g_grid TYPE REF TO cl_gui_alv_grid,

t_catalog TYPE lvc_t_fcat,

w_catalog TYPE lvc_s_fcat,

l_repid TYPE sy-repid.

CASE r_ucomm.

* When 'hide column' sub-menu is clicked from the context menu* then hide the column from where this is happenedWHEN 'ZFN1'.

* Get the global instance of the ALV grid as well as* it's field catalog info.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTING

e_callback_program = l_repid

e_grid = g_grid

Page 11: Adding Custom Context Menu in Classical List

et_fieldcat_lvc = t_catalog.

CHECK l_repid = g_repid.

IF g_grid IS BOUND AND t_catalog[] IS NOT INITIAL.

* Set the 'NO_OUT' attribute of the catalog to 'X'w_catalog-no_out = 'X'.

* Modify the field with this above value* on which right click occuredMODIFY t_catalog FROM w_catalog TRANSPORTING no_out

WHERE fieldname = ls_selfield-fieldname.

IF sy-subrc = 0.

* Set the field catalog with this modified oneCALL METHOD g_grid->set_frontend_fieldcatalog

EXPORTING

it_fieldcatalog = t_catalog.

ENDIF.

ENDIF.

WHEN OTHERS.

* Do nothing

ENDCASE.

ls_selfield-refresh = 'X'.

ENDFORM. "USER_COMMAND

Output: