diff --git a/src/ui/zcl_abapgit_gui_page_diff.clas.abap b/src/ui/zcl_abapgit_gui_page_diff.clas.abap index 95647f4d5..95196033c 100644 --- a/src/ui/zcl_abapgit_gui_page_diff.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_diff.clas.abap @@ -45,14 +45,18 @@ CLASS zcl_abapgit_gui_page_diff DEFINITION METHODS zif_abapgit_gui_event_handler~on_event REDEFINITION. PROTECTED SECTION. + CONSTANTS: BEGIN OF c_actions, - toggle_unified TYPE string VALUE 'toggle_unified', - toggle_hidden_chars TYPE string VALUE 'toggle_hidden_chars', - refresh_prefix TYPE string VALUE 'refresh', - refresh_all TYPE string VALUE 'refresh_all', - refresh_local TYPE string VALUE 'refresh_local', - refresh_local_object TYPE string VALUE 'refresh_local_object', + toggle_unified TYPE string VALUE 'toggle_unified', + toggle_hidden_chars TYPE string VALUE 'toggle_hidden_chars', + toggle_ignore_indent TYPE string VALUE 'toggle_ignore_indent', + toggle_ignore_comments TYPE string VALUE 'toggle_ignore_comments', + toggle_ignore_case TYPE string VALUE 'toggle_ignore_case', + refresh_prefix TYPE string VALUE 'refresh', + refresh_all TYPE string VALUE 'refresh_all', + refresh_local TYPE string VALUE 'refresh_local', + refresh_local_object TYPE string VALUE 'refresh_local_object', END OF c_actions , BEGIN OF c_action_texts, refresh_all TYPE string VALUE `Refresh All`, @@ -155,10 +159,17 @@ CLASS zcl_abapgit_gui_page_diff DEFINITION METHODS render_content REDEFINITION . PRIVATE SECTION. + TYPES: + BEGIN OF ty_view, + hidden_chars TYPE abap_bool, + ignore_indent TYPE abap_bool, + ignore_comments TYPE abap_bool, + ignore_case TYPE abap_bool, + END OF ty_view. DATA mt_delayed_lines TYPE zif_abapgit_definitions=>ty_diffs_tt . DATA mv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key . DATA mv_seed TYPE string . " Unique page id to bind JS sessionStorage - DATA mv_hidden_chars TYPE abap_bool . + DATA ms_view TYPE ty_view. METHODS render_diff IMPORTING @@ -221,6 +232,9 @@ CLASS zcl_abapgit_gui_page_diff DEFINITION METHODS add_filter_sub_menu IMPORTING !io_menu TYPE REF TO zcl_abapgit_html_toolbar . + METHODS add_view_sub_menu + IMPORTING + !io_menu TYPE REF TO zcl_abapgit_html_toolbar . METHODS render_lines IMPORTING !is_diff TYPE ty_file_diff @@ -372,9 +386,35 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION. io_menu->add( iv_txt = 'Split/Unified' iv_act = c_actions-toggle_unified ). - io_menu->add( iv_txt = '¶' - iv_title = 'Toggle Hidden Characters' - iv_act = c_actions-toggle_hidden_chars ). + add_view_sub_menu( io_menu ). + + ENDMETHOD. + + + METHOD add_view_sub_menu. + + DATA lo_sub_view TYPE REF TO zcl_abapgit_html_toolbar. + + CREATE OBJECT lo_sub_view EXPORTING iv_id = 'diff-view'. + + lo_sub_view->add( iv_txt = 'Show Hidden Characters' + iv_act = c_actions-toggle_hidden_chars + iv_chk = ms_view-hidden_chars ). + + lo_sub_view->add( iv_txt = 'Ignore Indentation' + iv_act = c_actions-toggle_ignore_indent + iv_chk = ms_view-ignore_indent ). + + lo_sub_view->add( iv_txt = 'Ignore Comments' + iv_act = c_actions-toggle_ignore_comments + iv_chk = ms_view-ignore_comments ). + + lo_sub_view->add( iv_txt = 'Ignore Pretty-Print Case' + iv_act = c_actions-toggle_ignore_case + iv_chk = ms_view-ignore_case ). + + io_menu->add( iv_txt = 'View' + io_sub = lo_sub_view ). ENDMETHOD. @@ -459,13 +499,19 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION. IF -fstate = c_fstate-remote. " Remote file leading changes CREATE OBJECT -o_diff EXPORTING - iv_new = -data - iv_old = -file-data. + iv_new = -data + iv_old = -file-data + iv_ignore_indentation = ms_view-ignore_indent + iv_ignore_comments = ms_view-ignore_comments + iv_ignore_case = ms_view-ignore_case. ELSE. " Local leading changes or both were modified CREATE OBJECT -o_diff EXPORTING - iv_new = -file-data - iv_old = -data. + iv_new = -file-data + iv_old = -data + iv_ignore_indentation = ms_view-ignore_indent + iv_ignore_comments = ms_view-ignore_comments + iv_ignore_case = ms_view-ignore_case. ENDIF. ENDIF. @@ -930,7 +976,7 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION. FIELD-SYMBOLS LIKE LINE OF lt_diffs. lo_highlighter = zcl_abapgit_syntax_factory=>create( iv_filename = is_diff-filename - iv_hidden_chars = mv_hidden_chars ). + iv_hidden_chars = ms_view-hidden_chars ). CREATE OBJECT ri_html TYPE zcl_abapgit_html. lt_diffs = is_diff-o_diff->get( ). @@ -1193,6 +1239,10 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION. METHOD zif_abapgit_gui_event_handler~on_event. + DATA ls_view LIKE ms_view. + + ls_view = ms_view. + CASE ii_event->mv_action. WHEN c_actions-toggle_unified. " Toggle file diplay @@ -1202,8 +1252,19 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION. WHEN c_actions-toggle_hidden_chars. " Toggle display of hidden characters - mv_hidden_chars = boolc( mv_hidden_chars = abap_false ). - rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + ms_view-hidden_chars = boolc( ms_view-hidden_chars = abap_false ). + + WHEN c_actions-toggle_ignore_indent. " Toggle ignore indentation + + ms_view-ignore_indent = boolc( ms_view-ignore_indent = abap_false ). + + WHEN c_actions-toggle_ignore_comments. " Toggle ignore comments + + ms_view-ignore_comments = boolc( ms_view-ignore_comments = abap_false ). + + WHEN c_actions-toggle_ignore_case. " Toggle case sensitivity + + ms_view-ignore_case = boolc( ms_view-ignore_case = abap_false ). WHEN OTHERS. @@ -1220,6 +1281,13 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION. ENDCASE. + " If view has changed, refresh local files recalculating diff, and update menu + IF ms_view <> ls_view. + refresh( c_actions-refresh_local ). + ms_control-page_menu = build_menu( ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + ENDIF. + ENDMETHOD. diff --git a/src/utils/zcl_abapgit_diff.clas.abap b/src/utils/zcl_abapgit_diff.clas.abap index d31e4519e..20e01f299 100644 --- a/src/utils/zcl_abapgit_diff.clas.abap +++ b/src/utils/zcl_abapgit_diff.clas.abap @@ -82,7 +82,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_DIFF IMPLEMENTATION. +CLASS zcl_abapgit_diff IMPLEMENTATION. METHOD calculate_stats. @@ -115,6 +115,7 @@ CLASS ZCL_ABAPGIT_DIFF IMPLEMENTATION. LIKE LINE OF it_new, LIKE LINE OF lt_delta. + " Note: Ignore case is for keywords, variables, types etc, but not for literals CALL FUNCTION 'RS_CMP_COMPUTE_DELTA' EXPORTING compare_mode = mv_compare_mode diff --git a/src/utils/zcl_abapgit_diff.clas.testclasses.abap b/src/utils/zcl_abapgit_diff.clas.testclasses.abap index da0bd680f..996ad967d 100644 --- a/src/utils/zcl_abapgit_diff.clas.testclasses.abap +++ b/src/utils/zcl_abapgit_diff.clas.testclasses.abap @@ -18,6 +18,7 @@ CLASS ltcl_diff DEFINITION FOR TESTING iv_old TYPE zif_abapgit_definitions=>ty_diff-old. METHODS: setup. + METHODS: test IMPORTING !iv_ignore_indentation TYPE abap_bool DEFAULT abap_false @@ -33,7 +34,9 @@ CLASS ltcl_diff DEFINITION FOR TESTING diff06 FOR TESTING, diff07 FOR TESTING, diff08 FOR TESTING, - diff09 FOR TESTING. + diff09 FOR TESTING, + diff10 FOR TESTING, + diff11 FOR TESTING. ENDCLASS. @@ -350,4 +353,45 @@ CLASS ltcl_diff IMPLEMENTATION. ENDMETHOD. + METHOD diff10. + + " ignore case should NOT ignore changed literals + add_new( iv_new = `WRITE 'TEST'` ). + + add_old( iv_old = `WRITE 'test'` ). + + add_expected( iv_new_num = ' 1' + iv_new = `WRITE 'TEST'` + iv_result = 'U' + iv_old_num = ' 1' + iv_old = `WRITE 'test'` ). + + test( iv_ignore_case = abap_true ). + + ENDMETHOD. + + METHOD diff11. + + " ignore case should ignore changed keywords, variables, types + add_new( iv_new = `write 'test'` ). + add_new( iv_new = `DATA FOO TYPE I.` ). + + add_old( iv_old = `WRITE 'test'` ). + add_old( iv_old = `DATA foo TYPE i.` ). + + add_expected( iv_new_num = ' 1' + iv_new = `write 'test'` + iv_result = '' " no diff! + iv_old_num = ' 1' + iv_old = `WRITE 'test'` ). + add_expected( iv_new_num = ' 2' + iv_new = `DATA FOO TYPE I.` + iv_result = '' " no diff! + iv_old_num = ' 2' + iv_old = `DATA foo TYPE i.` ). + + test( iv_ignore_case = abap_true ). + + ENDMETHOD. + ENDCLASS. diff --git a/test/abap_transpile.json b/test/abap_transpile.json index e852d5c3e..385164cb9 100644 --- a/test/abap_transpile.json +++ b/test/abap_transpile.json @@ -180,6 +180,8 @@ {"object": "ZCL_ABAPGIT_DIFF", "class": "ltcl_diff", "method": "diff07", "note": "Void type: RSWSOURCET"}, {"object": "ZCL_ABAPGIT_DIFF", "class": "ltcl_diff", "method": "diff08", "note": "Void type: RSWSOURCET"}, {"object": "ZCL_ABAPGIT_DIFF", "class": "ltcl_diff", "method": "diff09", "note": "Void type: RSWSOURCET"}, + {"object": "ZCL_ABAPGIT_DIFF", "class": "ltcl_diff", "method": "diff10", "note": "Void type: RSWSOURCET"}, + {"object": "ZCL_ABAPGIT_DIFF", "class": "ltcl_diff", "method": "diff11", "note": "Void type: RSWSOURCET"}, {"object": "ZCL_ABAPGIT_GUI_UTILS", "class": "ltcl_gui_utils", "method": "is_renderable", "note": "casting, https://github.com/abaplint/transpiler/issues/465"}, {"object": "ZCL_ABAPGIT_GUI_UTILS", "class": "ltcl_gui_utils", "method": "is_event_handler", "note": "casting, https://github.com/abaplint/transpiler/issues/465"},