]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/matita/matitaGui.ml
added support for (textual) cut and paste of mathml/boxml markup
[helm.git] / helm / matita / matitaGui.ml
index fe0b4a1f9870ebd3e314363692b8d55040303bac..cf141722992e3d49ccba720beba267d0396867d7 100644 (file)
@@ -29,7 +29,7 @@ open MatitaGeneratedGui
 open MatitaGtkMisc
 open MatitaMisc
 
-let gui_instance = ref None ;;
+let gui_instance = ref None
 
 class type browserWin =
   (* this class exists only because GEdit.combo_box_entry is not supported by
@@ -129,6 +129,11 @@ class gui () =
       ~default:BuildTimeConf.default_font_size "matita.font_size"
   in
   let source_buffer = source_view#source_buffer in
+(*   let _ =
+    source_view#event#connect#selection_clear (fun _ ->
+      prerr_endline "source_view: selection clear";
+      false)
+  in *)
   object (self)
     val mutable chosen_file = None
     val mutable _ok_not_exists = false
@@ -178,8 +183,7 @@ class gui () =
         ~website:"http://helm.cs.unibo.it"
         ()
       in
-      ignore (main#aboutMenuItem#connect#activate
-       (fun _ -> about_dialog#present ()));
+      connect_menu_item main#aboutMenuItem about_dialog#present;
         (* findRepl win *)
       let show_find_Repl () = 
         findRepl#toplevel#misc#show ();
@@ -292,12 +296,12 @@ class gui () =
           source_view#source_buffer#redo ();
           source_view#misc#grab_focus ()
       in
-      ignore(self#main#undoMenuItem#connect#activate ~callback:safe_undo);
+      connect_menu_item main#undoMenuItem safe_undo;
       ignore(source_view#source_buffer#connect#can_undo
-        ~callback:self#main#undoMenuItem#misc#set_sensitive);
-      ignore(self#main#redoMenuItem#connect#activate ~callback:safe_redo);
+        ~callback:main#undoMenuItem#misc#set_sensitive);
+      connect_menu_item main#redoMenuItem safe_redo;
       ignore(source_view#source_buffer#connect#can_redo
-        ~callback:self#main#redoMenuItem#misc#set_sensitive);
+        ~callback:main#redoMenuItem#misc#set_sensitive);
       ignore(source_view#connect#after#populate_popup
        ~callback:(fun pre_menu ->
          let menu = new GMenu.menu pre_menu in
@@ -316,7 +320,7 @@ class gui () =
          new_undoMenuItem#misc#set_sensitive
           (undoMenuItem#misc#get_flag `SENSITIVE);
          menu#remove (undoMenuItem :> GMenu.menu_item);
-         ignore(new_undoMenuItem#connect#activate ~callback:safe_undo);
+         connect_menu_item new_undoMenuItem safe_undo;
          let new_redoMenuItem =
           GMenu.image_menu_item
            ~image:(GMisc.image ~stock:`REDO ())
@@ -326,40 +330,41 @@ class gui () =
          new_redoMenuItem#misc#set_sensitive
           (redoMenuItem#misc#get_flag `SENSITIVE);
           menu#remove (redoMenuItem :> GMenu.menu_item);
-          ignore(new_redoMenuItem#connect#activate ~callback:safe_redo);
-         ));
-      let clipboard =
-       let atom = Gdk.Atom.clipboard in
-        GData.clipboard atom in
-      ignore (self#main#editMenu#connect#activate
-        ~callback:
-          (fun () ->
-            let something_selected =
-              (source_buffer#get_iter_at_mark `INSERT)#compare
-              (source_buffer#get_iter_at_mark `SEL_BOUND) <> 0
-            in
-             self#main#cutMenuItem#misc#set_sensitive something_selected;
-             self#main#copyMenuItem#misc#set_sensitive something_selected;
-             self#main#deleteMenuItem#misc#set_sensitive something_selected;
-             self#main#pasteMenuItem#misc#set_sensitive (clipboard#text <> None)
-          ));
-      ignore(self#main#cutMenuItem#connect#activate
-        ~callback:(fun () -> source_view#buffer#cut_clipboard clipboard));
-      ignore(self#main#copyMenuItem#connect#activate
-        ~callback:(fun () -> source_view#buffer#copy_clipboard clipboard));
-      ignore(self#main#pasteMenuItem#connect#activate
-        ~callback:(fun () ->
-          source_view#buffer#paste_clipboard clipboard;
-          (MatitaScript.instance ())#clean_dirty_lock));
-      ignore(self#main#deleteMenuItem#connect#activate
-        ~callback:(fun () -> ignore (source_view#buffer#delete_selection ())));
-      ignore(self#main#selectAllMenuItem#connect#activate
-        ~callback:(fun () ->
-          source_buffer#move_mark `INSERT source_buffer#start_iter;
-          source_buffer#move_mark `SEL_BOUND source_buffer#end_iter));
-      ignore(self#main#findReplMenuItem#connect#activate
-        ~callback:show_find_Repl);
-      ignore (findRepl#findEntry#connect#activate ~callback:find_forward);
+          connect_menu_item new_redoMenuItem safe_redo));
+      let clipboard = GData.clipboard Gdk.Atom.clipboard in
+      let text_selected () =
+        (source_buffer#get_iter_at_mark `INSERT)#compare
+          (source_buffer#get_iter_at_mark `SEL_BOUND) <> 0
+      in
+      let markup_selected () = MatitaMathView.get_selections () <> None in
+      connect_menu_item main#editMenu (fun () ->
+        let text_selected = text_selected () in
+        let markup_selected = markup_selected () in
+        let something_selected = text_selected || markup_selected in
+        main#cutMenuItem#misc#set_sensitive text_selected;
+        main#copyMenuItem#misc#set_sensitive something_selected;
+        main#deleteMenuItem#misc#set_sensitive text_selected;
+        main#pasteMenuItem#misc#set_sensitive (clipboard#text <> None));
+      connect_menu_item main#cutMenuItem (fun () ->
+        source_view#buffer#cut_clipboard clipboard);
+      connect_menu_item main#copyMenuItem (fun () ->
+        if text_selected () then
+          source_view#buffer#copy_clipboard clipboard
+        else if markup_selected () then
+          match MatitaMathView.get_selections () with
+          | None
+          | Some [] -> ()
+          | Some (s :: _) -> clipboard#set_text s);
+      connect_menu_item main#pasteMenuItem (fun () ->
+        source_view#buffer#paste_clipboard clipboard;
+        (MatitaScript.instance ())#clean_dirty_lock);
+      connect_menu_item main#deleteMenuItem (fun () ->
+        ignore (source_view#buffer#delete_selection ()));
+      connect_menu_item main#selectAllMenuItem (fun () ->
+        source_buffer#move_mark `INSERT source_buffer#start_iter;
+        source_buffer#move_mark `SEL_BOUND source_buffer#end_iter);
+      connect_menu_item main#findReplMenuItem show_find_Repl;
+      ignore (findRepl#findEntry#connect#activate find_forward);
         (* interface lockers *)
       let lock_world _ =
         main#buttonsToolbar#misc#set_sensitive false;
@@ -435,7 +440,7 @@ class gui () =
       ignore(develList#toplevel#event#connect#delete 
         (fun _ -> develList#toplevel#misc#hide();true));
       let selected_devel = ref None in
-      connect_menu_item self#main#developmentsMenuItem
+      connect_menu_item main#developmentsMenuItem
         (fun () -> refresh_devels_win ();develList#toplevel#misc#show ());
       
         (* add development win *)
@@ -531,7 +536,7 @@ class gui () =
           buf#insert ~iter:(buf#get_iter_at_mark (`NAME "locked"))
             ("\n" ^ GrafiteAstPp.pp_tactic ast)
       in
-      let tbar = self#main in
+      let tbar = main in
       connect_button tbar#introsButton (tac (A.Intros (loc, None, [])));
       connect_button tbar#applyButton (tac_w_term (A.Apply (loc, hole)));
       connect_button tbar#exactButton (tac_w_term (A.Exact (loc, hole)));
@@ -549,19 +554,19 @@ class gui () =
       connect_button tbar#cutButton (tac_w_term (A.Cut (loc, None, hole)));
       connect_button tbar#autoButton (tac (A.Auto (loc,None,None,None))); (* ALB *)
       MatitaGtkMisc.toggle_widget_visibility
-       ~widget:(self#main#tacticsButtonsHandlebox :> GObj.widget)
-       ~check:self#main#tacticsBarMenuItem;
+       ~widget:(main#tacticsButtonsHandlebox :> GObj.widget)
+       ~check:main#tacticsBarMenuItem;
       let module Hr = Helm_registry in
       if
         not (Hr.get_opt_default Hr.bool ~default:false "matita.tactics_bar")
       then 
-        self#main#tacticsBarMenuItem#set_active false;
+        main#tacticsBarMenuItem#set_active false;
       MatitaGtkMisc.toggle_callback 
         ~callback:(function 
-          | true -> self#main#toplevel#fullscreen () 
-          | false -> self#main#toplevel#unfullscreen ())
-        ~check:self#main#fullscreenMenuItem;
-      self#main#fullscreenMenuItem#set_active false;
+          | true -> main#toplevel#fullscreen () 
+          | false -> main#toplevel#unfullscreen ())
+        ~check:main#fullscreenMenuItem;
+      main#fullscreenMenuItem#set_active false;
         (* log *)
       MatitaLog.set_log_callback self#console#log_callback;
       GtkSignal.user_handler :=
@@ -579,7 +584,7 @@ class gui () =
       let s () = MatitaScript.instance () in
       let disableSave () =
         script_fname <- None;
-        self#main#saveMenuItem#misc#set_sensitive false
+        main#saveMenuItem#misc#set_sensitive false
       in
       let saveAsScript () =
         let script = s () in
@@ -648,7 +653,7 @@ class gui () =
       let bottom = locker (keep_focus bottom) in
       let jump = locker (keep_focus jump) in
       let connect_key sym f =
-        connect_key self#main#mainWinEventBox#event
+        connect_key main#mainWinEventBox#event
           ~modifiers:[`CONTROL] ~stop:true sym f;
         connect_key self#sourceView#event
           ~modifiers:[`CONTROL] ~stop:true sym f
@@ -685,19 +690,19 @@ class gui () =
                   GMain.Main.quit ()
                 with MatitaTypes.Cancel -> ())
           end);
-      connect_button self#main#scriptAdvanceButton advance;
-      connect_button self#main#scriptRetractButton retract;
-      connect_button self#main#scriptTopButton top;
-      connect_button self#main#scriptBottomButton bottom;
+      connect_button main#scriptAdvanceButton advance;
+      connect_button main#scriptRetractButton retract;
+      connect_button main#scriptTopButton top;
+      connect_button main#scriptBottomButton bottom;
       connect_key GdkKeysyms._Down advance;
       connect_key GdkKeysyms._Up retract;
       connect_key GdkKeysyms._Home top;
       connect_key GdkKeysyms._End bottom;
-      connect_button self#main#scriptJumpButton jump;
-      connect_menu_item self#main#openMenuItem   loadScript;
-      connect_menu_item self#main#saveMenuItem   saveScript;
-      connect_menu_item self#main#saveAsMenuItem saveAsScript;
-      connect_menu_item self#main#newMenuItem    newScript;
+      connect_button main#scriptJumpButton jump;
+      connect_menu_item main#openMenuItem   loadScript;
+      connect_menu_item main#saveMenuItem   saveScript;
+      connect_menu_item main#saveAsMenuItem saveAsScript;
+      connect_menu_item main#newMenuItem    newScript;
       connect_key GdkKeysyms._period
         (fun () ->
           source_buffer#insert ~iter:(source_buffer#get_iter_at_mark `INSERT)
@@ -711,11 +716,11 @@ class gui () =
          (* script monospace font stuff *)  
       self#updateFontSize ();
         (* debug menu *)
-      self#main#debugMenu#misc#hide ();
+      main#debugMenu#misc#hide ();
         (* status bar *)
-      self#main#hintLowImage#set_file (image_path "matita-bulb-low.png");
-      self#main#hintMediumImage#set_file (image_path "matita-bulb-medium.png");
-      self#main#hintHighImage#set_file (image_path "matita-bulb-high.png");
+      main#hintLowImage#set_file (image_path "matita-bulb-low.png");
+      main#hintMediumImage#set_file (image_path "matita-bulb-medium.png");
+      main#hintHighImage#set_file (image_path "matita-bulb-high.png");
         (* focus *)
       self#sourceView#misc#grab_focus ();
         (* main win dimension *)
@@ -724,8 +729,8 @@ class gui () =
       let main_w = width * 90 / 100 in 
       let main_h = height * 80 / 100 in
       let script_w = main_w * 6 / 10 in
-      self#main#toplevel#resize ~width:main_w ~height:main_h;
-      self#main#hpaneScriptSequent#set_position script_w;
+      main#toplevel#resize ~width:main_w ~height:main_h;
+      main#hpaneScriptSequent#set_position script_w;
         (* source_view *)
       ignore(source_view#connect#after#paste_clipboard 
         ~callback:(fun () -> (MatitaScript.instance ())#clean_dirty_lock));
@@ -794,9 +799,9 @@ class gui () =
       script_fname <- Some file;
       self#main#saveMenuItem#misc#set_sensitive true
         
-
     method console = console
-    method sourceView: GSourceView.source_view = (source_view: GSourceView.source_view)
+    method sourceView: GSourceView.source_view =
+      (source_view: GSourceView.source_view)
     method fileSel = fileSel
     method findRepl = findRepl
     method main = main
@@ -840,7 +845,7 @@ class gui () =
         keyBindingBoxes
 
     method setQuitCallback callback =
-      ignore (main#quitMenuItem#connect#activate callback);
+      connect_menu_item main#quitMenuItem callback;
       ignore (main#toplevel#event#connect#delete 
         (fun _ -> callback ();true));
       self#addKeyBinding GdkKeysyms._q callback