123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- 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.
|