Blame frx/frx_dialog.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
open Protocol
Packit bd2e5d
Packit bd2e5d
let rec mapi f n l =
Packit bd2e5d
  match l with
Packit bd2e5d
    [] -> []
Packit bd2e5d
  | x::l -> let v = f n x in v::(mapi f (succ n) l)
Packit bd2e5d
Packit bd2e5d
(* Same as tk_dialog, but not sharing the tkwait variable *)
Packit bd2e5d
(* w IS the parent widget *)
Packit bd2e5d
let f w name title mesg bitmap def buttons =
Packit bd2e5d
  let t = Toplevel.create_named w name [Class "Dialog"] in
Packit bd2e5d
    Wm.title_set t title;
Packit bd2e5d
    Wm.iconname_set t "Dialog";
Packit bd2e5d
    Wm.protocol_set t "WM_DELETE_WINDOW" (function () -> ());
Packit bd2e5d
    (* Wm.transient_set t (Winfo.toplevel w); *)
Packit bd2e5d
  let ftop =
Packit bd2e5d
   Frame.create_named t "top" [Relief Raised; BorderWidth (Pixels 1)]
Packit bd2e5d
  and fbot =
Packit bd2e5d
   Frame.create_named t "bot" [Relief Raised; BorderWidth (Pixels 1)]
Packit bd2e5d
   in
Packit bd2e5d
     pack [ftop][Side Side_Top; Fill Fill_Both];
Packit bd2e5d
     pack [fbot][Side Side_Bottom; Fill Fill_Both];
Packit bd2e5d
Packit bd2e5d
  let l =
Packit bd2e5d
   Label.create_named ftop "msg"
Packit bd2e5d
     [Justify Justify_Left; Text mesg; WrapLength (Pixels 600)] in
Packit bd2e5d
     pack [l][Side Side_Right; Expand true; Fill Fill_Both;
Packit bd2e5d
              PadX (Millimeters 3.0); PadY (Millimeters 3.0)];
Packit bd2e5d
  begin match bitmap with
Packit bd2e5d
     Predefined "" -> ()
Packit bd2e5d
  |  _ ->
Packit bd2e5d
    let b =
Packit bd2e5d
      Label.create_named ftop "bitmap" [Bitmap bitmap] in
Packit bd2e5d
     pack [b][Side Side_Left; PadX (Millimeters 3.0); PadY (Millimeters 3.0)]
Packit bd2e5d
  end;
Packit bd2e5d
Packit bd2e5d
  let waitv = Textvariable.create_temporary t in
Packit bd2e5d
Packit bd2e5d
  let buttons =
Packit bd2e5d
    mapi (fun i bname ->
Packit bd2e5d
     let b = Button.create t
Packit bd2e5d
              [Text bname;
Packit bd2e5d
               Command (fun () -> Textvariable.set waitv (string_of_int i))] in
Packit bd2e5d
    if i = def then begin
Packit bd2e5d
      let f = Frame.create_named fbot "default"
Packit bd2e5d
                 [Relief Sunken; BorderWidth (Pixels 1)] in
Packit bd2e5d
        raise_window_above b f;
Packit bd2e5d
        pack [f][Side Side_Left; Expand true;
Packit bd2e5d
                 PadX (Millimeters 3.0); PadY (Millimeters 2.0)];
Packit bd2e5d
        pack [b][In f; PadX (Millimeters 2.0); PadY (Millimeters 2.0)];
Packit bd2e5d
        bind t [[], KeyPressDetail "Return"]
Packit bd2e5d
         (BindSet ([], (fun _ -> Button.flash b; Button.invoke b)))
Packit bd2e5d
        end
Packit bd2e5d
    else
Packit bd2e5d
      pack [b][In fbot; Side Side_Left; Expand true;
Packit bd2e5d
               PadX (Millimeters 3.0); PadY (Millimeters 2.0)];
Packit bd2e5d
    b
Packit bd2e5d
    )
Packit bd2e5d
    0 buttons in
Packit bd2e5d
Packit bd2e5d
   Wm.withdraw t;
Packit bd2e5d
   update_idletasks();
Packit bd2e5d
   let x = (Winfo.screenwidth t)/2 - (Winfo.reqwidth t)/2 -
Packit bd2e5d
             (Winfo.vrootx (Winfo.parent t))
Packit bd2e5d
   and y = (Winfo.screenheight t)/2 - (Winfo.reqheight t)/2 -
Packit bd2e5d
             (Winfo.vrooty (Winfo.parent t)) in
Packit bd2e5d
   Wm.geometry_set t (Printf.sprintf "+%d+%d" x y);
Packit bd2e5d
   Wm.deiconify t;
Packit bd2e5d
Packit bd2e5d
   let oldfocus = try Some (Focus.get()) with _ -> None
Packit bd2e5d
   and oldgrab = Grab.current ~displayof: t ()
Packit bd2e5d
   and grabstatus = ref None in
Packit bd2e5d
    begin match oldgrab with
Packit bd2e5d
      [] -> ()
Packit bd2e5d
    | x::l -> grabstatus := Some(Grab.status x)
Packit bd2e5d
    end;
Packit bd2e5d
Packit bd2e5d
   (* avoid errors here because it makes the entire app useless *)
Packit bd2e5d
   (try Grab.set t with TkError _ -> ());
Packit bd2e5d
   Tkwait.visibility t;
Packit bd2e5d
   Focus.set (if def >= 0 then List.nth buttons def else t);
Packit bd2e5d
Packit bd2e5d
   Tkwait.variable waitv;
Packit bd2e5d
   begin match oldfocus with
Packit bd2e5d
       None -> ()
Packit bd2e5d
     | Some w -> try Focus.set w with _ -> ()
Packit bd2e5d
   end;
Packit bd2e5d
   destroy t;
Packit bd2e5d
   begin match oldgrab with
Packit bd2e5d
     [] -> ()
Packit bd2e5d
   | x::l ->
Packit bd2e5d
      try
Packit bd2e5d
        match !grabstatus with
Packit bd2e5d
          Some(GrabGlobal) -> Grab.set_global x
Packit bd2e5d
        | _ -> Grab.set x
Packit bd2e5d
      with TkError _ -> ()
Packit bd2e5d
   end;
Packit bd2e5d
Packit bd2e5d
   int_of_string (Textvariable.get waitv)