CLASS zcl_abapgit_gui_page DEFINITION PUBLIC ABSTRACT
INHERITING FROM zcl_abapgit_gui_component
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES:
zif_abapgit_gui_modal,
zif_abapgit_gui_renderable,
zif_abapgit_gui_event_handler,
zif_abapgit_gui_error_handler.
TYPES:
BEGIN OF ty_control,
page_layout TYPE string,
page_title TYPE string,
page_menu TYPE REF TO zcl_abapgit_html_toolbar,
page_menu_provider TYPE REF TO zif_abapgit_gui_menu_provider,
page_title_provider TYPE REF TO zif_abapgit_gui_page_title,
extra_css_url TYPE string,
extra_js_url TYPE string,
show_as_modal TYPE abap_bool,
END OF ty_control .
METHODS constructor RAISING zcx_abapgit_exception.
CONSTANTS:
BEGIN OF c_page_layout,
centered TYPE string VALUE `centered`,
full_width TYPE string VALUE `full_width`,
END OF c_page_layout.
PROTECTED SECTION.
DATA ms_control TYPE ty_control .
METHODS render_content " TODO refactor, render child directly
ABSTRACT
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
PRIVATE SECTION.
DATA mo_settings TYPE REF TO zcl_abapgit_settings .
DATA mx_error TYPE REF TO zcx_abapgit_exception .
DATA mo_exception_viewer TYPE REF TO zcl_abapgit_exception_viewer .
METHODS render_deferred_parts
IMPORTING
!ii_html TYPE REF TO zif_abapgit_html
!iv_part_category TYPE string
RAISING
zcx_abapgit_exception .
METHODS html_head
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html .
METHODS header_stylesheet_links
IMPORTING
ii_html TYPE REF TO zif_abapgit_html .
METHODS header_script_links
IMPORTING
ii_html TYPE REF TO zif_abapgit_html .
METHODS title
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
METHODS footer
IMPORTING
!iv_time TYPE string
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
METHODS render_link_hints
IMPORTING
!ii_html TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
METHODS render_browser_control_warning
IMPORTING
!ii_html TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
METHODS render_command_palettes
IMPORTING
!ii_html TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
METHODS render_hotkey_overview
RETURNING
VALUE(ro_html) TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
METHODS render_error_message_box
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
METHODS scripts
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
METHODS get_version_details
RETURNING
VALUE(rv_version) TYPE string.
METHODS is_edge_control_warning_needed
RETURNING
VALUE(rv_result) TYPE abap_bool.
ENDCLASS.
CLASS zcl_abapgit_gui_page IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
ms_control-page_layout = c_page_layout-centered.
ENDMETHOD.
METHOD footer.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
ri_html->add( '
' ).
ENDMETHOD.
METHOD get_version_details.
DATA lo_frontend_serv TYPE REF TO zif_abapgit_frontend_services.
rv_version = zif_abapgit_version=>c_abap_version.
IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true.
rv_version = rv_version && ` - Standalone Version`.
ELSE.
rv_version = rv_version && ` - Developer Version`.
ENDIF.
lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
CASE abap_true.
WHEN lo_frontend_serv->is_webgui( ).
rv_version = rv_version && ` - Web`.
WHEN lo_frontend_serv->is_sapgui_for_windows( ).
rv_version = rv_version && ` - Win`.
WHEN lo_frontend_serv->is_sapgui_for_java( ).
rv_version = rv_version && ` - Java`.
WHEN OTHERS.
* eg. open-abap?
rv_version = rv_version && ` - Unknown`.
ENDCASE.
" Will be filled by JS method displayBrowserControlFooter
rv_version = rv_version && ''.
ENDMETHOD.
METHOD header_script_links.
ii_html->add( '' ).
IF ms_control-extra_js_url IS NOT INITIAL.
ii_html->add( || ).
ENDIF.
ENDMETHOD.
METHOD header_stylesheet_links.
ii_html->add( '' ).
ii_html->add( '' ).
" Themes
ii_html->add( '' ). " Theme basis
CASE mo_settings->get_ui_theme( ).
WHEN zcl_abapgit_settings=>c_ui_theme-dark.
ii_html->add( '' ).
WHEN zcl_abapgit_settings=>c_ui_theme-belize.
ii_html->add( '' ).
ENDCASE.
" Page stylesheets
IF ms_control-extra_css_url IS NOT INITIAL.
ii_html->add( || ).
ENDIF.
ENDMETHOD.
METHOD html_head.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
ri_html->add( '' ).
ri_html->add( '' ).
ri_html->add( '' ).
ri_html->add( 'abapGit' ).
header_stylesheet_links( ri_html ).
header_script_links( ri_html ).
" Overwrite the automatic icon scaling done in zcl_abapgit_html=>icon
CASE mo_settings->get_icon_scaling( ).
WHEN mo_settings->c_icon_scaling-large.
ri_html->add( '' ).
WHEN mo_settings->c_icon_scaling-small.
ri_html->add( '' ).
ENDCASE.
ri_html->add( '' ).
ENDMETHOD.
METHOD is_edge_control_warning_needed.
DATA:
lv_gui_release TYPE zif_abapgit_frontend_services=>ty_gui_release,
lv_gui_sp TYPE zif_abapgit_frontend_services=>ty_gui_sp,
lv_gui_patch TYPE zif_abapgit_frontend_services=>ty_gui_patch,
li_frontend_services TYPE REF TO zif_abapgit_frontend_services.
" With SAP GUI 8.00 PL3 and 7.70 PL13 Edge browser control is basically working.
" For lower releases we render the browser control warning
" and toggle it via JS function toggleBrowserControlWarning.
rv_result = abap_true.
TRY.
li_frontend_services = zcl_abapgit_ui_factory=>get_frontend_services( ).
li_frontend_services->get_gui_version(
IMPORTING
ev_gui_release = lv_gui_release
ev_gui_sp = lv_gui_sp
ev_gui_patch = lv_gui_patch ).
CATCH zcx_abapgit_exception.
RETURN.
ENDTRY.
IF lv_gui_release >= '7700' AND lv_gui_sp >= '1' AND lv_gui_patch >= '13'
OR lv_gui_release >= '8000' AND lv_gui_sp >= '1' AND lv_gui_patch >= '3'.
rv_result = abap_false.
ENDIF.
ENDMETHOD.
METHOD render_browser_control_warning.
DATA li_documentation_link TYPE REF TO zif_abapgit_html.
CREATE OBJECT li_documentation_link TYPE zcl_abapgit_html.
li_documentation_link->add_a(
iv_txt = 'Documentation'
iv_typ = zif_abapgit_html=>c_action_type-url
iv_act = 'https://docs.abapgit.org/guide-sapgui.html#sap-gui-for-windows' ).
ii_html->add( '
' ).
ii_html->add( zcl_abapgit_gui_chunk_lib=>render_warning_banner(
|Attention: You use Edge browser control. |
&& |There are several known malfunctions. See |
&& li_documentation_link->render( ) ) ).
ii_html->add( '
' ).
ENDMETHOD.
METHOD render_command_palettes.
ii_html->add( 'var gCommandPalette = new CommandPalette(enumerateUiActions, {' ).
ii_html->add( ' toggleKey: "F1",' ).
ii_html->add( ' hotkeyDescription: "Command Palette"' ).
ii_html->add( '});' ).
ENDMETHOD.
METHOD render_deferred_parts.
DATA lt_parts TYPE zif_abapgit_html=>ty_table_of.
DATA li_part LIKE LINE OF lt_parts.
lt_parts = gui_services( )->get_html_parts( )->get_parts( iv_part_category ).
LOOP AT lt_parts INTO li_part.
ii_html->add( li_part ).
ENDLOOP.
ENDMETHOD.
METHOD render_error_message_box.
" You should remember that the we have to instantiate ro_html even
" it's overwritten further down. Because ADD checks whether it's
" bound.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
" You should remember that we render the message panel only
" if we have an error.
IF mx_error IS NOT BOUND.
RETURN.
ENDIF.
ri_html = zcl_abapgit_gui_chunk_lib=>render_error_message_box( mx_error ).
" You should remember that the exception viewer dispatches the events of
" error message panel
CREATE OBJECT mo_exception_viewer
EXPORTING
ix_error = mx_error.
" You should remember that we render the message panel just once
" for each exception/error text.
CLEAR:
mx_error.
ENDMETHOD.
METHOD render_hotkey_overview.
DATA lo_hotkeys_component TYPE REF TO zif_abapgit_gui_renderable.
lo_hotkeys_component ?= gui_services( )->get_hotkeys_ctl( ). " Mmmm ...
ro_html = lo_hotkeys_component->render( ).
ENDMETHOD.
METHOD render_link_hints.
DATA: lv_link_hint_key TYPE c LENGTH 1.
lv_link_hint_key = mo_settings->get_link_hint_key( ).
IF mo_settings->get_link_hints_enabled( ) = abap_true AND lv_link_hint_key IS NOT INITIAL.
ii_html->add( |activateLinkHints("{ lv_link_hint_key }");| ).
ii_html->add( |setInitialFocusWithQuerySelector('#header', false);| ).
ii_html->add( |enableArrowListNavigation();| ).
ENDIF.
ENDMETHOD.
METHOD scripts.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
render_deferred_parts(
ii_html = ri_html
iv_part_category = c_html_parts-scripts ).
render_link_hints( ri_html ).
render_command_palettes( ri_html ).
ri_html->add( |toggleBrowserControlWarning();| ).
ri_html->add( |displayBrowserControlFooter();| ).
ENDMETHOD.
METHOD title.
DATA lo_page_menu LIKE ms_control-page_menu.
DATA lv_page_title TYPE string.
lo_page_menu = ms_control-page_menu.
IF lo_page_menu IS NOT BOUND AND ms_control-page_menu_provider IS BOUND.
lo_page_menu = ms_control-page_menu_provider->get_menu( ).
ENDIF.
zcl_abapgit_exit=>get_instance( )->enhance_any_toolbar( lo_page_menu ).
lv_page_title = ms_control-page_title.
IF ms_control-page_title_provider IS BOUND.
lv_page_title = ms_control-page_title_provider->get_page_title( ).
ENDIF.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
ri_html->add( '