Blame frx/frx_req.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
(*
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)