(* Copyright (C) 2004-2005, HELM Team. * * This file is part of HELM, an Hypertextual, Electronic * Library of Mathematics, developed at the Computer Science * Department, University of Bologna, Italy. * * HELM is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * HELM is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HELM; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. * * For details, see the HELM World-Wide-Web page, * http://helm.cs.unibo.it/ *) open Printf open MatitaGtkMisc open MatitaTypes open MatitaMisc (** {2 Initialization} *) let _ = Helm_registry.load_from "matita.conf.xml"; (* read conf *) Http_getter.init (); MetadataTypes.ownerize_tables (Helm_registry.get "matita.owner"); MatitaDb.clean_owner_environment (); MatitaDb.create_owner_environment (); GtkMain.Rc.add_default_file BuildTimeConf.gtkrc; (* loads gtk rc files *) ignore (GMain.Main.init ()); (* environment trust *) CicEnvironment.set_trust (let trust = Helm_registry.get_bool "matita.environment_trust" in fun _ -> trust) (** {2 GUI callbacks} *) let gui = MatitaGui.instance () let _ = ignore (gui#main#newCicBrowserMenuItem#connect#activate (fun _ -> ignore (MatitaMathView.cicBrowser ()))); (* disambiguator callback *) MatitaDisambiguator.set_choose_uris_callback (MatitaGui.interactive_uri_choice ()); MatitaDisambiguator.set_choose_interp_callback (MatitaGui.interactive_interp_choice ()) let script = MatitaScript.script ~buffer:gui#main#scriptTextView#buffer ~init:(Lazy.force MatitaEngine.initial_status) ~mathviewer:(MatitaMathView.mathViewer ()) () (* math viewers *) let _ = let sequent_viewer = MatitaMathView.sequentViewer_instance () in let sequents_viewer = MatitaMathView.sequentsViewer_instance () in sequent_viewer#set_href_callback (Some (fun uri -> (MatitaMathView.cicBrowser ())#loadUri uri)); let browser_observer _ = MatitaMathView.refresh_all_browsers () in let sequents_observer status = sequents_viewer#reset; match status.proof_status with | Incomplete_proof ((proof, goal) as status) -> sequents_viewer#load_sequents status; sequents_viewer#goto_sequent goal | Proof proof -> prerr_endline "sequents_viewer#load_logo_with_qed (no proof)"; () | No_proof -> prerr_endline "sequents_viewer#load_logo (no proof)"; () | Intermediate _ -> assert false (* only the engine may be in this state *) in script#addObserver sequents_observer; script#addObserver browser_observer (** *) let _ = if BuildTimeConf.debug then begin gui#main#debugMenu#misc#show (); let addDebugItem ~label callback = let item = GMenu.menu_item ~packing:gui#main#debugMenu_menu#append ~label () in ignore (item#connect#activate callback) in addDebugItem "dump environment to \"env.dump\"" (fun _ -> let oc = open_out "env.dump" in CicEnvironment.dump_to_channel oc; close_out oc); addDebugItem "load environment from \"env.dump\"" (fun _ -> let ic = open_in "env.dump" in CicEnvironment.restore_from_channel ic; close_in ic); addDebugItem "dump universes" (fun _ -> List.iter (fun (u,_,g) -> prerr_endline (UriManager.string_of_uri u); CicUniv.print_ugraph g) (CicEnvironment.list_obj ()) ); addDebugItem "print selected terms" (fun () -> let i = ref 0 in List.iter (fun t -> incr i; MatitaLog.debug (sprintf "%d: %s" !i (CicPp.ppterm t))) (MatitaMathView.sequentViewer_instance ())#get_selected_terms); addDebugItem "dump getter settings" (fun _ -> prerr_endline (Http_getter_env.env_to_string ())); addDebugItem "getter: update" (fun _ -> ignore (Thread.create (fun () -> MatitaLog.message "Rebuilding getter maps in background ..."; Http_getter.update (); MatitaLog.message "Getter maps successfully rebuilt.") ())); addDebugItem "getter: getalluris" (fun _ -> List.iter prerr_endline (Http_getter.getalluris ())); addDebugItem "dump script status" script#dump; addDebugItem "dump metasenv" (fun _ -> if script#onGoingProof () then MatitaLog.debug (CicMetaSubst.ppmetasenv script#proofMetasenv [])); addDebugItem "rotate light bulbs" (fun _ -> let nb = gui#main#hintNotebook in nb#goto_page ((nb#current_page + 1) mod 3)); end (** *) let _ = at_exit (fun () -> Http_getter_logger.log "Sync map tree to disk..."; Http_getter.sync_dump_file (); print_endline "\nThanks for using Matita!\n"); Sys.catch_break true; (try script#loadFrom Sys.argv.(1); with Invalid_argument _ -> ()); if Filename.basename Sys.argv.(0) = "cicbrowser" then begin (* cicbrowser *) Helm_registry.set "matita.mode" "cicbrowser"; let browser = MatitaMathView.cicBrowser () in try browser#loadUri Sys.argv.(1) with Invalid_argument _ -> () end else begin (* matita *) Helm_registry.set "matita.mode" "matita"; gui#main#mainWin#show (); end; try GtkThread.main () with Sys.Break -> ()