aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ide/coqide.ml378
-rw-r--r--ide/coqide_ui.ml7
-rw-r--r--ide/ide.mllib1
-rw-r--r--ide/mac_default_accel_map4
-rw-r--r--ide/tags.ml1
-rw-r--r--ide/tags.mli1
-rw-r--r--ide/wg_Find.ml319
-rw-r--r--ide/wg_Find.mli19
8 files changed, 368 insertions, 362 deletions
diff --git a/ide/coqide.ml b/ide/coqide.ml
index 9540fe4b9..78f98e889 100644
--- a/ide/coqide.ml
+++ b/ide/coqide.ml
@@ -103,6 +103,7 @@ type viewable_script =
analyzed_view : analyzed_views;
toplvl : Coq.coqtop ref;
command : Wg_Command.command_window;
+ finder : Wg_Find.finder;
}
let kill_session s =
@@ -111,8 +112,11 @@ let kill_session s =
let build_session s =
let session_paned = GPack.paned `VERTICAL () in
+ let session_box =
+ GPack.vbox ~packing:(session_paned#pack1 ~shrink:false ~resize:true) ()
+ in
let eval_paned = GPack.paned `HORIZONTAL ~border_width:5
- ~packing:(session_paned#pack1 ~shrink:false ~resize:true) () in
+ ~packing:(session_box#pack ~expand:true) () in
let script_frame = GBin.frame ~shadow_type:`IN
~packing:eval_paned#add1 () in
let script_scroll = GBin.scrolled_window ~vpolicy:`AUTOMATIC ~hpolicy:`AUTOMATIC
@@ -148,6 +152,7 @@ let build_session s =
old_paned_height := paned_height;
)))
in
+ session_box#pack s.finder#coerce;
session_paned#pack2 ~shrink:false ~resize:false (s.command#frame#coerce);
script_scroll#add s.script#coerce;
proof_scroll#add s.proof_view#coerce;
@@ -594,7 +599,6 @@ object(self)
val mutable last_modification_time = 0.
val mutable last_auto_save_time = 0.
val mutable detached_views = []
- val mutable find_forward_instead_of_backward = false
val mutable auto_complete_on = !current.auto_complete
val hidden_proofs = Hashtbl.create 32
@@ -1513,6 +1517,7 @@ let create_session file =
in
let ct = ref (Coq.spawn_coqtop coqtop_args) in
let command = new Wg_Command.command_window ct current in
+ let finder = new Wg_Find.finder (script :> GText.view) in
let legacy_av = new analyzed_view script proof message stack ct file in
let () = legacy_av#update_stats in
let _ =
@@ -1562,7 +1567,8 @@ let create_session file =
analyzed_view=legacy_av;
encoding="";
toplvl=ct;
- command=command
+ command=command;
+ finder=finder;
}
(* XXX - to be used later
@@ -1966,214 +1972,6 @@ let main files =
| Some av -> av#set_auto_complete b
| None -> ());
*)
-
-(* begin of find/replace mechanism *)
- let last_found = ref None in
- let search_backward = ref false in
- let find_w = GWindow.window
- (* ~wm_class:"CoqIde" ~wm_name:"CoqIde" *)
- (* ~allow_grow:true ~allow_shrink:true *)
- (* ~width:!current.window_width ~height:!current.window_height *)
- ~position:`CENTER
- ~title:"CoqIde search/replace" ()
- in
- let find_box = GPack.table
- ~columns:3 ~rows:5
- ~col_spacings:10 ~row_spacings:10 ~border_width:10
- ~homogeneous:false ~packing:find_w#add () in
-
- let _ =
- GMisc.label ~text:"Find:"
- ~xalign:1.0
- ~packing:(find_box#attach ~left:0 ~top:0 ~fill:`X) ()
- in
- let find_entry = GEdit.entry
- ~editable: true
- ~packing: (find_box#attach ~left:1 ~top:0 ~expand:`X)
- ()
- in
- let _ =
- GMisc.label ~text:"Replace with:"
- ~xalign:1.0
- ~packing:(find_box#attach ~left:0 ~top:1 ~fill:`X) ()
- in
- let replace_entry = GEdit.entry
- ~editable: true
- ~packing: (find_box#attach ~left:1 ~top:1 ~expand:`X)
- ()
- in
- (* let _ =
- GButton.check_button
- ~label:"case sensitive"
- ~active:true
- ~packing: (find_box#attach ~left:1 ~top:2)
- ()
- in
- *)
- let find_backwards_check =
- GButton.check_button
- ~label:"search backwards"
- ~active:!search_backward
- ~packing: (find_box#attach ~left:1 ~top:3)
- ()
- in
- let close_find_button =
- GButton.button
- ~label:"Close"
- ~packing: (find_box#attach ~left:2 ~top:2)
- ()
- in
- let replace_find_button =
- GButton.button
- ~label:"Replace and find"
- ~packing: (find_box#attach ~left:2 ~top:1)
- ()
- in
- let find_again_button =
- GButton.button
- ~label:"_Find again"
- ~packing: (find_box#attach ~left:2 ~top:0)
- ()
- in
- let last_find () =
- let v = session_notebook#current_term.script in
- let b = v#buffer in
- let start,stop =
- match !last_found with
- | None -> let i = b#get_iter_at_mark `INSERT in (i,i)
- | Some(start,stop) ->
- let start = b#get_iter_at_mark start
- and stop = b#get_iter_at_mark stop
- in
- b#remove_tag Tags.Script.found ~start ~stop;
- last_found:=None;
- start,stop
- in
- (v,b,start,stop)
- in
- let do_replace () =
- let v = session_notebook#current_term.script in
- let b = v#buffer in
- match !last_found with
- | None -> ()
- | Some(start,stop) ->
- let start = b#get_iter_at_mark start
- and stop = b#get_iter_at_mark stop
- in
- b#delete ~start ~stop;
- b#insert ~iter:start replace_entry#text;
- last_found:=None
- in
- let find_from (v : Undo.undoable_view)
- (b : GText.buffer) (starti : GText.iter) text =
- prerr_endline ("Searching for " ^ text);
- match (if !search_backward then starti#backward_search text
- else starti#forward_search text)
- with
- | None -> ()
- | Some(start,stop) ->
- b#apply_tag Tags.Script.found ~start ~stop;
- let start = `MARK (b#create_mark start)
- and stop = `MARK (b#create_mark stop)
- in
- v#scroll_to_mark ~use_align:false ~yalign:0.75 ~within_margin:0.25
- stop;
- last_found := Some(start,stop)
- in
- let do_find () =
- let (v,b,starti,_) = last_find () in
- find_from v b starti find_entry#text
- in
- let do_replace_find () =
- do_replace();
- do_find()
- in
- let close_find () =
- let (v,b,_,stop) = last_find () in
- b#place_cursor ~where:stop;
- find_w#misc#hide();
- v#coerce#misc#grab_focus()
- in
- to_do_on_page_switch :=
- (fun i -> if find_w#misc#visible then close_find())::
- !to_do_on_page_switch;
- let find_again () =
- let (v,b,start,_) = last_find () in
- let start =
- if !search_backward
- then start#backward_chars 1
- else start#forward_chars 1
- in
- find_from v b start find_entry#text
- in
- let click_on_backward () =
- search_backward := not !search_backward
- in
- let key_find ev =
- let s = GdkEvent.Key.state ev and k = GdkEvent.Key.keyval ev in
- if k = GdkKeysyms._Escape then
- begin
- let (v,b,_,stop) = last_find () in
- find_w#misc#hide();
- v#coerce#misc#grab_focus();
- true
- end
- else if k = GdkKeysyms._Escape then
- begin
- close_find();
- true
- end
- else if k = GdkKeysyms._Return ||
- List.mem `CONTROL s && k = GdkKeysyms._f then
- begin
- find_again ();
- true
- end
- else if List.mem `CONTROL s && k = GdkKeysyms._b then
- begin
- find_backwards_check#set_active (not !search_backward);
- true
- end
- else false (* to let default callback execute *)
- in
- let find_f ~backward () =
- let save_dir = !search_backward in
- search_backward := backward;
- find_w#show ();
- find_w#present ();
- find_entry#misc#grab_focus ();
- search_backward := save_dir
- in
- let _ = find_again_button#connect#clicked find_again in
- let _ = close_find_button#connect#clicked close_find in
- let _ = replace_find_button#connect#clicked do_replace_find in
- let _ = find_backwards_check#connect#clicked click_on_backward in
- let _ = find_entry#connect#changed do_find in
- let _ = find_entry#event#connect#key_press ~callback:key_find in
- let _ = find_w#event#connect#delete ~callback:(fun _ -> find_w#misc#hide(); true) in
- (*
- let search_if = edit_f#add_item "Search _forward"
- ~key:GdkKeysyms._greater
- in
- let search_ib = edit_f#add_item "Search _backward"
- ~key:GdkKeysyms._less
- in
- *)
- (*
- let complete_i = edit_f#add_item "_Complete"
- ~key:GdkKeysyms._comma
- ~callback:
- (do_if_not_computing
- (fun b ->
- let v = session_notebook#current_term.analyzed_view
-
- in v#complete_at_offset
- ((v#view#buffer#get_iter `SEL_BOUND)#offset)
- ))
- in
- complete_i#misc#set_state `INSENSITIVE;
- *)
-(* end of find/replace mechanism *)
(* begin Preferences *)
let reset_revert_timer () =
disconnect_revert_timer ();
@@ -2458,8 +2256,16 @@ let main files =
session_notebook#current_term.script#as_view
~sgn:GtkText.View.S.paste_clipboard
with _ -> prerr_endline "EMIT PASTE FAILED") ~stock:`PASTE;
- GAction.add_action "Find in buffer" ~label:"_Find in buffer" ~callback:(fun _ -> find_f ~backward:false ()) ~stock:`FIND;
- GAction.add_action "Find backwards" ~label:"Find _backwards" ~callback:(fun _ -> find_f ~backward:true ()) ~accel:"<Ctrl>b";
+ GAction.add_action "Find" ~label:"_Find" ~stock:`FIND ~accel:"<Ctrl>F"
+ ~callback:(fun _ -> session_notebook#current_term.finder#show_find ());
+ GAction.add_action "Find Next" ~label:"Find _Next" ~stock:`GO_DOWN ~accel:"F3"
+ ~callback:(fun _ -> session_notebook#current_term.finder#find_forward ());
+ GAction.add_action "Find Previous" ~label:"Find _Previous" ~stock:`GO_UP ~accel:"<Shift>F3"
+ ~callback:(fun _ -> session_notebook#current_term.finder#find_backward ());
+ GAction.add_action "Replace" ~label:"_Replace" ~stock:`FIND_AND_REPLACE ~accel:"<Ctrl>R"
+ ~callback:(fun _ -> session_notebook#current_term.finder#show_replace ());
+ GAction.add_action "Close Find" ~accel:"Escape"
+ ~callback:(fun _ -> session_notebook#current_term.finder#hide ());
GAction.add_action "Complete Word" ~label:"Complete Word" ~callback:(fun _ ->
ignore (
let av = session_notebook#current_term.analyzed_view in
@@ -2496,7 +2302,7 @@ let main files =
if ccw#frame#misc#visible
then ccw#frame#misc#hide ()
else ccw#frame#misc#show ())
- ~accel:"Escape";
+ ~accel:"<Alt>Escape";
];
List.iter
(fun (opts,name,label,key,dflt) ->
@@ -2670,150 +2476,6 @@ let main files =
let nb = session_notebook in
let lower_hbox = GPack.hbox ~homogeneous:false ~packing:vbox#pack () in
lower_hbox#pack ~expand:true status#coerce;
- let search_lbl = GMisc.label ~text:"Search:"
- ~show:false
- ~packing:(lower_hbox#pack ~expand:false) ()
- in
- let search_history = ref [] in
- let (search_input,_) = GEdit.combo_box_entry_text ~strings:!search_history ~show:false
- ~packing:(lower_hbox#pack ~expand:false) ()
- in
- let ready_to_wrap_search = ref false in
-
- let start_of_search = ref None in
- let start_of_found = ref None in
- let end_of_found = ref None in
- let search_forward = ref true in
- let matched_word = ref None in
-
- let memo_search () =
- matched_word := Some search_input#entry#text
- in
- let end_search () =
- prerr_endline "End Search";
- memo_search ();
- let v = session_notebook#current_term.script in
- v#buffer#move_mark `SEL_BOUND ~where:(v#buffer#get_iter_at_mark `INSERT);
- v#coerce#misc#grab_focus ();
- search_input#entry#set_text "";
- search_lbl#misc#hide ();
- search_input#misc#hide ()
- in
- let end_search_focus_out () =
- prerr_endline "End Search(focus out)";
- memo_search ();
- let v = session_notebook#current_term.script in
- v#buffer#move_mark `SEL_BOUND ~where:(v#buffer#get_iter_at_mark `INSERT);
- search_input#entry#set_text "";
- search_lbl#misc#hide ();
- search_input#misc#hide ()
- in
- ignore (search_input#entry#connect#activate ~callback:end_search);
- ignore (search_input#entry#event#connect#key_press
- ~callback:(fun k -> let kv = GdkEvent.Key.keyval k in
- if
- kv = GdkKeysyms._Right
- || kv = GdkKeysyms._Up
- || kv = GdkKeysyms._Left
- || (kv = GdkKeysyms._g
- && (List.mem `CONTROL (GdkEvent.Key.state k)))
- then end_search ();
- false));
- ignore (search_input#entry#event#connect#focus_out
- ~callback:(fun _ -> end_search_focus_out (); false));
- to_do_on_page_switch :=
- (fun i ->
- start_of_search := None;
- ready_to_wrap_search:=false)::!to_do_on_page_switch;
-
- (* TODO : make it work !!! *)
- let rec search_f () =
- search_lbl#misc#show ();
- search_input#misc#show ();
-
- prerr_endline "search_f called";
- if !start_of_search = None then begin
- (* A full new search is starting *)
- start_of_search :=
- Some (session_notebook#current_term.script#buffer#create_mark
- (session_notebook#current_term.script#buffer#get_iter_at_mark `INSERT));
- start_of_found := !start_of_search;
- end_of_found := !start_of_search;
- matched_word := Some "";
- end;
- let txt = search_input#entry#text in
- let v = session_notebook#current_term.script in
- let iit = v#buffer#get_iter_at_mark `SEL_BOUND
- and insert_iter = v#buffer#get_iter_at_mark `INSERT
- in
- prerr_endline ("SELBOUND="^(string_of_int iit#offset));
- prerr_endline ("INSERT="^(string_of_int insert_iter#offset));
-
- (match
- if !search_forward then iit#forward_search txt
- else let npi = iit#forward_chars (Glib.Utf8.length txt) in
- match
- (npi#offset = (v#buffer#get_iter_at_mark `INSERT)#offset),
- (let t = iit#get_text ~stop:npi in
- flash_info (t^"\n"^txt);
- t = txt)
- with
- | true,true ->
- (flash_info "T,T";iit#backward_search txt)
- | false,true -> flash_info "F,T";Some (iit,npi)
- | _,false ->
- (iit#backward_search txt)
-
- with
- | None ->
- if !ready_to_wrap_search then begin
- ready_to_wrap_search := false;
- flash_info "Search wrapped";
- v#buffer#place_cursor
- ~where:(if !search_forward then v#buffer#start_iter else
- v#buffer#end_iter);
- search_f ()
- end else begin
- if !search_forward then flash_info "Search at end"
- else flash_info "Search at start";
- ready_to_wrap_search := true
- end
- | Some (start,stop) ->
- prerr_endline "search: before moving marks";
- prerr_endline ("SELBOUND="^(string_of_int (v#buffer#get_iter_at_mark `SEL_BOUND)#offset));
- prerr_endline ("INSERT="^(string_of_int (v#buffer#get_iter_at_mark `INSERT)#offset));
-
- v#buffer#move_mark `SEL_BOUND ~where:start;
- v#buffer#move_mark `INSERT ~where:stop;
- prerr_endline "search: after moving marks";
- prerr_endline ("SELBOUND="^(string_of_int (v#buffer#get_iter_at_mark `SEL_BOUND)#offset));
- prerr_endline ("INSERT="^(string_of_int (v#buffer#get_iter_at_mark `INSERT)#offset));
- v#scroll_to_mark `SEL_BOUND
- )
- in
- ignore (search_input#entry#event#connect#key_release
- ~callback:
- (fun ev ->
- if GdkEvent.Key.keyval ev = GdkKeysyms._Escape then begin
- let v = session_notebook#current_term.script in
- (match !start_of_search with
- | None ->
- prerr_endline "search_key_rel: Placing sel_bound";
- v#buffer#move_mark
- `SEL_BOUND
- ~where:(v#buffer#get_iter_at_mark `INSERT)
- | Some mk -> let it = v#buffer#get_iter_at_mark
- (`MARK mk) in
- prerr_endline "search_key_rel: Placing cursor";
- v#buffer#place_cursor ~where:it;
- start_of_search := None
- );
- search_input#entry#set_text "";
- v#coerce#misc#grab_focus ();
- end;
- false
- ));
- ignore (search_input#entry#connect#changed ~callback:search_f);
push_info "Ready";
(* Location display *)
let l = GMisc.label
diff --git a/ide/coqide_ui.ml b/ide/coqide_ui.ml
index eaf1e9348..6b464348c 100644
--- a/ide/coqide_ui.ml
+++ b/ide/coqide_ui.ml
@@ -20,6 +20,7 @@ let list_items menu li =
let init () =
let theui = Printf.sprintf "<ui>
+<accelerator action='Close Find' />
<menubar name='CoqIde MenuBar'>
<menu action='File'>
<menuitem action='New' />
@@ -48,8 +49,10 @@ let init () =
<menuitem action='Copy' />
<menuitem action='Paste' />
<separator />
- <menuitem action='Find in buffer' />
- <menuitem action='Find backwards' />
+ <menuitem action='Find' />
+ <menuitem action='Find Next' />
+ <menuitem action='Find Previous' />
+ <menuitem action='Replace' />
<menuitem action='Complete Word' />
<separator />
<menuitem action='External editor' />
diff --git a/ide/ide.mllib b/ide/ide.mllib
index ee498ba0c..5a9a6a874 100644
--- a/ide/ide.mllib
+++ b/ide/ide.mllib
@@ -10,6 +10,7 @@ Editable_cells
Config_parser
Tags
Wg_Notebook
+Wg_Find
Config_lexer
Utf8_convert
Preferences
diff --git a/ide/mac_default_accel_map b/ide/mac_default_accel_map
index 4d34636f4..e570ae651 100644
--- a/ide/mac_default_accel_map
+++ b/ide/mac_default_accel_map
@@ -108,7 +108,7 @@
; (gtk_accel_path "<DEFAULT ROOT>/d_ecompose sum/" "")
; (gtk_accel_path "<DEFAULT ROOT>/A_dd Abstract Ring A Aplus Amult Aone Azero Ainv Aeq T./" "")
; (gtk_accel_path "<CoqIde MenuBar>/Te_mplates/" "")
-(gtk_accel_path "<Actions>/Edit/Find in buffer" "<Meta>f")
+(gtk_accel_path "<Actions>/Edit/Find" "<Meta>f")
; (gtk_accel_path "<DEFAULT ROOT>/r_eplace __ with/" "")
(gtk_accel_path "<Actions>/Tactics/omega" "<Meta><Control>o")
; (gtk_accel_path "<DEFAULT ROOT>/S_cheme/" "")
@@ -308,7 +308,7 @@
; (gtk_accel_path "<CoqIde MenuBar>/Templates/_U.../" "")
(gtk_accel_path "<Actions>/Display/Display raw matching expressions" "<Shift><Control>m")
; (gtk_accel_path "<DEFAULT ROOT>/c_asetype/" "")
-(gtk_accel_path "<Actions>/Edit/Find backwards" "<Meta>b")
+(gtk_accel_path "<Actions>/Edit/Find Previous" "<Meta>b")
; (gtk_accel_path "<DEFAULT ROOT>/S_ave./" "")
; (gtk_accel_path "<DEFAULT ROOT>/p_attern/" "")
; (gtk_accel_path "<DEFAULT ROOT>/M_odule/" "")
diff --git a/ide/tags.ml b/ide/tags.ml
index eeace4658..73da20f21 100644
--- a/ide/tags.ml
+++ b/ide/tags.ml
@@ -34,6 +34,7 @@ struct
let folded = make_tag table ~name:"locked" [`EDITABLE false; `BACKGROUND "light grey"]
let paren = make_tag table ~name:"paren" [`BACKGROUND "purple"]
let sentence = make_tag table ~name:"sentence" []
+ let replaced = make_tag table ~name:"replaced" [`BACKGROUND "green"]
end
module Proof =
struct
diff --git a/ide/tags.mli b/ide/tags.mli
index 53a8c4930..4dc0b9fc8 100644
--- a/ide/tags.mli
+++ b/ide/tags.mli
@@ -24,6 +24,7 @@ sig
val folded : GText.tag
val paren : GText.tag
val sentence : GText.tag
+ val replaced : GText.tag
end
module Proof :
diff --git a/ide/wg_Find.ml b/ide/wg_Find.ml
new file mode 100644
index 000000000..0bd1f6e06
--- /dev/null
+++ b/ide/wg_Find.ml
@@ -0,0 +1,319 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * INRIA - CNRS - LIX - LRI - PPS - Copyright 1999-2010 *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+
+type mode =
+| Find
+| Replace
+
+class finder (view : GText.view) =
+
+ let widget = GPack.vbox () in
+ (* Find part *)
+ let find_box = GPack.hbox ~packing:widget#add () in
+ let _ =
+ GMisc.label ~text:"Find:"
+ ~xalign:1.0
+ ~packing:find_box#pack ()
+ in
+ let find_entry = GEdit.entry
+ ~editable:true
+ ~packing:(find_box#pack ~expand:true)
+ ()
+ in
+ let next_button =
+ GButton.button
+ ~label:"_Next"
+ ~use_mnemonic:true
+(* ~stock:`GO_DOWN *)
+ ~packing:find_box#pack
+ ()
+ in
+ let previous_button =
+ GButton.button
+ ~label:"_Previous"
+ ~use_mnemonic:true
+(* ~stock:`GO_UP *)
+ ~packing:find_box#pack
+ ()
+ in
+ (* Find and replace part *)
+ let replace_box = GPack.table
+ ~columns:4 ~rows:2
+ ~homogeneous:false ~packing:widget#add () in
+ let _ =
+ GMisc.label ~text:"Find:"
+ ~xalign:1.0
+ ~packing:(replace_box#attach ~left:0 ~top:0 ~fill:`X) ()
+ in
+ let _ =
+ GMisc.label ~text:"Replace:"
+ ~xalign:1.0
+ ~packing:(replace_box#attach ~left:0 ~top:1 ~fill:`X) ()
+ in
+ let r_find_entry = GEdit.entry
+ ~editable:true
+ ~packing:(replace_box#attach ~left:1 ~top:0 ~expand:`X ~fill:`X)
+ ()
+ in
+ let r_replace_entry = GEdit.entry
+ ~editable:true
+ ~packing:(replace_box#attach ~left:1 ~top:1 ~expand:`X ~fill:`X)
+ ()
+ in
+ let r_next_button =
+ GButton.button
+ ~label:"_Next" ~use_mnemonic:true
+ ~packing:(replace_box#attach ~left:2 ~top:0)
+ ()
+ in
+ let r_previous_button =
+ GButton.button
+ ~label:"_Previous" ~use_mnemonic:true
+ ~packing:(replace_box#attach ~left:3 ~top:0)
+ ()
+ in
+ let r_replace_button =
+ GButton.button
+ ~label:"_Replace" ~use_mnemonic:true
+ ~packing:(replace_box#attach ~left:2 ~top:1)
+ ()
+ in
+ let r_replace_all_button =
+ GButton.button
+ ~label:"Replace _All" ~use_mnemonic:true
+ ~packing:(replace_box#attach ~left:3 ~top:1)
+ ()
+ in
+
+ object (self)
+ val mutable last_found = None
+ val mutable mode = Find
+
+ method coerce = widget#coerce
+
+ method private get_selected_word () =
+ let start = view#buffer#get_iter `INSERT in
+ let stop = view#buffer#get_iter `SEL_BOUND in
+ view#buffer#get_text ~start ~stop ()
+
+ method private may_replace () =
+ let search = self#search_text in
+ (search <> "") && (search = self#get_selected_word ())
+
+ method replace () =
+ if self#may_replace () then
+ let _ = view#buffer#delete_selection () in
+ let _ = view#buffer#insert_interactive r_replace_entry#text in
+ self#find_forward ()
+ else self#find_forward ()
+
+ method replace_all () =
+ let rec replace_at (iter : GText.iter) =
+ let found = iter#forward_search self#search_text in
+ match found with
+ | None -> ()
+ | Some (start, stop) ->
+ let () = Printf.printf "%i-%i\n%!" start#offset stop#offset in
+ let start_mark = view#buffer#create_mark start in
+ let stop_mark = view#buffer#create_mark stop in
+ let _ = view#buffer#delete_interactive ~start ~stop () in
+ let iter = view#buffer#get_iter_at_mark (`MARK start_mark) in
+ let _ = view#buffer#insert_interactive ~iter r_replace_entry#text in
+ let next = view#buffer#get_iter_at_mark (`MARK stop_mark) in
+ let () = view#buffer#delete_mark (`MARK start_mark) in
+ let () = view#buffer#delete_mark (`MARK stop_mark) in
+ replace_at next
+ in
+ replace_at view#buffer#start_iter
+
+ method private set_not_found () =
+ find_entry#misc#modify_base [`NORMAL, `NAME "#F7E6E6"];
+ r_find_entry#misc#modify_base [`NORMAL, `NAME "#F7E6E6"];
+
+ method private set_found () =
+ find_entry#misc#modify_base [`NORMAL, `NAME "#BAF9CE"];
+ r_find_entry#misc#modify_base [`NORMAL, `NAME "#BAF9CE"]
+
+ method private set_normal () =
+ find_entry#misc#modify_base [`NORMAL, `NAME "white"];
+ r_find_entry#misc#modify_base [`NORMAL, `NAME "white"]
+
+ method private find_from backward (starti : GText.iter) text =
+ let found =
+ if backward then
+ starti#backward_search text
+ else
+ starti#forward_search text
+ in
+ match found with
+ | None ->
+ if not backward && not (starti#equal view#buffer#start_iter) then
+ self#find_from backward view#buffer#start_iter text
+ else if backward && not (starti#equal view#buffer#end_iter) then
+ self#find_from backward view#buffer#end_iter text
+ else
+ self#set_not_found ()
+ | Some (start, stop) ->
+ let _ = view#buffer#select_range start stop in
+ let scroll = `MARK (view#buffer#create_mark stop) in
+ let _ = view#scroll_to_mark ~use_align:false scroll in
+ self#set_found ()
+
+ method find_forward () =
+ let starti = view#buffer#get_iter `SEL_BOUND in
+ self#find_from false starti self#search_text
+
+ method find_backward () =
+ let starti = view#buffer#get_iter `INSERT in
+ self#find_from true starti self#search_text
+
+ method private search_text = match mode with
+ | Find -> find_entry#text
+ | Replace -> r_find_entry#text
+
+ method hide () =
+ widget#misc#hide ();
+ view#coerce#misc#grab_focus ()
+
+ method show_find () =
+ mode <- Find;
+ let search =
+ if self#coerce#misc#visible then
+ r_find_entry#text
+ else
+ self#get_selected_word ()
+ in
+ self#set_normal ();
+ find_entry#set_text search;
+ widget#misc#show ();
+ find_box#misc#show ();
+ replace_box#misc#hide ();
+ find_entry#misc#grab_focus ()
+
+ method show_replace () =
+ mode <- Replace;
+ let search =
+ if self#coerce#misc#visible then
+ find_entry#text
+ else
+ self#get_selected_word ()
+ in
+ self#set_normal ();
+ r_find_entry#set_text search;
+ widget#misc#show ();
+ find_box#misc#hide ();
+ replace_box#misc#show ();
+ r_find_entry#misc#grab_focus ()
+
+ initializer
+ let _ = self#hide () in
+ let _ = next_button#connect#clicked self#find_forward in
+ let _ = previous_button#connect#clicked self#find_backward in
+ let _ = r_next_button#connect#clicked self#find_forward in
+ let _ = r_previous_button#connect#clicked self#find_backward in
+ let _ = r_replace_button#connect#clicked self#replace in
+ let _ = r_replace_all_button#connect#clicked self#replace_all in
+(* let insert_cb _ ~pos = self#find_forward () in
+ let delete_cb ~start ~stop = self#find_backward () in*)
+(* let _ = find_entry#connect#insert_text ~callback:insert_cb in
+ let _ = find_entry#connect#delete_text ~callback:delete_cb in*)
+(* let _ = find_again_button#connect#clicked find_again in *)
+(* let _ = close_find_button#connect#clicked close_find in *)
+(* let _ = replace_find_button#connect#clicked do_replace_find in *)
+(* let _ = find_backwards_check#connect#clicked click_on_backward in *)
+(* let _ = find_entry#connect#changed do_find in *)
+ ()
+
+ end
+
+(* let find_box = GPack.table
+ ~columns:3 ~rows:5
+ ~col_spacings:10 ~row_spacings:10 ~border_width:10
+ ~homogeneous:false ~packing:find_w#add () in
+
+let _ =
+ GMisc.label ~text:"Find:"
+ ~xalign:1.0
+ ~packing:(find_box#attach ~left:0 ~top:0 ~fill:`X) ()
+in
+let _ =
+ GMisc.label ~text:"Replace with:"
+ ~xalign:1.0
+ ~packing:(find_box#attach ~left:0 ~top:1 ~fill:`X) ()
+in *)
+(* let _ =
+ GButton.check_button
+ ~label:"case sensitive"
+ ~active:true
+ ~packing: (find_box#attach ~left:1 ~top:2)
+ ()
+ in
+*)
+(* let find_backwards_check =
+ GButton.check_button
+ ~label:"search backwards"
+ ~active:!search_backward
+ ~packing: (find_box#attach ~left:1 ~top:3)
+ ()
+in
+let close_find_button =
+ GButton.button
+ ~label:"Close"
+ ~packing: (find_box#attach ~left:2 ~top:2)
+ ()
+in
+let replace_find_button =
+ GButton.button
+ ~label:"Replace and find"
+ ~packing: (find_box#attach ~left:2 ~top:1)
+ ()
+in
+let find_again_button =
+ GButton.button
+ ~label:"_Find again"
+ ~packing: (find_box#attach ~left:2 ~top:0)
+ ()
+in*)
+
+(*let key_find ev =
+ let s = GdkEvent.Key.state ev and k = GdkEvent.Key.keyval ev in
+ if k = GdkKeysyms._Escape then
+ begin
+ let (v,b,_,stop) = last_find () in
+ find_w#misc#hide();
+ v#coerce#misc#grab_focus();
+ true
+ end
+ else if k = GdkKeysyms._Escape then
+ begin
+ close_find();
+ true
+ end
+ else if k = GdkKeysyms._Return ||
+ List.mem `CONTROL s && k = GdkKeysyms._f then
+ begin
+ find_again ();
+ true
+ end
+ else if List.mem `CONTROL s && k = GdkKeysyms._b then
+ begin
+ find_backwards_check#set_active (not !search_backward);
+ true
+ end
+ else false (* to let default callback execute *)
+
+in *)
+
+(* let find_f ~backward () =
+ let save_dir = !search_backward in
+ search_backward := backward;
+ find_w#show ();
+ find_w#present ();
+ find_entry#misc#grab_focus ();
+ search_backward := save_dir
+*) \ No newline at end of file
diff --git a/ide/wg_Find.mli b/ide/wg_Find.mli
new file mode 100644
index 000000000..96025e188
--- /dev/null
+++ b/ide/wg_Find.mli
@@ -0,0 +1,19 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * INRIA - CNRS - LIX - LRI - PPS - Copyright 1999-2010 *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+
+class finder : GText.view ->
+ object
+ method coerce : GObj.widget
+ method hide : unit -> unit
+ method show_find : unit -> unit
+ method show_replace : unit -> unit
+ method replace : unit -> unit
+ method replace_all : unit -> unit
+ method find_backward : unit -> unit
+ method find_forward : unit -> unit
+ end