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 >
Wrap
Oberon Text
|
1994-11-16
|
21KB
|
499 lines
Syntax10.Scn.Fnt
Syntax10i.Scn.Fnt
Syntax12.Scn.Fnt
Syntax10b.Scn.Fnt
MODULE Edit; (** CAS/MH/HM 27.4.1994 / NW 15.11.94 **)
IMPORT
Modules, Oberon, Display, Viewers, MenuViewers, Fonts, Printer,
Texts, TextFrames, ParcElems, TextPrinter;
CONST
Menu = "^Edit.Menu.Text System.Close System.Copy System.Grow Edit.Search Edit.Replace Edit.Parcs Edit.Store ";
OptionChar = "/";
mm = TextFrames.mm; Unit = TextPrinter.Unit;
Scale = mm DIV 10; (*unit of user setable attributes is 1/10 mm*)
headerX = 15 * mm DIV Unit;
headerW = 165 * mm DIV Unit;
bodyX = 15 * mm DIV Unit; bodyY = 15 * mm DIV Unit;
bodyW = 165 * mm DIV Unit;
MaxPat = 128;
CR = 0DX;
R: Texts.Reader;
W: Texts.Writer;
mnam: ARRAY 12*3 + 1 OF CHAR;
find: RECORD
time, len: LONGINT;
buf: ARRAY MaxPat OF CHAR
END;
repl: RECORD
time: LONGINT;
buf: Texts.Buffer
END;
PROCEDURE Ch (ch: CHAR);
BEGIN Texts.Write(W, ch); Texts.Append(Oberon.Log, W.buf)
END Ch;
PROCEDURE Str (s: ARRAY OF CHAR);
BEGIN Texts.WriteString(W, s); Texts.Append(Oberon.Log, W.buf)
END Str;
PROCEDURE Int (n: LONGINT);
BEGIN Texts.Write(W, " "); Texts.WriteInt(W, n, 0); Texts.Append(Oberon.Log, W.buf)
END Int;
PROCEDURE Ln;
BEGIN Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
END Ln;
PROCEDURE Min (x, y: LONGINT): LONGINT;
BEGIN
IF x < y THEN RETURN x ELSE RETURN y END
END Min;
PROCEDURE AppendNum (VAR s: ARRAY OF CHAR; VAR i: INTEGER; n: LONGINT);
VAR j: INTEGER; digits: ARRAY 16 OF CHAR;
BEGIN j := 0;
REPEAT digits[j] := CHR(n MOD 10 + 30H); INC(j); n := n DIV 10 UNTIL n = 0;
REPEAT DEC(j); s[i] := digits[j]; INC(i) UNTIL j = 0;
s[i] := 0X
END AppendNum;
PROCEDURE AppendDate (VAR s: ARRAY OF CHAR); (*s := s & " (dd mmm yy)"*)
VAR time, date: LONGINT; i, j, k, m: INTEGER;
BEGIN Oberon.GetClock(time, date); i := 0;
WHILE s[i] # 0X DO INC(i) END;
s[i] := " "; s[i + 1] := " "; s[i + 2] := " "; s[i + 3] := "("; INC(i, 4);
AppendNum(s, i, date MOD 20H); s[i] := " "; INC(i);
m := SHORT((date DIV 20H) MOD 10H); k := m * 3; j := k - 3;
REPEAT s[i] := mnam[j]; INC(i); INC(j) UNTIL j = k;
s[i] := " "; INC(i); AppendNum(s, i, (date DIV 200H) MOD 100);
s[i] := ")"; s[i + 1] := 0X
END AppendDate;
PROCEDURE ShowAliens (t: Texts.Text);
VAR R: Texts.Reader; identify: Texts.IdentifyMsg;
BEGIN
Texts.OpenReader(R, t, 0); Texts.ReadElem(R);
WHILE ~R.eot DO identify.mod[31] := 0X; R.elem.handle(R.elem, identify);
IF identify.mod[31] = 1X THEN Ln; Str("pos"); Int(Texts.Pos(R) - 1);
Str(" unknown element allocator: "); Str(identify.mod); Ch("."); Str(identify.proc)
END;
Texts.ReadElem(R)
END;
IF W.buf.len > 0 THEN Ln; Texts.Append(Oberon.Log, W.buf) END
END ShowAliens;
(* view support *)
PROCEDURE ShowPos (F: TextFrames.Frame; pos: LONGINT);
VAR beg, end, delta: LONGINT;
BEGIN delta := 200;
LOOP beg := F.org; end := TextFrames.Pos(F, F.X + F.W, F.Y);
IF (beg <= pos) & (pos < end) OR (delta = 0) THEN EXIT END;
TextFrames.Show(F, pos - delta); delta := delta DIV 2
END
END ShowPos;
PROCEDURE SetCaret (F: TextFrames.Frame; pos: LONGINT);
BEGIN Oberon.PassFocus(Viewers.This(F.X, F.Y)); TextFrames.SetCaret(F, pos)
END SetCaret;
PROCEDURE NewView (name: ARRAY OF CHAR; class: INTEGER;
T: Texts.Text; org: LONGINT): TextFrames.Frame;
VAR V: MenuViewers.Viewer; F, M: TextFrames.Frame; i, x, y: INTEGER;
BEGIN
IF class = Texts.String THEN i := 0;
WHILE name[i] # 0X DO INC(i) END;
name[i] := 22X; INC(i); name[i] := 0X;
WHILE i >= 0 DO name[i+1] := name[i]; DEC(i) END;
name[0] := 22X
END;
F := TextFrames.NewText(T, org);
Oberon.AllocateUserViewer(Oberon.Mouse.X, x, y);
M := TextFrames.NewMenu(name, Menu);
V := MenuViewers.New(M, F, TextFrames.menuH, x, y);
ShowPos(F, org); RETURN F
END NewView;
(* search & replace *)
PROCEDURE Find (T: Texts.Text; beg: LONGINT; VAR end: LONGINT);
VAR i, j, b, e: INTEGER; ch: CHAR; ref: ARRAY MaxPat OF CHAR; (*ref [b..e) is readback buffer*)
BEGIN
Texts.OpenReader(R, T, beg); Texts.Read(R, ch); i := 0; ref[0] := ch; j := 0; b := 0; e := 1;
WHILE ~R.eot & (i < find.len) DO
IF (find.buf[i] = ch)
OR (find.buf[i] = 0FFX)
& ((ch < "0") OR (ch > "9") & (ch < "A") OR (ch > "Z") & (ch < "a") OR (ch > "z"))
THEN INC(i); j := (j + 1) MOD MaxPat
ELSE i := 0; b := (b + 1) MOD MaxPat; j := b
END;
IF j # e THEN ch := ref[j]
ELSE Texts.Read(R, ch); ref[j] := ch; e := (e + 1) MOD MaxPat; INC(beg);
END
END;
IF i = find.len THEN end := beg ELSE end := -1 END
END Find;
PROCEDURE Check (T: Texts.Text; beg: LONGINT): BOOLEAN;
VAR ch: CHAR; i: INTEGER;
BEGIN i := 0;
IF (beg >= 0) & (find.len > 0) THEN Texts.OpenReader(R, T, beg); Texts.Read(R, ch);
WHILE ~R.eot & (i < find.len) & (ch = find.buf[i]) DO Texts.Read(R, ch); INC(i) END;
END;
RETURN i = find.len
END Check;
PROCEDURE SetReplBuf;
VAR T: Texts.Text; beg, end, time: LONGINT;
BEGIN Oberon.GetSelection(T, beg, end, time);
IF time > repl.time THEN repl.time := time;
Texts.OpenBuf(repl.buf); Texts.Save(T, beg, end, repl.buf)
END
END SetReplBuf;
PROCEDURE Subst (T: Texts.Text; beg: LONGINT; VAR end: LONGINT);
BEGIN Texts.Delete(T, beg, beg + find.len);
IF repl.buf.len > 0 THEN end := beg + repl.buf.len;
Texts.Insert(T, beg, repl.buf); Texts.Save(T, beg, end, repl.buf)
END
END Subst;
(* arguments *)
PROCEDURE MarkedFrame (): TextFrames.Frame;
VAR V: Viewers.Viewer;
BEGIN V := Oberon.MarkedViewer();
IF (V # NIL) & (V IS MenuViewers.Viewer) & (V.dsc.next IS TextFrames.Frame) THEN
RETURN V.dsc.next(TextFrames.Frame)
ELSE RETURN NIL
END
END MarkedFrame;
PROCEDURE FocusFrame (): TextFrames.Frame;
VAR V: Viewers.Viewer; f: Display.Frame;
BEGIN V := Oberon.FocusViewer;
IF (V # NIL) & (V IS MenuViewers.Viewer) & (V.dsc # NIL) THEN f := V.dsc.next;
IF (f # NIL) & (f IS TextFrames.Frame) THEN RETURN f(TextFrames.Frame) ELSE RETURN NIL END
ELSE RETURN NIL
END
END FocusFrame;
PROCEDURE TargetFrame (): TextFrames.Frame; (*body frame or focus frame*)
VAR f: Display.Frame;
BEGIN
IF Oberon.Par.vwr.dsc = Oberon.Par.frame THEN f := Oberon.Par.frame.next;
IF (f # NIL) & (f IS TextFrames.Frame) THEN RETURN f(TextFrames.Frame) ELSE RETURN NIL END
ELSE RETURN FocusFrame()
END
END TargetFrame;
PROCEDURE GetMainArg (VAR S: Texts.Scanner; VAR end: LONGINT); (*takes recent selection if ^*)
VAR text: Texts.Text; beg, time: LONGINT;
BEGIN Texts.Scan(S); end := MAX(LONGINT);
IF (S.class = Texts.Char) & (S.c = "^") THEN Oberon.GetSelection(text, beg, end, time);
IF time >= 0 THEN Texts.OpenScanner(S, text, beg); Texts.Scan(S) END
END;
IF S.line # 0 THEN S.class := Texts.Inval END
END GetMainArg;
PROCEDURE GetArg (VAR S: Texts.Scanner);
(*takes selection in command frame if ^*)
VAR F: TextFrames.Frame;
BEGIN
Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
IF (S.class = Texts.Char) & (S.c = "^") THEN F := Oberon.Par.frame(TextFrames.Frame);
IF F.hasSel THEN
Texts.OpenScanner(S, F.text, F.selbeg.pos); Texts.Scan(S); F.time := 0;
END
END
END GetArg;
PROCEDURE Change (sel: SET);
VAR S: Texts.Scanner; fnt: Fonts.Font; text: Texts.Text; beg, end, time: LONGINT; col, off: SHORTINT;
BEGIN GetArg(S); Oberon.GetSelection(text, beg, end, time);
IF time >= 0 THEN
IF (sel = {0}) & (S.class = Texts.Name) THEN fnt := Fonts.This(S.s)
ELSIF (sel = {1}) & (S.class = Texts.Int) & (0 <= S.i) & (S.i < 16) THEN col := SHORT(SHORT(S.i))
ELSIF (sel = {2}) & (S.class = Texts.Int) & (-128 <= S.i) & (S.i < 128) THEN off := SHORT(SHORT(S.i))
ELSE sel := {}
END;
IF sel # {} THEN Texts.ChangeLooks(text, beg, end, sel, fnt, col, off) END
END
END Change;
(* commands *)
PROCEDURE Locate*;
VAR S: Texts.Scanner; F: TextFrames.Frame; text: Texts.Text; beg, end, time: LONGINT;
BEGIN F := MarkedFrame(); Oberon.GetSelection(text, beg, end, time);
IF time > 0 THEN Texts.OpenScanner(S, text, beg); Texts.Scan(S);
WHILE (S.class # Texts.Int) & (S.line = 0) & ~S.eot DO Texts.Scan(S) END;
IF (F # NIL) & (S.class = Texts.Int) & (S.line = 0) THEN ShowPos(F, S.i); Se