diff options
| author | vgross | 2010-03-23 14:48:02 +0000 |
|---|---|---|
| committer | vgross | 2010-03-23 14:48:02 +0000 |
| commit | a03aabb8819997fe6de3538bc3a7cf12c0dfe407 (patch) | |
| tree | 4a71aa00a693abe2bf932d4260b1a6b87b579133 /ide/proof.ml | |
| parent | 64e5ee718e55e13473bd3103a9535aa76ec4c63d (diff) | |
New functions for goals fetching.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12877 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'ide/proof.ml')
| -rw-r--r-- | ide/proof.ml | 94 |
1 files changed, 94 insertions, 0 deletions
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 *) +(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *) +(* \VV/ **************************************************************) +(* // * This file is distributed under the terms of the *) +(* * GNU Lesser General Public License Version 2.1 *) +(************************************************************************) + + +(* $Id$ *) + +(* tag is the tag to be hooked, item is the item covered by this tag, make_menu + * * is the template for building menu if needed, sel_cb is the callback if + * there + * * is a selection o said menu, hover_cb is the callback when there is only + * * hovering *) +let hook_tag_cb tag menu_content sel_cb hover_cb = + ignore (tag#connect#event ~callback: + (fun ~origin evt it -> + 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 |
