(*
  .name         RxARexx
  .task         arexx-commands for arexx/macros
  .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: 04/04/95, 16:32:10, version 2 *)

MODULE RxARexx;

IMPORT
  SYS:= SYSTEM,

  ASCII,
  CN:= CmdNodes,
  Dos,
  F:= Files,
  IO:= IOServer,
  K:= Kernel,
  M:= Macro,
  Prj:= EProject,
  Req:= ERequests,
  Rx:= ERexx,
  Sett:= Settings,
  Str:= StrPool,
  W:= Windows;

PROCEDURE ExecuteRexx* (w: W.Window; VAR rexxPrg: ARRAY OF CHAR; VAR msg: SHORTINT);

VAR
  old, dir: Dos.FileLockPtr;
  name: ARRAY F.nameLen OF CHAR;
  path: ARRAY F.pathLen OF CHAR;
  i: INTEGER;

BEGIN
  IF Req.ReqFile(w.win, rexxPrg, FALSE) THEN
    F.GetPath(path, rexxPrg);
    F.GetName(name, rexxPrg);
    i:= 0;
    WHILE name[i] # ASCII.nul DO
      IF name[i] = " " THEN
        Req.ReqMessage(w.win, Str.nameContainsBlanks^, Str.cancel^);
        RETURN;
      END;
      INC(i);
    END;
    IO.Autosave;
    dir:= Dos.Lock(path, Dos.sharedLock);
    IF dir # NIL THEN
      old:= Dos.CurrentDir(dir);
      IF Rx.Execute(name, TRUE) THEN
        msg:= CN.HandleRexx(w);
        IF Sett.recRxPrg IN Sett.macroFlags THEN
          M.RemLastCmd;
          M.AddCommand(rexxPrg, TRUE);
        END;
      END;
      old:= Dos.CurrentDir(old);
      Dos.UnLock(dir);
    END;
  END;
  IO.RestoreStatus;
END ExecuteRexx;

PROCEDURE EnterRexx* (w: Prj.Window; VAR rexxCmd: ARRAY OF CHAR; VAR msg: SHORTINT);

BEGIN
  IF Req.ReqString(w.win, Str.enterRexxTitle^, Str.rexxCmds^, rexxCmd) = Req.cmdOk THEN
    w.Refresh; IO.Autosave;
    IF Rx.Execute(rexxCmd, FALSE) THEN
      msg:= CN.HandleRexx(w);
      IF Sett.recRxCmdLine IN Sett.macroFlags THEN
        M.RemLastCmd;
        M.AddCommand(rexxCmd, FALSE);
      END;
      IO.RestoreStatus;
    END;
  END;
END EnterRexx;

PROCEDURE BeginMacro* (w: Prj.Window);

VAR
  a: ARRAY 1 OF LONGINT;
  cmd: ARRAY 30 OF CHAR;

BEGIN
  M.BeginMacro(w.win);
  a[0]:= w.pos;
  K.FormatString(cmd, "'Set POSITION %ld'", a);
  M.AddCommand(cmd, FALSE);
END BeginMacro;

PROCEDURE EndMacro*;

BEGIN
  M.EndMacro;
END EndMacro;

PROCEDURE SaveMacro* (w: Prj.Window);

BEGIN
  IF Rx.GetStr(M.filename) OR Req.ReqFile(w.win, M.filename, TRUE) THEN
    IF ~M.Save(M.filename) THEN
      Req.ReqMessage(w.win, Str.cannotSaveMacro^, Str.cancel^);
    END;
  END;
END SaveMacro;

PROCEDURE ExecMacro*;

BEGIN
  M.ExecMacro;
END ExecMacro;

PROCEDURE FreeMacro*;

BEGIN
  M.FreeMacro;
END FreeMacro;

END RxARexx.