DEADSOFTWARE

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