DIRECTORY Atom, BiScrollers, Geom2D, Imager, ImagerBackdoor, Process, Rope, TIPUser, ViewerClasses, ViewerOps; BSTest: CEDAR PROGRAM IMPORTS Atom, BiScrollers, Geom2D, Imager, ImagerBackdoor, Process, Rope, TIPUser, ViewerOps = {OPEN BiScrollers; Data: TYPE = REF DataRep; DataRep: TYPE = RECORD [ style: BiScrollerStyle, moving: BOOL _ FALSE, x, y: REAL _ 0.0]; Delta: TYPE = REF DeltaRep; DeltaRep: TYPE = RECORD [ drawOld, drawNew: BOOL, oldX, oldY: REAL]; className: ROPE _ "BS Test "; InStyle: PROC [style: BiScrollerStyle, preferIntegers, delay: BOOL _ FALSE] RETURNS [class: BiScrollerClass] = { className _ className.Cat["I"]; class _ style.NewBiScrollerClass[[ flavor: Atom.MakeAtom[className], extrema: Extrema, paint: Paint, notify: Notify, bsUserAction: IF delay THEN ForkDelayAndDo ELSE NIL, finish: LIST[$Exit], menu: bsMenu, icon: fileCabinet, tipTable: TIPUser.InstantiateNewTIPTable["BSTest.tip"], mayStretch: TRUE, offsetsMustBeIntegers: TRUE, preferIntegerCoefficients: preferIntegers ]]; }; ForkDelayAndDo: PROC [bs: BiScroller, input: LORA] ~ TRUSTED {Process.Detach[FORK DelayAndDo[bs, input]]}; DelayAndDo: PROC [bs: BiScroller, input: LORA] ~ { Process.PauseMsec[1000]; DoBSUserAction[bs, input]; RETURN}; Extrema: PROC [clientData: REF ANY, direction: Vec] RETURNS [min, max: Vec] --ExtremaProc-- = { d: Data _ NARROW[clientData]; [min, max] _ Geom2D.ExtremaOfRect[[d.x, d.y, 23, 47], direction]; }; whats: LORA _ NIL; log: BOOL _ FALSE; Paint: PROC [self: Viewer, context: Imager.Context, whatChanged: REF ANY, clear: BOOL] RETURNS [quit: BOOL _ FALSE] --ViewerClasses.PaintProc-- = { DrawAt: PROC [x, y: REAL] = { Imager.MaskRectangle[context: context, r: [x, y + 00, 13, 47]]; Imager.MaskRectangle[context: context, r: [x, y + 45, 23, 01]]; }; d: Data _ NARROW[BiScrollers.ClientDataOfViewer[self]]; IF log THEN whats _ CONS[whatChanged, whats]; IF whatChanged # NIL THEN { da: Delta _ NARROW[whatChanged]; Imager.SetColor[context, invertingGray]; IF da.drawOld AND NOT clear THEN DrawAt[da.oldX, da.oldY]; IF da.drawNew THEN DrawAt[d.x, d.y]} ELSE DrawAt[d.x, d.y]; }; invertingGray: Imager.Color _ ImagerBackdoor.MakeStipple[5A5AH, TRUE]; inputs: LIST OF LORA _ NIL; Notify: PROC [self: Viewer, input: LIST OF REF ANY] --ViewerClases.NotifyProc-- = { bs: BiScroller _ BiScrollers.QuaBiScroller[self]; d: Data _ NARROW[bs.ClientDataOf[]]; IF log THEN inputs _ CONS[input, inputs]; SELECT input.first FROM $Track => { cc: ClientCoords _ NARROW[input.rest.first]; D: Delta _ NEW [DeltaRep _ [d.moving, TRUE, d.x, d.y]]; d.x _ cc.x; d.y _ cc.y; d.moving _ TRUE; ViewerOps.PaintViewer[self, client, FALSE, D]; d.style.SetButtonsCapturedness[bs, TRUE]; }; $End => { cc: ClientCoords _ NARROW[input.rest.first]; D: Delta _ NEW [DeltaRep _ [d.moving, FALSE, d.x, d.y]]; d.x _ cc.x; d.y _ cc.y; d.moving _ FALSE; ViewerOps.PaintViewer[self, client, FALSE, D]; ViewerOps.PaintViewer[self, client, FALSE, NIL]; d.style.SetButtonsCapturedness[bs, FALSE]; }; $Exit => { D: Delta _ NEW [DeltaRep _ [d.moving, FALSE, d.x, d.y]]; d.moving _ FALSE; ViewerOps.PaintViewer[self, client, FALSE, D]; d.style.SetButtonsCapturedness[bs, FALSE]; }; ENDCASE => ERROR; }; Create: PROC [class: BiScrollerClass, info: ViewerClasses.ViewerRec] RETURNS [bs: BiScroller] = { info.data _ NEW [DataRep _ [style: class.style]]; bs _ class.style.CreateBiScroller[class: class, info: info]; }; Start: PROC ~ { buttonedStyle: BiScrollerStyle ~ GetStyle["Buttonned"]; buttonedClass: BiScrollerClass ~ InStyle[buttonedStyle, FALSE, TRUE]; buttoned: BiScroller ~ Create[buttonedClass, [name: "Buttonned Test", iconic: FALSE]]; buttonlessStyle: BiScrollerStyle ~ GetStyle["Buttonless"]; buttonlessClass: BiScrollerClass ~ InStyle[buttonlessStyle, FALSE, TRUE]; buttonless: BiScroller ~ Create[buttonlessClass, [name: "Buttonless Test", iconic: FALSE]]; RETURN}; Start[]; }. ŠBSTest.Mesa Last Edited by: Spreitzer, May 4, 1985 3:42:51 pm PDT Last tweaked by Mike Spreitzer on November 3, 1989 3:51:05 pm PST ΚΥ– "cedar" style˜code™ K™5K™A—K˜KšΟk œe˜nK˜šΠbxœœ˜KšœU˜\Kšœœ ˜—K˜Kšœœœ ˜šœ œœ˜Kšœ˜Kšœœœ˜Kšœœ˜—K˜Kšœœœ ˜šœ œœ˜Kšœœ˜Kšœ œ˜—K˜Kšœ œ˜K˜š Οnœœ1œœœ˜pK˜šœ"˜"K˜!K˜K˜ K˜Kš œœœœœ˜4Kšœœ˜K˜ K˜Kšœ7˜7Kšœ œ˜Kšœœ˜Kšœ)˜)K˜—K˜—K˜šŸœœœ˜2Kšœœœ˜7—K˜šŸ œœœ˜2Kšœ˜Kšœ˜Kšœ˜—K˜š ŸœœœœœΟcœ˜_Kšœ œ ˜KšœA˜AK˜—K˜Kšœœœ˜Kšœœœ˜K˜šŸœœ6œœ œœœœ œ˜“šŸœœœ˜Kšœ?˜?Kšœ?˜?K˜—Kšœ œ'˜7Kšœœ œ˜-šœœœ˜Kšœ œ˜ K˜(Kšœ œœœ˜:Kšœ œ˜$—Kšœ˜K˜—K˜Kšœ@œ˜FK˜Kš œœœœœ˜K˜šŸœœœœœœ œ˜SK˜1Kšœ œ˜$Kšœœ œ˜)šœ ˜˜ Kšœœ˜,KšΠgkœ œœ ˜7Kšœ#œ˜(Kšœ$œ‘œ˜.Kšœ#œ˜)K˜—˜ Kšœœ˜,Kš‘œ œœ ˜8Kšœ#œ˜)Kšœ$œ‘œ˜.Kšœ$œœ˜0Kšœ#œ˜*K˜—˜ Kš‘œ œœ ˜8Kšœ œ˜Kšœ$œ‘œ˜.Kšœ#œ˜*K˜—Kšœœ˜—K˜—K˜šŸœœ9œ˜aKšœ œ"˜1K˜