|
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 *)
|