<> <> <> <<>> DIRECTORY RefTab USING [Create, Delete, EachPairAction, Fetch, Pairs, Ref, Store], Rope USING [Size], TextNodeRegistry; TextNodeRegistryImpl: CEDAR PROGRAM IMPORTS RefTab, Rope EXPORTS TextNodeRegistry ~ BEGIN Ref: TYPE ~ TextNodeRegistry.Ref; ProcSet: TYPE ~ TextNodeRegistry.ProcSet; registrationTable: RefTab.Ref = RefTab.Create[]; Register: PUBLIC PROC [activity: ATOM, procs: ProcSet] RETURNS [] ~ { <> [] _ RefTab.Store[registrationTable, activity, procs]; }; <<>> UnRegister: PUBLIC PROC [activity: ATOM] RETURNS [] ~ { <> [] _ RefTab.Delete[registrationTable, activity]; }; <<>> GetProcs: PUBLIC PROC[activity: ATOM] RETURNS [procs: ProcSet] ~ { <> RETURN[NARROW[RefTab.Fetch[registrationTable, activity].val]]; }; <<>> ActivityOn: PUBLIC PROC [activity: ATOM, on: BOOLEAN _ TRUE] RETURNS [wasOn: BOOLEAN] ~ { <> SetActivity: RefTab.EachPairAction = { <<[key: RefTab.Key, val: RefTab.Val] RETURNS [quit: BOOL _ FALSE]>> procs: TextNodeRegistry.ProcSet = NARROW[val]; IF procs#NIL THEN { wasOn _ procs.activityOn; procs.activityOn _ on; IF wasOn#on AND procs.activityProc#NIL THEN procs.activityProc[on, procs.activityProcData]; }; }; wasOn _ FALSE; IF activity#NIL THEN [] _ SetActivity[activity, RefTab.Fetch[registrationTable, activity].val] ELSE [] _ RefTab.Pairs[registrationTable, SetActivity]; }; <<>> DoTransform: PUBLIC PROC [activity: ATOM, node: Ref, parent: Ref _ NIL, wantFirst: BOOLEAN _ TRUE] RETURNS [new: Ref] ~ { <> procs: TextNodeRegistry.ProcSet = NARROW[RefTab.Fetch[registrationTable, activity].val]; new _ IF procs=NIL OR NOT procs.activityOn OR procs.transformProc=NIL THEN node ELSE procs.transformProc[node, parent, wantFirst, procs.transformProcData]; }; <<>> GetSize: PUBLIC PROC [activity: ATOM, node: Ref] RETURNS [size: INT] ~ { <> procs: TextNodeRegistry.ProcSet = NARROW[RefTab.Fetch[registrationTable, activity].val]; size _ IF procs=NIL OR NOT procs.activityOn OR procs.sizeProc=NIL THEN Rope.Size[node.rope] ELSE procs.sizeProc[node, procs.sizeProcData]; }; END.