<> <> <> <<>> DIRECTORY Imager USING [Context, Rectangle, VEC], IO USING [STREAM], Rope USING [ROPE], TIPUser USING [TIPTable], ViewerClasses USING [Viewer, ViewerRec]; Trc: CEDAR DEFINITIONS ~ BEGIN <> Context: TYPE ~ Imager.Context; Rectangle: TYPE ~ Imager.Rectangle; ROPE: TYPE ~ Rope.ROPE; VEC: TYPE ~ Imager.VEC; Viewer: TYPE ~ ViewerClasses.Viewer; ViewerRec: TYPE ~ ViewerClasses.ViewerRec; TRC: TYPE ~ REF TRCRep; TRCRep: TYPE ~ RECORD [ class: Class, instance: REF, listener: LIST OF Listener _ NIL ]; Class: TYPE ~ REF ClassRep; ClassRep: TYPE ~ RECORD [ flavor: ATOM, fcn: Fcn _, blockFcn: BlockFcn _ NIL, copy: CopyProc _ NIL, pickle: PickleProc _ NIL, --N.B. A class should not implement a PickleProc unless the class is registered!!! There is no way to Depickle an unregistered class depickle: DepickleProc _ NIL, notify: NotifyProc _ NIL, tipTable: TIPUser.TIPTable _ NIL, background: BackgroundProc _ NIL, control: BuildControlViewerProc _ NIL, classData: REF _ NIL --For certain types of subclassing ]; Fcn: TYPE ~ PROC [trc: TRC, a: REAL] RETURNS [b: REAL]; BlockFcn: TYPE ~ UNSAFE PROC [trc: TRC, from, to: UnsafeTable, count: NAT]; CopyProc: TYPE ~ PROC [trc: TRC] RETURNS [new: TRC]; PickleProc: TYPE ~ PROC [trc: TRC, stream: IO.STREAM, indentation: ROPE _ NIL]; <> <> DepickleProc: TYPE ~ PROC [class: Class, stream: IO.STREAM] RETURNS [trc: TRC]; NotifyProc: TYPE ~ PROC [viewer: Viewer, trc: TRC, input: LIST OF REF ANY]; BackgroundProc: TYPE ~ PROC [trc: TRC, context: Context, rectangle: Rectangle, whatChanged: REF _ NIL]; <> <> <> BuildControlViewerProc: TYPE ~ PROC [trc: TRC, info: ViewerRec, paint: BOOL] RETURNS [viewer: Viewer]; <> <> <> Listener: TYPE ~ RECORD [proc: ListenerProc, listenerData: REF]; ListenerProc: TYPE ~ PROC [trc: TRC, listenerData: REF]; Table: TYPE ~ REF TableRep; TableRep: TYPE ~ RECORD [SEQUENCE n: NAT OF REAL]; UnsafeTable: TYPE ~ LONG POINTER TO RECORD [SEQUENCE COMPUTED NAT OF REAL]; <> ApplyFcn: Fcn ~ INLINE { RETURN [trc.class.fcn[trc, a]]; }; ApplyBlockFcn: BlockFcn ~ UNCHECKED INLINE { trc.class.blockFcn[trc, from, to, count]; }; Copy: CopyProc ~ INLINE { RETURN [trc.class.copy[trc]] }; Pickle: PickleProc ~ INLINE { trc.class.pickle[trc, stream, indentation]; }; Depickle: DepickleProc ~ INLINE { RETURN [class.depickle[class, stream]]; }; PaintBackground: BackgroundProc ~ INLINE { trc.class.background[trc, context, rectangle, whatChanged]; }; BuildControlViewer: BuildControlViewerProc ~ INLINE { RETURN [trc.class.control[trc, info, paint]]; }; <> RegisterClass: PROC [class: Class]; <> ClassFromFlavor: PROC [flavor: ATOM] RETURNS [class: Class]; <> InstallListener: PROC [trc: TRC, listener: Listener] RETURNS [registration: REF]; <> DeinstallListener: PROC [registration: REF]; <> NotifyListeners: PROC [trc: TRC, fork: BOOL _ FALSE]; <> <> EnumerateRegisteredClasses: PROC [proc: ClassEnumProc]; ClassEnumProc: TYPE ~ PROC [class: Class] RETURNS [quit: BOOL _ FALSE]; <> NotifyNewRegistrations: PROC [proc: PROC [clientData: REF], clientData: REF _ NIL, firstTime: BOOL _ TRUE]; <> <> PickleArbitraryTrc: PROC [trc: TRC, stream: IO.STREAM, indentation: ROPE _ NIL]; DepickleArbitraryTrc: PROC [stream: IO.STREAM] RETURNS [trc: TRC]; <> FetchProp: PROC [viewer: Viewer, prop: ATOM] RETURNS [val: REF ANY]; <> <<1. If ISTYPE[ViewerOps.FetchProp[viewer, prop], PropEvaluator], then return the result obtained by calling the eval proc with viewer, prop, and the eval data.>> <<2. If ViewerOps.FetchProp[viewer, prop]~NIL, then recursively examine viewer.parent, etc.>> PropEvaluator: TYPE ~ REF PropEvaluatorRep; PropEvaluatorRep: TYPE ~ RECORD [ proc: PROC [viewer: Viewer, prop: ATOM, data: REF] RETURNS [val: REF], data: REF ]; <> <> DefaultBlockFcn: BlockFcn; <> DefaultCopy: CopyProc; DefaultPickle: PickleProc; <> DefaultDepickle: DepickleProc; --Matches PickleProc DefaultNotify: NotifyProc; --For classes with no direct screen interaction DefaultBackground: BackgroundProc; --For classes with no background to paint DefaultControl: BuildControlViewerProc; --For classes with nothing to control. <> <<classClass: Trc.Class ~ NEW[Trc.ClassRep _ [>> <> <> <> <> <> <> <> <> <> <> <<]]>> <> BuildTable: PROC [nElements: NAT, first, delta: REAL] RETURNS [table: Table]; <> UnsafeTableFromTable: PROC [table: Table, start, count: NAT _ 0] RETURNS [unsafeTable: UnsafeTable]; <> END.