|
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 |
(*
|
|
Packit |
bd2e5d |
* Some standard requesters (in Amiga techspeak) or dialog boxes (in Apple
|
|
Packit |
bd2e5d |
* jargon).
|
|
Packit |
bd2e5d |
*)
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
let version = "$Id$"
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
(*
|
|
Packit |
bd2e5d |
* Simple requester
|
|
Packit |
bd2e5d |
* an entry field, unrestricted, with emacs-like bindings
|
|
Packit |
bd2e5d |
* Note: grabs focus, thus always unique at one given moment, and we
|
|
Packit |
bd2e5d |
* shouldn't have to worry about toplevel widget name.
|
|
Packit |
bd2e5d |
* We add a title widget in case the window manager does not decorate
|
|
Packit |
bd2e5d |
* toplevel windows.
|
|
Packit |
bd2e5d |
*)
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
let open_simple title action notaction memory =
|
|
Packit |
bd2e5d |
let t = Toplevel.create Widget.default_toplevel [Class "Dialog"] in
|
|
Packit |
bd2e5d |
Focus.set t;
|
|
Packit |
bd2e5d |
Wm.title_set t title;
|
|
Packit |
bd2e5d |
let tit = Label.create t [Text title] in
|
|
Packit |
bd2e5d |
let len = max 40 (String.length (Textvariable.get memory)) in
|
|
Packit |
bd2e5d |
let e =
|
|
Packit |
bd2e5d |
Entry.create t [Relief Sunken; TextVariable memory; TextWidth len] in
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
let activate _ =
|
|
Packit |
bd2e5d |
let v = Entry.get e in
|
|
Packit |
bd2e5d |
Grab.release t; (* because of wm *)
|
|
Packit |
bd2e5d |
destroy t; (* so action can call open_simple *)
|
|
Packit |
bd2e5d |
action v in
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
bind e [[], KeyPressDetail "Return"] (BindSet ([], activate));
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
let f = Frame.create t [] in
|
|
Packit |
bd2e5d |
let bok = Button.create f [Text "Ok"; Command activate] in
|
|
Packit |
bd2e5d |
let bcancel = Button.create f
|
|
Packit |
bd2e5d |
[Text "Cancel";
|
|
Packit |
bd2e5d |
Command (fun () -> notaction(); Grab.release t; destroy t)] in
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
bind e [[], KeyPressDetail "Escape"]
|
|
Packit |
bd2e5d |
(BindSet ([], (fun _ -> Button.invoke bcancel)));
|
|
Packit |
bd2e5d |
pack [bok] [Side Side_Left; Expand true];
|
|
Packit |
bd2e5d |
pack [bcancel] [Side Side_Right; Expand true];
|
|
Packit |
bd2e5d |
pack [tit;e] [Fill Fill_X];
|
|
Packit |
bd2e5d |
pack [f] [Side Side_Bottom; Fill Fill_X];
|
|
Packit |
bd2e5d |
Frx_widget.resizeable t;
|
|
Packit |
bd2e5d |
Focus.set e;
|
|
Packit |
bd2e5d |
Tkwait.visibility t;
|
|
Packit |
bd2e5d |
Grab.set t
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
(* A synchronous version *)
|
|
Packit |
bd2e5d |
let open_simple_synchronous title memory =
|
|
Packit |
bd2e5d |
let t = Toplevel.create Widget.default_toplevel [Class "Dialog"] in
|
|
Packit |
bd2e5d |
Focus.set t;
|
|
Packit |
bd2e5d |
Wm.title_set t title;
|
|
Packit |
bd2e5d |
let tit = Label.create t [Text title] in
|
|
Packit |
bd2e5d |
let len = max 40 (String.length (Textvariable.get memory)) in
|
|
Packit |
bd2e5d |
let e =
|
|
Packit |
bd2e5d |
Entry.create t [Relief Sunken; TextVariable memory; TextWidth len] in
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
let waiting = Textvariable.create_temporary t in
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
let activate _ =
|
|
Packit |
bd2e5d |
Grab.release t; (* because of wm *)
|
|
Packit |
bd2e5d |
destroy t; (* so action can call open_simple *)
|
|
Packit |
bd2e5d |
Textvariable.set waiting "1" in
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
bind e [[], KeyPressDetail "Return"] (BindSet ([], activate));
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
let f = Frame.create t [] in
|
|
Packit |
bd2e5d |
let bok = Button.create f [Text "Ok"; Command activate] in
|
|
Packit |
bd2e5d |
let bcancel =
|
|
Packit |
bd2e5d |
Button.create f
|
|
Packit |
bd2e5d |
[Text "Cancel";
|
|
Packit |
bd2e5d |
Command (fun () ->
|
|
Packit |
bd2e5d |
Grab.release t; destroy t; Textvariable.set waiting "0")] in
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
bind e [[], KeyPressDetail "Escape"]
|
|
Packit |
bd2e5d |
(BindSet ([], (fun _ -> Button.invoke bcancel)));
|
|
Packit |
bd2e5d |
pack [bok] [Side Side_Left; Expand true];
|
|
Packit |
bd2e5d |
pack [bcancel] [Side Side_Right; Expand true];
|
|
Packit |
bd2e5d |
pack [tit;e] [Fill Fill_X];
|
|
Packit |
bd2e5d |
pack [f] [Side Side_Bottom; Fill Fill_X];
|
|
Packit |
bd2e5d |
Frx_widget.resizeable t;
|
|
Packit |
bd2e5d |
Focus.set e;
|
|
Packit |
bd2e5d |
Tkwait.visibility t;
|
|
Packit |
bd2e5d |
Grab.set t;
|
|
Packit |
bd2e5d |
Tkwait.variable waiting;
|
|
Packit |
bd2e5d |
begin match Textvariable.get waiting with
|
|
Packit |
bd2e5d |
"1" -> true
|
|
Packit |
bd2e5d |
| _ -> false
|
|
Packit |
bd2e5d |
end
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
(*
|
|
Packit |
bd2e5d |
* Simple list requester
|
|
Packit |
bd2e5d |
* Same remarks as in open_simple.
|
|
Packit |
bd2e5d |
* focus seems to be in the listbox automatically
|
|
Packit |
bd2e5d |
*)
|
|
Packit |
bd2e5d |
let open_list title elements action notaction =
|
|
Packit |
bd2e5d |
let t = Toplevel.create Widget.default_toplevel [Class "Dialog"] in
|
|
Packit |
bd2e5d |
Wm.title_set t title;
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
let tit = Label.create t [Text title] in
|
|
Packit |
bd2e5d |
let fls = Frame.create t [Relief Sunken; BorderWidth (Pixels 2)] in
|
|
Packit |
bd2e5d |
let lb = Listbox.create fls [SelectMode Extended] in
|
|
Packit |
bd2e5d |
let sb = Scrollbar.create fls [] in
|
|
Packit |
bd2e5d |
Frx_listbox.scroll_link sb lb;
|
|
Packit |
bd2e5d |
Listbox.insert lb End elements;
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
(* activation: we have to break() because we destroy the requester *)
|
|
Packit |
bd2e5d |
let activate _ =
|
|
Packit |
bd2e5d |
let l = List.map (Listbox.get lb) (Listbox.curselection lb) in
|
|
Packit |
bd2e5d |
Grab.release t;
|
|
Packit |
bd2e5d |
destroy t;
|
|
Packit |
bd2e5d |
List.iter action l;
|
|
Packit |
bd2e5d |
break() in
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
bind lb [[Double], ButtonPressDetail 1] (BindSetBreakable ([], activate));
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
Frx_listbox.add_completion lb activate;
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
let f = Frame.create t [] in
|
|
Packit |
bd2e5d |
let bok = Button.create f [Text "Ok"; Command activate] in
|
|
Packit |
bd2e5d |
let bcancel = Button.create f
|
|
Packit |
bd2e5d |
[Text "Cancel";
|
|
Packit |
bd2e5d |
Command (fun () -> notaction(); Grab.release t; destroy t)] in
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
pack [bok; bcancel] [Side Side_Left; Fill Fill_X; Expand true];
|
|
Packit |
bd2e5d |
pack [lb] [Side Side_Left; Fill Fill_Both; Expand true];
|
|
Packit |
bd2e5d |
pack [sb] [Side Side_Right; Fill Fill_Y];
|
|
Packit |
bd2e5d |
pack [tit] [Fill Fill_X];
|
|
Packit |
bd2e5d |
pack [fls] [Fill Fill_Both; Expand true];
|
|
Packit |
bd2e5d |
pack [f] [Side Side_Bottom; Fill Fill_X];
|
|
Packit |
bd2e5d |
Frx_widget.resizeable t;
|
|
Packit |
bd2e5d |
Tkwait.visibility t;
|
|
Packit |
bd2e5d |
Grab.set t
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
(* Synchronous *)
|
|
Packit |
bd2e5d |
let open_passwd title =
|
|
Packit |
bd2e5d |
let username = ref ""
|
|
Packit |
bd2e5d |
and password = ref ""
|
|
Packit |
bd2e5d |
and cancelled = ref false in
|
|
Packit |
bd2e5d |
let t = Toplevel.create Widget.default_toplevel [Class "Dialog"] in
|
|
Packit |
bd2e5d |
Focus.set t;
|
|
Packit |
bd2e5d |
Wm.title_set t title;
|
|
Packit |
bd2e5d |
let tit = Label.create t [Text title]
|
|
Packit |
bd2e5d |
and fu,eu = Frx_entry.new_label_entry t "Username" (fun s -> ())
|
|
Packit |
bd2e5d |
and fp,ep = Frx_entry.new_label_entry t "Password" (fun s -> ())
|
|
Packit |
bd2e5d |
in
|
|
Packit |
bd2e5d |
let fb = Frame.create t [] in
|
|
Packit |
bd2e5d |
let bok = Button.create fb
|
|
Packit |
bd2e5d |
[Text "Ok"; Command (fun _ ->
|
|
Packit |
bd2e5d |
username := Entry.get eu;
|
|
Packit |
bd2e5d |
password := Entry.get ep;
|
|
Packit |
bd2e5d |
Grab.release t; (* because of wm *)
|
|
Packit |
bd2e5d |
destroy t)] (* will return from tkwait *)
|
|
Packit |
bd2e5d |
and bcancel = Button.create fb
|
|
Packit |
bd2e5d |
[Text "Cancel"; Command (fun _ ->
|
|
Packit |
bd2e5d |
cancelled := true;
|
|
Packit |
bd2e5d |
Grab.release t; (* because of wm *)
|
|
Packit |
bd2e5d |
destroy t)] (* will return from tkwait *)
|
|
Packit |
bd2e5d |
in
|
|
Packit |
bd2e5d |
Entry.configure ep [Show '*'];
|
|
Packit |
bd2e5d |
bind eu [[], KeyPressDetail "Return"]
|
|
Packit |
bd2e5d |
(BindSetBreakable ([], (fun _ -> Focus.set ep; break())));
|
|
Packit |
bd2e5d |
bind ep [[], KeyPressDetail "Return"]
|
|
Packit |
bd2e5d |
(BindSetBreakable ([], (fun _ -> Button.flash bok;
|
|
Packit |
bd2e5d |
Button.invoke bok;
|
|
Packit |
bd2e5d |
break())));
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
pack [bok] [Side Side_Left; Expand true];
|
|
Packit |
bd2e5d |
pack [bcancel] [Side Side_Right; Expand true];
|
|
Packit |
bd2e5d |
pack [tit;fu;fp;fb] [Fill Fill_X];
|
|
Packit |
bd2e5d |
Tkwait.visibility t;
|
|
Packit |
bd2e5d |
Focus.set eu;
|
|
Packit |
bd2e5d |
Grab.set t;
|
|
Packit |
bd2e5d |
Tkwait.window t;
|
|
Packit |
bd2e5d |
if !cancelled then failwith "cancelled"
|
|
Packit |
bd2e5d |
else (!username, !password)
|