Kontextmenüs für Listen 

Wie bei normalen Dynpros erzeugt das System auch für einen Dialogstatus für Listen ein Standardkontextmenü. Dieses Standardkontextmenü kann mit der rechten Maustaste ( SHIFT-F10 ) aufgerufen werden und zeigt sämtliche mit Funktionscodes belegten Funktionstasten an.

Ähnlich wie für Dynproelemente können auch für Listenzeilen Kontextmenüs definiert werden. Hierfür muß im Dialogstatus der Liste die Funktionstaste SHIFT-F10 explizit mit einem speziellen Funktionscode belegt werden. Um Kontextmenüs für eine Liste definieren zu können, muß also zuerst ein eigener Dialogstatus für Listen definiert und mit SET PF-STATUS gesetzt werden.

In diesem Dialogstatus, der in der Regel mit der Vorlage Liststatus abgeglichen wird, muß in den Eigenschaften der Funktionstastenbelegung das Feld Liste mit Kontextmenü angekreuzt werden. Hierzu kann z.B. im Menu Painter der Cursor auf eine Funktionstastenbelegung positioniert und Attribute ausgewählt werden, oder man geht über Springen ® Eigenschaften ® F-Tastenbelegung. Dadurch wird die Funktionstaste SHIFT-F10 mit dem Funktionscode %CTX belegt. Seit der Einführung von Kontextmenüs auf Listen, kann SHIFT-F10 im Menu Painter nicht mehr frei belegt werden. Falls in einem schon vorhandenen Dialogstatus SHIFT-F10 anders belegt war, wird der vorhergehende Funktionscode automatisch auf SHIFT-CTRL-0 gelegt. Der Funktionscode %CTX muß noch manuell aktiviert werden, bevor er im Dialogstatus wirksam ist.

Genau wie bei Dynpros werden Kontextmenüs auf Listen dynamisch im ABAP-Programm als Objekte der Klasse CL_CTMENU erzeugt Für Kontextmenüs auf Listen muß genau eine Callback-Routine im ABAP-Programm programmiert werden, nämlich:

FORM on_ctmenu_request USING <l_menu> TYPE REF TO cl_ctmenu.
  ...
ENDFORM.

In diesem Unterprogramm kann wie unter Kontextmenüs beschrieben mit Hilfe der Objektreferenz <l_menu> ein Kontextmenü definiert werden. Um ein spezifisches Kontextmenü zu definieren kann man sich die Cursorposition auf der Liste beispielsweise mit GET CURSOR besorgen. Auch die Stufe der angezeigten Liste muß nötigenfalls den entsprechenden Systemfeldern (z.B. SY-LISTI) entnommen werden.

Bei Auswahl einer Listenzeile mit der rechten Maustaste ( SHIFT-F10 ) wird die Callback-Routine aufgerufen und das dort definierte Kontextmenü angezeigt. Wählt der Benutzer einen Menüpunkt, wird dem Funktionscode entsprechend verfahren. Die ausgewählte Funktion wird entweder von der Laufzeitumgebung ausgeführt oder es wird das zugehörige Ereignis ausgelöst wobei der Funktionscode im Systemfeld SY-UCOMM zur Verfügung steht.

Eine Betätigung der rechten Maustaste außerhalb einer Listenzeile zeigt weiterhin das Standardkontextmenü an.

REPORT demo_list_context_menu .

DATA: wa_spfli   TYPE spfli,
      wa_sflight TYPE sflight.

START-OF-SELECTION.
  SET PF-STATUS 'BASIC'.
  SELECT * FROM spfli INTO wa_spfli.
    WRITE: / wa_spfli-carrid,
             wa_spfli-connid,
             wa_spfli-cityfrom,
             wa_spfli-cityto.
    HIDE: wa_spfli-carrid, wa_spfli-connid.
  ENDSELECT.
  CLEAR wa_spfli.

AT USER-COMMAND.
  CASE sy-ucomm.
    WHEN 'DETAIL'.
      CHECK NOT wa_spfli IS INITIAL.
      WRITE sy-lisel COLOR COL_HEADING.
      SELECT * FROM sflight INTO wa_sflight
               WHERE carrid = wa_spfli-carrid
                 AND connid = wa_spfli-connid.
        WRITE / wa_sflight-fldate.
      ENDSELECT.
  ENDCASE.

FORM on_ctmenu_request USING l_menu TYPE REF TO cl_ctmenu.
  DATA lin TYPE i.
  IF sy-listi = 0.
    GET CURSOR LINE lin.
    IF lin > 2.
      CALL METHOD l_menu->add_function
                  EXPORTING fcode = 'DETAIL'
                            text  = text-001.
    ENDIF.
    CALL METHOD l_menu->add_function
                EXPORTING fcode = 'BACK'
                          text  = text-002.
  ENDIF.
ENDFORM.

Im Dialogstatus BASIC der Grundliste ist SHIFT-F10 mit %CTX belegt. In der Callback-Routine wird abhängig von der Cursorposition und der angezeigten Liste ein Kontextmenü definiert.

Wählt der Benutzer die rechte Maustaste auf dem zweizeiligen Standardseitenkopf der Grundliste, wird ein einzeiliges Kontextmenü angezeigt. Die Funktion Back wird von der Laufzeitumgebung ausgeführt. Bei Auswahl des Kontextmenüs auf einer Listenzeile, erscheint ein zweizeiliges Kontextmenü. Die Funktion Detail führt zum Ereignis AT USER-COMMAND.