CLASS zcl_abapgit_gui_page DEFINITION PUBLIC ABSTRACT INHERITING FROM zcl_abapgit_gui_component CREATE PUBLIC. PUBLIC SECTION. INTERFACES: zif_abapgit_gui_renderable, zif_abapgit_gui_event_handler, zif_abapgit_gui_error_handler. METHODS: constructor RAISING zcx_abapgit_exception. PROTECTED SECTION. TYPES: BEGIN OF ty_control, page_title TYPE string, page_menu TYPE REF TO zcl_abapgit_html_toolbar, END OF ty_control . DATA ms_control TYPE ty_control . METHODS render_content 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, mx_error TYPE REF TO zcx_abapgit_exception, 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 title RETURNING VALUE(ri_html) TYPE REF TO zif_abapgit_html. METHODS footer RETURNING VALUE(ri_html) TYPE REF TO zif_abapgit_html. METHODS render_link_hints 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(ro_html) TYPE REF TO zcl_abapgit_html RAISING zcx_abapgit_exception. METHODS scripts RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html RAISING zcx_abapgit_exception. ENDCLASS. CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION. METHOD constructor. super->constructor( ). mo_settings = zcl_abapgit_persist_settings=>get_instance( )->read( ). ENDMETHOD. METHOD footer. CREATE OBJECT ri_html TYPE zcl_abapgit_html. ri_html->add( '' ). ENDMETHOD. METHOD html_head. CREATE OBJECT ri_html TYPE zcl_abapgit_html. ri_html->add( '' ). "#EC NOTEXT ri_html->add( '' ). "#EC NOTEXT ri_html->add( '' ). "#EC NOTEXT ri_html->add( 'abapGit' ). "#EC NOTEXT ri_html->add( '' ). ri_html->add( '' ). " Themes ri_html->add( '' ). " Theme basis CASE mo_settings->get_ui_theme( ). WHEN zcl_abapgit_settings=>c_ui_theme-dark. ri_html->add( '' ). WHEN zcl_abapgit_settings=>c_ui_theme-belize. ri_html->add( '' ). ENDCASE. ri_html->add( '' ). "#EC NOTEXT CASE mo_settings->get_icon_scaling( ). " Enforce 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( '' ). "#EC NOTEXT ENDMETHOD. METHOD render_command_palettes. ii_html->add( 'var gCommandPalette = new CommandPalette(enumerateToolbarActions, {' ). ii_html->add( ' toggleKey: "F1",' ). ii_html->add( ' hotkeyDescription: "Command ..."' ). ii_html->add( '});' ). ENDMETHOD. METHOD render_deferred_parts. DATA lt_parts TYPE zif_abapgit_html=>tty_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 ro_html. " You should remember that we render the message panel only " if we have an error. IF mx_error IS NOT BOUND. RETURN. ENDIF. ro_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 char01. 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('a span', true);| ). ii_html->add( |enableArrowListNavigation();| ). ENDIF. ENDMETHOD. METHOD scripts. CREATE OBJECT ro_html. render_deferred_parts( ii_html = ro_html iv_part_category = c_html_parts-scripts ). render_link_hints( ro_html ). render_command_palettes( ro_html ). ENDMETHOD. METHOD title. CREATE OBJECT ri_html TYPE zcl_abapgit_html. ri_html->add( '' ). ENDMETHOD. METHOD zif_abapgit_gui_error_handler~handle_error. mx_error = ix_error. rv_handled = abap_true. ENDMETHOD. METHOD zif_abapgit_gui_event_handler~on_event. CASE iv_action. WHEN zif_abapgit_definitions=>c_action-goto_source. IF mo_exception_viewer IS BOUND. mo_exception_viewer->goto_source( ). ENDIF. ev_state = zcl_abapgit_gui=>c_event_state-no_more_act. WHEN zif_abapgit_definitions=>c_action-show_callstack. IF mo_exception_viewer IS BOUND. mo_exception_viewer->show_callstack( ). ENDIF. ev_state = zcl_abapgit_gui=>c_event_state-no_more_act. WHEN zif_abapgit_definitions=>c_action-goto_message. IF mo_exception_viewer IS BOUND. mo_exception_viewer->goto_message( ). ENDIF. ev_state = zcl_abapgit_gui=>c_event_state-no_more_act. ENDCASE. ENDMETHOD. METHOD zif_abapgit_gui_renderable~render. DATA: li_script TYPE REF TO zif_abapgit_html. gui_services( )->register_event_handler( me ). " Real page CREATE OBJECT ri_html TYPE zcl_abapgit_html. ri_html->add( '' ). "#EC NOTEXT ri_html->add( '' ). "#EC NOTEXT ri_html->add( html_head( ) ). ri_html->add( '' ). "#EC NOTEXT ri_html->add( title( ) ). ri_html->add( render_content( ) ). " TODO -> render child ri_html->add( render_hotkey_overview( ) ). ri_html->add( render_error_message_box( ) ). render_deferred_parts( ii_html = ri_html iv_part_category = c_html_parts-hidden_forms ). ri_html->add( footer( ) ). ri_html->add( '' ). "#EC NOTEXT li_script = scripts( ). IF li_script IS BOUND AND li_script->is_empty( ) = abap_false. ri_html->add( '' ). ENDIF. ri_html->add( '' ). "#EC NOTEXT ENDMETHOD. ENDCLASS.