2
0

Markers.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. MODULE DevMarkers;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Dev/Mod/Markers.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT
  5. Kernel, Files, Stores, Fonts, Ports, Models, Views, Controllers, Properties, Dialog,
  6. TextModels, TextSetters, TextViews, TextControllers, TextMappers;
  7. CONST
  8. (** View.mode **)
  9. undefined* = 0; mark* = 1; message* = 2;
  10. firstMode = 1; lastMode = 2;
  11. (** View.err **)
  12. noCode* = 9999;
  13. errFile = "Errors"; point = Ports.point;
  14. TYPE
  15. View* = POINTER TO ABSTRACT RECORD (Views.View)
  16. mode-: INTEGER;
  17. err-: INTEGER;
  18. msg-: POINTER TO ARRAY OF CHAR;
  19. era: INTEGER
  20. END;
  21. Directory* = POINTER TO ABSTRACT RECORD END;
  22. StdView = POINTER TO RECORD (View) END;
  23. StdDirectory = POINTER TO RECORD (Directory) END;
  24. SetModeOp = POINTER TO RECORD (Stores.Operation)
  25. view: View;
  26. mode: INTEGER
  27. END;
  28. VAR
  29. dir-, stdDir-: Directory;
  30. globR: TextModels.Reader; globW: TextModels.Writer; (* recycling done in Load, Insert *)
  31. thisEra: INTEGER;
  32. (** View **)
  33. PROCEDURE (v: View) CopyFromSimpleView- (source: Views.View), EXTENSIBLE;
  34. BEGIN
  35. (* v.CopyFrom^(source); *)
  36. WITH source: View DO
  37. v.err := source.err; v.mode := source.mode;
  38. IF source.msg # NIL THEN
  39. NEW(v.msg, LEN(source.msg^)); v.msg^ := source.msg^$
  40. END
  41. END
  42. END CopyFromSimpleView;
  43. (*
  44. PROCEDURE (v: View) InitContext* (context: Models.Context), EXTENSIBLE;
  45. BEGIN
  46. ASSERT(v.mode # undefined, 20);
  47. v.InitContext^(context)
  48. END InitContext;
  49. *)
  50. PROCEDURE (v: View) InitErr* (err: INTEGER), NEW, EXTENSIBLE;
  51. BEGIN
  52. ASSERT(v.msg = NIL, 20);
  53. IF v.err # err THEN v.err := err; v.mode := mark END;
  54. IF v.mode = undefined THEN v.mode := mark END
  55. END InitErr;
  56. PROCEDURE (v: View) InitMsg* (msg: ARRAY OF CHAR), NEW, EXTENSIBLE;
  57. VAR i: INTEGER; str: ARRAY 1024 OF CHAR;
  58. BEGIN
  59. ASSERT(v.msg = NIL, 20);
  60. Dialog.MapString(msg, str);
  61. i := 0; WHILE str[i] # 0X DO INC(i) END;
  62. NEW(v.msg, i + 1); v.msg^ := str$;
  63. v.mode := mark
  64. END InitMsg;
  65. PROCEDURE (v: View) SetMode* (mode: INTEGER), NEW, EXTENSIBLE;
  66. VAR op: SetModeOp;
  67. BEGIN
  68. ASSERT((firstMode <= mode) & (mode <= lastMode), 20);
  69. IF v.mode # mode THEN
  70. NEW(op); op.view := v; op.mode := mode;
  71. Views.Do(v, "#System:ViewSetting", op)
  72. END
  73. END SetMode;
  74. (** Directory **)
  75. PROCEDURE (d: Directory) New* (type: INTEGER): View, NEW, ABSTRACT;
  76. PROCEDURE (d: Directory) NewMsg* (msg: ARRAY OF CHAR): View, NEW, ABSTRACT;
  77. (* SetModeOp *)
  78. PROCEDURE (op: SetModeOp) Do;
  79. VAR v: View; mode: INTEGER;
  80. BEGIN
  81. v := op.view;
  82. mode := v.mode; v.mode := op.mode; op.mode := mode;
  83. Views.Update(v, Views.keepFrames);
  84. IF v.context # NIL THEN v.context.SetSize(Views.undefined, Views.undefined) END
  85. END Do;
  86. PROCEDURE ToggleMode (v: View);
  87. VAR mode: INTEGER;
  88. BEGIN
  89. IF ABS(v.err) # noCode THEN
  90. IF v.mode < lastMode THEN mode := v.mode + 1 ELSE mode := firstMode END
  91. ELSE
  92. IF v.mode < message THEN mode := v.mode + 1 ELSE mode := firstMode END
  93. END;
  94. v.SetMode(mode)
  95. END ToggleMode;
  96. (* primitives for StdView *)
  97. PROCEDURE NumToStr (x: INTEGER; VAR s: ARRAY OF CHAR; VAR i: INTEGER);
  98. VAR j: INTEGER; m: ARRAY 32 OF CHAR;
  99. BEGIN
  100. ASSERT(x >= 0, 20);
  101. j := 0; REPEAT m[j] := CHR(x MOD 10 + ORD("0")); x := x DIV 10; INC(j) UNTIL x = 0;
  102. i := 0; REPEAT DEC(j); s[i] := m[j]; INC(i) UNTIL j = 0;
  103. s[i] := 0X
  104. END NumToStr;
  105. PROCEDURE Load (v: StdView);
  106. VAR view: Views.View; t: TextModels.Model; s: TextMappers.Scanner;
  107. err: INTEGER; i: INTEGER; ch: CHAR; loc: Files.Locator;
  108. msg: ARRAY 1024 OF CHAR;
  109. BEGIN
  110. err := ABS(v.err); NumToStr(err, msg, i);
  111. loc := Files.dir.This("Dev"); IF loc = NIL THEN RETURN END;
  112. loc := loc.This("Rsrc"); IF loc = NIL THEN RETURN END;
  113. view := Views.OldView(loc, errFile);
  114. IF (view # NIL) & (view IS TextViews.View) THEN
  115. t := view(TextViews.View).ThisModel();
  116. IF t # NIL THEN
  117. s.ConnectTo(t);
  118. REPEAT
  119. s.Scan
  120. UNTIL ((s.type = TextMappers.int) & (s.int = err)) OR (s.type = TextMappers.eot);
  121. IF s.type = TextMappers.int THEN
  122. s.Skip(ch); i := 0;
  123. WHILE (ch >= " ") & (i < LEN(msg) - 1) DO
  124. msg[i] := ch; INC(i); s.rider.ReadChar(ch)
  125. END;
  126. msg[i] := 0X
  127. END
  128. END
  129. END;
  130. NEW(v.msg, i + 1); v.msg^ := msg$
  131. END Load;
  132. PROCEDURE DrawMsg (v: StdView; f: Views.Frame; font: Fonts.Font; color: Ports.Color);
  133. VAR w, h, asc, dsc: INTEGER;
  134. BEGIN
  135. CASE v.mode OF
  136. mark:
  137. v.context.GetSize(w, h);
  138. f.DrawLine(point, 0, w - 2 * point, h, 0, color);
  139. f.DrawLine(w - 2 * point, 0, point, h, 0, color)
  140. | message:
  141. font.GetBounds(asc, dsc, w);
  142. f.DrawString(2 * point, asc, color, v.msg^, font)
  143. END
  144. END DrawMsg;
  145. PROCEDURE ShowMsg (v: StdView);
  146. BEGIN
  147. IF v.msg = NIL THEN Load(v) END;
  148. Dialog.ShowStatus(v.msg^)
  149. END ShowMsg;
  150. PROCEDURE Track (v: StdView; f: Views.Frame; x, y: INTEGER; buttons: SET);
  151. VAR c: Models.Context; t: TextModels.Model; u, w, h: INTEGER; isDown, in, in0: BOOLEAN; m: SET;
  152. BEGIN
  153. v.context.GetSize(w, h); u := f.dot; in0 := FALSE;
  154. in := (0 <= x) & (x < w) & (0 <= y) & (y < h);
  155. REPEAT
  156. IF in # in0 THEN
  157. f.MarkRect(u, 0, w - u, h, Ports.fill, Ports.invert, Ports.show); in0 := in
  158. END;
  159. f.Input(x, y, m, isDown);
  160. in := (0 <= x) & (x < w) & (0 <= y) & (y < h)
  161. UNTIL ~isDown;
  162. IF in0 THEN
  163. f.MarkRect(u, 0, w - u, h, Ports.fill, Ports.invert, Ports.hide);
  164. IF Dialog.showsStatus & ~(Controllers.modify IN buttons) & ~(Controllers.doubleClick IN buttons) THEN
  165. ShowMsg(v)
  166. ELSE
  167. ToggleMode(v)
  168. END;
  169. c := v.context;
  170. WITH c: TextModels.Context DO
  171. t := c.ThisModel();
  172. TextControllers.SetCaret(t, c.Pos() + 1)
  173. ELSE
  174. END
  175. END
  176. END Track;
  177. PROCEDURE SizePref (v: StdView; VAR p: Properties.SizePref);
  178. VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; asc, dsc, w: INTEGER;
  179. BEGIN
  180. c := v.context;
  181. IF (c # NIL) & (c IS TextModels.Context) THEN a := c(TextModels.Context).Attr(); font := a.font
  182. ELSE font := Fonts.dir.Default()
  183. END;
  184. font.GetBounds(asc, dsc, w);
  185. p.h := asc + dsc;
  186. CASE v.mode OF
  187. mark:
  188. p.w := p.h + 2 * point
  189. | message:
  190. IF v.msg = NIL THEN Load(v) END;
  191. p.w := font.StringWidth(v.msg^) + 4 * point
  192. END
  193. END SizePref;
  194. (* StdView *)
  195. PROCEDURE (v: StdView) ExternalizeAs (VAR s1: Stores.Store);
  196. BEGIN
  197. s1 := NIL
  198. END ExternalizeAs;
  199. PROCEDURE (v: StdView) SetMode(mode: INTEGER);
  200. BEGIN v.SetMode^(mode); ShowMsg(v)
  201. END SetMode;
  202. PROCEDURE (v: StdView) Restore (f: Views.Frame; l, t, r, b: INTEGER);
  203. VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; color: Ports.Color;
  204. w, h: INTEGER;
  205. BEGIN
  206. c := v.context; c.GetSize(w, h);
  207. WITH c: TextModels.Context DO a := c.Attr(); font := a.font ELSE font := Fonts.dir.Default() END;
  208. IF TRUE (*f.colors >= 4*) THEN color := Ports.grey50 ELSE color := Ports.defaultColor END;
  209. IF v.err >= 0 THEN
  210. f.DrawRect(point, 0, w - point, h, Ports.fill, color);
  211. DrawMsg(v, f, font, Ports.background)
  212. ELSE
  213. f.DrawRect(point, 0, w - point, h, 0, color);
  214. DrawMsg(v, f, font, Ports.defaultColor)
  215. END
  216. END Restore;
  217. PROCEDURE (v: StdView) GetBackground (VAR color: Ports.Color);
  218. BEGIN
  219. color := Ports.background
  220. END GetBackground;
  221. PROCEDURE (v: StdView) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message;
  222. VAR focus: Views.View);
  223. BEGIN
  224. WITH msg: Controllers.TrackMsg DO
  225. Track(v, f, msg.x, msg.y, msg.modifiers)
  226. ELSE
  227. END
  228. END HandleCtrlMsg;
  229. PROCEDURE (v: StdView) HandlePropMsg (VAR msg: Properties.Message);
  230. VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; asc, w: INTEGER;
  231. BEGIN
  232. WITH msg: Properties.Preference DO
  233. WITH msg: Properties.SizePref DO
  234. SizePref(v, msg)
  235. | msg: Properties.ResizePref DO
  236. msg.fixed := TRUE
  237. | msg: Properties.FocusPref DO
  238. msg.hotFocus := TRUE
  239. (*
  240. | msg: Properties.StorePref DO
  241. msg.view := NIL
  242. *)
  243. | msg: TextSetters.Pref DO
  244. c := v.context;
  245. IF (c # NIL) & (c IS TextModels.Context) THEN
  246. a := c(TextModels.Context).Attr(); font := a.font
  247. ELSE
  248. font := Fonts.dir.Default()
  249. END;
  250. font.GetBounds(asc, msg.dsc, w)
  251. ELSE
  252. END
  253. ELSE
  254. END
  255. END HandlePropMsg;
  256. (* StdDirectory *)
  257. PROCEDURE (d: StdDirectory) New (err: INTEGER): View;
  258. VAR v: StdView;
  259. BEGIN
  260. NEW(v); v.InitErr(err); RETURN v
  261. END New;
  262. PROCEDURE (d: StdDirectory) NewMsg (msg: ARRAY OF CHAR): View;
  263. VAR v: StdView;
  264. BEGIN
  265. NEW(v); v.InitErr(noCode); v.InitMsg(msg); RETURN v
  266. END NewMsg;
  267. (** Cleaner **)
  268. PROCEDURE Cleanup;
  269. BEGIN
  270. globR := NIL; globW := NIL
  271. END Cleanup;
  272. (** miscellaneous **)
  273. PROCEDURE Insert* (text: TextModels.Model; pos: INTEGER; v: View);
  274. VAR w: TextModels.Writer; r: TextModels.Reader;
  275. BEGIN
  276. ASSERT(v.era = 0, 20);
  277. Models.BeginModification(Models.clean, text);
  278. v.era := thisEra;
  279. IF pos > text.Length() THEN pos := text.Length() END;
  280. globW := text.NewWriter(globW); w := globW; w.SetPos(pos);
  281. IF pos > 0 THEN DEC(pos) END;
  282. globR := text.NewReader(globR); r := globR; r.SetPos(pos); r.Read;
  283. IF r.attr # NIL THEN w.SetAttr(r.attr) END;
  284. w.WriteView(v, Views.undefined, Views.undefined);
  285. Models.EndModification(Models.clean, text);
  286. END Insert;
  287. PROCEDURE Unmark* (text: TextModels.Model);
  288. VAR r: TextModels.Reader; v: Views.View; pos: INTEGER;
  289. script: Stores.Operation;
  290. BEGIN
  291. Models.BeginModification(Models.clean, text);
  292. Models.BeginScript(text, "#Dev:DeleteMarkers", script);
  293. r := text.NewReader(NIL); r.ReadView(v);
  294. WHILE ~r.eot DO
  295. IF r.view IS View THEN
  296. pos := r.Pos() - 1; text.Delete(pos, pos + 1); r.SetPos(pos)
  297. END;
  298. r.ReadView(v)
  299. END;
  300. INC(thisEra);
  301. Models.EndScript(text, script);
  302. Models.EndModification(Models.clean, text);
  303. END Unmark;
  304. PROCEDURE ShowFirstError* (text: TextModels.Model; focusOnly: BOOLEAN);
  305. VAR v1: Views.View; pos: INTEGER;
  306. BEGIN
  307. globR := text.NewReader(globR); globR.SetPos(0);
  308. REPEAT globR.ReadView(v1) UNTIL globR.eot OR (v1 IS View);
  309. IF ~globR.eot THEN
  310. pos := globR.Pos();
  311. TextViews.ShowRange(text, pos, pos, focusOnly);
  312. TextControllers.SetCaret(text, pos);
  313. v1(View).SetMode(v1(View).mode)
  314. END
  315. END ShowFirstError;
  316. (** commands **)
  317. PROCEDURE UnmarkErrors*;
  318. VAR t: TextModels.Model;
  319. BEGIN
  320. t := TextViews.FocusText();
  321. IF t # NIL THEN Unmark(t) END
  322. END UnmarkErrors;
  323. PROCEDURE NextError*;
  324. VAR c: TextControllers.Controller; t: TextModels.Model; v1: Views.View;
  325. beg, pos: INTEGER;
  326. BEGIN
  327. c := TextControllers.Focus();
  328. IF c # NIL THEN
  329. t := c.text;
  330. IF c.HasCaret() THEN pos := c.CaretPos()
  331. ELSIF c.HasSelection() THEN c.GetSelection(beg, pos)
  332. ELSE pos := 0
  333. END;
  334. TextControllers.SetSelection(t, TextControllers.none, TextControllers.none);
  335. globR := t.NewReader(globR); globR.SetPos(pos);
  336. REPEAT globR.ReadView(v1) UNTIL globR.eot OR (v1 IS View);
  337. IF ~globR.eot THEN
  338. pos := globR.Pos(); v1(View).SetMode(v1(View).mode);
  339. TextViews.ShowRange(t, pos, pos, TextViews.focusOnly)
  340. ELSE
  341. pos := 0; Dialog.Beep
  342. END;
  343. TextControllers.SetCaret(t, pos);
  344. globR := NIL
  345. END
  346. END NextError;
  347. PROCEDURE ToggleCurrent*;
  348. VAR c: TextControllers.Controller; t: TextModels.Model; v: Views.View; pos: INTEGER;
  349. BEGIN
  350. c := TextControllers.Focus();
  351. IF (c # NIL) & c.HasCaret() THEN
  352. t := c.text; pos := c.CaretPos();
  353. globR := t.NewReader(globR); globR.SetPos(pos); globR.ReadPrev;
  354. v := globR.view;
  355. IF (v # NIL) & (v IS View) THEN ToggleMode(v(View)) END;
  356. TextViews.ShowRange(t, pos, pos, TextViews.focusOnly);
  357. TextControllers.SetCaret(t, pos);
  358. globR := NIL
  359. END
  360. END ToggleCurrent;
  361. PROCEDURE SetDir* (d: Directory);
  362. BEGIN
  363. dir := d
  364. END SetDir;
  365. PROCEDURE Init;
  366. VAR d: StdDirectory;
  367. BEGIN
  368. thisEra := 1;
  369. NEW(d); dir := d; stdDir := d
  370. END Init;
  371. BEGIN
  372. Init; Kernel.InstallCleaner(Cleanup)
  373. CLOSE
  374. Kernel.RemoveCleaner(Cleanup)
  375. END DevMarkers.