(*
  .name         RxTexts
  .task         arexx texts commands
  .release      1.0
  .language     Oberon-2
  .translator   Amiga Oberon 3.2
  .system req.  AmigaOS 2.04 or higher
  .author       Joachim Barheine
  .address      Hochgrevestr. 3, 38640 Goslar
  .copyright    (c) 1995 by J.Barheine
*)

(* .info: 31/03/95, 17:23:54, version 2 *)

MODULE RxTexts;

IMPORT
  ASCII,
  F:= Files,
  IO:= IOServer,
  L:= UntracedLists,
  P:= EPrint,
  Prj:= EProject,
  Req:= ERequests,
  Rx:= ERexx,
  RxRequests,
  Str:= StrPool,
  T:= ETexts,
  W:= Windows;

PROCEDURE FirstText* (VAR w: W.Window);

BEGIN
  w:= IO.WindowFromText(IO.texts.head(IO.Text))(W.Window);
END FirstText;

PROCEDURE ForceAutosave*;

BEGIN
  IO.Autosave;
END ForceAutosave;

PROCEDURE InsertFile* (w: W.Window);

VAR
  filename: ARRAY F.filenameLen OF CHAR;
  name: ARRAY F.nameLen OF CHAR;
  done: BOOLEAN;

BEGIN
  IO.Busy(w.text, Str.inserting^);
  F.GetFilename(filename, w.text(T.Text).path, "");  (* current directory *)
  done:= Rx.GetStrLast(filename) OR Req.ReqFile(w.win, filename, FALSE);
  IF done THEN
    F.GetName(name, filename);
    w.DisplayOff;
    REPEAT
      done:= w.text(T.Text).InsertText(w.pos, filename);
    UNTIL done OR ~Prj.ReqInsertErr(w, name);
    w.DisplayOn;
  END;
  IO.BusyDone(w.text);
  Rx.SetBoolResult(done);
END InsertFile;

PROCEDURE LastText* (VAR w: W.Window);

BEGIN
  w:= IO.WindowFromText(IO.texts.tail(IO.Text))(W.Window);
END LastText;

PROCEDURE NextText* (VAR w: W.Window);

VAR
  res: BOOLEAN;

BEGIN
  res:= TRUE;
  IF w.text.next # NIL THEN
    w:= IO.WindowFromText(w.text.next(IO.Text))(W.Window);
  ELSIF Rx.Match("CYCLE") THEN
    FirstText(w);
  ELSE
    res:= FALSE;
  END;
  Rx.SetBoolResult(res);
END NextText;

PROCEDURE Open* (w: W.Window; new: T.Text): BOOLEAN;

VAR
  filename: ARRAY F.filenameLen OF CHAR;
  name: ARRAY F.nameLen OF CHAR;
  done: BOOLEAN;

BEGIN
  done:= FALSE;
  w.Busy(Str.opening^);
  w.UnMark;  (* forget marks *)
  IF ~w.text(T.Text).new THEN
    F.GetFilename(filename, w.text(T.Text).path, "")
  ELSE
    filename:= "";
  END;
  IF Rx.GetStrLast(filename) OR Req.ReqFile(w.win, filename, FALSE) THEN
    done:= TRUE;
    F.GetName(name, filename);
    LOOP
      IF new.Open(filename) THEN
        IF (w.text(T.Text).useCount = 1) & (w.text(T.Text).changes # 0) THEN
          CASE Prj.ReqSave(w) OF
            0: new.Dispose;       (* cancel *)
               done:= FALSE;
          | 1: Prj.Save(w);         (* save *)
               w.NewText(new);
          | 2: Prj.SaveAs(w);       (* save as *)
               w.NewText(new);
          | 3: w.NewText(new);    (* no *)
          END;
        ELSE
          w.NewText(new);
        END;
        EXIT;
      ELSIF ~Prj.ReqOpenErr(w, name) THEN
        new.Dispose;
        done:= FALSE;
        EXIT;
      END;
    END;  (* if open *)
  END;  (* loop *)
  w.BusyDone;
  Rx.SetBoolResult(done);
  RETURN done;
END Open;

PROCEDURE PrevText* (w: W.Window);

VAR
  res: BOOLEAN;

BEGIN
  res:= TRUE;
  IF w.text.prev # NIL THEN
    w:= IO.WindowFromText(w.text.prev(IO.Text))(W.Window);
  ELSIF Rx.Match("CYCLE") THEN
    LastText(w);
  ELSE
    res:= FALSE;
  END;
  Rx.SetBoolResult(res);
END PrevText;

PROCEDURE Print* (w: W.Window);

VAR
  doIt: BOOLEAN;

BEGIN
  doIt:= RxRequests.ReqPrint(w);
  IF doIt THEN
    IO.Busy(w.text, Str.printing^);
    P.Print(w, 0, w.text(T.Text).len - 1);
    IO.BusyDone(w.text);
  END;
  Rx.SetBoolResult(doIt);
END Print;

PROCEDURE Save* (w: W.Window);

BEGIN
  Prj.Save(w);
  Rx.SetBoolResult(w.text(T.Text).changes = 0);
END Save;

PROCEDURE^ SetFilename* (w: W.Window);

PROCEDURE SaveAs* (w: W.Window);

BEGIN
  IF Rx.More() THEN
    SetFilename(w);
    Prj.Save(w);
  ELSE
    Prj.SaveAs(w);
  END;
  Rx.SetBoolResult(w.text(T.Text).changes = 0);
END SaveAs;

PROCEDURE SaveTemp* (w: W.Window);

VAR
  f: F.File;
  filename: ARRAY 256 OF CHAR;
  done: BOOLEAN;

BEGIN
  done:= Rx.GetStrLastErr(filename) & f.Open(filename, TRUE);
  IF done THEN
   done:= w.text(T.Text).StoreTemp(f);
   f.Close;
  END;
  Rx.SetBoolResult(done);
END SaveTemp;

PROCEDURE SelectText* (VAR w: W.Window);

VAR
  id: LONGINT;
  n: L.NodePtr;

BEGIN
  IF Rx.GetNumErr(id) THEN
    n:= IO.GetText(SHORT(id));
    IF n # NIL THEN
      w:= n(W.Window);
    ELSE
      Rx.ErrorMsg(Str.unknownTextID^);
    END;
  END;
END SelectText;

PROCEDURE SetFilename* (w: W.Window);

VAR
  filename: ARRAY F.filenameLen OF CHAR;
  path: ARRAY F.pathLen OF CHAR;
  name: ARRAY F.nameLen OF CHAR;

BEGIN
  IF Rx.GetStrLastErr(filename) THEN
    F.GetName(name, filename);
    F.GetPath(path, filename);
    w.text(T.Text).RenameFile(path, name);
  END;
END SetFilename;

END RxTexts.