From a03aabb8819997fe6de3538bc3a7cf12c0dfe407 Mon Sep 17 00:00:00 2001 From: vgross Date: Tue, 23 Mar 2010 14:48:02 +0000 Subject: New functions for goals fetching. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12877 85f007b7-540e-0410-9357-904b9bb8a0f7 --- ide/proof.ml | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 ide/proof.ml (limited to 'ide/proof.ml') diff --git a/ide/proof.ml b/ide/proof.ml new file mode 100644 index 0000000000..b91233e293 --- /dev/null +++ b/ide/proof.ml @@ -0,0 +1,94 @@ +(************************************************************************) +(* v * The Coq Proof Assistant / The Coq Development Team *) +(* + let iter = new GText.iter it in + let start = iter#backward_to_tag_toggle (Some tag) in + let stop = iter#forward_to_tag_toggle (Some tag) in + match GdkEvent.get_type evt with + | `BUTTON_PRESS -> + let ev = GdkEvent.Button.cast evt in + if (GdkEvent.Button.button ev) <> 3 then false else begin + let ctxt_menu = GMenu.menu () in + let factory = new GMenu.factory ctxt_menu in + List.iter + (fun (text,cmd) -> ignore (factory#add_item text ~callback:(sel_cb cmd))) + menu_content; + ctxt_menu#popup ~button:3 ~time:(GdkEvent.Button.time ev); + true + end + | `MOTION_NOTIFY -> + hover_cb start stop; false + | _ -> false)) + +let mode_tactic sel_cb (proof:GText.view) = function + | [] -> assert false + | (hyps,cur_goal,cur_goal_menu)::rem_goals -> + let on_hover sel_start sel_stop = + proof#buffer#remove_tag_by_name + "highlight" + ~start:proof#buffer#start_iter + ~stop:sel_start; + proof#buffer#remove_tag_by_name + "highlight" + ~start:sel_stop + ~stop:proof#buffer#end_iter + in + let goals_cnt = List.length rem_goals + 1 in + let head_str = Printf.sprintf "%d subgoal%s\n" goals_cnt (if 1 < goals_cnt then "" else "s") in + let insert_hyp (h,menu) = + let tag = proof#buffer#create_tag [] in + hook_tag_cb tag menu sel_cb on_hover; + proof#buffer#insert ~tags:[tag] (h^"\n") + in + let insert_goal g menu index total = + let tags = if menu <> [] then + let tag = proof#buffer#create_tag [] in + hook_tag_cb tag menu sel_cb on_hover; + [tag] + else [] + in + proof#buffer#insert (Printf.sprintf + "\n______________________________________(%d/%d)\n" index total); + proof#buffer#insert ~tags (g^"\n") + in + proof#buffer#insert head_str; + List.iter insert_hyp hyps; + insert_goal cur_goal cur_goal_menu 1 goals_cnt; + Util.list_fold_left_i (fun i _ (_,g,_) -> insert_goal g [] i goals_cnt) 2 () rem_goals; + ignore (proof#scroll_to_iter + ((proof#buffer#get_iter_at_mark `INSERT)#backward_lines (3*goals_cnt - 2))) + +let mode_cesar (proof:GText.view) = function + | [] -> assert false + | (hyps,(cur_goal,cur_goal_menu))::_ -> + proof#buffer#insert " *** Declarative Mode ***\n"; + List.iter + (fun (hyp,_) -> proof#buffer#insert (hyp^"\n")) + hyps; + proof#buffer#insert "______________________________________\n"; + proof#buffer#insert ("thesis := \n "^cur_goal^"\n"); + ignore (proof#scroll_to_iter (proof#buffer#get_iter_at_mark `INSERT)) + +let display mode view goals = + view#buffer#set_text ""; + match goals with + | Coq.Message msg -> + view#buffer#insert msg + | Coq.Goals g -> + mode view g -- cgit v1.2.3