aboutsummaryrefslogtreecommitdiff
path: root/src/main.ml
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.ml')
-rwxr-xr-xsrc/main.ml201
1 files changed, 100 insertions, 101 deletions
diff --git a/src/main.ml b/src/main.ml
index 8e557ce..4e49aa3 100755
--- a/src/main.ml
+++ b/src/main.ml
@@ -2,17 +2,15 @@ module E:Sym_expr.SYM_EXPR = Evaluate
let u = UTF8.from_utf8string
-let redraw t screen =
- let screen' =
- Screen.draw t screen
- |> Screen.draw_input t in
- t, screen'
-
-let action f msg (t, screen) = begin
- let t', count = f t in
- let t', screen' = redraw t' screen in
- Screen.status screen' @@ UTF8.from_utf8string (Printf.sprintf msg count);
- t', screen'
+let redraw t screen selection =
+ Screen.draw t selection screen;
+ Screen.draw_input t selection screen
+
+let action f msg (t, screen, selection) = begin
+ let count = f t in
+ redraw t screen selection;
+ Screen.status screen @@ UTF8.from_utf8string (Printf.sprintf msg count);
+ t, screen, selection
end
let catalog = Functions.C.compile @@ Functions.built_in Functions.C.empty
@@ -67,187 +65,188 @@ let parser screen = begin
menhirParser get_value
end
-let rec normal_mode (t, screen) = begin
+let rec normal_mode (t, screen, selection) = begin
match (parser screen) with
- | exception x -> normal_mode (t, screen)
+ | exception x -> normal_mode (t, screen, selection)
| Actions.Visual ->
Screen.status screen @@ u"-- Selection --";
- selection_mode (t, screen)
+ selection_mode (t, screen, selection)
| Actions.Move direction ->
- begin match Sheet.move direction t with
- | Some t' -> normal_mode @@ redraw t' screen
- | None -> normal_mode (t, screen)
+ begin match Selection.move direction selection with
+ | Some selection ->
+ redraw t screen selection;
+ normal_mode (t, screen, selection)
+ | None -> normal_mode (t, screen, selection)
end
- | Actions.Resize -> normal_mode (t, Screen.resize t screen)
+ | Actions.Resize -> normal_mode (t, Screen.resize t selection screen, selection)
| Actions.Delete ->
- let yank_before_delete = fun x -> Sheet.delete (fst (Sheet.yank x)) in
- normal_mode @@ action yank_before_delete "Deleted %d cells" (t, screen)
+ let yank_before_delete = fun x ->
+ ignore @@ Sheet.yank selection x;
+ Sheet.delete selection x in
+ normal_mode @@ action yank_before_delete "Deleted %d cells" (t, screen, selection)
| Actions.Yank ->
- normal_mode @@ action Sheet.yank "Yanked %d cells" (t, screen)
+ normal_mode @@ action (Sheet.yank selection) "Yanked %d cells" (t, screen, selection)
| Actions.Paste ->
- normal_mode @@ action Sheet.paste "Pasted %d cells" (t, screen)
+ let paste = Sheet.paste @@ Selection.extract selection in
+ normal_mode @@ action paste "Pasted %d cells" (t, screen, selection)
| Actions.Undo ->
begin match Sheet.undo t with
- | Some t' -> normal_mode @@ redraw t' screen
- | None -> normal_mode (t, screen)
+ | true ->
+ redraw t screen selection;
+ normal_mode (t, screen, selection)
+ | false -> normal_mode (t, screen, selection)
end
(* Edit a content *)
| Actions.Edit ->
- let position = Selection.extract t.Sheet.selected in
- let expr = Sheet.Raw.get_expr position t.Sheet.data
- |> Expression.show in
- begin match Screen.editor ~position ~prefix:(u"-> ") ~init:expr screen with
+ let position = Selection.extract selection in
+ let expr, _, _ = Sheet.get_cell position t in
+ let expr_repr = Expression.show expr in
+ begin match Screen.editor ~position ~prefix:(u"-> ") ~init:expr_repr screen with
| None ->
(* Restore the previous value *)
- Screen.status screen expr;
- normal_mode (t, screen)
+ Screen.status screen expr_repr;
+ normal_mode (t, screen, selection)
| Some content ->
let expr' = Expression.load content in
- let _, t' = Sheet.add expr' t in
- normal_mode @@ redraw t' screen
+ ignore @@ Sheet.add ~history:true expr' position t;
+ redraw t screen selection;
+ normal_mode (t, screen, selection)
end
(* Insert a new formula, the actual value will be erased *)
| Actions.InsertFormula ->
- let position = Selection.extract t.Sheet.selected in
+ let position = Selection.extract selection in
begin match Screen.editor ~position ~init:(u"=") screen with
| None ->
(* Restore the previous value *)
- let expr = Sheet.Raw.get_expr position t.Sheet.data
- |> Expression.show in
- Screen.status screen expr;
- normal_mode (t, screen)
+ let expr, _, _ = Sheet.get_cell position t in
+ Screen.status screen (Expression.show expr);
+ normal_mode (t, screen, selection)
| Some content ->
let expr = Expression.load content in
- let _, t' = Sheet.add expr t in
- normal_mode @@ redraw t' screen
+ ignore @@ Sheet.add ~history:true expr position t;
+ redraw t screen selection;
+ normal_mode (t, screen, selection)
end
-(*
- | Actions.Search ->
- let expr = Screen.search screen
- |> Expression.load in
- (*let pattern = Expression.eval expr (fun _ -> ScTypes.Refs.Single None) in*)
- let pattern = Expression.eval' expr catalog in
- begin match Sheet.search (`Pattern (Some pattern)) t with
- | Some t' -> normal_mode @@ redraw t' screen
- | None -> normal_mode (t, screen)
- end
-*)
-
| Actions.Button1_clicked coord ->
begin match Screen.get_cell screen coord with
- | None -> normal_mode (t, screen)
- | Some (x,y) -> begin match Sheet.move (Actions.Absolute (x,y)) t with
- | Some t' -> normal_mode @@ redraw t' screen
- | None -> normal_mode (t, screen)
+ | None -> normal_mode (t, screen, selection)
+ | Some (x,y) -> begin match Selection.move (Actions.Absolute (x,y)) selection with
+ | Some selection' ->
+ redraw t screen selection';
+ normal_mode (t, screen, selection')
+ | None -> normal_mode (t, screen, selection)
end
end
| Actions.Button1_released coord ->
begin match Screen.get_cell screen coord with
- | Some (x,y) when (x,y) <> (Selection.extract t.Sheet.selected) ->
+ | Some (x,y) when (x,y) <> (Selection.extract selection) ->
Screen.status screen @@ u"-- Selection -- ";
- let t' = { t with
- Sheet.selected = Selection.extends (Actions.Absolute (x,y)) t.Sheet.selected
- } in
- let screen' = Screen.draw t' screen in
- selection_mode (t', screen')
- | _ -> normal_mode (t, screen)
+ let selection = Selection.extends (Actions.Absolute (x,y)) selection in
+ Screen.draw t selection screen;
+ selection_mode (t, screen, selection)
+ | _ -> normal_mode (t, screen, selection)
end
| Actions.Command ->
begin match Screen.editor ~prefix:(u":") screen with
| None ->
- normal_mode (t, screen)
+ normal_mode (t, screen, selection)
| Some content ->
let args = try
UTF8.to_utf8string content
|> Tools.String.split ~by:' '
with Not_found ->
(UTF8.to_utf8string content, "") in
- command (t, screen) args
+ command (t, screen, selection) args
end
- | _ -> normal_mode (t, screen)
+ | _ -> normal_mode (t, screen, selection)
end
-and selection_mode (t, screen) = begin
+and selection_mode (t, screen, selection) = begin
match (parser screen) with
- | exception x -> selection_mode (t, screen)
+ | exception x -> selection_mode (t, screen, selection)
- | Actions.Resize -> selection_mode (t, Screen.resize t screen)
+ | Actions.Resize -> selection_mode (t, Screen.resize t selection screen, selection)
| Actions.Delete ->
- let yank_before_delete = fun x -> Sheet.delete (fst (Sheet.yank x)) in
- normal_mode @@ action yank_before_delete "Deleted %d cells" (t, screen)
+ let yank_before_delete = fun x ->
+ ignore @@ Sheet.yank selection x;
+ Sheet.delete selection x in
+ normal_mode @@ action yank_before_delete "Deleted %d cells" (t, screen, selection)
| Actions.Yank ->
- normal_mode @@ action Sheet.yank "Yanked %d cells" (t, screen)
+ normal_mode @@ action (Sheet.yank selection) "Yanked %d cells" (t, screen, selection)
| Actions.Escape ->
- let t' = { t with Sheet.selected = Selection.create (Selection.extract t.Sheet.selected) } in
- let screen' = Screen.draw t' screen
- |> Screen.draw_input t' in
- Screen.status screen UTF8.empty;
- normal_mode (t', screen')
+ let selection = Selection.create (Selection.extract selection) in
+ Screen.draw t selection screen;
+ Screen.draw_input t selection screen;
+ Screen.status screen UTF8.empty;
+ normal_mode (t, screen, selection)
| Actions.Move m ->
- let t' = { t with Sheet.selected = Selection.extends m t.Sheet.selected } in
- let screen' = Screen.draw t' screen in
- selection_mode (t', screen')
+ let selection = Selection.extends m selection in
+ Screen.draw t selection screen;
+ selection_mode (t, screen, selection)
| Actions.Button1_clicked coord ->
begin match Screen.get_cell screen coord with
- | None -> normal_mode (t, screen)
- | Some (x,y) -> begin match Sheet.move (Actions.Absolute (x,y)) t with
- | Some t' ->
+ | None -> normal_mode (t, screen, selection)
+ | Some (x,y) -> begin match Selection.move (Actions.Absolute (x,y)) selection with
+ | Some selection ->
Screen.status screen UTF8.empty;
- normal_mode @@ redraw t' screen
- | None -> normal_mode (t, screen)
+ redraw t screen selection;
+ normal_mode (t, screen, selection)
+ | None -> normal_mode (t, screen, selection)
end
end
- | _ -> selection_mode (t, screen)
+ | _ -> selection_mode (t, screen, selection)
end
-and command (t, screen) action = begin
+and command (t, screen, selection) action = begin
match action with
| ("w", file) -> (* Save the file *)
- Odf.save t.Sheet.data file;
- normal_mode @@ redraw t screen
-(*
- | ("repr", file) -> (* Save the file *)
- let out_gv = open_out_bin file in
- let form = Format.formatter_of_out_channel out_gv in
- Evaluator.repr form (Evaluator.get_catalog ());
- close_out out_gv;
- normal_mode @@ redraw t screen
-*)
+ Odf.save t file;
+ redraw t screen selection;
+ normal_mode (t, screen, selection)
| ("enew", _) -> (* Start a new spreadsheet *)
- normal_mode @@ redraw (Sheet.create catalog Sheet.Raw.empty) screen
+ let selection = Selection.create (1, 1)
+ and sheet = Sheet.create catalog in
+ redraw sheet screen selection;
+ normal_mode (sheet, screen, selection)
| ("q", _) -> (* Quit *)
t
- | _ -> normal_mode @@ redraw t screen
+ | _ ->
+ redraw t screen selection;
+ normal_mode (t, screen, selection)
end
let () = begin
let sheet =
if Array.length Sys.argv = 1 then
- Sheet.Raw.empty
+ Sheet.create catalog
else
- Odf.load catalog Sys.argv.(1) in
+ Odf.load catalog Sys.argv.(1)
+
+ and selection = Selection.create (1, 1) in
Screen.run (fun window ->
- ignore @@ normal_mode @@ redraw (Sheet.create catalog sheet) window)
+ redraw sheet window selection;
+ ignore @@ normal_mode (sheet, window, selection)
+ )
end