Neue Schaltflächen

Mithilfe eines Docking-Containers und einer Toolbar “zaubern” wir eine neue Schaltflächenleiste. Der Clou hierbei ist, dass der aktuelle GUI-Status ausgelesen wird und nur bestimmte Funktionen als Drucktaste aufgenommen werden.

Die Aufteilung der Funktionstasten kann bei großen Transaktionen sinnvoll sein. Hier könnten Funktionen, die für die gesamte Transaktion gelten in der Standard-Drucktastenleiste stehen und Funktionen, die für das aktuelle Dynpro notwendig sind, stehen in der Sidebar. Oder umgekehrt…

Unser Beispielprogramm zeigt ein Dynpro mit der “Sidebar”. Die Funktione, die in der Sidebar angezeigt werden, werden aus dem aktuellen GUI-Status gelesen. Dabei werden nur Funktionen angezeigt, die mit einem Dollarzeichen beginnen. So können wir im GUI-Status einfach definieren, welche Funktionen in die Sidebar aufgenommen werden.

Darstellung

Und so sieht unsere kleine Spielerei aus:

Abwandlung

Anstelle des Docking-Containers könnte man auch einen Dialogbox-Container nehmen (CL_GUI_DIALOGBOX_CONTAINER). Dann wären die Drucktasten in einem eigenen kleinen Fenster vorhanden, das der Anwender verschieben kann.

Info

Die Funktionen müssen natürlich nicht aus dem GUI-Status gelesen werden, sie können auch “per Hand” übertragen werden. Man muss dann im Programm steuern, welche Funktionen sichtbar sein sollen.

Ohne Applikationsbar…

Wenn man mal in der Höhe so viel Platz wie möglich haben möchte, dann kann man die Sidebar auch als Ersatz für die Drucktastenleiste nehmen. Dafür müssen natürlich auch die Systemfunktionen angezeigt werden und es muss evtl. auf “Trenner” im Status reagiert werden.

Wenn man dann in den Dynpro-Eigenschaften den Haken bei “Ohne Applikationsbar” setzt, dann steht der Platz, der für die Drucktastenleiste reserviert ist, dem Dynpro zu Verfügung…

Coding

REPORT ZZ_SIDEBAR.
CLASS lcl_my_event_handler DEFINITION DEFERRED.
DATA evt_receiver TYPE REF TO lcl_my_event_handler.
DATA gr_box       TYPE REF TO cl_gui_dialogbox_container.
DATA gr_dock      TYPE REF TO cl_gui_docking_container.
DATA gr_toolbar   TYPE REF TO cl_gui_toolbar.
DATA gv_pfkey     TYPE sypfkey VALUE 'BOX'.
DATA gv_mode      TYPE i.
DATA gv_text      TYPE text80.
DATA gt_fkeys     TYPE STANDARD TABLE OF rsmpe_keys.
DATA gs_fkey      TYPE                   rsmpe_keys.

TYPE-POOLS icon.

*----------------------------------------------------------------------*
*       CLASS lcl_my_event_handler DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_my_event_handler DEFINITION.

  PUBLIC SECTION.
    METHODS: on_function_selected
               FOR EVENT function_selected OF cl_gui_toolbar
                 IMPORTING fcode.

ENDCLASS.                    "lcl_my_event_handler DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_my_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_my_event_handler IMPLEMENTATION.

  METHOD on_function_selected.

    CASE fcode.

*** Docking-Container lösen
      WHEN 'KILLME'.
        FREE gr_toolbar.
        FREE gr_box.
        CALL METHOD gr_dock->free.
        CALL METHOD cl_gui_cfw=>flush.

      WHEN OTHERS.
*** Funktionscode ausführen
        CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'
          EXPORTING
            functioncode = fcode.
    ENDCASE.

  ENDMETHOD.                    "lcl_my_event_handler

ENDCLASS.                    "lcl_my_event_handler IMPLEMENTATION

START-OF-SELECTION.
  CALL SCREEN 100.

*&---------------------------------------------------------------------*
*&      Form  init
*&---------------------------------------------------------------------*
FORM init.

  DATA myevent_tab TYPE cntl_simple_events.
  DATA myevent TYPE cntl_simple_event.

  CHECK gr_dock IS INITIAL.

*** Docking Container erzeugen
  CREATE OBJECT gr_dock
    EXPORTING
       repid     = sy-cprog
       dynnr     = sy-dynnr
       side      = cl_gui_docking_container=>dock_at_left
       extension = 180
    EXCEPTIONS
      OTHERS     = 6.
  IF sy-subrc = 0.

*** Toolbar erzeugen
    CREATE OBJECT gr_toolbar
      EXPORTING
        parent       = gr_dock
        display_mode = cl_gui_toolbar=>m_mode_vertical.
  ENDIF.

*** Ereignisbehandlungroutinen
  myevent-eventid    = cl_gui_toolbar=>m_id_function_selected.
  myevent-appl_event = 'X'.
  APPEND myevent TO myevent_tab.
  CREATE OBJECT evt_receiver.

  CALL METHOD gr_toolbar->set_registered_events
    EXPORTING
      events = myevent_tab.

  SET HANDLER evt_receiver->on_function_selected
              FOR gr_toolbar.

ENDFORM.                    "init

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS gv_pfkey.
  SET TITLEBAR 'BOX'.
  PERFORM init.
  PERFORM transfer_box.
ENDMODULE.                 " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  CASE sy-ucomm.
    WHEN 'BACK' OR 'HOME' OR 'END'.
*** Exit 
      SET SCREEN 0. LEAVE SCREEN.
    WHEN OTHERS.
      CASE sy-ucomm.
        WHEN 'CHANGE'.
*** Wechseln-Knopf wurde gedrückt
          IF gv_pfkey = 'BOX1'.
*** Status 2 einschalten
            gv_pfkey = 'BOX2'.
          ELSE.
*** Status 1 einschalten
            gv_pfkey = 'BOX1'.
          ENDIF.
        WHEN OTHERS.
*** "Normale" Funktionen
          IF sy-ucomm(1) = '$'.
*** Bei den Funktionen aus der Sidebar gesondert reagieren:
            READ TABLE gt_fkeys INTO gs_fkey WITH KEY code = sy-ucomm.
            IF sy-subrc = 0.
              gv_text = gs_fkey-quickinfo.
            ENDIF.
          ENDIF.
      ENDCASE.
  ENDCASE.

ENDMODULE.                 " USER_COMMAND_0100  INPUT

*&---------------------------------------------------------------------*
*&      Form  transfer_box
*&---------------------------------------------------------------------*
FORM transfer_box.

  STATICS lv_pfkey TYPE sypfkey.

  CHECK gr_toolbar IS BOUND.

  CHECK sy-pfkey <> lv_pfkey.
  lv_pfkey = sy-pfkey.

  DATA lv_func  TYPE ui_func.
  DATA lv_info  TYPE iconquick.
  DATA lv_text  TYPE text40.

*** GUI-Status lesen
  CALL FUNCTION 'RS_CUA_GET_STATUS'
    EXPORTING
      language     = sy-langu
      program      = sy-cprog
      status       = sy-pfkey
    TABLES
      functionkeys = gt_fkeys
    EXCEPTIONS
      OTHERS       = 6.

*** Alle vorhandenen Knöpfe löschen
  CALL METHOD gr_toolbar->delete_all_buttons
    EXCEPTIONS
      OTHERS = 1.

*** Schliessen-Knopf einfügen
  CALL METHOD gr_toolbar->add_button
    EXPORTING
      fcode            = 'KILLME'
      icon             = icon_close
      butn_type        = '0'
      text             = 'Fenster schließen'
      quickinfo        = space
      is_checked       = ' '
      is_disabled      = ' '
    EXCEPTIONS
      cntb_error_fcode = 1.

*** Den Wechseln-Knopf an zweiter Stelle positionieren
  READ TABLE gt_fkeys INTO gs_fkey WITH KEY code = 'CHANGE'.
  IF sy-subrc = 0.
    lv_func = gs_fkey-code.
    lv_info = gs_fkey-quickinfo.

    CALL METHOD gr_toolbar->add_button
      EXPORTING
        fcode            = lv_func
        icon             = gs_fkey-icon_id
        butn_type        = '0'
        text             = gs_fkey-text
        quickinfo        = lv_info
      EXCEPTIONS
        cntb_error_fcode = 1.
  ENDIF.

*** Dann einen "Trenner"
  CALL METHOD gr_toolbar->add_button
    EXPORTING
      fcode            = '$$$'
      icon             = space
      butn_type        = '3'
    EXCEPTIONS
      cntb_error_fcode = 1.

*** Und nun die aktiven Funktionen, die mit "$" beginnen
  LOOP AT gt_fkeys INTO gs_fkey WHERE active = 'X'
                                  AND code(1) = '$'
                                  AND sys_icon = space.

    lv_func = gs_fkey-code.
    lv_info = gs_fkey-quickinfo.
    CALL METHOD gr_toolbar->add_button
      EXPORTING
        fcode            = lv_func
        icon             = gs_fkey-icon_id
        butn_type        = '0'
        text             = gs_fkey-text
        quickinfo        = lv_info
      EXCEPTIONS
        cntb_error_fcode = 1.
  ENDLOOP.

  CALL METHOD cl_gui_cfw=>dispatch.

ENDFORM.                    "transfer_box
Enno Wulff