Blame frx/frx_fit.ml

Packit bd2e5d
(***********************************************************************)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*                 MLTk, Tcl/Tk interface of OCaml                     *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*    Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis    *)
Packit bd2e5d
(*               projet Cristal, INRIA Rocquencourt                    *)
Packit bd2e5d
(*            Jacques Garrigue, Kyoto University RIMS                  *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*  Copyright 2002 Institut National de Recherche en Informatique et   *)
Packit bd2e5d
(*  en Automatique and Kyoto University.  All rights reserved.         *)
Packit bd2e5d
(*  This file is distributed under the terms of the GNU Library        *)
Packit bd2e5d
(*  General Public License, with the special exception on linking      *)
Packit bd2e5d
(*  described in file LICENSE found in the OCaml source tree.          *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(***********************************************************************)
Packit bd2e5d
open Camltk
Packit bd2e5d
Packit bd2e5d
let debug = ref false
Packit bd2e5d
Packit bd2e5d
let vert wid =
Packit bd2e5d
  let newsize = ref 0
Packit bd2e5d
  and pending_resize = ref false
Packit bd2e5d
  and last_last = ref 0.0 in
Packit bd2e5d
  let rec resize () =
Packit bd2e5d
    pending_resize := false;
Packit bd2e5d
    if !debug then
Packit bd2e5d
      (Printf.eprintf "%s Resize %d\n"
Packit bd2e5d
                      (Widget.name wid) !newsize; flush stderr);
Packit bd2e5d
    Text.configure wid [TextHeight !newsize];
Packit bd2e5d
    ()
Packit bd2e5d
  and check () =
Packit bd2e5d
    let first, last = Text.yview_get wid in
Packit bd2e5d
      check1 first last
Packit bd2e5d
Packit bd2e5d
  and check1 first last =
Packit bd2e5d
    let curheight = int_of_string (cget wid CHeight) in
Packit bd2e5d
      if !debug then begin
Packit bd2e5d
         Printf.eprintf "%s C %d %f %f\n"
Packit bd2e5d
                        (Widget.name wid) curheight first last;
Packit bd2e5d
         flush stderr
Packit bd2e5d
         end;
Packit bd2e5d
      if first = 0.0 && last = 1.0 then ()
Packit bd2e5d
      (* Don't attempt anything if widget is not visible *)
Packit bd2e5d
      else if not (Winfo.viewable wid) then begin
Packit bd2e5d
        if !debug then
Packit bd2e5d
          (Printf.eprintf "%s C notviewable\n" (Widget.name wid);
Packit bd2e5d
           flush stderr);
Packit bd2e5d
        (* Try again later *)
Packit bd2e5d
        bind wid [[], Expose] (BindSet ([], fun _ ->
Packit bd2e5d
               bind wid [[], Expose] BindRemove;
Packit bd2e5d
               check()))
Packit bd2e5d
        end
Packit bd2e5d
      else  begin
Packit bd2e5d
        let delta =
Packit bd2e5d
          if last = 0.0 then 1
Packit bd2e5d
          else if last = !last_last then
Packit bd2e5d
            (* it didn't change since our last resize ! *)
Packit bd2e5d
            1
Packit bd2e5d
           else begin
Packit bd2e5d
            last_last := last;
Packit bd2e5d
            (* never to more than double *)
Packit bd2e5d
            let visible = max 0.5 (last -. first) in
Packit bd2e5d
            max 1 (truncate (float curheight *. (1. -. visible)))
Packit bd2e5d
            end in
Packit bd2e5d
        newsize := max (curheight + delta) !newsize;
Packit bd2e5d
        if !debug then
Packit bd2e5d
           (Printf.eprintf "%s newsize: %d\n" (Widget.name wid) !newsize;
Packit bd2e5d
            flush stderr);
Packit bd2e5d
        if !pending_resize then ()
Packit bd2e5d
        else begin
Packit bd2e5d
          pending_resize := true;
Packit bd2e5d
          Timer.set 300 (fun () -> Frx_after.idle resize)
Packit bd2e5d
          end
Packit bd2e5d
        end
Packit bd2e5d
Packit bd2e5d
    and scroll first last =
Packit bd2e5d
      if !debug then
Packit bd2e5d
        (Printf.eprintf "%s V %f %f\n" (Widget.name wid) first last;
Packit bd2e5d
         flush stderr);
Packit bd2e5d
      if first = 0.0 && last = 1.0 then ()
Packit bd2e5d
      else check1 first last
Packit bd2e5d
    in
Packit bd2e5d
      scroll, check