DIRECTORY TrcButtons, Buttons USING [ButtonProc], Menus USING [MouseButton], TIPUser USING [InstantiateNewTIPTable], Trc, TrcViewers USING [CreateTRCViewer, InfoFromTRCViewer], ViewerClasses USING [Viewer, ViewerRec], ViewerOps USING [PaintViewer]; TrcButtonsImpl: CEDAR PROGRAM IMPORTS TIPUser, Trc, TrcViewers, ViewerOps EXPORTS TrcButtons ~ BEGIN OPEN TrcButtons; Create: PUBLIC PROC [trc: Trc.TRC, rectangle: Trc.Rectangle, dx: REAL, info: ViewerClasses.ViewerRec, proc: Buttons.ButtonProc, clientData: REF _ NIL, fork: BOOL _ TRUE, paint: BOOL _ TRUE] RETURNS [button: ViewerClasses.Viewer] ~ { instance: ButtonInstance ~ NEW[ButtonInstanceRep]; buttonTrc: Trc.TRC ~ NEW[Trc.TRCRep _ [class: buttonClass, instance: instance]]; info.data _ buttonTrc; button _ TrcViewers.CreateTRCViewer[trc: buttonTrc, rectangle: rectangle, dx: dx, info: info]; instance^ _ [ trc: trc, proc: proc, clientData: clientData, fork: fork, listenerReg: Trc.InstallListener[trc: trc, listener: [proc: ButtonListener, listenerData: button]] ]; }; AttachNewTrcToButton: PUBLIC PROC [button: ViewerClasses.Viewer, trc: Trc.TRC, paint: BOOL _ TRUE] ~ { buttonTrc: Trc.TRC ~ TrcViewers.InfoFromTRCViewer[button].trc; instance: ButtonInstance ~ NARROW[buttonTrc.instance]; Trc.DeinstallListener[registration: instance.listenerReg]; instance.trc _ trc; instance.listenerReg _ Trc.InstallListener[trc: trc, listener: [proc: ButtonListener, listenerData: button]]; IF paint THEN ViewerOps.PaintViewer[viewer: button, hint: all]; }; TrcFromButton: PUBLIC PROC [button: ViewerClasses.Viewer] RETURNS [trc: Trc.TRC] ~ { buttonTrc: Trc.TRC ~ TrcViewers.InfoFromTRCViewer[button].trc; instance: ButtonInstance ~ NARROW[buttonTrc.instance]; RETURN [instance.trc]; }; ButtonListener: Trc.ListenerProc = { button: ViewerClasses.Viewer ~ NARROW[listenerData]; buttonTrc: Trc.TRC ~ NARROW[button.data]; instance: ButtonInstance ~ NARROW[buttonTrc.instance]; Trc.NotifyListeners[trc: buttonTrc, fork: instance.fork]; }; ButtonInstance: TYPE ~ REF ButtonInstanceRep; ButtonInstanceRep: TYPE ~ RECORD [ trc: Trc.TRC, proc: Buttons.ButtonProc, clientData: REF _ NIL, fork: BOOL _ TRUE, listenerReg: REF _ NIL ]; ButtonFcn: Trc.Fcn = { instance: ButtonInstance ~ NARROW[trc.instance]; RETURN [Trc.ApplyFcn[instance.trc, a]]; }; ButtonBlockFcn: Trc.BlockFcn = UNCHECKED { instance: ButtonInstance ~ NARROW[trc.instance]; Trc.ApplyBlockFcn[trc: instance.trc, from: from, to: to, count: count]; }; ButtonNotify: Trc.NotifyProc = { instance: ButtonInstance ~ NARROW[trc.instance]; control, shift: BOOL _ FALSE; mouseButton: Menus.MouseButton _ red; FOR each: LIST OF REF ANY _ input, each.rest UNTIL each=NIL DO WITH each.first SELECT FROM token: ATOM => SELECT token FROM $Control => control _ TRUE; $Shift => shift _ TRUE; $Red => mouseButton _ red; $Yellow => mouseButton _ yellow; $Blue => mouseButton _ blue; $Hit => instance.proc[parent: viewer, clientData: instance.clientData, mouseButton: mouseButton, shift: shift, control: control]; ENDCASE; ENDCASE; ENDLOOP; }; ButtonBackground: Trc.BackgroundProc = { instance: ButtonInstance ~ NARROW[trc.instance]; Trc.PaintBackground[trc: instance.trc, context: context, rectangle: rectangle, whatChanged: $Button]; }; buttonClass: Trc.Class ~ NEW[Trc.ClassRep _ [ flavor: $Button, fcn: ButtonFcn, blockFcn: ButtonBlockFcn, pickle: Trc.DefaultPickle, depickle: Trc.DefaultDepickle, notify: ButtonNotify, tipTable: TIPUser.InstantiateNewTIPTable[file: "TrcButton.tip"], background: ButtonBackground, control: Trc.DefaultControl, classData: NIL ]]; END.  TrcButtonsImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Eric Nickell, April 10, 1986 1:41:55 am PST [trc: TRC, listenerData: REF ANY] [trc: TRC, a: REAL] RETURNS [b: REAL] [trc: TRC, from: Trc.UnsafeTable, to: Trc.UnsafeTable, count: NAT] [viewer: ViewerClasses.Viewer, trc: TRC, input: LIST OF REF ANY] [trc: TRC, context: Imager.Context, rectangle: ImagerTransformation.Rectangle] Κ°˜™Icodešœ Οmœ1™Kšœžœ˜6K–[registration: REF ANY]˜:K˜K–&[trc: TRC, listener: Trc.Listener]šœm˜mK–w[viewer: ViewerClasses.Viewer, hint: ViewerOps.PaintHint, clearClient: BOOL _ TRUE, whatChanged: REF ANY _ NIL]šžœžœ2˜?K˜—š‘ œž œ žœ žœ˜TKšœžœ,˜>Kšœžœ˜6Kšžœ˜K˜—K–% -- [trc: TRC, listenerData: REF ANY]˜˜$KšΠck!™!Kšœžœ˜4Kšœžœžœ˜)Kšœžœ˜6K–"[trc: TRC, fork: BOOL _ FALSE]˜9K˜—–) -- [trc: TRC, a: REAL] RETURNS [b: REAL]šœžœžœ˜-šœžœžœ˜"Kšœ žœ˜ Kšœ˜Kšœ žœžœ˜Kšœžœžœ˜Kšœ žœž˜Kšœ˜——˜Kš’%™%Kšœžœ˜0Kšžœ!˜'K˜—–F -- [trc: TRC, from: Trc.UnsafeTable, to: Trc.UnsafeTable, count: NAT]šœž œ˜*Kš’B™BKšœžœ˜0K˜GK˜—–D -- [viewer: ViewerClasses.Viewer, trc: TRC, input: LIST OF REF ANY]šœ ˜ Kš’@™@Kšœžœ˜0Kšœžœžœ˜K˜%šžœžœžœžœžœžœžœž˜>šžœ žœž˜šœžœžœž˜ Kšœžœ˜Kšœžœ˜K˜K˜ K˜K˜Kšžœ˜—Kšžœ˜—Kšžœ˜—K˜—–R -- [trc: TRC, context: Imager.Context, rectangle: ImagerTransformation.Rectangle]šœ(˜(Kš’N™NKšœžœ˜0Kšœe˜eK˜—šœžœ˜-KšœŸœ˜K˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜K–[file: ROPE _ NIL]šœ Ÿ5œ˜@Kšœ˜Kšœ˜Kšœ ž˜K˜—K˜—K˜Kšžœ˜—…— κ: