Blame browser/jg_box.ml

Packit bd2e5d
(*************************************************************************)
Packit bd2e5d
(*                                                                       *)
Packit bd2e5d
(*                         OCaml LablTk library                          *)
Packit bd2e5d
(*                                                                       *)
Packit bd2e5d
(*            Jacques Garrigue, Kyoto University RIMS                    *)
Packit bd2e5d
(*                                                                       *)
Packit bd2e5d
(*   Copyright 1999 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.                                 *)
Packit bd2e5d
(*                                                                       *)
Packit bd2e5d
(*************************************************************************)
Packit bd2e5d
Packit bd2e5d
(* $Id$ *)
Packit bd2e5d
Packit bd2e5d
open Tk
Packit bd2e5d
Packit bd2e5d
let add_scrollbar lb  =
Packit bd2e5d
  let sb =
Packit bd2e5d
    Scrollbar.create (Winfo.parent lb) ~command:(Listbox.yview lb) in
Packit bd2e5d
  Listbox.configure lb ~yscrollcommand:(Scrollbar.set sb); sb
Packit bd2e5d
Packit bd2e5d
let create_with_scrollbar ?selectmode parent =
Packit bd2e5d
  let frame = Frame.create parent in
Packit bd2e5d
  let lb = Listbox.create frame ?selectmode in
Packit bd2e5d
  frame, lb, add_scrollbar lb
Packit bd2e5d
Packit bd2e5d
(* from frx_listbox,adapted *)
Packit bd2e5d
Packit bd2e5d
let recenter lb ~index =
Packit bd2e5d
   Listbox.selection_clear lb ~first:(`Num 0) ~last:`End;
Packit bd2e5d
     (* Activate it, to keep consistent with Up/Down.
Packit bd2e5d
        You have to be in Extended or Browse mode *)
Packit bd2e5d
   Listbox.activate lb ~index;
Packit bd2e5d
   Listbox.selection_anchor lb ~index;
Packit bd2e5d
   Listbox.yview_index lb ~index
Packit bd2e5d
Packit bd2e5d
class timed ?wait ?nocase get_texts = object
Packit bd2e5d
  val get_texts = get_texts
Packit bd2e5d
  inherit Jg_completion.timed [] ?wait ?nocase as super
Packit bd2e5d
  method! reset =
Packit bd2e5d
    texts <- get_texts ();
Packit bd2e5d
    super#reset
Packit bd2e5d
end
Packit bd2e5d
Packit bd2e5d
let add_completion ?action ?wait ?nocase ?(double=true) lb =
Packit bd2e5d
  let comp =
Packit bd2e5d
    new timed ?wait ?nocase
Packit bd2e5d
      (fun () -> Listbox.get_range lb ~first:(`Num 0) ~last:`End) in
Packit bd2e5d
Packit bd2e5d
  Jg_bind.enter_focus lb;
Packit bd2e5d
Packit bd2e5d
  bind lb ~events:[`KeyPress] ~fields:[`Char] ~action:
Packit bd2e5d
    begin fun ev ->
Packit bd2e5d
      (* consider only keys producing characters. The callback is called
Packit bd2e5d
         even if you press Shift. *)
Packit bd2e5d
      if ev.ev_Char <> "" then
Packit bd2e5d
        recenter lb ~index:(`Num (comp#add ev.ev_Char))
Packit bd2e5d
    end;
Packit bd2e5d
Packit bd2e5d
  begin match action with
Packit bd2e5d
    Some action ->
Packit bd2e5d
      bind lb ~events:[`KeyPressDetail "Return"]
Packit bd2e5d
        ~action:(fun _ -> action `Active);
Packit bd2e5d
      let bmod = if double then [`Double] else [] in
Packit bd2e5d
      bind lb ~events:[`Modified(bmod, `ButtonPressDetail 1)]
Packit bd2e5d
        ~breakable:true ~fields:[`MouseY]
Packit bd2e5d
        ~action:
Packit bd2e5d
        begin fun ev ->
Packit bd2e5d
          let index = Listbox.nearest lb ~y:ev.ev_MouseY in
Packit bd2e5d
          if not double then begin
Packit bd2e5d
            Listbox.selection_clear lb ~first:(`Num 0) ~last:`End;
Packit bd2e5d
            Listbox.selection_set lb ~first:index ~last:index;
Packit bd2e5d
          end;
Packit bd2e5d
          action index;
Packit bd2e5d
          break ()
Packit bd2e5d
        end
Packit bd2e5d
  | None -> ()
Packit bd2e5d
  end;
Packit bd2e5d
Packit bd2e5d
  recenter lb ~index:(`Num 0)   (* so that first item is active *)