2
0

Dialog.txt 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. MODULE StdDialog;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Std/Mod/Dialog.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT
  5. Kernel, Meta, Strings, Files, Stores, Models, Sequencers, Views,
  6. Containers, Dialog, Properties, Documents, Converters, Windows;
  7. TYPE
  8. Item* = POINTER TO EXTENSIBLE RECORD
  9. next*: Item;
  10. item-, string-, filter-: POINTER TO ARRAY OF CHAR;
  11. shortcut-: ARRAY 8 OF CHAR;
  12. privateFilter-, failed, trapped: BOOLEAN; (* filter call failed, caused a trap *)
  13. res: INTEGER (* result code of failed filter *)
  14. END;
  15. FilterProcVal = RECORD (Meta.Value) p: Dialog.GuardProc END;
  16. FilterProcPVal = RECORD (Meta.Value) p: PROCEDURE(n: INTEGER; VAR p: Dialog.Par) END;
  17. ViewHook = POINTER TO RECORD (Views.ViewHook) END;
  18. VAR curItem-: Item; (** IN parameter for item filters **)
  19. PROCEDURE GetSubLoc* (mod: ARRAY OF CHAR; cat: Files.Name;
  20. OUT loc: Files.Locator; OUT name: Files.Name);
  21. VAR sub: Files.Name; file: Files.File; type: Files.Type;
  22. BEGIN
  23. IF (cat[0] = "S") & (cat[1] = "y") & (cat[2] = "m") THEN type := Kernel.symType
  24. ELSIF (cat[0] = "C") & (cat[1] = "o") & (cat[2] = "d") & (cat[3] = "e") THEN type := Kernel.objType
  25. ELSE type := ""
  26. END;
  27. Kernel.SplitName(mod, sub, name); Kernel.MakeFileName(name, type);
  28. loc := Files.dir.This(sub); file := NIL;
  29. IF loc # NIL THEN
  30. loc := loc.This(cat);
  31. IF sub = "" THEN
  32. IF loc # NIL THEN
  33. file := Files.dir.Old(loc, name, Files.shared);
  34. IF file = NIL THEN loc := NIL END
  35. END;
  36. IF loc = NIL THEN
  37. loc := Files.dir.This("System");
  38. IF loc # NIL THEN loc := loc.This(cat) END
  39. END
  40. END
  41. END
  42. END GetSubLoc;
  43. PROCEDURE Len (VAR str: ARRAY OF CHAR): INTEGER;
  44. VAR i: INTEGER;
  45. BEGIN
  46. i := 0; WHILE str[i] # 0X DO INC(i) END;
  47. RETURN i
  48. END Len;
  49. PROCEDURE AddItem* (i: Item; item, string, filter, shortcut: ARRAY OF CHAR);
  50. VAR j: INTEGER; ch: CHAR;
  51. BEGIN
  52. ASSERT(i # NIL, 20);
  53. NEW(i.item, Len(item) + 1);
  54. NEW(i.string, Len(string) + 1);
  55. NEW(i.filter, Len(filter) + 1);
  56. ASSERT((i.item # NIL) & (i.string # NIL) & (i.filter # NIL), 100);
  57. i.item^ := item$;
  58. i.string^ := string$;
  59. i.filter^ := filter$;
  60. i.shortcut := shortcut$;
  61. j := 0; ch := filter[0]; WHILE (ch # ".") & (ch # 0X) DO INC(j); ch := filter[j] END;
  62. i.privateFilter := (j > 0) & (ch = 0X);
  63. i.failed := FALSE; i.trapped := FALSE
  64. END AddItem;
  65. PROCEDURE ClearGuards* (i: Item);
  66. BEGIN
  67. i.failed := FALSE; i.trapped := FALSE
  68. END ClearGuards;
  69. PROCEDURE GetGuardProc (name: ARRAY OF CHAR; VAR i: Meta.Item;
  70. VAR par: BOOLEAN; VAR n: INTEGER);
  71. VAR j, k: INTEGER; num: ARRAY 32 OF CHAR;
  72. BEGIN
  73. j := 0;
  74. WHILE (name[j] # 0X) & (name[j] # "(") DO INC(j) END;
  75. IF name[j] = "(" THEN
  76. name[j] := 0X; INC(j); k := 0;
  77. WHILE (name[j] # 0X) & (name[j] # ")") DO num[k] := name[j]; INC(j); INC(k) END;
  78. IF (name[j] = ")") & (name[j+1] = 0X) THEN
  79. num[k] := 0X; Strings.StringToInt(num, n, k);
  80. IF k = 0 THEN Meta.LookupPath(name, i); par := TRUE
  81. ELSE Meta.Lookup("", i)
  82. END
  83. ELSE Meta.Lookup("", i)
  84. END
  85. ELSE
  86. Meta.LookupPath(name, i); par := FALSE
  87. END
  88. END GetGuardProc;
  89. PROCEDURE CheckFilter* (i: Item; VAR failed, ok: BOOLEAN; VAR par: Dialog.Par);
  90. VAR x: Meta.Item; v: FilterProcVal; vp: FilterProcPVal; p: BOOLEAN; n: INTEGER;
  91. BEGIN
  92. IF ~i.failed THEN
  93. curItem := i;
  94. par.disabled := FALSE; par.checked := FALSE; par.label := i.item$;
  95. par.undef := FALSE; par.readOnly := FALSE;
  96. i.failed := TRUE; i.trapped := TRUE;
  97. GetGuardProc(i.filter^, x, p, n);
  98. IF (x.obj = Meta.procObj) OR (x.obj = Meta.varObj) & (x.typ = Meta.procTyp) THEN
  99. IF p THEN
  100. x.GetVal(vp, ok);
  101. IF ok THEN vp.p(n, par) END
  102. ELSE
  103. x.GetVal(v, ok);
  104. IF ok THEN v.p(par) END
  105. END
  106. ELSE ok := FALSE
  107. END;
  108. IF ok THEN i.res := 0 ELSE i.res := 1 END;
  109. i.trapped := FALSE; i.failed := ~ok
  110. END;
  111. failed := i.failed
  112. END CheckFilter;
  113. PROCEDURE HandleItem* (i: Item);
  114. VAR res: INTEGER;
  115. BEGIN
  116. IF ~i.failed THEN
  117. Views.ClearQueue; res := 0;
  118. Dialog.Call(i.string^, " ", res)
  119. ELSIF (i # NIL) & i.failed THEN
  120. IF i.trapped THEN
  121. Dialog.ShowParamMsg("#System:ItemFilterTrapped", i.string^, i.filter^, "")
  122. ELSE
  123. Dialog.ShowParamMsg("#System:ItemFilterNotFound", i.string^, i.filter^, "")
  124. END
  125. END
  126. END HandleItem;
  127. PROCEDURE RecalcView* (v: Views.View);
  128. (* recalc size of all subviews of v, then v itself *)
  129. VAR m: Models.Model; v1: Views.View; c: Containers.Controller;
  130. minW, maxW, minH, maxH, w, h, w0, h0: INTEGER;
  131. BEGIN
  132. IF v IS Containers.View THEN
  133. c := v(Containers.View).ThisController();
  134. IF c # NIL THEN
  135. v1 := NIL; c.GetFirstView(Containers.any, v1);
  136. WHILE v1 # NIL DO
  137. RecalcView(v1);
  138. c.GetNextView(Containers.any, v1)
  139. END
  140. END
  141. END;
  142. IF v.context # NIL THEN
  143. m := v.context.ThisModel();
  144. IF (m # NIL) & (m IS Containers.Model) THEN
  145. m(Containers.Model).GetEmbeddingLimits(minW, maxW, minH, maxH);
  146. v.context.GetSize(w0, h0); w := w0; h := h0;
  147. Properties.PreferredSize(v, minW, maxW, minH, maxH, w, h, w, h);
  148. IF (w # w0) OR (h # h0) THEN v.context.SetSize(w, h) END
  149. END
  150. END
  151. END RecalcView;
  152. PROCEDURE Open* (v: Views.View; title: ARRAY OF CHAR;
  153. loc: Files.Locator; name: Files.Name; conv: Converters.Converter;
  154. asTool, asAux, noResize, allowDuplicates, neverDirty: BOOLEAN);
  155. VAR t: Views.Title; flags, opts: SET; done: BOOLEAN; d: Documents.Document; i: INTEGER;
  156. win: Windows.Window; c: Containers.Controller; seq: ANYPTR;
  157. BEGIN
  158. IF conv = NIL THEN conv := Converters.list END; (* use document converter *)
  159. ASSERT(v # NIL, 20);
  160. flags := {}; done := FALSE;
  161. IF noResize THEN
  162. flags := flags + {Windows.noResize, Windows.noHScroll, Windows.noVScroll}
  163. END;
  164. IF asTool THEN INCL(flags, Windows.isTool) END;
  165. IF asAux THEN INCL(flags, Windows.isAux) END;
  166. IF neverDirty THEN INCL(flags, Windows.neverDirty) END;
  167. i := 0;
  168. WHILE (i < LEN(t) - 1) & (title[i] # 0X) DO t[i] := title[i]; INC(i) END;
  169. t[i] := 0X;
  170. IF ~allowDuplicates THEN
  171. IF ~asTool & ~asAux THEN
  172. IF (loc # NIL) & (name # "") THEN Windows.SelectBySpec(loc, name, conv, done) END
  173. ELSE
  174. IF title # "" THEN Windows.SelectByTitle(v, flags, t, done) END
  175. END
  176. ELSE
  177. INCL(flags, Windows.allowDuplicates)
  178. END;
  179. IF ~done THEN
  180. IF v IS Documents.Document THEN
  181. IF v.context # NIL THEN
  182. d := Documents.dir.New(
  183. Views.CopyOf(v(Documents.Document).ThisView(), Views.shallow),
  184. Views.undefined, Views.undefined)
  185. ELSE
  186. d := v(Documents.Document)
  187. END;
  188. ASSERT(d.context = NIL, 22);
  189. v := d.ThisView(); ASSERT(v # NIL, 23)
  190. ELSIF v.context # NIL THEN
  191. ASSERT(v.context IS Documents.Context, 24);
  192. d := v.context(Documents.Context).ThisDoc();
  193. IF d.context # NIL THEN
  194. d := Documents.dir.New(Views.CopyOf(v, Views.shallow), Views.undefined, Views.undefined)
  195. END;
  196. ASSERT(d.context = NIL, 25)
  197. (*IF d.Domain() = NIL THEN Stores.InitDomain(d, v.Domain()) END (for views opened via Views.Old *)
  198. ELSE
  199. d := Documents.dir.New(v, Views.undefined, Views.undefined)
  200. END;
  201. IF asTool OR asAux THEN
  202. c := d.ThisController();
  203. c.SetOpts(c.opts + {Containers.noSelection})
  204. END;
  205. ASSERT(d.Domain() = v.Domain(), 100);
  206. ASSERT(d.Domain() # NIL, 101);
  207. seq := d.Domain().GetSequencer();
  208. IF neverDirty & (seq # NIL) THEN
  209. ASSERT(seq IS Sequencers.Sequencer, 26);
  210. seq(Sequencers.Sequencer).SetDirty(FALSE)
  211. END;
  212. IF neverDirty THEN
  213. (* change "fit to page" to "fit to window" in secondary windows *)
  214. c := d.ThisController(); opts := c.opts;
  215. IF Documents.pageWidth IN opts THEN
  216. opts := opts - {Documents.pageWidth} + {Documents.winWidth}
  217. END;
  218. IF Documents.pageHeight IN opts THEN
  219. opts := opts - {Documents.pageHeight} + {Documents.winHeight}
  220. END;
  221. c.SetOpts(opts)
  222. END;
  223. win := Windows.dir.New();
  224. IF seq # NIL THEN
  225. Windows.dir.OpenSubWindow(win, d, flags, t)
  226. ELSE
  227. Windows.dir.Open(win, d, flags, t, loc, name, conv)
  228. END
  229. END
  230. END Open;
  231. PROCEDURE (h: ViewHook) Open (v: Views.View; title: ARRAY OF CHAR;
  232. loc: Files.Locator; name: Files.Name; conv: Converters.Converter;
  233. asTool, asAux, noResize, allowDuplicates, neverDirty: BOOLEAN);
  234. BEGIN
  235. Open(v, title, loc, name, conv, asTool, asAux, noResize, allowDuplicates, neverDirty)
  236. END Open;
  237. PROCEDURE (h: ViewHook) OldView (loc: Files.Locator; name: Files.Name;
  238. VAR conv: Converters.Converter): Views.View;
  239. VAR w: Windows.Window; s: Stores.Store; c: Converters.Converter;
  240. BEGIN
  241. ASSERT(loc # NIL, 20); ASSERT(name # "", 21);
  242. Kernel.MakeFileName(name, ""); s := NIL;
  243. IF loc.res # 77 THEN
  244. w := Windows.dir.First(); c := conv;
  245. IF c = NIL THEN c := Converters.list END; (* use document converter *)
  246. WHILE (w # NIL) & ((w.loc = NIL) OR (w.name = "") OR (w.loc.res = 77) OR
  247. ~Files.dir.SameFile(loc, name, w.loc, w.name) OR (w.conv # c)) DO
  248. w := Windows.dir.Next(w)
  249. END;
  250. IF w # NIL THEN s := w.doc.ThisView() END
  251. END;
  252. IF s = NIL THEN
  253. Converters.Import(loc, name, conv, s);
  254. IF s # NIL THEN RecalcView(s(Views.View)) END
  255. END;
  256. IF s # NIL THEN RETURN s(Views.View) ELSE RETURN NIL END
  257. END OldView;
  258. PROCEDURE (h: ViewHook) RegisterView (v: Views.View;
  259. loc: Files.Locator; name: Files.Name; conv: Converters.Converter);
  260. BEGIN
  261. ASSERT(v # NIL, 20); ASSERT(loc # NIL, 21); ASSERT(name # "", 22);
  262. Kernel.MakeFileName(name, "");
  263. Converters.Export(loc, name, conv, v)
  264. END RegisterView;
  265. PROCEDURE Init;
  266. VAR h: ViewHook;
  267. BEGIN
  268. NEW(h); Views.SetViewHook(h)
  269. END Init;
  270. BEGIN
  271. Init
  272. END StdDialog.