Draw.Mod.txt 5.1 KB

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