GtkThread.main ();
m#destroy ()
+let popup_message_lowlevel
+ ~title ~message ?(no_separator=true) ~callback ~message_type ~buttons
+ ?parent ?(destroy_with_parent=true) ?(allow_grow=false) ?(allow_shrink=false)
+ ?icon ?(modal=true) ?(resizable=false) ?screen ?type_hint
+ ?(position=`CENTER_ON_PARENT) ?wm_name ?wm_class ?border_width ?width
+ ?height ?(show=true) ()
+=
+ let m =
+ GWindow.dialog
+ ~no_separator
+ ?parent ~destroy_with_parent
+ ~title ~allow_grow ~allow_shrink ?icon ~modal ~resizable ?screen
+ ?type_hint ~position ?wm_name ?wm_class ?border_width ?width ?height
+ ~show ()
+ in
+ let stock =
+ match message_type with
+ | `WARNING -> `DIALOG_WARNING
+ | `INFO -> `DIALOG_INFO
+ | `ERROR ->`DIALOG_ERROR
+ | `QUESTION -> `DIALOG_QUESTION
+ in
+ let image = GMisc.image ~stock ~icon_size:`DIALOG () in
+ let label = GMisc.label ~markup:message () in
+ let hbox = GPack.hbox ~spacing:10 () in
+ hbox#pack ~from:`START ~expand:true ~fill:true (image:>GObj.widget);
+ hbox#pack ~from:`START ~expand:true ~fill:true (label:>GObj.widget);
+ m#vbox#pack ~from:`START
+ ~padding:20 ~expand:true ~fill:true (hbox:>GObj.widget);
+ List.iter (fun (x,y) -> m#add_button_stock x y) buttons;
+ ignore(m#connect#response
+ ~callback:(fun a -> GMain.Main.quit ();callback a));
+ ignore(m#connect#close
+ ~callback:(fun _ -> GMain.Main.quit ();raise PopupClosed));
+ GtkThread.main ();
+ m#destroy ()
+
let ask_confirmation ~title ~message ?parent () =
- let rc = ref false in
+ let rc = ref `YES in
let callback =
- function `YES -> rc := true | `NO -> rc := false | _ -> rc := false
+ function
+ | `YES -> rc := `YES
+ | `NO -> rc := `NO
+ | `CANCEL -> rc := `CANCEL
+ | `DELETE_EVENT -> rc := `CANCEL
in
- let buttons = GWindow.Buttons.yes_no in
+ let buttons = [`CANCEL,`CANCEL ; `NO,`NO ; `YES,`YES] in
try
- popup_message ~title ~message ~message_type:`WARNING ~callback ~buttons
- ?parent ();
+ popup_message_lowlevel
+ ~title ~message ~message_type:`WARNING ~callback ~buttons ?parent ();
!rc
with
- | PopupClosed -> false
+ | PopupClosed -> `CANCEL
let report_error ~title ~message ?parent () =
let rc = ref false in
let callback _ = () in
let buttons = GWindow.Buttons.ok in
try
- popup_message ~title ~message ~message_type:`ERROR ~callback ~buttons
- ?parent ()
+ popup_message
+ ~title ~message ~message_type:`ERROR ~callback ~buttons ?parent ()
with
| PopupClosed -> ()
in
(* quit *)
self#setQuitCallback (fun () ->
- if
- MatitaGtkMisc.ask_confirmation
- ~parent:main#toplevel
- ~title:"Unsaved work!"
- ~message:("Your work is <b>unsaved</b>!\n\n"^
- "<i>Do you want to save the script before exiting?</i>")
- ()
- then
- (saveScript ();prerr_endline "SAVE";GMain.Main.quit ())
- else
- GMain.Main.quit ());
+ if source_view#buffer#modified then
+ begin
+ let rc =
+ MatitaGtkMisc.ask_confirmation
+ ~parent:main#toplevel
+ ~title:"Unsaved work!"
+ ~message:("Your work is <b>unsaved</b>!\n\n"^
+ "<i>Do you want to save the script before exiting?</i>")
+ ()
+ in
+ match rc with
+ | `YES -> saveScript ();GMain.Main.quit ()
+ | `NO -> GMain.Main.quit ()
+ | `CANCEL -> ()
+ end else GMain.Main.quit ());
connect_button self#main#scriptAdvanceButton advance;
connect_button self#main#scriptRetractButton retract;
connect_button self#main#scriptTopButton top;
val mutable filename = std_filename
initializer
- ignore(GMain.Timeout.add ~ms:20000
+ ignore(GMain.Timeout.add ~ms:30000
~callback:(fun _ -> self#_saveToBackuptFile ();true));
ignore(buffer#connect#modified_changed
(fun _ -> if buffer#modified then
buffer#set_modified false
method private _saveToBackuptFile () =
- let f = filename ^ "~" in
- let oc = open_out f in
- output_string oc (buffer#get_text ~start:buffer#start_iter
- ~stop:buffer#end_iter ());
- close_out oc;
- MatitaLog.debug ("backup file " ^ f ^ " saved")
+ if buffer#modified then
+ begin
+ let f = filename ^ "~" in
+ let oc = open_out f in
+ output_string oc (buffer#get_text ~start:buffer#start_iter
+ ~stop:buffer#end_iter ());
+ close_out oc;
+ MatitaLog.debug ("backup " ^ f ^ " saved")
+ end
method private goto_top =
MatitaSync.time_travel ~present:self#status ~past:init;