DIRECTORY ViewerClasses USING [Viewer], ViewerEvents; ViewerEventsImpl: CEDAR PROGRAM EXPORTS ViewerEvents = BEGIN OPEN ViewerEvents; EventProcs: TYPE = LIST OF RECORD[proc: EventProc, filter: REF, before: BOOL] ; eventProcs: ARRAY ViewerEvent OF EventProcs ; RegisterEventProc: PUBLIC PROC [proc: EventProc, event: ViewerEvent, filter: REF ANY _ NIL, before: BOOL _ TRUE] RETURNS [EventRegistration] = BEGIN RETURN [eventProcs[event] _ CONS[[proc, filter, before], eventProcs[event]]]; END; UnRegisterEventProc: PUBLIC PROC [proc: EventRegistration, event: ViewerEvent] = BEGIN prev: EventProcs _ eventProcs[event]; IF prev = NIL THEN RETURN; IF proc=prev THEN { -- its the first one on the list eventProcs[event] _ eventProcs[event].rest; RETURN }; FOR l: EventProcs _ prev.rest, l.rest UNTIL l=NIL DO IF l=proc THEN { prev.rest _ l.rest; RETURN }; prev _ l; ENDLOOP; END; ProcessEvent: PUBLIC PROC [event: ViewerEvent, viewer: ViewerClasses.Viewer, before: BOOL] RETURNS[abort: BOOL _ FALSE] = BEGIN FOR l: EventProcs _ eventProcs[event], l.rest UNTIL l=NIL DO IF l.first.before # before THEN LOOP; IF l.first.filter # NIL AND l.first.filter # viewer AND l.first.filter # viewer.class.flavor THEN LOOP; abort _ l.first.proc[viewer, event, before ! ABORTED => CONTINUE].abort; IF abort THEN RETURN; ENDLOOP; END; END. €ViewerEventsImpl.mesa; Edited by McGregor on August 2, 1982 11:44 am Last Edited by: Maxwell, January 11, 1983 12:27 pm Κ9– "cedar" style˜JšΟc™Jš-™-Jšœ2™2J˜šΟk ˜ Jšœžœ ˜J˜ J˜—šœž ˜Jšžœ˜J˜—Jšžœžœ˜J˜Jš œ žœžœžœžœžœ žœ˜OJšœ žœ žœ ˜-J˜šΟnœžœžœ&˜DJš œžœžœžœ žœžœ˜+Jšžœž˜#Jšžœžœ-˜MJšžœ˜J˜—šŸœžœžœ1ž˜VJ˜%Jšžœžœžœžœ˜šžœ žœ ˜4J˜+Jšžœ˜ —šžœ#žœžœž˜4Jšžœžœžœ˜.J˜ Jšžœ˜—Jšžœ˜J˜—šŸ œžœžœ<žœ˜ZJšžœž œž˜$šžœ+žœžœž˜