Blame browser/jg_text.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 StdLabels
Packit bd2e5d
open Tk
Packit bd2e5d
open Jg_tk
Packit bd2e5d
Packit bd2e5d
let get_all tw = Text.get tw ~start:tstart ~stop:(tposend 1)
Packit bd2e5d
Packit bd2e5d
let tag_and_see tw ~tag ~start ~stop =
Packit bd2e5d
  Text.tag_remove tw ~start:(tpos 0) ~stop:tend ~tag;
Packit bd2e5d
  Text.tag_add tw ~start ~stop ~tag;
Packit bd2e5d
  try
Packit bd2e5d
    Text.see tw ~index:(`Tagfirst tag, []);
Packit bd2e5d
    Text.mark_set tw ~mark:"insert" ~index:(`Tagfirst tag, [])
Packit bd2e5d
  with Protocol.TkError _ -> ()
Packit bd2e5d
Packit bd2e5d
let output tw ~buf ~pos ~len =
Packit bd2e5d
  Text.insert tw ~index:tend ~text:(String.sub buf ~pos ~len)
Packit bd2e5d
Packit bd2e5d
let add_scrollbar tw =
Packit bd2e5d
  let sb = Scrollbar.create (Winfo.parent tw) ~command:(Text.yview tw)
Packit bd2e5d
  in Text.configure tw ~yscrollcommand:(Scrollbar.set sb); sb
Packit bd2e5d
Packit bd2e5d
let create_with_scrollbar parent =
Packit bd2e5d
  let frame = Frame.create parent in
Packit bd2e5d
  let tw = Text.create frame in
Packit bd2e5d
  frame, tw, add_scrollbar tw
Packit bd2e5d
Packit bd2e5d
let goto_tag tw ~tag =
Packit bd2e5d
  let index = (`Tagfirst tag, []) in
Packit bd2e5d
  try Text.see tw ~index;
Packit bd2e5d
      Text.mark_set tw ~index ~mark:"insert"
Packit bd2e5d
  with Protocol.TkError _ -> ()
Packit bd2e5d
Packit bd2e5d
let search_string tw =
Packit bd2e5d
  let tl = Jg_toplevel.titled "Search" in
Packit bd2e5d
  Wm.transient_set tl ~master:(Winfo.toplevel tw);
Packit bd2e5d
  let fi = Frame.create tl
Packit bd2e5d
  and fd = Frame.create tl
Packit bd2e5d
  and fm = Frame.create tl
Packit bd2e5d
  and buttons = Frame.create tl
Packit bd2e5d
  and direction = Textvariable.create ~on:tl ()
Packit bd2e5d
  and mode = Textvariable.create ~on:tl ()
Packit bd2e5d
  and count = Textvariable.create ~on:tl ()
Packit bd2e5d
  in
Packit bd2e5d
  let label = Label.create fi ~text:"Pattern:"
Packit bd2e5d
  and text = Entry.create fi ~width:20
Packit bd2e5d
  and back = Radiobutton.create fd ~variable:direction
Packit bd2e5d
               ~text:"Backwards" ~value:"backward"
Packit bd2e5d
  and forw = Radiobutton.create fd ~variable:direction
Packit bd2e5d
               ~text:"Forwards" ~value:"forward"
Packit bd2e5d
  and exact = Radiobutton.create fm ~variable:mode
Packit bd2e5d
                ~text:"Exact" ~value:"exact"
Packit bd2e5d
  and nocase = Radiobutton.create fm ~variable:mode
Packit bd2e5d
                 ~text:"No case" ~value:"nocase"
Packit bd2e5d
  and regexp =  Radiobutton.create fm ~variable:mode
Packit bd2e5d
                 ~text:"Regexp" ~value:"regexp"
Packit bd2e5d
  in
Packit bd2e5d
  let search = Button.create buttons ~text:"Search" ~command:
Packit bd2e5d
    begin fun () ->
Packit bd2e5d
    try
Packit bd2e5d
      let pattern = Entry.get text in
Packit bd2e5d
      let dir, ofs = match Textvariable.get direction with
Packit bd2e5d
          "forward" -> `Forwards, 1
Packit bd2e5d
        | "backward" -> `Backwards, -1
Packit bd2e5d
        | _ -> assert false
Packit bd2e5d
      and mode = match Textvariable.get mode with "exact" -> [`Exact]
Packit bd2e5d
                 | "nocase" -> [`Nocase] | "regexp" -> [`Regexp] | _ -> []
Packit bd2e5d
      in
Packit bd2e5d
      let ndx =
Packit bd2e5d
        Text.search tw ~pattern ~switches:([dir;`Count count] @ mode)
Packit bd2e5d
          ~start:(`Mark "insert", [`Char ofs])
Packit bd2e5d
      in
Packit bd2e5d
      tag_and_see tw ~tag:"sel" ~start:(ndx,[])
Packit bd2e5d
        ~stop:(ndx,[`Char(int_of_string (Textvariable.get count))])
Packit bd2e5d
    with Invalid_argument _ -> ()
Packit bd2e5d
    end
Packit bd2e5d
  and ok = Jg_button.create_destroyer tl ~parent:buttons ~text:"Cancel" in
Packit bd2e5d
Packit bd2e5d
  Focus.set text;
Packit bd2e5d
  Jg_bind.return_invoke text ~button:search;
Packit bd2e5d
  Jg_bind.escape_destroy tl;
Packit bd2e5d
  Textvariable.set direction "forward";
Packit bd2e5d
  Textvariable.set mode "nocase";
Packit bd2e5d
  pack [label] ~side:`Left;
Packit bd2e5d
  pack [text] ~side:`Right ~fill:`X ~expand:true;
Packit bd2e5d
  pack [back; forw] ~side:`Left;
Packit bd2e5d
  pack [exact; nocase; regexp] ~side:`Left;
Packit bd2e5d
  pack [search; ok] ~side:`Left ~fill:`X ~expand:true;
Packit bd2e5d
  pack [fi; fd; fm; buttons] ~side:`Top ~fill:`X