From bd18c08212cbed9877167b64e0d1484a483b3cf6 Mon Sep 17 00:00:00 2001 From: ppedrot Date: Mon, 23 Apr 2012 10:35:25 +0000 Subject: Now CoqIDE has a nice find & replace mechanism. BTW, removing a blob of dead code that used to serve as such a long time ago. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@15234 85f007b7-540e-0410-9357-904b9bb8a0f7 --- ide/wg_Find.ml | 319 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 319 insertions(+) create mode 100644 ide/wg_Find.ml (limited to 'ide/wg_Find.ml') 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 *) +(* "") && (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 -- cgit v1.2.3