-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDraw.Mod.txt
156 lines (138 loc) · 5.12 KB
/
Draw.Mod.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
MODULE Draw; (*NW 29.6.88 / 12.11.94 / 18.11.2013*)
IMPORT Files, Fonts, Viewers, Texts, Oberon,
TextFrames, MenuViewers, Graphics, GraphicFrames;
CONST Menu = "System.Close System.Copy System.Grow Draw.Delete Draw.Ticks Draw.Restore Draw.Store";
VAR W: Texts.Writer;
(*Exported commands:
Open, Delete,
SetWidth, ChangeColor, ChangeWidth, ChangeFont,
Store, Print, Macro, Ticks, Restore*)
PROCEDURE Open*;
VAR X, Y: INTEGER;
beg, end, t: LONGINT;
G: Graphics.Graph;
F: GraphicFrames.Frame;
V: Viewers.Viewer;
S: Texts.Scanner;
text: Texts.Text;
BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
IF (S.class = Texts.Char) & (S.c = "^") THEN
Oberon.GetSelection(text, beg, end, t);
IF t >= 0 THEN Texts.OpenScanner(S, text, beg); Texts.Scan(S) END
END ;
IF S.class = Texts.Name THEN
NEW(G); Graphics.Open(G, S.s);
NEW(F); GraphicFrames.Open(F, G);
Oberon.AllocateUserViewer(Oberon.Par.vwr.X, X, Y);
V := MenuViewers.New(TextFrames.NewMenu(S.s, Menu), F, TextFrames.menuH, X, Y)
END
END Open;
PROCEDURE Delete*;
VAR F: GraphicFrames.Frame;
BEGIN
IF Oberon.Par.frame = Oberon.Par.vwr.dsc THEN
F := Oberon.Par.vwr.dsc.next(GraphicFrames.Frame);
GraphicFrames.Erase(F); Graphics.Delete(F.graph)
END
END Delete;
PROCEDURE GetArg(VAR S: Texts.Scanner);
VAR T: Texts.Text; beg, end, time: LONGINT;
BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
IF (S.class = Texts.Char) & (S.c = "^") THEN
Oberon.GetSelection(T, beg, end, time);
IF time >= 0 THEN Texts.OpenScanner(S, T, beg); Texts.Scan(S) END
END
END GetArg;
PROCEDURE SetWidth*;
VAR S: Texts.Scanner;
BEGIN GetArg(S);
IF (S.class = Texts.Int) & (S.i > 0) & (S.i < 7) THEN Graphics.SetWidth(S.i) END
END SetWidth;
PROCEDURE ChangeColor*;
VAR S: Texts.Scanner; CM: Graphics.ColorMsg;
BEGIN GetArg(S);
IF S.class = Texts.Int THEN
CM.col := S.i MOD 16; GraphicFrames.Change(GraphicFrames.Selected(), CM)
END
END ChangeColor;
PROCEDURE ChangeWidth*;
VAR S: Texts.Scanner; WM: Graphics.WidMsg;
BEGIN GetArg(S);
IF S.class = Texts.Int THEN
WM.w := S.i; GraphicFrames.Change(GraphicFrames.Selected(), WM)
END
END ChangeWidth;
PROCEDURE ChangeFont*;
VAR S: Texts.Scanner; FM: Graphics.FontMsg;
BEGIN GetArg(S);
IF S.class = Texts.Name THEN
FM.fnt := Fonts.This(S.s);
IF FM.fnt # NIL THEN GraphicFrames.Change(GraphicFrames.Selected(), FM) END
END
END ChangeFont;
PROCEDURE Redraw(Q: BOOLEAN);
VAR v: Viewers.Viewer; G: GraphicFrames.Frame;
BEGIN
IF Oberon.Par.frame = Oberon.Par.vwr.dsc THEN v := Oberon.Par.vwr
ELSE v := Oberon.MarkedViewer()
END ;
IF (v # NIL) & (v.dsc # NIL) & (v.dsc.next IS GraphicFrames.Frame) THEN
G := v.dsc.next(GraphicFrames.Frame); G.ticked := Q OR ~G.ticked; GraphicFrames.Restore(G)
END
END Redraw;
PROCEDURE Ticks*;
BEGIN Redraw(FALSE)
END Ticks;
PROCEDURE Restore*;
BEGIN Redraw(TRUE)
END Restore;
PROCEDURE Backup (VAR name: ARRAY OF CHAR);
VAR res, i: INTEGER; ch: CHAR;
bak: ARRAY 32 OF CHAR;
BEGIN i := 0; ch := name[0];
WHILE ch > 0X DO bak[i] := ch; INC(i); ch := name[i] END ;
IF i < 28 THEN
bak[i] := "."; bak[i+1] := "B"; bak[i+2] := "a"; bak[i+3] := "k"; bak[i+4] := 0X;
Files.Rename(name, bak, res)
END
END Backup;
PROCEDURE Store*;
VAR S: Texts.Scanner;
Menu: TextFrames.Frame; G: GraphicFrames.Frame;
v: Viewers.Viewer;
BEGIN
IF Oberon.Par.frame = Oberon.Par.vwr.dsc THEN
Menu := Oberon.Par.vwr.dsc(TextFrames.Frame); G := Menu.next(GraphicFrames.Frame);
Texts.OpenScanner(S, Menu.text, 0); Texts.Scan(S);
IF S.class = Texts.Name THEN
Texts.WriteString(W, S.s); Texts.WriteString(W, " storing");
Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf);
Backup(S.s); GraphicFrames.Store(G, S.s)
END
ELSE
Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
IF S.class = Texts.Name THEN
v := Oberon.MarkedViewer();
IF (v.dsc # NIL) & (v.dsc.next IS GraphicFrames.Frame) THEN
G := v.dsc.next(GraphicFrames.Frame);
Texts.WriteString(W, S.s); Texts.WriteString(W, " storing");
Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf);
Backup(S.s); GraphicFrames.Store(G, S.s)
END
END
END
END Store;
PROCEDURE Macro*;
VAR S: Texts.Scanner;
T: Texts.Text;
time, beg, end: LONGINT;
Lname: ARRAY 32 OF CHAR;
BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
IF S.class = Texts.Name THEN
Lname := S.s; Texts.Scan(S);
IF S.class = Texts.Name THEN GraphicFrames.Macro(Lname, S.s) END ;
END
END Macro;
BEGIN Texts.OpenWriter(W); Texts.WriteString(W, "Draw - NW 9.8.2013");
Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
END Draw.