DIRECTORY AMTypes, BasicTime, Process, Real, ViewRec, ViewRecInsides; ViewRecSample: CEDAR MONITOR IMPORTS AMTypes, BasicTime, Process, Real, ViewRecInsides EXPORTS ViewRec, ViewRecInsides = BEGIN OPEN ViewRecInsides; behavior: PUBLIC ViewRec.BehaviorOptions _ []; delayed: PUBLIC REAL _ 0; z: PUBLIC REAL _ 0; roots: PUBLIC DataList _ NIL; activeCount, extantCount, eltCount: CARDINAL _ 0; SetBehavior: PUBLIC PROC [newBehavior: ViewRec.BehaviorOptions _ []] = {behavior _ newBehavior}; Sample: PROCEDURE = BEGIN oldPriority: ViewRec.DelayPriority _ behavior.delayParms.priority; TRUSTED {Process.SetPriority[DPToP[oldPriority]]}; WHILE TRUE DO parm: REAL; asCard: CARDINAL; start: BasicTime.Pulses _ BasicTime.GetClockPulses[]; last: DataList _ NIL; IF behavior.delayParms.priority # oldPriority THEN TRUSTED {Process.SetPriority[DPToP[oldPriority _ behavior.delayParms.priority]]}; activeCount _ extantCount _ eltCount _ 0; FOR r: DataList _ roots, r.rest WHILE r # NIL DO IF r.first.v.destroyed THEN BEGIN IF last # NIL THEN last.rest _ r.rest ELSE roots _ r.rest; END ELSE BEGIN SampleData[r.first]; last _ r; END; ENDLOOP; BEGIN OPEN behavior.delayParms; parm _ MIN[max, MAX[min, offset + dActive * activeCount + dExtant * extantCount + dElt * eltCount + dMicroseconds * BasicTime.PulsesToMicroseconds[BasicTime.GetClockPulses[] - start] ]]; END; IF (z > 0) AND (z < 1) THEN delayed _ (parm*(1-z) + delayed*z) ELSE delayed _ parm; asCard _ Real.RoundC[ABS[parm]]; Process.Pause[Process.MsecToTicks[asCard]] ENDLOOP; END; DPToP: PROC [dp: ViewRec.DelayPriority] RETURNS [Process.Priority] = INLINE {RETURN [SELECT dp FROM Normal => Process.priorityNormal, Background => Process.priorityBackground, Foreground => Process.priorityForeground, ENDCASE => ERROR]}; RedisplayElt: PUBLIC PROC [eh: REF ANY] = BEGIN ed: EltData _ NARROW[eh]; IF ed.update # NIL THEN ed.update[ed, TRUE]; END; SampleData: PUBLIC PROC [d: Data] = BEGIN IF d.v.destroyed OR d.v.iconic THEN {extantCount _ extantCount + 1; RETURN}; activeCount _ activeCount + 1; FOR ed: EltData _ d.last, ed.prev WHILE ed # NIL DO IF ed.update # NIL THEN {eltCount _ eltCount + 1; ed.update[ed, FALSE]}; ENDLOOP; END; SampleRV: PUBLIC PROC [rv: RecordViewer] = {SampleData[RVToData[rv]]}; OKProc: PUBLIC PROC [pt: Type, argSpecs, retSpecs: BindingList, createOptions: CreateOptions] RETURNS [ok, hasDom, hasRange: BOOLEAN] = BEGIN dom: Type _ AMTypes.Domain[pt]; range: Type _ AMTypes.Range[pt]; domArgs, rangeArgs: CARDINAL; SELECT AMTypes.TypeClass[dom] FROM structure, record => [ok, domArgs] _ SimpleEnough[dom, argSpecs, createOptions]; nil => {ok _ TRUE; domArgs _ 0}; ENDCASE => ok _ FALSE; IF NOT ok THEN RETURN [FALSE, FALSE, FALSE]; SELECT AMTypes.TypeClass[range] FROM structure, record => [ok, rangeArgs] _ SimpleEnough[range, retSpecs, createOptions]; nil => {ok _ TRUE; rangeArgs _ 0}; ENDCASE => ok _ FALSE; IF NOT ok THEN RETURN [FALSE, FALSE, FALSE]; RETURN [ok, domArgs > 0, rangeArgs > 0]; END; SimpleEnough: PUBLIC PROC [rt: Type, specs: BindingList, createOptions: CreateOptions] RETURNS [ok: BOOLEAN, count: CARDINAL] = BEGIN len: CARDINAL; tc: AMTypes.Class _ AMTypes.TypeClass[rt]; count _ 0; SELECT tc FROM record, structure => len _ AMTypes.NComponents[rt]; sequence, array => len _ 1; ENDCASE => ERROR NotAnAggregate; FOR i: CARDINAL IN [1 .. len] DO tt, t: Type; val: TypedVariable; sublist: BindingList; ok, visible: BOOLEAN; recers: RList; name: ROPE; SELECT tc FROM record, structure => BEGIN tt _ AMTypes.IndexToType[rt, i]; name _ AMTypes.IndexToName[rt, i]; END; sequence, array => BEGIN tt _ AMTypes.Range[rt]; name _ NIL; END; ENDCASE => ERROR; t _ AMTypes.GroundStar[tt]; [sublist, ,val, ok, visible, , , , recers] _ SelectBindings[specs, name, i]; count _ count + 1; IF ok AND NOT visible THEN count _ count - 1 ELSE BEGIN exception: BOOLEAN _ FALSE; IF Recognize[t: t, specials: recers, onlyRecognize: TRUE, specs: sublist, createOptions: createOptions].recognized THEN ok _ TRUE ELSE ok _ FALSE; IF createOptions.doAllRecords THEN {IF exception OR NOT ok THEN count _ count - 1} ELSE IF NOT ok THEN RETURN [FALSE, 0] ELSE IF exception THEN count _ count - 1; END; ENDLOOP; ok _ TRUE; END; Setup: PROC = BEGIN TRUSTED {Process.Detach[FORK Sample[]]}; END; Setup[]; END. RFILE: ViewRecSample.Mesa last edited by Spreitzer November 12, 1983 1:57 pm Κ,– "cedar" style˜Jšœ™Jšœ2™2J˜codešΟk ˜ Kšœ;˜;K˜—šΠbx œœ˜Kšœ2˜9Kšœ˜!K˜—Kšœœ˜K˜Kšœ œ˜.Kšœ œœ˜Kšœœœ˜K˜Kšœœ œ˜K˜Kšœ$œ˜1K˜šΟn œœœ.˜FK˜—K˜šŸœ œ˜Kš˜K˜BKšœ+˜2šœœ˜ Kšœœ˜ Kšœœ˜Kšœ5˜5Kšœœ˜Kšœ,œœJ˜„K˜)šœœœ˜0šœ˜Kš˜Kšœœœœ˜:Kš˜—š˜Kš˜K˜K˜ Kšœ˜—Kšœ˜—˜Kšœœ˜šœœœ˜˜8Kšœh˜h——Kšœ˜—šœ œ ˜K˜"—Kšœ˜Kšœœ˜ K˜*Kšœ˜—Kšœ˜—K˜šŸœœœ˜Kšœœœ˜K˜!K˜)K˜)Kšœœ˜——K˜š Ÿ œœœœœ˜)Kš˜Kšœœ˜Kšœ œœœ˜,Kšœ˜—K˜šŸ œœœ ˜#Kš˜Kšœœ œ!œ˜LK˜šœœœ˜3Kšœ œœ)œ˜HKšœ˜—Kšœ˜—K˜šŸœœœ˜*K˜—K˜š ŸœœœKœœ˜‡Kš˜K˜K˜ Kšœœ˜šœ˜"˜$Kšœ+˜+—Kšœ œ˜ Kšœ œ˜—Kšœœœœœœœ˜,šœ˜$˜&Kšœ-˜-—Kšœ œ˜"Kšœ œ˜—Kšœœœœœœœ˜,Kšœ"˜(Kšœ˜—K˜š Ÿ œœœ>œœ œ˜Kš˜Kšœœ˜K˜*K˜ šœ˜Kšœ3˜3Kšœ˜Kšœœ˜ —šœœœ ˜ K˜ K˜K˜Kšœ œ˜K˜Kšœœ˜ šœ˜šœ˜K˜ K˜"Kšœ˜—šœ˜K˜Kšœœ˜ Kšœ˜—Kšœœ˜—K˜K˜LK˜Kšœœœ œ˜,šœ˜ Kšœ œœ˜Kšœ2œ;œ˜Kšœœ˜šœ˜"Kš œœ œœœ˜/—Kš œœœœœœ˜%Kšœœ œ˜)Kšœ˜—Kšœ˜—Kšœœ˜ Kšœ˜—K˜šŸœœ˜ Kš˜Kšœœ ˜(Kšœ˜—K˜K˜K˜Kšœ˜—…—ΐ>