(* PROJECT HELM *)
(* *)
(* Claudio Sacerdoti Coen <sacerdot@cs.unibo.it> *)
-(* 03/04/2001 *)
+(* 24/01/2000 *)
(* *)
(* This is a simple gtk interface to the Coq-like pretty printer cicPp for *)
(* cic terms exported in xml. It uses directly the modules cicPp and *)
(* *)
(******************************************************************************)
+(* DEFINITION OF THE URI TREE AND USEFUL FUNCTIONS ON IT *)
+
+type item =
+ Dir of string * item list ref
+ | File of string * UriManager.uri
+;;
+
+let uritree = ref []
+let theoryuritree = ref []
+
+let get_name =
+ function
+ Dir (name,_) -> name
+ | File (name,_) -> name
+;;
+
+let get_uri =
+ function
+ Dir _ -> None
+ | File (_,uri) -> Some uri
+;;
+
+(* STUFF TO BUILD THE URI TREE *)
+
+exception EmptyUri
+exception DuplicatedUri
+exception ConflictingUris
+
+let insert_in_uri_tree uri =
+ let rec aux l =
+ function
+ [name] ->
+ (try
+ let _ = List.find (fun item -> name = get_name item) !l in
+ raise DuplicatedUri
+ with
+ Not_found -> l := (File (name,uri))::!l
+ )
+ | name::tl ->
+ (try
+ match List.find (fun item -> name = get_name item) !l with
+ Dir (_,children) -> aux children tl
+ | File _ -> raise ConflictingUris
+ with
+ Not_found ->
+ let children = ref [] in
+ l := (Dir (name,children))::!l ;
+ aux children tl
+ )
+ | [] -> raise EmptyUri
+ in
+ aux
+;;
+
+(* Imperative procedure that builds the two uri trees *)
+let build_uri_tree () =
+ let dbh = Dbm.opendbm Configuration.uris_dbm [Dbm.Dbm_rdonly] 0 in
+ Dbm.iter
+ (fun uri _ ->
+ let cicregexp = Str.regexp "cic:"
+ and theoryregexp = Str.regexp "theory:" in
+ if Str.string_match cicregexp uri 0 then
+ let s = Str.replace_first cicregexp "" uri in
+ let l = Str.split (Str.regexp "/") s in
+ insert_in_uri_tree (UriManager.uri_of_string uri) uritree l
+ else if Str.string_match theoryregexp uri 0 then
+ let s = Str.replace_first theoryregexp "" uri in
+ let l = Str.split (Str.regexp "/") s in
+ insert_in_uri_tree (UriManager.uri_of_string uri) theoryuritree l
+ ) dbh ;
+ Dbm.close dbh
+;;
+
(* GLOBAL REFERENCES (USED BY CALLBACKS) *)
let annotated_obj = ref None;; (* reference to a couple option where *)
(* the map from ids to annotated targets *)
let ann = ref (ref None);; (* current annotation *)
let radio_some_status = ref false;; (* is the radio_some button selected? *)
-let current_url = ref "";;
-
-(* MISC FUNCTIONS *)
-
-let pathname_of_annuri uristring =
- Configuration.annotations_dir ^
- Str.replace_first (Str.regexp "^cic:") "" uristring
-;;
-
-let make_dirs dirpath =
- ignore (Unix.system ("mkdir -p " ^ dirpath))
-;;
-
-exception No_param_dot_CICURI_or_param_dot_annotations_found_in of string;;
-exception Bad_formed_url of string;;
-
-let uri_from_url url =
- let module N = Neturl in
- let founduri = ref None in
- let foundann = ref None in
- let rec find_uri =
- function
- [] -> raise (No_param_dot_CICURI_or_param_dot_annotations_found_in url)
- | he::tl ->
- match Str.split (Str.regexp "=") he with
- ["param.CICURI";uri] ->
- if !founduri <> None then
- raise (Bad_formed_url url)
- else
- begin
- founduri := Some uri ;
- if !foundann = None then
- find_uri tl
- end
- | ["param.annotations";ann] ->
- if !foundann <> None then
- raise (Bad_formed_url url)
- else
- begin
- foundann :=
- Some
- (match ann with
- "yes" -> ".ann"
- | "NO" -> ""
- | _ -> raise (Bad_formed_url url)
- ) ;
- if !founduri = None then
- find_uri tl
- end
- | _ -> find_uri tl
- in
- find_uri
- (Str.split (Str.regexp "&")
- (N.url_query ~encoded:true (N.url_of_string N.ip_url_syntax url))) ;
- match !founduri,!foundann with
- (Some uri),(Some ann) -> uri ^ ann
- | _ , _ ->
- raise (No_param_dot_CICURI_or_param_dot_annotations_found_in url)
+
+let theory_visited_uris = ref [];;
+let theory_to_visit_uris = ref [];;
+let visited_uris = ref [];;
+let to_visit_uris = ref [];;
+
+(* CALLBACKS *)
+
+exception NoCurrentUri;;
+exception NoNextOrPrevUri;;
+
+let theory_get_current_uri () =
+ match !theory_visited_uris with
+ [] -> raise NoCurrentUri
+ | uri::_ -> uri
;;
let get_current_uri () =
- UriManager.uri_of_string (uri_from_url !current_url)
+ match !visited_uris with
+ [] -> raise NoCurrentUri
+ | uri::_ -> uri
;;
-(* CALLBACKS *)
-
let get_annotated_obj () =
match !annotated_obj with
None ->
- let annobj =
+ let (annobj, ids_to_targets,_) =
(CicCache.get_annobj (get_current_uri ()))
in
- annotated_obj := Some annobj ;
- annobj
+ annotated_obj := Some (annobj, ids_to_targets) ;
+ (annobj, ids_to_targets)
| Some annobj -> annobj
;;
-let update_output rendering_window url =
- rendering_window#label#set_text (uri_from_url url) ;
- rendering_window#output#load url
+let filename_of_uri uri =
+ Getter.get uri
+;;
+
+let theory_update_output rendering_window uri =
+ rendering_window#label#set_text (UriManager.string_of_uri uri) ;
+ ignore (rendering_window#errors#delete_text 0 rendering_window#errors#length) ;
+ let mmlfile = XsltProcessor.process uri true "theory" in
+ rendering_window#output#load mmlfile
+;;
+
+let update_output rendering_window uri =
+ rendering_window#label#set_text (UriManager.string_of_uri uri) ;
+ ignore (rendering_window#errors#delete_text 0 rendering_window#errors#length) ;
+ let mmlfile = XsltProcessor.process uri true "cic" in
+ rendering_window#output#load mmlfile
+;;
+
+let theory_next rendering_window () =
+ match !theory_to_visit_uris with
+ [] -> raise NoNextOrPrevUri
+ | uri::tl ->
+ theory_to_visit_uris := tl ;
+ theory_visited_uris := uri::!theory_visited_uris ;
+ theory_update_output rendering_window uri ;
+ rendering_window#prevb#misc#set_sensitive true ;
+ if tl = [] then
+ rendering_window#nextb#misc#set_sensitive false
+;;
+
+let next rendering_window () =
+ match !to_visit_uris with
+ [] -> raise NoNextOrPrevUri
+ | uri::tl ->
+ to_visit_uris := tl ;
+ visited_uris := uri::!visited_uris ;
+ annotated_obj := None ;
+ update_output rendering_window uri ;
+ rendering_window#prevb#misc#set_sensitive true ;
+ if tl = [] then
+ rendering_window#nextb#misc#set_sensitive false
+;;
+
+let theory_prev rendering_window () =
+ match !theory_visited_uris with
+ [] -> raise NoCurrentUri
+ | [_] -> raise NoNextOrPrevUri
+ | uri::(uri'::tl as newvu) ->
+ theory_visited_uris := newvu ;
+ theory_to_visit_uris := uri::!theory_to_visit_uris ;
+ theory_update_output rendering_window uri' ;
+ rendering_window#nextb#misc#set_sensitive true ;
+ if tl = [] then
+ rendering_window#prevb#misc#set_sensitive false
+;;
+
+let prev rendering_window () =
+ match !visited_uris with
+ [] -> raise NoCurrentUri
+ | [_] -> raise NoNextOrPrevUri
+ | uri::(uri'::tl as newvu) ->
+ visited_uris := newvu ;
+ to_visit_uris := uri::!to_visit_uris ;
+ annotated_obj := None ;
+ update_output rendering_window uri' ;
+ rendering_window#nextb#misc#set_sensitive true ;
+ if tl = [] then
+ rendering_window#prevb#misc#set_sensitive false
;;
(* called when an hyperlink is clicked *)
let jump rendering_window (node : Ominidom.o_mDOMNode) =
let module O = Ominidom in
- let module U = Unix in
match (node#get_attribute (O.o_mDOMString_of_string "href")) with
Some str ->
- let frameseturl = str#get_string in
- let devnull = U.openfile "/dev/null" [U.O_RDWR] 0o600 in
- ignore
- (U.create_process "netscape-remote"
- [|"netscape-remote" ; "-noraise" ; "-remote" ;
- "openURL(" ^ frameseturl ^ ",cic)"
- |] devnull devnull devnull)
+ let s = str#get_string in
+ let uri = UriManager.uri_of_string s in
+ rendering_window#show () ;
+ rendering_window#prevb#misc#set_sensitive true ;
+ rendering_window#nextb#misc#set_sensitive false ;
+ visited_uris := uri::!visited_uris ;
+ to_visit_uris := [] ;
+ annotated_obj := None ;
+ update_output rendering_window uri
| None -> assert false
;;
-(* called by the remote control *)
-let remotejump rendering_window url =
- current_url := url ;
- update_output rendering_window url
-;;
-
let choose_selection rendering_window (node : Ominidom.o_mDOMNode option) =
let module O = Ominidom in
let rec aux node =
| None -> rendering_window#output#set_selection None
;;
+
+let theory_selection_changed rendering_window uri () =
+ match uri with
+ None -> ()
+ | Some uri' ->
+ if !theory_visited_uris <> [] then
+ rendering_window#prevb#misc#set_sensitive true ;
+ rendering_window#nextb#misc#set_sensitive false ;
+ theory_visited_uris := uri'::!theory_visited_uris ;
+ theory_to_visit_uris := [] ;
+ rendering_window#show () ;
+ theory_update_output rendering_window uri'
+;;
+
+let selection_changed rendering_window uri () =
+ match uri with
+ None -> ()
+ | Some uri' ->
+ if !visited_uris <> [] then
+ rendering_window#prevb#misc#set_sensitive true ;
+ rendering_window#nextb#misc#set_sensitive false ;
+ visited_uris := uri'::!visited_uris ;
+ to_visit_uris := [] ;
+ annotated_obj := None ;
+ rendering_window#show () ;
+ update_output rendering_window uri'
+;;
+
+let create_gtk_trees (hbox : GPack.box) rendering_window theory_rendering_window mktree =
+ let sw3 =
+ GBin.scrolled_window ~width:250 ~height:600
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let tree1 =
+ GTree.tree ~selection_mode:`BROWSE ~packing:sw3#add_with_viewport () in
+ let tree_item1 = GTree.tree_item ~label:"theory:/" ~packing:tree1#append () in
+
+ let sw2 =
+ GBin.scrolled_window ~width:250 ~height:600
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let tree =
+ GTree.tree ~selection_mode:`BROWSE ~packing:sw2#add_with_viewport () in
+ let tree_item = GTree.tree_item ~label:"cic:/" ~packing:tree#append () in
+
+ ignore(tree_item#connect#select (selection_changed rendering_window None)) ;
+ mktree selection_changed rendering_window tree_item (Dir ("cic:/",uritree)) ;
+
+ ignore(tree_item1#connect#select
+ (theory_selection_changed theory_rendering_window None)) ;
+ mktree theory_selection_changed theory_rendering_window tree_item1
+ (Dir ("theory:/",theoryuritree)) ;
+ (sw3,sw2)
+;;
+
+let updateb_pressed theory_rendering_window rendering_window
+ (sw1, sw ,(hbox : GPack.box)) mktree ()
+=
+ Getter.update () ;
+ (* let's empty the uri trees and rebuild them *)
+ uritree := [] ;
+ theoryuritree := [] ;
+ build_uri_tree () ;
+ hbox#remove !sw1#coerce ;
+ hbox#remove !sw#coerce ;
+ let (sw3,sw2) =
+ create_gtk_trees hbox rendering_window theory_rendering_window mktree
+ in
+ sw1 := sw3 ;
+ sw := sw2
+;;
+
+let theory_check rendering_window () =
+ let output =
+ try
+ TheoryTypeChecker.typecheck (theory_get_current_uri ());
+ "Type Checking was successful"
+ with
+ TheoryTypeChecker.NotWellTyped s ->
+ "Type Checking was NOT successful:\n\t" ^ s
+ in
+ (* next "cast" can't got rid of, but I don't know why *)
+ let errors = (rendering_window#errors : GEdit.text) in
+ let _ = errors#delete_text 0 errors#length in
+ errors#insert output
+;;
+
+let check rendering_window () =
+ let output =
+ try
+ CicTypeChecker.typecheck (get_current_uri ());
+ "Type Checking was successful"
+ with
+ CicTypeChecker.NotWellTyped s -> "Type Checking was NOT successful:\n\t" ^ s
+ in
+ (* next "cast" can't got rid of, but I don't know why *)
+ let errors = (rendering_window#errors : GEdit.text) in
+ let _ = errors#delete_text 0 errors#length in
+ errors#insert output
+;;
+
let annotateb_pressed rendering_window annotation_window () =
let module O = Ominidom in
match rendering_window#output#get_selection with
- Some node ->
- begin
- match (node#get_attribute (O.o_mDOMString_of_string "xref")) with
- Some xpath ->
- let annobj = get_annotated_obj ()
- and annotation = (annotation_window#annotation : GEdit.text) in
- ann := CicXPath.get_annotation annobj (xpath#get_string) ;
- CicAnnotationHinter.create_hints annotation_window annobj
- (xpath#get_string) ;
- annotation#delete_text 0 annotation#length ;
- begin
- match !(!ann) with
- None ->
- annotation#misc#set_sensitive false ;
- annotation_window#radio_none#set_active true ;
- radio_some_status := false
- | Some ann' ->
- annotation#insert ann' ;
- annotation#misc#set_sensitive true ;
- annotation_window#radio_some#set_active true ;
- radio_some_status := true
- end ;
- GMain.Grab.add (annotation_window#window_to_annotate#coerce) ;
- annotation_window#show () ;
- | None -> rendering_window#label#set_text ("ERROR: No xref found!!!\n")
- end
- | None -> rendering_window#label#set_text ("ERROR: No selection!!!\n")
+ | Some node ->
+ begin
+ match (node#get_attribute (O.o_mDOMString_of_string "xref")) with
+ | Some xpath ->
+ let annobj = get_annotated_obj ()
+ (* next "cast" can't got rid of, but I don't know why *)
+ and annotation = (annotation_window#annotation : GEdit.text) in
+ ann := CicXPath.get_annotation annobj (xpath#get_string) ;
+ CicAnnotationHinter.create_hints annotation_window annobj (xpath#get_string) ;
+ annotation#delete_text 0 annotation#length ;
+ begin
+ match !(!ann) with
+ None ->
+ annotation#misc#set_sensitive false ;
+ annotation_window#radio_none#set_active true ;
+ radio_some_status := false
+ | Some ann' ->
+ annotation#insert ann' ;
+ annotation#misc#set_sensitive true ;
+ annotation_window#radio_some#set_active true ;
+ radio_some_status := true
+ end ;
+ GMain.Grab.add (annotation_window#window_to_annotate#coerce) ;
+ annotation_window#show () ;
+ | None ->
+ (* next "cast" can't got rid of, but I don't know why *)
+ let errors = (rendering_window#errors : GEdit.text) in
+ errors#insert ("\nNo xref found\n")
+ end
+ | None -> (rendering_window#errors : GEdit.text)#insert "\nNo selection!\n"
;;
(* called when the annotation is confirmed *)
let save_annotation annotation =
- let module S = Str in
+ if !radio_some_status then
+ !ann := Some (annotation#get_chars 0 annotation#length)
+ else
+ !ann := None ;
+ match !annotated_obj with
+ None -> assert false
+ | Some (annobj,_) ->
+ let uri = get_current_uri () in
+ let annxml = Annotation2Xml.pp_annotation annobj uri in
+ Xml.pp annxml (Some (fst (Getter.get_ann_file_name_and_uri uri)))
+;;
+
+let parse_no_cache uri =
let module U = UriManager in
- if !radio_some_status then
- !ann := Some (annotation#get_chars 0 annotation#length)
- else
- !ann := None ;
- match !annotated_obj with
- None -> assert false
- | Some (annobj,_) ->
- let uri = get_current_uri () in
- let annxml = Annotation2Xml.pp_annotation annobj uri in
- make_dirs
- (pathname_of_annuri (U.buri_of_uri uri)) ;
- Xml.pp ~quiet:true annxml
- (Some
- (pathname_of_annuri (U.string_of_uri (U.annuri_of_uri uri)) ^
- ".xml"
- )
- )
+ XsltProcessor.process uri false "cic"
;;
+
(* STUFF TO BUILD THE GTK INTERFACE *)
+(* Stuff to build the tree window *)
+
+(* selection_changed is actually selection_changed or theory_selection_changed*)
+let mktree selection_changed rendering_window =
+ let rec aux treeitem =
+ function
+ Dir (dirname, content) ->
+ let subtree = GTree.tree () in
+ treeitem#set_subtree subtree ;
+ let expand_sons =
+ List.map
+ (fun ti ->
+ let label = get_name ti
+ and uri = get_uri ti in
+ let treeitem2 = GTree.tree_item ~label:label () in
+ subtree#append treeitem2 ;
+ ignore(treeitem2#connect#select
+ (selection_changed rendering_window uri)) ;
+ (* Almost lazy function *)
+ (fun () -> aux treeitem2 ti)
+ ) (List.sort compare !content)
+ in
+ let lazy_expand_sons = lazy (List.iter (fun f -> f ()) expand_sons) in
+ ignore(treeitem#connect#expand
+ (fun () -> Lazy.force lazy_expand_sons)) ;
+ | _ -> ()
+ in
+ aux
+;;
+
(* Stuff for the widget settings *)
let export_to_postscript (output : GMathView.math_view) () =
window_to_annotate#misc#hide () ;
save_annotation annotation ;
GMain.Grab.remove (window_to_annotate#coerce) ;
- let new_current_uri = UriManager.annuri_of_uri (get_current_uri ()) in
- Getter.register new_current_uri
- (Configuration.annotations_url ^
- Str.replace_first (Str.regexp "^cic:") ""
- (UriManager.string_of_uri new_current_uri) ^ ".xml"
- ) ;
-(*CSC: corretto, up to XsltProcessor.url_of_uri
- let new_current_url = XsltProcessor.url_of_uri new_current_uri in
- current_url := new_current_url ;
+ let new_current_uri =
+ (snd (Getter.get_ann_file_name_and_uri (get_current_uri ())))
+ in
+ visited_uris := new_current_uri::(List.tl !visited_uris) ;
label#set_text (UriManager.string_of_uri new_current_uri) ;
- output#load new_current_url
-*) ()
+ let mmlfile = parse_no_cache new_current_uri in
+ output#load mmlfile
)) ;
ignore (abortb#connect#clicked
(fun () ->
let vbox =
GPack.vbox ~packing:window#add () in
let _ = vbox#pack ~expand:false ~fill:false ~padding:5 label#coerce in
+ let paned =
+ GPack.paned `HORIZONTAL ~packing:(vbox#pack ~expand:true ~padding:5) () in
let scrolled_window0 =
- GBin.scrolled_window ~border_width:10
- ~packing:(vbox#pack ~expand:true ~padding:5) () in
+ GBin.scrolled_window ~border_width:10 ~packing:paned#add1 () in
let _ = scrolled_window0#add output#coerce in
+ let scrolled_window =
+ GBin.scrolled_window
+ ~border_width:10 ~packing:paned#add2 ~width:240 ~height:100 () in
+ let errors = GEdit.text ~packing:scrolled_window#add_with_viewport () in
let hbox =
GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let prevb =
+ GButton.button ~label:"Prev"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let nextb =
+ GButton.button ~label:"Next"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let checkb =
+ GButton.button ~label:"Check"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
let annotateb =
GButton.button ~label:"Annotate"
~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
GButton.button ~label:"Close"
~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
object(self)
+ method nextb = nextb
+ method prevb = prevb
method label = label
method output = (output : GMathView.math_view)
+ method errors = errors
method show () = window#show ()
initializer
+ nextb#misc#set_sensitive false ;
+ prevb#misc#set_sensitive false ;
button_export_to_postscript#misc#set_sensitive false ;
(* signal handlers here *)
ignore(output#connect#jump (jump self)) ;
ignore(output#connect#selection_changed (choose_selection self)) ;
- ignore(closeb#connect#clicked (fun _ -> GMain.Main.quit ())) ;
+ ignore(nextb#connect#clicked (next self)) ;
+ ignore(prevb#connect#clicked (prev self)) ;
+ (* LUCA: check disabled while compression is not fully implemented *)
+ (* ignore(checkb#connect#clicked (check self)) ; *)
+ checkb#misc#set_sensitive false ;
+ ignore(closeb#connect#clicked window#misc#hide) ;
ignore(annotateb#connect#clicked (annotateb_pressed self annotation_window)) ;
let settings_window = new settings_window output scrolled_window0
button_export_to_postscript (jump self) (choose_selection self) in
ignore(settingsb#connect#clicked settings_window#show) ;
ignore(button_export_to_postscript#connect#clicked (export_to_postscript output)) ;
- ignore(window#event#connect#delete (fun _ -> GMain.Main.quit () ; true ))
+ ignore(window#event#connect#delete (fun _ -> window#misc#hide () ; true ))
end;;
-(* MAIN *)
+class theory_rendering_window rendering_window =
+ let window =
+ GWindow.window ~title:"MathML theory viewer" ~border_width:2 () in
+ let vbox =
+ GPack.vbox ~packing:window#add () in
+ let label =
+ GMisc.label ~text:"???"
+ ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let paned =
+ GPack.paned `HORIZONTAL ~packing:(vbox#pack ~expand:true ~padding:5) () in
+ let scrolled_window0 =
+ GBin.scrolled_window ~border_width:10 ~packing:paned#add1 () in
+ let output =
+ GMathView.math_view ~width:400 ~height:380 ~packing:scrolled_window0#add () in
+ let scrolled_window =
+ GBin.scrolled_window
+ ~border_width:10 ~packing:paned#add2 ~width:240 ~height:100 () in
+ let errors = GEdit.text ~packing:scrolled_window#add_with_viewport () in
+ let hbox =
+ GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let prevb =
+ GButton.button ~label:"Prev"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let nextb =
+ GButton.button ~label:"Next"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let checkb =
+ GButton.button ~label:"Check"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let settingsb =
+ GButton.button ~label:"Settings"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let button_export_to_postscript =
+ GButton.button ~label:"export_to_postscript"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let closeb =
+ GButton.button ~label:"Close"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+object(self)
+ method nextb = nextb
+ method prevb = prevb
+ method label = label
+ method output = (output : GMathView.math_view)
+ method errors = errors
+ method show () = window#show ()
+ initializer
+ nextb#misc#set_sensitive false ;
+ prevb#misc#set_sensitive false ;
+ button_export_to_postscript#misc#set_sensitive false ;
-let initialize_everything tmpfile url =
- let module U = Unix in
- (* Let's be ready to be remotely controlled *)
- let socket = U.socket ~domain:U.PF_INET ~kind:U.SOCK_DGRAM ~protocol:0 in
- let address = U.ADDR_INET (U.inet_addr_of_string "127.000.000.001", 8778) in
- let buffersize = 2048 in (* are 2048 chars enough? *)
- let buffer = String.create buffersize in
- try
- U.bind socket address ;
- U.set_nonblock socket ;
- let output = GMathView.math_view ~width:400 ~height:380 ()
- and label = GMisc.label ~text:"???" () in
- let annotation_window = new annotation_window output label in
- let rendering_window =
- new rendering_window annotation_window output label
- in
- let exec_remote_request () =
- try
- remotejump rendering_window
- (String.sub buffer 0 (U.recv socket buffer 0 buffersize []))
- with
- U.Unix_error (U.EAGAIN,_,_)
- | U.Unix_error (U.EWOULDBLOCK,_,_) -> ()
- in
- ignore (GMain.Timeout.add ~ms:500
- ~callback:(fun () -> exec_remote_request () ; true)) ;
- rendering_window#show () ;
- rendering_window#label#set_text (uri_from_url url) ;
- rendering_window#output#load tmpfile ;
- GMain.Main.main ()
- with
- U.Unix_error (_,"bind",_) ->
- (* Another copy is already under execution ==> I am a remote control *)
- ignore (U.sendto socket url 0 (String.length url) [] address)
-;;
+ (* signal handlers here *)
+ ignore(output#connect#jump (jump rendering_window)) ;
+ ignore(output#connect#selection_changed (choose_selection self)) ;
+ ignore(nextb#connect#clicked (theory_next self)) ;
+ ignore(prevb#connect#clicked (theory_prev self)) ;
+ ignore(checkb#connect#clicked (theory_check self)) ;
+ let settings_window = new settings_window output scrolled_window0
+ button_export_to_postscript (jump rendering_window)(choose_selection self) in
+ ignore(settingsb#connect#clicked settings_window#show) ;
+ ignore(button_export_to_postscript#connect#clicked (export_to_postscript output)) ;
+ ignore(closeb#connect#clicked window#misc#hide) ;
+ ignore(window#event#connect#delete (fun _ -> window#misc#hide () ; true ))
+end;;
+
+(* CSC: fare in modo che i due alberi vengano svuotati invece che distrutti *)
+class selection_window theory_rendering_window rendering_window =
+ let label = "cic:/" in
+ let theorylabel = "theory:/" in
+ let win = GWindow.window ~title:"Known uris" ~border_width:2 () in
+ let vbox = GPack.vbox ~packing:win#add () in
+ let hbox1 = GPack.hbox ~packing:(vbox#pack ~padding:5) () in
+ let (sw1,sw) =
+ create_gtk_trees hbox1 rendering_window theory_rendering_window mktree
+ in
+ let hbox =
+ GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let updateb =
+ GButton.button ~label:"Update"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let quitb =
+ GButton.button ~label:"Quit"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+object (self)
+ method show () = win#show ()
+ initializer
+ (* signal handlers here *)
+ ignore (win#connect#destroy ~callback:GMain.Main.quit) ;
+ ignore (quitb#connect#clicked GMain.Main.quit) ;
+ ignore(updateb#connect#clicked (updateb_pressed
+ theory_rendering_window rendering_window (ref sw1, ref sw, hbox1) mktree))
+end;;
+
+
+(* MAIN *)
let _ =
- let filename = ref "" in
- let usage_msg =
- "\nusage: mmlinterface[.opt] file url\n\n List of options:"
- in
- Arg.parse []
- (fun x ->
- if x = "" then raise (Arg.Bad "Empty filename or URL not allowed") ;
- if !filename = "" then
- filename := x
- else if !current_url = "" then
- current_url := x
- else
- begin
- prerr_string "More than two arguments provided\n" ;
- Arg.usage [] usage_msg ;
- exit (-1)
- end
- ) usage_msg ;
- initialize_everything !filename !current_url
+ build_uri_tree () ;
+ let output = GMathView.math_view ~width:400 ~height:380 ()
+ and label = GMisc.label ~text:"???" () in
+ let annotation_window = new annotation_window output label in
+ let rendering_window = new rendering_window annotation_window output label in
+ let theory_rendering_window = new theory_rendering_window rendering_window in
+ let selection_window =
+ new selection_window theory_rendering_window rendering_window
+ in
+ selection_window#show () ;
+ GMain.Main.main ()
;;