home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 10
/
Fresh_Fish_10_2352.bin
/
new
/
dev
/
obero
/
oberon
/
projectoberonsrc
/
parcelems.mod
(
.txt
)
< prev
next >
Wrap
Oberon Text
|
1994-10-17
|
23KB
|
515 lines
Syntax10.Scn.Fnt
Syntax10b.Scn.Fnt
Syntax10i.Scn.Fnt
MODULE ParcElems; (** CAS/MH/HM 20.4.1993 **)
IMPORT
SYSTEM, Input, Display, Files, Oberon, Fonts, Texts, TextFrames, TextPrinter;
CONST
(**StateMsg.id*)
set* = 0; get* = 1;
mm = TextFrames.mm; unit = TextFrames.Unit; Unit = TextPrinter.Unit;
Scale = mm DIV 10; MinTabDelta = 5*mm; ParcHeight = 3*mm; ColumnGap = 7*mm;
gridAdj = TextFrames.gridAdj; leftAdj = TextFrames.leftAdj; rightAdj = TextFrames.rightAdj;
pageBreak = TextFrames.pageBreak;
twoColumns = TextFrames.twoColumns;
AdjMask = {leftAdj, rightAdj};
rightKey = 0; middleKey = 1; leftKey = 2; cancel = {rightKey, middleKey, leftKey};
black = Display.black; white = Display.white;
SepH = 5;
MargW = 5; MargH = 5;
TYPE
StateMsg* = RECORD (Texts.ElemMsg)
id*: INTEGER;
pos*: LONGINT;
frame*: TextFrames.Frame;
par*: Texts.Scanner;
log*: Texts.Text
END;
W: Texts.Writer;
TabMarkImage: ARRAY 6 OF SET;
TabPat: LONGINT;
PROCEDURE RdSet (VAR r: Files.Rider; VAR s: SET);
BEGIN Files.ReadNum(r, SYSTEM.VAL(LONGINT, s))
END RdSet;
PROCEDURE WrtSet (VAR r: Files.Rider; s: SET);
BEGIN Files.WriteNum(r, SYSTEM.VAL(LONGINT, s))
END WrtSet;
PROCEDURE Str (s: ARRAY OF CHAR);
BEGIN Texts.WriteString(W, s)
END Str;
PROCEDURE Int (n: LONGINT);
BEGIN Texts.Write(W, " "); Texts.WriteInt(W, n, 0)
END Int;
PROCEDURE Ln;
BEGIN Texts.WriteLn(W)
END Ln;
PROCEDURE Min (x, y: LONGINT): LONGINT;
BEGIN
IF x < y THEN RETURN x ELSE RETURN y END
END Min;
PROCEDURE Max (x, y: LONGINT): LONGINT;
BEGIN
IF x > y THEN RETURN x ELSE RETURN y END
END Max;
PROCEDURE Matches (VAR S: Texts.Scanner; key: ARRAY OF CHAR): BOOLEAN;
VAR i: INTEGER;
BEGIN i := 0;
WHILE (S.s[i] # 0X) & (CAP(S.s[i]) = key[i]) DO INC(i) END;
RETURN (S.class = Texts.Name) & ((key[i] = 0X) OR (i >= 3)) & (S.s[i] = 0X)
END Matches;
PROCEDURE GetNextInt (VAR S: Texts.Scanner; lo, hi, def: LONGINT); (*constrained int w/ default*)
BEGIN Texts.Scan(S);
IF Matches(S, "DEFAULT") THEN S.class := Texts.Int; S.i := def
ELSIF S.class = Texts.Int THEN
IF (S.i < lo) OR (S.i >= hi) THEN S.i := def END
END
END GetNextInt;
PROCEDURE Grid (x: LONGINT): LONGINT;
BEGIN RETURN x + (-x) MOD (1 * mm)
END Grid;
PROCEDURE DrawCursor (x, y: INTEGER);
BEGIN Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, x, y)
END DrawCursor;
PROCEDURE TrackMouse (VAR x, y: INTEGER; VAR keys, keysum: SET);
BEGIN Input.Mouse(keys, x, y); DrawCursor(x, y); keysum := keysum + keys
END TrackMouse;
PROCEDURE FirstMark (col: SHORTINT; x, y0: INTEGER);
BEGIN Display.ReplConst(col, x, y0 + SepH+1, 2, 5, Display.paint)
END FirstMark;
PROCEDURE FlipFirst (P: TextFrames.Parc; x0, y0: INTEGER);
BEGIN Display.ReplConst(white, x0 + SHORT((P.left + P.first) DIV unit), y0 + SepH+1, 2, 5, Display.invert)
END FlipFirst;
PROCEDURE MoveFirst (P: TextFrames.Parc; x0, y0, dw: INTEGER);
VAR px: LONGINT;
BEGIN px := Grid(LONG(dw) * unit);
px := Max(px, -P.left); px := Min(px, P.width);
IF px # P.first THEN FlipFirst(P, x0, y0); P.first := px; FlipFirst(P, x0, y0) END
END MoveFirst;
PROCEDURE FlipLeft (P: TextFrames.Parc; x0, y0: INTEGER);
BEGIN Display.ReplConst(white, x0 + SHORT(P.left DIV unit), y0+SepH-MargH+1, MargW, MargH, Display.invert)
END FlipLeft;
PROCEDURE MoveLeft (P: TextFrames.Parc; rm: LONGINT; x0, y0, dw: INTEGER);
VAR px: LONGINT;
BEGIN px := Grid(LONG(dw) * unit);
px := Max(px, 0); px := Min(px, rm);
IF px # P.left THEN FlipLeft(P, x0, y0); P.left := px; FlipLeft(P, x0, y0) END
END MoveLeft;
PROCEDURE FlipRight (P: TextFrames.Parc; x0, y0: INTEGER);
BEGIN Display.ReplConst(white, x0+SHORT((P.left + P.width) DIV unit) - MargW, y0+SepH-MargH+1, MargW, MargH, Display.invert)
END FlipRight;
PROCEDURE MoveRight (P: TextFrames.Parc; rm: LONGINT; x0, y0, dw: INTEGER);
VAR px: LONGINT;
BEGIN px := Grid(LONG(dw) * unit);
px := Max(px, P.left + 10*mm); px := Min(px, rm);
IF px # P.left + P.width THEN FlipRight(P, x0, y0); P.width := px - P.left; FlipRight(P, x0, y0) END
END MoveRight;
PROCEDURE TabMark (col: SHORTINT; x, y: INTEGER);
BEGIN Display.CopyPattern(col, TabPat, x, y, Display.replace)
END TabMark;
PROCEDURE FlipTab (P: TextFrames.Parc; i, x0, y0: INTEGER);
BEGIN Display.CopyPattern(white, TabPat, x0 + SHORT(P.tab[i] DIV unit), y0, Display.invert)
END FlipTab;
PROCEDURE GrabTab (P: TextFrames.Parc; x0, y0, dw: INTEGER; VAR i: INTEGER; VAR new: BOOLEAN);
CONST Gravity = 2*mm;
VAR j: INTEGER; lx, px, rx: LONGINT;
BEGIN
i := 0; j := P.nofTabs; new := FALSE; px := Grid(LONG(dw) * unit);
WHILE (i < j) & (P.tab[i] < px - Gravity) DO INC(i) END;
IF i < TextFrames.MaxTabs THEN
IF (i = j) OR (P.tab[i] >= px + Gravity) THEN
IF i = 0 THEN lx := MinTabDelta ELSE lx := P.tab[i - 1] + MinTabDelta END;
IF i = P.nofTabs THEN rx := P.width ELSE rx := P.tab[i] - MinTabDelta END;
IF px < lx THEN px := lx END;
IF px < rx THEN INC(P.nofTabs); new := TRUE;
WHILE j > i DO P.tab[j] := P.tab[j - 1]; DEC(j) END
END
ELSE px := P.tab[i]
END
ELSE DEC(i); px := P.tab[i]
END;
IF ~new THEN FlipTab(P, i, x0, y0) END;
P.tab[i] := px; FlipTab(P, i, x0, y0)
END GrabTab;
PROCEDURE MoveTab (P: TextFrames.Parc; rm: LONGINT; i, x0, y0, dw: INTEGER);
VAR lx, px, rx: LONGINT;
BEGIN px := Grid(LONG(dw) * unit);
IF i = 0 THEN lx := MinTabDelta ELSE lx := P.tab[i - 1] + MinTabDelta END;
IF i = P.nofTabs - 1 THEN rx := P.width ELSE rx := P.tab[i + 1] - MinTabDelta END;
px := Max(px, lx); px := Min(px, rx); px := Min(px, rm);
IF px # P.tab[i] THEN FlipTab(P, i, x0, y0); P.tab[i] := px; FlipTab(P, i, x0, y0) END
END MoveTab;
PROCEDURE RemoveTab (P: TextFrames.Parc; i: INTEGER);
BEGIN
WHILE i < P.nofTabs - 1 DO P.tab[i] := P.tab[i + 1]; INC(i) END;
DEC(P.nofTabs)
END RemoveTab;
PROCEDURE Changed (E: Texts.Elem; beg: LONGINT);
VAR T: Texts.Text;
BEGIN T := Texts.ElemBase(E); Texts.ChangeLooks(T, beg, beg+1, {}, NIL, 0, 0)
END Changed;
PROCEDURE ParcExtent* (T: Texts.Text; beg: LONGINT; VAR end: LONGINT);
VAR R: Texts.Reader;
BEGIN Texts.OpenReader(R, T, beg + 1);
REPEAT Texts.ReadElem(R) UNTIL R.eot OR (R.elem IS TextFrames.Parc);
IF R.eot THEN end := T.len ELSE end := Texts.Pos(R) - 1 END
END ParcExtent;
PROCEDURE ChangedParc* (P: TextFrames.Parc; beg: LONGINT);
VAR T: Texts.Text; end: LONGINT;
BEGIN T := Texts.ElemBase(P); ParcExtent(T, beg, end); Texts.ChangeLooks(T, beg, end, {}, NIL, 0, 0)
END ChangedParc;
PROCEDURE LoadParc* (P: TextFrames.Parc; VAR r: Files.Rider);
VAR version, i, j, k: LONGINT;
BEGIN Files.ReadNum(r, version); (*version 1*)
Files.ReadNum(r, P.first); Files.ReadNum(r, P.left); Files.ReadNum(r, P.width);
Files.ReadNum(r, P.lead); Files.ReadNum(r, P.lsp); Files.ReadNum(r, P.dsr);
RdSet(r, P.opts); Files.ReadNum(r, i);
IF i <= TextFrames.MaxTabs THEN P.nofTabs := SHORT(i) ELSE P.nofTabs := TextFrames.MaxTabs END;
j := 0; WHILE j < P.nofTabs DO Files.ReadNum(r, P.tab[j]); INC(j) END;
WHILE j < i DO Files.ReadNum(r, k); INC(j) END;
END LoadParc;
PROCEDURE StoreParc* (P: TextFrames.Parc; VAR r: Files.Rider);
VAR i: INTEGER;
BEGIN Files.WriteNum(r, 1); (*version 1*)
Files.WriteNum(r, P.first); Files.WriteNum(r, P.left); Files.WriteNum(r, P.width);
Files.WriteNum(r, P.lead); Files.WriteNum(r, P.lsp); Files.WriteNum(r, P.dsr);
WrtSet(r, P.opts); Files.WriteNum(r, P.nofTabs); i := 0;
WHILE i < P.nofTabs DO Files.WriteNum(r, P.tab[i]); INC(i) END
END StoreParc;
PROCEDURE CopyParc* (SP, DP: TextFrames.Parc);
VAR i: INTEGER;
BEGIN Texts.CopyElem(SP, DP);
DP.first := SP.first; DP.left := SP.left; DP.width := SP.width;
DP.lead := SP.lead; DP.lsp := SP.lsp; DP.dsr := SP.dsr;
DP.opts := SP.opts; DP.nofTabs := SP.nofTabs; i := SP.nofTabs;
WHILE i > 0 DO DEC(i); DP.tab[i] := SP.tab[i] END
END CopyParc;
PROCEDURE Prepare* (P: TextFrames.Parc; indent, unit: LONGINT);
BEGIN P.W := 9999 * unit; P.H := ParcHeight + P.lead;
IF gridAdj IN P.opts THEN INC(P.H, (-P.lead) MOD P.lsp) END
END Prepare;
PROCEDURE Draw* (P: TextFrames.Parc; F: Display.Frame; col: SHORTINT; x0, y0: INTEGER);
VAR i, x1, px, w, n: INTEGER;
B