home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / oberon / system / macro.mod (.txt) < prev    next >
Oberon Text  |  1977-12-31  |  4KB  |  105 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10i.Scn.Fnt
  3. StampElems
  4. Alloc
  5. 2 May 95
  6. Syntax10b.Scn.Fnt
  7. Syntax12b.Scn.Fnt
  8. PopupElems
  9. Alloc
  10. Macro
  11. Syntax10.Scn.Fnt
  12. Macro.Record 0
  13. Macro.Play 0
  14. Macro.Play 0 2
  15. Macro.Play 0 3
  16. Macro.Play 0 4
  17. Macro.Play 0 8
  18. Macro.Play 0 ^
  19. _______________________________________
  20. Macro.Record 1
  21. Macro.Play 1
  22. Macro.Play 1 2
  23. Macro.Play 1 3
  24. Macro.Play 1 4
  25. Macro.Play 1 8
  26. Macro.Play 1 ^
  27. MODULE Macro;    (** SHML 21 Jul 92, 
  28.     IMPORT Input, Texts, TF := TextFrames, Oberon;
  29.     CONST
  30.     (* understood by XE editor *)
  31.         CtrlB = 2X; CtrlD = 4X; CtrlE = 5X; CtrlF = 6X; BS = 8X; TAB = 9X; LF = 0AX; CtrlK = 0BX; CR = 0DX; CtrlN = 0EX;
  32.         CtrlP = 10X; CtrlT = 14X; CtrlW = 17X; CtrlX = 18X; CtrlZ = 1AX;
  33.         Legal = {ORD(CtrlB), ORD(CtrlD), ORD(CtrlE), ORD(CtrlF), ORD(BS), ORD(TAB), ORD(LF), ORD(CtrlK),
  34.             ORD(CR), ORD(CtrlN), ORD(CtrlP), ORD(CtrlT), ORD(CtrlW), ORD(CtrlX), ORD(CtrlZ)};
  35.         CtrlS = 13X; CtrlC = 3X; CtrlV = 16X; CtrlQ = 11X;    (* start/cut selection, copy, paste, end macro *)
  36.     VAR macro: ARRAY 8, 256 OF CHAR;
  37.     PROCEDURE Interpret(f: TF.Frame; msg: Oberon.InputMsg; ch: CHAR; VAR start: LONGINT; buf: Texts.Buffer);
  38.         VAR end: LONGINT; buf1: Texts.Buffer;
  39.     BEGIN
  40.         IF (ch >= " ") OR (ORD(ch) IN Legal) THEN msg.ch := ch; f.handle(f, msg)
  41.         ELSIF (ch = CtrlS) & (start < 0) THEN start := f.carloc.pos
  42.         ELSIF (ch = CtrlS) OR (ch = CtrlC) THEN
  43.             IF start >= 0 THEN
  44.                 end := f.carloc.pos;
  45.                 IF end < start THEN end := start; start := f.carloc.pos END;
  46.                 Texts.Save(f.text, start, end, buf);
  47.                 IF ch = CtrlS THEN Texts.Delete(f.text, start, end); TF.SetCaret(f, start) END;
  48.                 start := -1
  49.             END
  50.         ELSIF ch = CtrlV THEN
  51.             end := f.carloc.pos+buf.len; NEW(buf1); Texts.OpenBuf(buf1);
  52.             Texts.Copy(buf, buf1); Texts.Insert(f.text, f.carloc.pos, buf1); TF.SetCaret(f, end)
  53.         END
  54.     END Interpret;
  55.     PROCEDURE Record*;    (** n    Start recording of keyboard macro n **)
  56.         VAR
  57.             s: Texts.Scanner; buf: Texts.Buffer; f: TF.Frame; msg: Oberon.InputMsg;
  58.             n, i: INTEGER; start: LONGINT; ch: CHAR;
  59.     BEGIN
  60.         Texts.OpenScanner(s, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(s);
  61.         IF (s.class = Texts.Int) & (s.i < LEN(macro, 0)) & (Oberon.FocusViewer.dsc.next IS TF.Frame)
  62.                 & Oberon.FocusViewer.dsc.next(TF.Frame).hasCar THEN
  63.             f := Oberon.FocusViewer.dsc.next(TF.Frame); n := SHORT(s.i);
  64.             NEW(buf); Texts.OpenBuf(buf); start := -1;
  65.             msg.id := Oberon.consume; msg.fnt := Oberon.CurFnt; msg.col := Oberon.CurCol; msg.voff := Oberon.CurOff;
  66.             Oberon.FadeCursor(Oberon.Mouse);
  67.             i := 0;
  68.             REPEAT
  69.                 REPEAT UNTIL Input.Available() > 0;
  70.                 Input.Read(ch);
  71.                 Interpret(f, msg, ch, start, buf);
  72.                 macro[n, i] := ch; INC(i)
  73.             UNTIL (ch = CtrlQ) OR (i = LEN(macro, 1)-1);
  74.             Oberon.DrawCursor(Oberon.Mouse, Oberon.Mouse.marker, Oberon.Mouse.X, Oberon.Mouse.Y);
  75.             macro[n, i-1] := 0X; macro[n, i] := 0X
  76.         END
  77.     END Record;
  78.     PROCEDURE Play*;    (** n [rep]    Playback keyboard macro n rep times **)
  79.         VAR
  80.             s: Texts.Scanner; sel: Texts.Text; beg, end, time: LONGINT;
  81.             buf: Texts.Buffer; f: TF.Frame; msg: Oberon.InputMsg;
  82.             n, rep, i: INTEGER; start: LONGINT;
  83.     BEGIN
  84.         Texts.OpenScanner(s, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(s);
  85.         IF (s.class = Texts.Int) & (s.i < LEN(macro, 0)) & (Oberon.FocusViewer.dsc.next IS TF.Frame)
  86.                 & Oberon.FocusViewer.dsc.next(TF.Frame).hasCar THEN
  87.             f := Oberon.FocusViewer.dsc.next(TF.Frame); n := SHORT(s.i); Texts.Scan(s);
  88.             IF (s.class = Texts.Char) & (s.line = 0) & (s.c = "^") THEN
  89.                 Oberon.GetSelection(sel, beg, end, time);
  90.                 IF time >= 0 THEN Texts.OpenScanner(s, sel, beg); Texts.Scan(s) END
  91.             END;
  92.             IF (s.line = 0) & (s.class = Texts.Int) & (s.i > 0) THEN rep := SHORT(s.i) ELSE rep := 1 END;
  93.             Oberon.FadeCursor(Oberon.Mouse);
  94.             REPEAT
  95.                 NEW(buf); Texts.OpenBuf(buf); start := -1;
  96.                 msg.id := Oberon.consume; msg.fnt := Oberon.CurFnt; msg.col := Oberon.CurCol; msg.voff := Oberon.CurOff;
  97.                 Oberon.FadeCursor(Oberon.Mouse);
  98.                 i := 0; WHILE macro[n, i] # 0X DO Interpret(f, msg, macro[n, i], start, buf); INC(i) END;
  99.                 DEC(rep)
  100.             UNTIL rep = 0;
  101.             Oberon.DrawCursor(Oberon.Mouse, Oberon.Mouse.marker, Oberon.Mouse.X, Oberon.Mouse.Y)
  102.         END
  103.     END Play;
  104. END Macro.
  105.