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
                (* print the lines before the diff *)
                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) ->
                (* replace the Change by a Delete and a Add. *)
                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 ()