abapGit/src/zabapgit_gui.prog.abap

331 lines
9.4 KiB
ABAP

*&---------------------------------------------------------------------*
*& Include ZABAPGIT_GUI
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_gui DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_gui DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
PUBLIC SECTION.
METHODS go_home
RAISING zcx_abapgit_exception.
METHODS back
IMPORTING iv_to_bookmark TYPE abap_bool DEFAULT abap_false
RETURNING VALUE(rv_exit) TYPE xfeld
RAISING zcx_abapgit_exception.
METHODS on_event FOR EVENT sapevent OF cl_gui_html_viewer
IMPORTING action frame getdata postdata query_table. "#EC NEEDED
PRIVATE SECTION.
TYPES: BEGIN OF ty_page_stack,
page TYPE REF TO lif_gui_page,
bookmark TYPE abap_bool,
END OF ty_page_stack.
DATA: mi_cur_page TYPE REF TO lif_gui_page,
mt_stack TYPE STANDARD TABLE OF ty_page_stack,
mo_router TYPE REF TO lcl_gui_router,
mo_asset_man TYPE REF TO lcl_gui_asset_manager,
mo_html_viewer TYPE REF TO cl_gui_html_viewer.
METHODS constructor
RAISING zcx_abapgit_exception.
METHODS startup
RAISING zcx_abapgit_exception.
METHODS cache_html
IMPORTING iv_text TYPE string
RETURNING VALUE(rv_url) TYPE w3url.
METHODS cache_asset
IMPORTING iv_text TYPE string OPTIONAL
iv_xdata TYPE xstring OPTIONAL
iv_url TYPE w3url OPTIONAL
iv_type TYPE c
iv_subtype TYPE c
RETURNING VALUE(rv_url) TYPE w3url.
METHODS render
RAISING zcx_abapgit_exception.
METHODS get_current_page_name
RETURNING VALUE(rv_page_name) TYPE string.
METHODS call_page
IMPORTING ii_page TYPE REF TO lif_gui_page
iv_with_bookmark TYPE abap_bool DEFAULT abap_false
iv_replacing TYPE abap_bool DEFAULT abap_false
RAISING zcx_abapgit_exception.
METHODS handle_action
IMPORTING action TYPE c
frame TYPE c OPTIONAL
getdata TYPE c OPTIONAL
postdata TYPE cnht_post_data_tab OPTIONAL
query_table TYPE cnht_query_table OPTIONAL.
ENDCLASS. "lcl_gui DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_gui IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_gui IMPLEMENTATION.
METHOD constructor.
startup( ).
ENDMETHOD. "constructor
METHOD handle_action.
DATA: lx_exception TYPE REF TO zcx_abapgit_exception,
li_page TYPE REF TO lif_gui_page,
lv_state TYPE i.
TRY.
IF mi_cur_page IS BOUND.
mi_cur_page->on_event(
EXPORTING
iv_action = action
iv_prev_page = get_current_page_name( )
iv_getdata = getdata
it_postdata = postdata
IMPORTING
ei_page = li_page
ev_state = lv_state ).
ENDIF.
IF lv_state IS INITIAL.
mo_router->on_event(
EXPORTING
iv_action = action
iv_prev_page = get_current_page_name( )
iv_getdata = getdata
it_postdata = postdata
IMPORTING
ei_page = li_page
ev_state = lv_state ).
ENDIF.
CASE lv_state.
WHEN ZIF_ABAPGIT_DEFINITIONS=>gc_event_state-re_render.
render( ).
WHEN ZIF_ABAPGIT_DEFINITIONS=>gc_event_state-new_page.
call_page( li_page ).
WHEN ZIF_ABAPGIT_DEFINITIONS=>gc_event_state-new_page_w_bookmark.
call_page( ii_page = li_page iv_with_bookmark = abap_true ).
WHEN ZIF_ABAPGIT_DEFINITIONS=>gc_event_state-new_page_replacing.
call_page( ii_page = li_page iv_replacing = abap_true ).
WHEN ZIF_ABAPGIT_DEFINITIONS=>gc_event_state-go_back.
back( ).
WHEN ZIF_ABAPGIT_DEFINITIONS=>gc_event_state-go_back_to_bookmark.
back( iv_to_bookmark = abap_true ).
WHEN ZIF_ABAPGIT_DEFINITIONS=>gc_event_state-no_more_act.
" Do nothing, handling completed
WHEN OTHERS.
zcx_abapgit_exception=>raise( |Unknown action: { action }| ).
ENDCASE.
CATCH zcx_abapgit_exception INTO lx_exception.
ROLLBACK WORK.
MESSAGE lx_exception->text TYPE 'S' DISPLAY LIKE 'E'.
CATCH lcx_cancel ##NO_HANDLER.
" Do nothing = gc_event_state-no_more_act
ENDTRY.
ENDMETHOD. "handle_action
METHOD on_event.
handle_action(
action = action
frame = frame
getdata = getdata
postdata = postdata
query_table = query_table ).
ENDMETHOD. "on_event
METHOD back.
DATA: lv_index TYPE i,
ls_stack LIKE LINE OF mt_stack.
lv_index = lines( mt_stack ).
IF lv_index = 0.
rv_exit = abap_true.
RETURN.
ENDIF.
DO lv_index TIMES.
READ TABLE mt_stack INDEX lv_index INTO ls_stack.
ASSERT sy-subrc = 0.
DELETE mt_stack INDEX lv_index.
ASSERT sy-subrc = 0.
lv_index = lv_index - 1.
IF iv_to_bookmark = abap_false OR ls_stack-bookmark = abap_true.
EXIT.
ENDIF.
ENDDO.
mi_cur_page = ls_stack-page. " last page always stays
render( ).
ENDMETHOD. "back
METHOD call_page.
DATA: ls_stack TYPE ty_page_stack.
IF iv_replacing = abap_false AND NOT mi_cur_page IS INITIAL.
ls_stack-page = mi_cur_page.
ls_stack-bookmark = iv_with_bookmark.
APPEND ls_stack TO mt_stack.
ENDIF.
mi_cur_page = ii_page.
render( ).
ENDMETHOD. "call_page
METHOD go_home.
on_event( action = |{ ZIF_ABAPGIT_DEFINITIONS=>gc_action-go_main }| ). " doesn't accept strings directly
ENDMETHOD. "go_home
METHOD startup.
DATA: lt_events TYPE cntl_simple_events,
ls_event LIKE LINE OF lt_events,
lt_assets TYPE ZIF_ABAPGIT_DEFINITIONS=>tt_web_assets.
FIELD-SYMBOLS <ls_asset> LIKE LINE OF lt_assets.
CREATE OBJECT mo_router.
CREATE OBJECT mo_asset_man.
CREATE OBJECT mo_html_viewer
EXPORTING
query_table_disabled = abap_true
parent = cl_gui_container=>screen0.
cache_asset( iv_xdata = mo_asset_man->get_asset( 'css_common' )
iv_url = 'css/common.css'
iv_type = 'text'
iv_subtype = 'css' ).
cache_asset( iv_xdata = mo_asset_man->get_asset( 'js_common' )
iv_url = 'js/common.js'
iv_type = 'text'
iv_subtype = 'javascript' ).
lt_assets = mo_asset_man->get_images( ).
IF lines( lt_assets ) > 0.
LOOP AT lt_assets ASSIGNING <ls_asset>.
cache_asset( iv_xdata = <ls_asset>-content
iv_url = <ls_asset>-url
iv_type = 'image'
iv_subtype = 'png' ).
ENDLOOP.
ENDIF.
ls_event-eventid = mo_html_viewer->m_id_sapevent.
ls_event-appl_event = abap_true.
APPEND ls_event TO lt_events.
mo_html_viewer->set_registered_events( lt_events ).
SET HANDLER me->on_event FOR mo_html_viewer.
ENDMETHOD. "startup
METHOD render.
DATA: lv_url TYPE w3url,
lo_html TYPE REF TO lcl_html.
lo_html = mi_cur_page->render( ).
lv_url = cache_html( lo_html->render( iv_no_indent_jscss = abap_true ) ).
mo_html_viewer->show_url( lv_url ).
ENDMETHOD. "render
METHOD cache_html.
rv_url = cache_asset( iv_text = iv_text
iv_type = 'text'
iv_subtype = 'html' ).
ENDMETHOD. "cache_html
METHOD cache_asset.
DATA: lv_xstr TYPE xstring,
lt_xdata TYPE TABLE OF w3_mime, " RAW255
lv_size TYPE int4.
ASSERT iv_text IS SUPPLIED OR iv_xdata IS SUPPLIED.
IF iv_text IS SUPPLIED. " String input
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = iv_text
IMPORTING
buffer = lv_xstr
EXCEPTIONS
OTHERS = 1.
ASSERT sy-subrc = 0.
ELSE. " Raw input
lv_xstr = iv_xdata.
ENDIF.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = lv_xstr
IMPORTING
output_length = lv_size
TABLES
binary_tab = lt_xdata.
mo_html_viewer->load_data(
EXPORTING
type = iv_type
subtype = iv_subtype
size = lv_size
url = iv_url
IMPORTING
assigned_url = rv_url
CHANGING
data_table = lt_xdata
EXCEPTIONS
OTHERS = 1 ) ##NO_TEXT.
ASSERT sy-subrc = 0. " Image data error
ENDMETHOD. " cache_asset.
METHOD get_current_page_name.
IF mi_cur_page IS BOUND.
rv_page_name =
cl_abap_classdescr=>describe_by_object_ref( mi_cur_page
)->get_relative_name( ).
SHIFT rv_page_name LEFT DELETING LEADING 'LCL_GUI_'.
ENDIF." ELSE - return is empty => initial page
ENDMETHOD. "get_current_page_name
ENDCLASS. "lcl_gui IMPLEMENTATION