UI diff page unified mode #442

CSS finetune
page_diff refactor
render_line split+unified
plus-minus markers
subsequent updated line output
user param diff_unified
This commit is contained in:
sbcgua 2017-01-10 23:48:31 +02:00
parent 4f0f617a3e
commit c8c7ce8471
5 changed files with 301 additions and 137 deletions

View File

@ -37,7 +37,7 @@ form input:focus, textarea:focus {
.grey { color: lightgrey !important; } .grey { color: lightgrey !important; }
.darkgrey { color: #808080 !important; } .darkgrey { color: #808080 !important; }
.attention { color: red !important; } .attention { color: red !important; }
.blue { color: #5e8dc9; !important; } .blue { color: #5e8dc9 !important; }
.red { color: red !important; } .red { color: red !important; }
/* MODIFIERS */ /* MODIFIERS */
@ -415,8 +415,8 @@ span.diff_banner {
padding-right: 0.3em; padding-right: 0.3em;
} }
.diff_ins { .diff_ins {
border-color: #7bea7b; border-color: #abf2ab;
background-color: #d3f8d3; background-color: #e0ffe0;
} }
.diff_del { .diff_del {
border-color: #ff667d; border-color: #ff667d;
@ -500,21 +500,37 @@ table.diff_tab thead.nav_line th {
color: #bbb; color: #bbb;
} }
table.diff_tab td.num, th.num { table.diff_tab td.num, th.num {
text-align: right; width: 1%;
min-width: 2em;
padding-right: 8px;
padding-left: 8px;
text-align: right !important;
color: #ccc; color: #ccc;
border-left: 1px solid #eee; border-left: 1px solid #eee;
border-right: 1px solid #eee; border-right: 1px solid #eee;
-ms-user-select: none;
user-select: none;
}
table.diff_tab td.num::before {
content: attr(line-num);
} }
table.diff_tab code { table.diff_tab code {
font-family: inherit; font-family: inherit;
white-space: pre; white-space: pre;
} }
table.diff_tab td.code {
/* font-family: inherit; */
/* white-space: pre; */
word-wrap: break-word;
white-space: pre-wrap;
overflow: visible;
}
table.diff_tab code span.keyword { color: #0a69ce; } table.diff_tab code span.keyword { color: #0a69ce; }
table.diff_tab code span.text { color: #48ce4f; } table.diff_tab code span.text { color: #48ce4f; }
table.diff_tab code span.comment { color: #808080; font-style: italic; } table.diff_tab code span.comment { color: #808080; font-style: italic; }
table.diff_tab code span.xml_tag { color: #3370e0; } table.diff_tab code span.xml_tag { color: #457ce3; }
table.diff_tab code span.attr { color: #f20707; } table.diff_tab code span.attr { color: #b777fb; }
table.diff_tab code span.attr_val { color: #7a02f9; } table.diff_tab code span.attr_val { color: #7a02f9; }
table.diff_tab tbody tr:first-child td { padding-top: 0.5em; } table.diff_tab tbody tr:first-child td { padding-top: 0.5em; }

View File

@ -7,32 +7,40 @@ CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page.
PUBLIC SECTION. PUBLIC SECTION.
CONSTANTS: CONSTANTS:
BEGIN OF c_mod, BEGIN OF c_fstate,
local TYPE char1 VALUE 'L', local TYPE char1 VALUE 'L',
remote TYPE char1 VALUE 'R', remote TYPE char1 VALUE 'R',
both TYPE char1 VALUE 'B', both TYPE char1 VALUE 'B',
END OF c_mod. END OF c_fstate.
TYPES: BEGIN OF ty_file_diff, TYPES: BEGIN OF ty_file_diff,
filename TYPE string, filename TYPE string,
lstate TYPE char1, lstate TYPE char1,
rstate TYPE char1, rstate TYPE char1,
mod TYPE char1, " Abstraction for shorter ifs fstate TYPE char1, " FILE state - Abstraction for shorter ifs
o_diff TYPE REF TO lcl_diff, o_diff TYPE REF TO lcl_diff,
END OF ty_file_diff, END OF ty_file_diff,
tt_file_diff TYPE STANDARD TABLE OF ty_file_diff. tt_file_diff TYPE STANDARD TABLE OF ty_file_diff.
METHODS: constructor METHODS:
constructor
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
is_file TYPE ty_file OPTIONAL is_file TYPE ty_file OPTIONAL
is_object TYPE ty_item OPTIONAL is_object TYPE ty_item OPTIONAL
RAISING lcx_exception. RAISING lcx_exception,
lif_gui_page~on_event REDEFINITION.
PROTECTED SECTION. PROTECTED SECTION.
METHODS render_content REDEFINITION. METHODS render_content REDEFINITION.
PRIVATE SECTION. PRIVATE SECTION.
DATA: mt_diff_files TYPE tt_file_diff. CONSTANTS: BEGIN OF c_actions,
toggle_unified TYPE string VALUE 'toggle_unified',
END OF c_actions.
DATA: mt_diff_files TYPE tt_file_diff,
mt_delayed_lines TYPE lcl_diff=>ty_diffs_tt,
mv_unified TYPE abap_bool VALUE abap_true.
METHODS render_diff METHODS render_diff
IMPORTING is_diff TYPE ty_file_diff IMPORTING is_diff TYPE ty_file_diff
@ -49,16 +57,20 @@ CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page.
IMPORTING is_diff_line TYPE lcl_diff=>ty_diff IMPORTING is_diff_line TYPE lcl_diff=>ty_diff
is_diff TYPE ty_file_diff is_diff TYPE ty_file_diff
RETURNING VALUE(ro_html) TYPE REF TO lcl_html. RETURNING VALUE(ro_html) TYPE REF TO lcl_html.
METHODS get_line_hl METHODS render_line_split
IMPORTING iv_mod TYPE char1 IMPORTING is_diff_line TYPE lcl_diff=>ty_diff
iv_result TYPE lcl_diff=>ty_diff-result iv_fstate TYPE char1
EXPORTING ev_lattr TYPE string RETURNING VALUE(ro_html) TYPE REF TO lcl_html.
ev_rattr TYPE string. METHODS render_line_unified
IMPORTING is_diff_line TYPE lcl_diff=>ty_diff OPTIONAL
RETURNING VALUE(ro_html) TYPE REF TO lcl_html.
METHODS append_diff METHODS append_diff
IMPORTING it_remote TYPE ty_files_tt IMPORTING it_remote TYPE ty_files_tt
it_local TYPE ty_files_item_tt it_local TYPE ty_files_item_tt
is_status TYPE ty_result is_status TYPE ty_result
RAISING lcx_exception. RAISING lcx_exception.
METHODS build_menu
RETURNING VALUE(ro_menu) TYPE REF TO lcl_html_toolbar.
ENDCLASS. "lcl_gui_page_diff ENDCLASS. "lcl_gui_page_diff
@ -75,6 +87,8 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
super->constructor( ). super->constructor( ).
ms_control-page_title = 'DIFF'. ms_control-page_title = 'DIFF'.
ms_control-page_menu = build_menu( ).
mv_unified = lcl_app=>user( )->get_diff_unified( ).
ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed
@ -154,14 +168,14 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
<ls_diff>-rstate = is_status-rstate. <ls_diff>-rstate = is_status-rstate.
IF <ls_diff>-lstate IS NOT INITIAL AND <ls_diff>-rstate IS NOT INITIAL. IF <ls_diff>-lstate IS NOT INITIAL AND <ls_diff>-rstate IS NOT INITIAL.
<ls_diff>-mod = c_mod-both. <ls_diff>-fstate = c_fstate-both.
ELSEIF <ls_diff>-lstate IS NOT INITIAL. ELSEIF <ls_diff>-lstate IS NOT INITIAL.
<ls_diff>-mod = c_mod-local. <ls_diff>-fstate = c_fstate-local.
ELSE. "rstate IS NOT INITIAL, lstate = empty. ELSE. "rstate IS NOT INITIAL, lstate = empty.
<ls_diff>-mod = c_mod-remote. <ls_diff>-fstate = c_fstate-remote.
ENDIF. ENDIF.
IF <ls_diff>-mod = c_mod-remote. " Remote file leading changes IF <ls_diff>-fstate = c_fstate-remote. " Remote file leading changes
CREATE OBJECT <ls_diff>-o_diff CREATE OBJECT <ls_diff>-o_diff
EXPORTING EXPORTING
iv_new = <ls_remote>-data iv_new = <ls_remote>-data
@ -175,45 +189,46 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ENDMETHOD. "append_diff ENDMETHOD. "append_diff
METHOD render_diff_head. METHOD build_menu.
DATA: lo_html TYPE REF TO lcl_html, CREATE OBJECT ro_menu.
ls_stats TYPE lcl_diff=>ty_count. ro_menu->add( iv_txt = 'Split/Unified view'
iv_act = c_actions-toggle_unified ) ##NO_TEXT.
ENDMETHOD. " build_menu.
CREATE OBJECT lo_html. **********************************************************************
* EVENT HANDLING
**********************************************************************
ls_stats = is_diff-o_diff->stats( ). METHOD lif_gui_page~on_event.
IF is_diff-mod = c_mod-both. " Merge stats into 'update' if both were changed CASE iv_action.
ls_stats-update = ls_stats-update + ls_stats-insert + ls_stats-delete. WHEN c_actions-toggle_unified. " Toggle file diplay
CLEAR: ls_stats-insert, ls_stats-delete. mv_unified = lcl_app=>user( )->toggle_diff_unified( ).
ENDIF. ev_state = gc_event_state-re_render.
ENDCASE.
lo_html->add( '<div class="diff_head">' ). "#EC NOTEXT ENDMETHOD. "lif_gui_page~on_event
lo_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ).
lo_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ).
lo_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ).
lo_html->add( |<span class="diff_name">{ is_diff-filename }</span>| ). "#EC NOTEXT
lo_html->add( lcl_gui_chunk_lib=>render_item_state( iv1 = is_diff-lstate
iv2 = is_diff-rstate ) ).
lo_html->add( '</div>' ). "#EC NOTEXT
ro_html = lo_html. **********************************************************************
ENDMETHOD. * RENDER LOGIC
**********************************************************************
METHOD render_table_head. METHOD render_content.
DATA ls_diff_file LIKE LINE OF mt_diff_files.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
ro_html->add( '<thead class="header">' ). "#EC NOTEXT LOOP AT mt_diff_files INTO ls_diff_file.
ro_html->add( '<tr>' ). "#EC NOTEXT lcl_progress=>show( iv_key = 'Diff'
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT iv_current = sy-tabix
ro_html->add( '<th>LOCAL</th>' ). "#EC NOTEXT iv_total = lines( mt_diff_files )
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT iv_text = |Render Diff - { ls_diff_file-filename }| ).
ro_html->add( '<th>REMOTE</th>' ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT
ro_html->add( '</thead>' ). "#EC NOTEXT
ENDMETHOD. " render_table_head. ro_html->add( render_diff( ls_diff_file ) ).
ENDLOOP.
ENDMETHOD. "render_content
METHOD render_diff. METHOD render_diff.
@ -232,8 +247,67 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ro_html->add( '</div>' ). "#EC NOTEXT ro_html->add( '</div>' ). "#EC NOTEXT
ENDMETHOD. " render_diff
**********************************************************************
* CHUNKS
**********************************************************************
METHOD render_diff_head.
DATA: ls_stats TYPE lcl_diff=>ty_count.
CREATE OBJECT ro_html.
ls_stats = is_diff-o_diff->stats( ).
IF is_diff-fstate = c_fstate-both. " Merge stats into 'update' if both were changed
ls_stats-update = ls_stats-update + ls_stats-insert + ls_stats-delete.
CLEAR: ls_stats-insert, ls_stats-delete.
ENDIF.
ro_html->add( '<div class="diff_head">' ). "#EC NOTEXT
ro_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ).
ro_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ).
ro_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ).
ro_html->add( |<span class="diff_name">{ is_diff-filename }</span>| ). "#EC NOTEXT
ro_html->add( lcl_gui_chunk_lib=>render_item_state( iv1 = is_diff-lstate
iv2 = is_diff-rstate ) ).
IF is_diff-fstate = c_fstate-both AND mv_unified = abap_true.
ro_html->add( '<span class="attention pad-sides">Attention: Unified mode'
&& ' highlighting for MM assumes local file is newer ! </span>' ). "#EC NOTEXT
ENDIF.
ro_html->add( '</div>' ). "#EC NOTEXT
ENDMETHOD. ENDMETHOD.
METHOD render_table_head.
CREATE OBJECT ro_html.
IF mv_unified = abap_true.
ro_html->add( '<thead class="header">' ). "#EC NOTEXT
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( '<th class="num">old</th>' ). "#EC NOTEXT
ro_html->add( '<th class="num">new</th>' ). "#EC NOTEXT
ro_html->add( '<th>code</th>' ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT
ro_html->add( '</thead>' ). "#EC NOTEXT
ELSE.
ro_html->add( '<thead class="header">' ). "#EC NOTEXT
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>LOCAL</th>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>REMOTE</th>' ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT
ro_html->add( '</thead>' ). "#EC NOTEXT
ENDIF.
ENDMETHOD. " render_table_head.
METHOD render_beacon. METHOD render_beacon.
DATA: lv_beacon TYPE string. DATA: lv_beacon TYPE string.
@ -246,10 +320,19 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
lv_beacon = '---'. lv_beacon = '---'.
ENDIF. ENDIF.
ro_html->add( '<thead class="nav_line">' ). ro_html->add( '<thead class="nav_line">' ).
ro_html->add( '<tr>' ). ro_html->add( '<tr>' ).
IF mv_unified = abap_true.
ro_html->add( '<th class="num"></th>' ). ro_html->add( '<th class="num"></th>' ).
ro_html->add( |<th colspan="3">@@ { is_diff_line-new_line } @@ { lv_beacon }</th>| ). ro_html->add( '<th class="num"></th>' ).
ro_html->add( |<th>@@ { is_diff_line-new_num } @@ { lv_beacon }</th>| ).
ELSE.
ro_html->add( '<th class="num"></th>' ).
ro_html->add( |<th colspan="3">@@ { is_diff_line-new_num } @@ { lv_beacon }</th>| ).
ENDIF.
ro_html->add( '</tr>' ). ro_html->add( '</tr>' ).
ro_html->add( '</thead>' ). ro_html->add( '</thead>' ).
@ -259,10 +342,6 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
DATA: lo_highlighter TYPE REF TO lcl_syntax_highlighter, DATA: lo_highlighter TYPE REF TO lcl_syntax_highlighter,
lt_diffs TYPE lcl_diff=>ty_diffs_tt, lt_diffs TYPE lcl_diff=>ty_diffs_tt,
lv_local TYPE string,
lv_remote TYPE string,
lv_lattr TYPE string,
lv_rattr TYPE string,
lv_insert_nav TYPE abap_bool. lv_insert_nav TYPE abap_bool.
FIELD-SYMBOLS <ls_diff> LIKE LINE OF lt_diffs. FIELD-SYMBOLS <ls_diff> LIKE LINE OF lt_diffs.
@ -283,83 +362,125 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
lv_insert_nav = abap_false. lv_insert_nav = abap_false.
ENDIF. ENDIF.
IF is_diff-mod = c_mod-remote. " Remote file leading changes
lv_local = <ls_diff>-old.
lv_remote = <ls_diff>-new.
ELSE. " Local leading changes or both were modified
lv_local = <ls_diff>-new.
lv_remote = <ls_diff>-old.
ENDIF.
IF lo_highlighter IS BOUND. IF lo_highlighter IS BOUND.
lv_local = lo_highlighter->process_line( lv_local ). <ls_diff>-new = lo_highlighter->process_line( <ls_diff>-new ).
lv_remote = lo_highlighter->process_line( lv_remote ). <ls_diff>-old = lo_highlighter->process_line( <ls_diff>-old ).
ELSE. ELSE.
lv_local = escape( val = lv_local format = cl_abap_format=>e_html_attr ). <ls_diff>-new = escape( val = <ls_diff>-new format = cl_abap_format=>e_html_attr ).
lv_remote = escape( val = lv_remote format = cl_abap_format=>e_html_attr ). <ls_diff>-old = escape( val = <ls_diff>-old format = cl_abap_format=>e_html_attr ).
ENDIF. ENDIF.
get_line_hl( EXPORTING iv_mod = is_diff-mod CONDENSE <ls_diff>-new_num. "get rid of leading spaces
iv_result = <ls_diff>-result CONDENSE <ls_diff>-old_num.
IMPORTING ev_lattr = lv_lattr
ev_rattr = lv_rattr ).
ro_html->add( '<tr>' ). "#EC NOTEXT IF mv_unified = abap_true.
ro_html->add( |<td class="num">{ <ls_diff>-new_line }</td>| ). "#EC NOTEXT ro_html->add( render_line_unified( is_diff_line = <ls_diff> ) ).
ro_html->add( |<td{ lv_lattr }><code>{ lv_local }</code></td>| ). "#EC NOTEXT ELSE.
ro_html->add( |<td class="num">{ <ls_diff>-old_line }</td>| ). "#EC NOTEXT ro_html->add( render_line_split( is_diff_line = <ls_diff>
ro_html->add( |<td{ lv_rattr }><code>{ lv_remote }</code></td>| ). "#EC NOTEXT iv_fstate = is_diff-fstate ) ).
ro_html->add( '</tr>' ). "#EC NOTEXT ENDIF.
ENDLOOP. ENDLOOP.
ENDMETHOD. IF mv_unified = abap_true.
ro_html->add( render_line_unified( ) ). " Release delayed lines
METHOD get_line_hl.
CLEAR: ev_lattr, ev_rattr. " Class for changed lines
IF iv_result IS INITIAL.
RETURN.
ENDIF. ENDIF.
" Both file changed ? Or line updated ? - All yellow ENDMETHOD. "render_lines
IF iv_mod = c_mod-both OR iv_result = lcl_diff=>c_diff-update.
ev_lattr = ' class="diff_upd"'. "#EC NOTEXT
ev_rattr = ' class="diff_upd"'. "#EC NOTEXT
ELSEIF iv_mod = c_mod-local. " Changed locally
CASE iv_result.
WHEN lcl_diff=>c_diff-insert.
ev_lattr = ' class="diff_ins"'. "#EC NOTEXT
WHEN lcl_diff=>c_diff-delete.
ev_rattr = ' class="diff_del"'. "#EC NOTEXT
ENDCASE.
ELSEIF iv_mod = c_mod-remote. " Changed remotely - invert sides
CASE iv_result.
WHEN lcl_diff=>c_diff-insert.
ev_rattr = ' class="diff_ins"'. "#EC NOTEXT
WHEN lcl_diff=>c_diff-delete.
ev_lattr = ' class="diff_del"'. "#EC NOTEXT
ENDCASE.
ENDIF.
ENDMETHOD. " get_line_hl. METHOD render_line_split.
METHOD render_content. DATA: lv_new TYPE string,
lv_old TYPE string,
DATA ls_diff_file LIKE LINE OF mt_diff_files. lv_mark TYPE string,
lv_bg TYPE string.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
LOOP AT mt_diff_files INTO ls_diff_file. " New line
lcl_progress=>show( iv_key = 'Diff' lv_mark = ` `.
iv_current = sy-tabix IF iv_fstate = c_fstate-both OR is_diff_line-result = lcl_diff=>c_diff-update.
iv_total = lines( mt_diff_files ) lv_bg = ' diff_upd'.
iv_text = |Render Diff - { ls_diff_file-filename }| ). lv_mark = `~`.
ELSEIF is_diff_line-result = lcl_diff=>c_diff-insert.
lv_bg = ' diff_ins'.
lv_mark = `+`.
ENDIF.
lv_new = |<td class="num" line-num="{ is_diff_line-new_num }"></td>|
&& |<td class="code{ lv_bg }">{ lv_mark }{ is_diff_line-new }</td>|.
ro_html->add( render_diff( ls_diff_file ) ). " Old line
CLEAR lv_bg.
lv_mark = ` `.
IF iv_fstate = c_fstate-both OR is_diff_line-result = lcl_diff=>c_diff-update.
lv_bg = ' diff_upd'.
lv_mark = `~`.
ELSEIF is_diff_line-result = lcl_diff=>c_diff-delete.
lv_bg = ' diff_del'.
lv_mark = `-`.
ENDIF.
lv_old = |<td class="num" line-num="{ is_diff_line-old_num }"></td>|
&& |<td class="code{ lv_bg }">{ lv_mark }{ is_diff_line-old }</td>|.
" render line, inverse sides if remote is newer
ro_html->add( '<tr>' ). "#EC NOTEXT
IF iv_fstate = c_fstate-remote. " Remote file leading changes
ro_html->add( lv_old ). " local
ro_html->add( lv_new ). " remote
ELSE. " Local leading changes or both were modified
ro_html->add( lv_new ). " local
ro_html->add( lv_old ). " remote
ENDIF.
ro_html->add( '</tr>' ). "#EC NOTEXT
ENDMETHOD. "render_line_split
METHOD render_line_unified.
DATA lv_line TYPE string.
FIELD-SYMBOLS <diff_line> LIKE LINE OF mt_delayed_lines.
CREATE OBJECT ro_html.
" Release delayed subsequent update lines
IF is_diff_line-result <> lcl_diff=>c_diff-update.
LOOP AT mt_delayed_lines ASSIGNING <diff_line>.
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( |<td class="num" line-num="{ <diff_line>-old_num }"></td>|
&& |<td class="num" line-num=""></td>|
&& |<td class="code diff_del">-{ <diff_line>-old }</td>| ).
ro_html->add( '</tr>' ). "#EC NOTEXT
ENDLOOP. ENDLOOP.
LOOP AT mt_delayed_lines ASSIGNING <diff_line>.
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( |<td class="num" line-num=""></td>|
&& |<td class="num" line-num="{ <diff_line>-new_num }"></td>|
&& |<td class="code diff_ins">+{ <diff_line>-new }</td>| ).
ro_html->add( '</tr>' ). "#EC NOTEXT
ENDLOOP.
CLEAR mt_delayed_lines.
ENDIF.
ENDMETHOD. "render_content ro_html->add( '<tr>' ). "#EC NOTEXT
CASE is_diff_line-result.
WHEN lcl_diff=>c_diff-update.
APPEND is_diff_line TO mt_delayed_lines. " Delay output of subsequent updates
WHEN lcl_diff=>c_diff-insert.
ro_html->add( |<td class="num" line-num=""></td>|
&& |<td class="num" line-num="{ is_diff_line-new_num }"></td>|
&& |<td class="code diff_ins">+{ is_diff_line-new }</td>| ).
WHEN lcl_diff=>c_diff-delete.
ro_html->add( |<td class="num" line-num="{ is_diff_line-old_num }"></td>|
&& |<td class="num" line-num=""></td>|
&& |<td class="code diff_del">-{ is_diff_line-old }</td>| ).
WHEN OTHERS. "none
ro_html->add( |<td class="num" line-num="{ is_diff_line-old_num }"></td>|
&& |<td class="num" line-num="{ is_diff_line-new_num }"></td>|
&& |<td class="code"> { is_diff_line-old }</td>| ).
ENDCASE.
ro_html->add( '</tr>' ). "#EC NOTEXT
ENDMETHOD. "render_line_unified
ENDCLASS. "lcl_gui_page_diff ENDCLASS. "lcl_gui_page_diff

View File

@ -422,6 +422,14 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
RETURNING VALUE(rv_changes_only) TYPE abap_bool RETURNING VALUE(rv_changes_only) TYPE abap_bool
RAISING lcx_exception. RAISING lcx_exception.
METHODS toggle_diff_unified
RETURNING VALUE(rv_diff_unified) TYPE abap_bool
RAISING lcx_exception.
METHODS get_diff_unified
RETURNING VALUE(rv_diff_unified) TYPE abap_bool
RAISING lcx_exception.
METHODS get_favorites METHODS get_favorites
RETURNING VALUE(rt_favorites) TYPE tt_favorites RETURNING VALUE(rt_favorites) TYPE tt_favorites
RAISING lcx_exception. RAISING lcx_exception.
@ -454,6 +462,7 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
repo_config TYPE ty_repo_config_tt, repo_config TYPE ty_repo_config_tt,
hide_files TYPE abap_bool, hide_files TYPE abap_bool,
changes_only TYPE abap_bool, changes_only TYPE abap_bool,
diff_unified TYPE abap_bool,
favorites TYPE tt_favorites, favorites TYPE tt_favorites,
END OF ty_user. END OF ty_user.
@ -698,6 +707,24 @@ CLASS lcl_persistence_user IMPLEMENTATION.
ENDMETHOD. "get_changes_only ENDMETHOD. "get_changes_only
METHOD toggle_diff_unified.
DATA ls_user TYPE ty_user.
ls_user = read( ).
ls_user-diff_unified = boolc( ls_user-diff_unified = abap_false ).
update( ls_user ).
rv_diff_unified = ls_user-diff_unified.
ENDMETHOD. "toggle_diff_unified
METHOD get_diff_unified.
rv_diff_unified = read( )-diff_unified.
ENDMETHOD. "get_diff_unified
METHOD get_favorites. METHOD get_favorites.
rt_favorites = read( )-favorites. rt_favorites = read( )-favorites.

View File

@ -242,10 +242,10 @@ CLASS ltcl_diff IMPLEMENTATION.
DEFINE _expected. DEFINE _expected.
CLEAR ms_expected. CLEAR ms_expected.
ms_expected-new_line = &1. ms_expected-new_num = &1.
ms_expected-new = &2. ms_expected-new = &2.
ms_expected-result = &3. ms_expected-result = &3.
ms_expected-old_line = &4. ms_expected-old_num = &4.
ms_expected-old = &5. ms_expected-old = &5.
APPEND ms_expected TO mt_expected. APPEND ms_expected TO mt_expected.
END-OF-DEFINITION. END-OF-DEFINITION.

View File

@ -547,10 +547,10 @@ CLASS lcl_diff DEFINITION FINAL.
END OF c_diff. END OF c_diff.
TYPES: BEGIN OF ty_diff, TYPES: BEGIN OF ty_diff,
new_line TYPE c LENGTH 6, new_num TYPE c LENGTH 6,
new TYPE string, new TYPE string,
result TYPE c LENGTH 1, result TYPE c LENGTH 1,
old_line TYPE c LENGTH 6, old_num TYPE c LENGTH 6,
old TYPE string, old TYPE string,
short TYPE abap_bool, short TYPE abap_bool,
beacon TYPE i, beacon TYPE i,
@ -697,16 +697,16 @@ CLASS lcl_diff IMPLEMENTATION.
LOOP AT mt_diff ASSIGNING <ls_diff>. LOOP AT mt_diff ASSIGNING <ls_diff>.
<ls_diff>-new_line = lv_new. <ls_diff>-new_num = lv_new.
<ls_diff>-old_line = lv_old. <ls_diff>-old_num = lv_old.
CASE <ls_diff>-result. " Line nums CASE <ls_diff>-result. " Line nums
WHEN c_diff-delete. WHEN c_diff-delete.
lv_old = lv_old + 1. lv_old = lv_old + 1.
CLEAR <ls_diff>-new_line. CLEAR <ls_diff>-new_num.
WHEN c_diff-insert. WHEN c_diff-insert.
lv_new = lv_new + 1. lv_new = lv_new + 1.
CLEAR <ls_diff>-old_line. CLEAR <ls_diff>-old_num.
WHEN OTHERS. WHEN OTHERS.
lv_new = lv_new + 1. lv_new = lv_new + 1.
lv_old = lv_old + 1. lv_old = lv_old + 1.