abapGit/src/ui/zcl_abapgit_hotkeys.clas.abap
Christian Günter 02647d77c6 Hotkeys no longer depend on abapGit installation #2629 (#2633)
* Hotkeys no longer depend on abapGit installation

When this commit is applied hotkeys also work with
the single abapGit report. Limitation is still that users
only can override hotkeys with the installed abapGit repo.

* Fix hotkey display when no user def. hotkeys

* New: Override hotkeys within one file abapGit report

When this commit is applied it's possible to override the default
shortcut also in the one file abapGit report. It's no longer necessary
to installe the full abapGit repo to use this feature

* Extract is_merged + check in hotkey logic
2019-04-19 00:21:36 -07:00

189 lines
5.4 KiB
ABAP

CLASS zcl_abapgit_hotkeys DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS:
get_all_default_hotkeys
IMPORTING
io_page TYPE REF TO zcl_abapgit_gui_page OPTIONAL
RETURNING
VALUE(rt_hotkey_actions) TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_with_name
RAISING
zcx_abapgit_exception.
CLASS-METHODS:
should_show_hint
RETURNING
VALUE(rv_yes) TYPE abap_bool.
PRIVATE SECTION.
CONSTANTS:
mc_hotkey_interface TYPE string VALUE `ZIF_ABAPGIT_GUI_PAGE_HOTKEY` ##NO_TEXT.
CLASS-DATA:
gv_hint_was_shown TYPE abap_bool,
gt_interface_implementations TYPE saboo_iimpt.
CLASS-METHODS:
get_hotkeys_from_global_intf
IMPORTING
io_page TYPE REF TO zcl_abapgit_gui_page
RETURNING
VALUE(rt_hotkeys) TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_with_name,
get_hotkeys_from_local_intf
IMPORTING
io_page TYPE REF TO zcl_abapgit_gui_page
RETURNING
VALUE(rt_hotkeys) TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_with_name
RAISING
zcx_abapgit_exception,
get_local_intf_implementations
RETURNING
VALUE(rt_interface_implementations) TYPE saboo_iimpt
RAISING
zcx_abapgit_exception.
ENDCLASS.
CLASS zcl_abapgit_hotkeys IMPLEMENTATION.
METHOD get_all_default_hotkeys.
IF zcl_abapgit_environment=>is_merged( ) = abap_true.
rt_hotkey_actions = get_hotkeys_from_local_intf( io_page ).
ELSE.
rt_hotkey_actions = get_hotkeys_from_global_intf( io_page ).
ENDIF.
" the global shortcuts are defined in the base class
INSERT LINES OF zcl_abapgit_gui_page=>get_global_hotkeys( ) INTO TABLE rt_hotkey_actions.
SORT rt_hotkey_actions BY name.
ENDMETHOD.
METHOD should_show_hint.
IF gv_hint_was_shown = abap_false.
rv_yes = abap_true.
gv_hint_was_shown = abap_true.
ENDIF.
ENDMETHOD.
METHOD get_hotkeys_from_global_intf.
DATA: lt_hotkey_actions TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_with_name,
lo_interface TYPE REF TO cl_oo_interface,
lv_class_name TYPE abap_abstypename,
lt_classes TYPE seo_relkeys,
lv_where_clause TYPE string.
FIELD-SYMBOLS: <ls_class> LIKE LINE OF lt_classes.
TRY.
lo_interface ?= cl_oo_class=>get_instance( |{ mc_hotkey_interface }| ).
CATCH cx_class_not_existent.
RETURN.
ENDTRY.
lt_classes = lo_interface->get_implementing_classes( ).
IF io_page IS BOUND.
lv_class_name = cl_abap_classdescr=>get_class_name( io_page ).
lv_class_name = substring_after( val = lv_class_name
regex = '^\\CLASS=' ).
lv_where_clause = |CLSNAME = LV_CLASS_NAME|.
ENDIF.
LOOP AT lt_classes ASSIGNING <ls_class>
WHERE (lv_where_clause).
CALL METHOD (<ls_class>-clsname)=>zif_abapgit_gui_page_hotkey~get_hotkey_actions
RECEIVING
rt_hotkey_actions = lt_hotkey_actions.
INSERT LINES OF lt_hotkey_actions INTO TABLE rt_hotkeys.
ENDLOOP.
ENDMETHOD.
METHOD get_hotkeys_from_local_intf.
DATA: lt_hotkey_actions TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_with_name,
lv_where_clause TYPE string,
lv_class_name TYPE abap_abstypename,
lt_interface_implementations TYPE saboo_iimpt.
FIELD-SYMBOLS: <ls_intf_implementation> TYPE vseoimplem.
lt_interface_implementations = get_local_intf_implementations( ).
lv_where_clause = |REFCLSNAME = MC_HOTKEY_INTERFACE|.
IF io_page IS BOUND.
lv_class_name = cl_abap_classdescr=>get_class_name( io_page ).
lv_class_name = substring_after( val = lv_class_name
regex = `^\\PROGRAM=` && sy-cprog && `\\CLASS=` ).
lv_where_clause = |{ lv_where_clause } AND CLSNAME = LV_CLASS_NAME|.
ENDIF.
LOOP AT lt_interface_implementations ASSIGNING <ls_intf_implementation>
WHERE (lv_where_clause).
CALL METHOD (<ls_intf_implementation>-clsname)=>zif_abapgit_gui_page_hotkey~get_hotkey_actions
RECEIVING
rt_hotkey_actions = lt_hotkey_actions.
INSERT LINES OF lt_hotkey_actions INTO TABLE rt_hotkeys.
ENDLOOP.
ENDMETHOD.
METHOD get_local_intf_implementations.
DATA: lt_type_infos TYPE saboo_vseot,
lt_method_implementations TYPE saboo_method_impl_tab,
lt_source TYPE saboo_sourt.
IF gt_interface_implementations IS INITIAL.
READ REPORT sy-cprog INTO lt_source.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Cannot read { sy-cprog }| ).
ENDIF.
CALL FUNCTION 'SCAN_ABAP_OBJECTS_CLASSES'
CHANGING
vseo_tabs = lt_type_infos
method_impls = lt_method_implementations
sourc_tab = lt_source
EXCEPTIONS
scan_abap_source_error = 1
scan_abap_src_line_too_long = 2
OTHERS = 3.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
gt_interface_implementations = lt_type_infos-iimpl_tab.
ENDIF.
rt_interface_implementations = gt_interface_implementations.
ENDMETHOD.
ENDCLASS.