]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/DEVEL/lablgtk/lablgtk_20000829-0.1.0/examples/editor.ml
Initial revision
[helm.git] / helm / DEVEL / lablgtk / lablgtk_20000829-0.1.0 / examples / editor.ml
diff --git a/helm/DEVEL/lablgtk/lablgtk_20000829-0.1.0/examples/editor.ml b/helm/DEVEL/lablgtk/lablgtk_20000829-0.1.0/examples/editor.ml
new file mode 100644 (file)
index 0000000..5e3da80
--- /dev/null
@@ -0,0 +1,101 @@
+(* $Id$ *)
+
+open GMain
+
+let file_dialog ~title ~callback ?filename () =
+  let sel =
+    GWindow.file_selection ~title ~modal:true ?filename () in
+  sel#cancel_button#connect#clicked ~callback:sel#destroy;
+  sel#ok_button#connect#clicked ~callback:
+    begin fun () ->
+      let name = sel#get_filename in
+      sel#destroy ();
+      callback name
+    end;
+  sel#show ()
+
+class editor ?packing ?show () = object (self)
+  val text = GEdit.text ~editable:true ?packing ?show ()
+  val mutable filename = None
+
+  method text = text
+
+  method load_file name =
+    try
+      let ic = open_in name in
+      filename <- Some name;
+      text#freeze ();
+      text#delete_text ~start:0 ~stop:text#length;
+      let buf = String.create 1024 and len = ref 0 in
+      while len := input ic ~buf ~pos:0 ~len:1024; !len > 0 do
+       if !len = 1024 then text#insert buf
+       else text#insert (String.sub buf ~pos:0 ~len:!len)
+      done;
+      text#set_point 0;
+      text#thaw ();
+      close_in ic
+    with _ -> ()
+
+  method open_file () = file_dialog ~title:"Open" ~callback:self#load_file ()
+
+  method save_dialog () =
+    file_dialog ~title:"Save" ?filename
+      ~callback:(fun file -> self#output ~file) ()
+
+  method save_file () =
+    match filename with
+      Some file -> self#output ~file
+    | None -> self#save_dialog ()
+
+  method output ~file =
+    try
+      if Sys.file_exists file then Sys.rename ~src:file ~dst:(file ^ "~");
+      let oc = open_out file in
+      output_string oc (text#get_chars ~start:0 ~stop:text#length);
+      close_out oc;
+      filename <- Some file
+    with _ -> prerr_endline "Save failed"
+end
+
+let window = GWindow.window ~width:500 ~height:300 ~title:"editor" ()
+let vbox = GPack.vbox ~packing:window#add ()
+
+let menubar = GMenu.menu_bar ~packing:vbox#pack ()
+let factory = new GMenu.factory menubar
+let accel_group = factory#accel_group
+let file_menu = factory#add_submenu "File"
+let edit_menu = factory#add_submenu "Edit"
+
+let hbox = GPack.hbox ~packing:vbox#add ()
+let editor = new editor ~packing:hbox#add ()
+let scrollbar = GRange.scrollbar `VERTICAL ~packing:hbox#pack ()
+
+open GdkKeysyms
+
+let _ =
+  window#connect#destroy ~callback:Main.quit;
+  let factory = new GMenu.factory file_menu ~accel_group in
+  factory#add_item "Open..." ~key:_O ~callback:editor#open_file;
+  factory#add_item "Save" ~key:_S ~callback:editor#save_file;
+  factory#add_item "Save as..." ~callback:editor#save_dialog;
+  factory#add_separator ();
+  factory#add_item "Quit" ~key:_Q ~callback:window#destroy;
+  let factory = new GMenu.factory edit_menu ~accel_group in
+  factory#add_item "Copy" ~key:_C ~callback:editor#text#copy_clipboard;
+  factory#add_item "Cut" ~key:_X ~callback:editor#text#cut_clipboard;
+  factory#add_item "Paste" ~key:_V ~callback:editor#text#paste_clipboard;
+  factory#add_separator ();
+  factory#add_check_item "Word wrap" ~active:false
+    ~callback:editor#text#set_word_wrap;
+  factory#add_check_item "Read only" ~active:false
+    ~callback:(fun b -> editor#text#set_editable (not b));
+  window#add_accel_group accel_group;
+  editor#text#event#connect#button_press
+    ~callback:(fun ev ->
+      let button = GdkEvent.Button.button ev in
+      if button = 3 then begin
+       file_menu#popup ~button ~time:(GdkEvent.Button.time ev); true
+      end else false);
+  editor#text#set_vadjustment scrollbar#adjustment;
+  window#show ();
+  Main.main ()