home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 10 / Fresh_Fish_10_2352.bin / new / dev / obero / oberon / projectoberonsrc / edit.mod (.txt) < prev    next >
Oberon Text  |  1994-11-16  |  21KB  |  499 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10i.Scn.Fnt
  3. Syntax12.Scn.Fnt
  4. Syntax10b.Scn.Fnt
  5. MODULE Edit;    (** CAS/MH/HM 27.4.1994 / NW 15.11.94 **)
  6.     IMPORT
  7.         Modules, Oberon, Display, Viewers, MenuViewers, Fonts, Printer,
  8.         Texts, TextFrames, ParcElems, TextPrinter;
  9.     CONST
  10.         Menu = "^Edit.Menu.Text System.Close  System.Copy  System.Grow  Edit.Search  Edit.Replace  Edit.Parcs  Edit.Store ";
  11.         OptionChar = "/";
  12.         mm = TextFrames.mm; Unit = TextPrinter.Unit;
  13.         Scale = mm DIV 10;    (*unit of user setable attributes is 1/10 mm*)
  14.         headerX = 15 * mm DIV Unit;
  15.         headerW = 165 * mm DIV Unit;
  16.         bodyX = 15 * mm DIV Unit; bodyY = 15 * mm DIV Unit;
  17.         bodyW = 165 * mm DIV Unit;
  18.         MaxPat = 128;
  19.         CR = 0DX;
  20.         R: Texts.Reader;
  21.         W: Texts.Writer;
  22.         mnam: ARRAY 12*3 + 1 OF CHAR;
  23.         find: RECORD
  24.             time, len: LONGINT;
  25.             buf: ARRAY MaxPat OF CHAR
  26.         END;
  27.         repl: RECORD
  28.             time: LONGINT;
  29.             buf: Texts.Buffer
  30.         END;
  31.     PROCEDURE Ch (ch: CHAR);
  32.     BEGIN Texts.Write(W, ch); Texts.Append(Oberon.Log, W.buf)
  33.     END Ch;
  34.     PROCEDURE Str (s: ARRAY OF CHAR);
  35.     BEGIN Texts.WriteString(W, s); Texts.Append(Oberon.Log, W.buf)
  36.     END Str;
  37.     PROCEDURE Int (n: LONGINT);
  38.     BEGIN Texts.Write(W, " "); Texts.WriteInt(W, n, 0); Texts.Append(Oberon.Log, W.buf)
  39.     END Int;
  40.     PROCEDURE Ln;
  41.     BEGIN Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
  42.     END Ln;
  43.     PROCEDURE Min (x, y: LONGINT): LONGINT;
  44.     BEGIN
  45.         IF x < y THEN RETURN x ELSE RETURN y END
  46.     END Min;
  47.     PROCEDURE AppendNum (VAR s: ARRAY OF CHAR; VAR i: INTEGER; n: LONGINT);
  48.         VAR j: INTEGER; digits: ARRAY 16 OF CHAR;
  49.     BEGIN j := 0;
  50.         REPEAT digits[j] := CHR(n MOD 10 + 30H); INC(j); n := n DIV 10 UNTIL n = 0;
  51.         REPEAT DEC(j); s[i] := digits[j]; INC(i) UNTIL j = 0;
  52.         s[i] := 0X
  53.     END AppendNum;
  54.     PROCEDURE AppendDate (VAR s: ARRAY OF CHAR);    (*s := s & "   (dd mmm yy)"*)
  55.         VAR time, date: LONGINT; i, j, k, m: INTEGER;
  56.     BEGIN Oberon.GetClock(time, date); i := 0;
  57.         WHILE s[i] # 0X DO INC(i) END;
  58.         s[i] := " "; s[i + 1] := " "; s[i + 2] := " "; s[i + 3] := "("; INC(i, 4);
  59.         AppendNum(s, i, date MOD 20H); s[i] := " "; INC(i);
  60.         m := SHORT((date DIV 20H) MOD 10H); k := m * 3; j := k - 3;
  61.         REPEAT s[i] := mnam[j]; INC(i); INC(j) UNTIL j = k;
  62.         s[i] := " "; INC(i); AppendNum(s, i, (date DIV 200H) MOD 100);
  63.         s[i] := ")"; s[i + 1] := 0X
  64.     END AppendDate;
  65.     PROCEDURE ShowAliens (t: Texts.Text);
  66.         VAR R: Texts.Reader; identify: Texts.IdentifyMsg;
  67.     BEGIN
  68.         Texts.OpenReader(R, t, 0); Texts.ReadElem(R);
  69.         WHILE ~R.eot DO identify.mod[31] := 0X; R.elem.handle(R.elem, identify);
  70.             IF identify.mod[31] = 1X THEN Ln; Str("pos"); Int(Texts.Pos(R) - 1);
  71.                 Str("  unknown element allocator: "); Str(identify.mod); Ch("."); Str(identify.proc)
  72.             END;
  73.             Texts.ReadElem(R)
  74.         END;
  75.         IF W.buf.len > 0 THEN Ln; Texts.Append(Oberon.Log, W.buf) END
  76.     END ShowAliens;
  77.     (* view support *)
  78.     PROCEDURE ShowPos (F: TextFrames.Frame; pos: LONGINT);
  79.         VAR beg, end, delta: LONGINT;
  80.     BEGIN delta := 200;
  81.         LOOP beg := F.org; end := TextFrames.Pos(F, F.X + F.W, F.Y);
  82.             IF (beg <= pos) & (pos < end) OR (delta = 0) THEN EXIT END;
  83.             TextFrames.Show(F, pos - delta); delta := delta DIV 2
  84.         END
  85.     END ShowPos;
  86.     PROCEDURE SetCaret (F: TextFrames.Frame; pos: LONGINT);
  87.     BEGIN Oberon.PassFocus(Viewers.This(F.X, F.Y)); TextFrames.SetCaret(F, pos)
  88.     END SetCaret;
  89.     PROCEDURE NewView (name: ARRAY OF CHAR; class: INTEGER;
  90.             T: Texts.Text; org: LONGINT): TextFrames.Frame;
  91.         VAR V: MenuViewers.Viewer; F, M: TextFrames.Frame; i, x, y: INTEGER;
  92.     BEGIN
  93.         IF class = Texts.String THEN i := 0;
  94.             WHILE name[i] # 0X DO INC(i) END;
  95.             name[i] := 22X; INC(i); name[i] := 0X;
  96.             WHILE i >= 0 DO name[i+1] := name[i]; DEC(i) END;
  97.             name[0] := 22X
  98.         END;
  99.         F := TextFrames.NewText(T, org);
  100.         Oberon.AllocateUserViewer(Oberon.Mouse.X, x, y);
  101.         M := TextFrames.NewMenu(name, Menu);
  102.         V := MenuViewers.New(M, F, TextFrames.menuH, x, y);
  103.         ShowPos(F, org); RETURN F
  104.     END NewView;
  105.     (* search & replace *)
  106.     PROCEDURE Find (T: Texts.Text; beg: LONGINT; VAR end: LONGINT);
  107.         VAR i, j, b, e: INTEGER; ch: CHAR; ref: ARRAY MaxPat OF CHAR;    (*ref [b..e) is readback buffer*)
  108.     BEGIN
  109.         Texts.OpenReader(R, T, beg); Texts.Read(R, ch); i := 0; ref[0] := ch; j := 0; b := 0; e := 1;
  110.         WHILE ~R.eot & (i < find.len) DO
  111.             IF (find.buf[i] = ch)
  112.                 OR (find.buf[i] = 0FFX)
  113.                     & ((ch < "0") OR (ch > "9") & (ch < "A") OR (ch > "Z") & (ch < "a") OR (ch > "z"))
  114.                         THEN INC(i); j := (j + 1) MOD MaxPat
  115.             ELSE i := 0; b := (b + 1) MOD MaxPat; j := b
  116.             END;
  117.             IF j # e THEN ch := ref[j]
  118.             ELSE Texts.Read(R, ch); ref[j] := ch; e := (e + 1) MOD MaxPat; INC(beg);
  119.             END
  120.         END;
  121.         IF i = find.len THEN end := beg ELSE end := -1 END
  122.     END Find;
  123.     PROCEDURE Check (T: Texts.Text; beg: LONGINT): BOOLEAN;
  124.         VAR ch: CHAR; i: INTEGER;
  125.     BEGIN i := 0;
  126.         IF (beg >= 0) & (find.len > 0) THEN Texts.OpenReader(R, T, beg); Texts.Read(R, ch);
  127.             WHILE ~R.eot & (i < find.len) & (ch = find.buf[i]) DO Texts.Read(R, ch); INC(i) END;
  128.         END;
  129.         RETURN i = find.len
  130.     END Check;
  131.     PROCEDURE SetReplBuf;
  132.         VAR T: Texts.Text; beg, end, time: LONGINT;
  133.     BEGIN Oberon.GetSelection(T, beg, end, time);
  134.         IF time > repl.time THEN repl.time := time;
  135.             Texts.OpenBuf(repl.buf); Texts.Save(T, beg, end, repl.buf)
  136.         END
  137.     END SetReplBuf;
  138.     PROCEDURE Subst (T: Texts.Text; beg: LONGINT; VAR end: LONGINT);
  139.     BEGIN Texts.Delete(T, beg, beg + find.len);
  140.         IF repl.buf.len > 0 THEN end := beg + repl.buf.len;
  141.             Texts.Insert(T, beg, repl.buf); Texts.Save(T, beg, end, repl.buf)
  142.         END
  143.     END Subst;
  144.     (* arguments *)
  145.     PROCEDURE MarkedFrame (): TextFrames.Frame;
  146.         VAR V: Viewers.Viewer;
  147.     BEGIN V := Oberon.MarkedViewer();
  148.         IF (V # NIL) & (V IS MenuViewers.Viewer) & (V.dsc.next IS TextFrames.Frame) THEN
  149.             RETURN V.dsc.next(TextFrames.Frame)
  150.         ELSE RETURN NIL
  151.         END
  152.     END MarkedFrame;
  153.     PROCEDURE FocusFrame (): TextFrames.Frame;
  154.         VAR V: Viewers.Viewer; f: Display.Frame;
  155.     BEGIN V := Oberon.FocusViewer;
  156.         IF (V # NIL) & (V IS MenuViewers.Viewer) & (V.dsc # NIL) THEN f := V.dsc.next;
  157.             IF (f # NIL) & (f IS TextFrames.Frame) THEN RETURN f(TextFrames.Frame) ELSE RETURN NIL END
  158.         ELSE RETURN NIL
  159.         END
  160.     END FocusFrame;
  161.     PROCEDURE TargetFrame (): TextFrames.Frame;    (*body frame or focus frame*)
  162.         VAR f: Display.Frame;
  163.     BEGIN
  164.         IF Oberon.Par.vwr.dsc = Oberon.Par.frame THEN f := Oberon.Par.frame.next;
  165.             IF (f # NIL) & (f IS TextFrames.Frame) THEN RETURN f(TextFrames.Frame) ELSE RETURN NIL END
  166.         ELSE RETURN FocusFrame()
  167.         END
  168.     END TargetFrame;
  169.     PROCEDURE GetMainArg (VAR S: Texts.Scanner; VAR end: LONGINT); (*takes recent selection if ^*)
  170.         VAR text: Texts.Text; beg, time: LONGINT;
  171.     BEGIN Texts.Scan(S); end := MAX(LONGINT);
  172.         IF (S.class = Texts.Char) & (S.c = "^") THEN Oberon.GetSelection(text, beg, end, time);
  173.             IF time >= 0 THEN Texts.OpenScanner(S, text, beg); Texts.Scan(S) END
  174.         END;
  175.         IF S.line # 0 THEN S.class := Texts.Inval END
  176.     END GetMainArg;
  177.     PROCEDURE GetArg (VAR S: Texts.Scanner);
  178.         (*takes selection in command frame if ^*)
  179.         VAR F: TextFrames.Frame;
  180.     BEGIN
  181.         Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  182.         IF (S.class = Texts.Char) & (S.c = "^") THEN F := Oberon.Par.frame(TextFrames.Frame);
  183.             IF F.hasSel THEN 
  184.                 Texts.OpenScanner(S, F.text, F.selbeg.pos); Texts.Scan(S); F.time := 0;
  185.             END
  186.         END
  187.     END GetArg;
  188.     PROCEDURE Change (sel: SET);
  189.         VAR S: Texts.Scanner; fnt: Fonts.Font; text: Texts.Text; beg, end, time: LONGINT; col, off: SHORTINT;
  190.     BEGIN GetArg(S); Oberon.GetSelection(text, beg, end, time);
  191.         IF time >= 0 THEN
  192.             IF (sel = {0}) & (S.class = Texts.Name) THEN fnt := Fonts.This(S.s)
  193.             ELSIF (sel = {1}) & (S.class = Texts.Int) & (0 <= S.i) & (S.i < 16) THEN col := SHORT(SHORT(S.i))
  194.             ELSIF (sel = {2}) & (S.class = Texts.Int) & (-128 <= S.i) & (S.i < 128) THEN off := SHORT(SHORT(S.i))
  195.             ELSE sel := {}
  196.             END;
  197.             IF sel # {} THEN Texts.ChangeLooks(text, beg, end, sel, fnt, col, off) END
  198.         END
  199.     END Change;
  200.     (* commands *)
  201.     PROCEDURE Locate*;
  202.         VAR S: Texts.Scanner; F: TextFrames.Frame; text: Texts.Text; beg, end, time: LONGINT;
  203.     BEGIN F := MarkedFrame(); Oberon.GetSelection(text, beg, end, time);
  204.         IF time > 0 THEN Texts.OpenScanner(S, text, beg); Texts.Scan(S);
  205.             WHILE (S.class # Texts.Int) & (S.line = 0) & ~S.eot DO Texts.Scan(S) END;
  206.             IF (F # NIL) & (S.class = Texts.Int) & (S.line = 0) THEN ShowPos(F, S.i); Se