method display =
wlist#clear () ;
wlist#freeze () ;
let l = Str.split (Str.regexp "\n") string in
let rec iter n lines diffs =
match diffs with
[] ->
(
match lines with
[] ->
()
| s :: q ->
self#insert_line ~line: n s ;
iter (n+1) q []
)
| d :: q ->
match d with
Add (_,One i,_) ->
let lines_before, lines_after =
get_n_first_ele (i-n) lines
in
iter n lines_before [] ;
let lines_diff, remain =
get_n_first_ele 1 lines_after
in
(match lines_diff with
[s] -> self#insert_line ~line: i
~fgcolor: "Orange"
~bgcolor: "DarkSlateBlue"
s
| _ -> ()
);
iter (i+1) remain q
| Add (_, Many(first, last), _) ->
let n_lines_before = first - n in
let lines_before, lines_after =
get_n_first_ele n_lines_before lines
in
iter n lines_before [] ;
let n_lines_diff = last - first + 1 in
let lines_diff, remain =
get_n_first_ele n_lines_diff lines_after
in
let next = List.fold_left
(fun line -> fun s ->
self#insert_line ~line: line
~fgcolor: "Orange"
~bgcolor: "DarkSlateBlue"
s;
(line + 1)
)
first
lines_diff
in
iter next remain q
| Delete (_, i2, s) ->
let lines_before, lines_after =
get_n_first_ele ((first_of_index i2) - n) lines
in
iter n lines_before [] ;
List.iter
(fun s -> self#insert_line ~fgcolor: "White" ~bgcolor: "Grey" s)
(Str.split (Str.regexp "\n") s) ;
iter (first_of_index i2) lines_after q
| Change(i1, s1, i2, s2) ->
let del = Delete (i1, One (first_of_index i2), s1) in
let add = Add (One (first_of_index i1), i2, s2) in
iter n lines (del :: add :: q)
in
iter 1 l diffs ;
GToolbox.autosize_clist wlist ;
wlist#thaw ()