DIRECTORY Imager, Rope USING [Concat], TIPUser USING [InstantiateNewTIPTable, TIPScreenCoords], Menus USING [Menu, MenuProc, CreateEntry, CreateMenu, InsertMenuEntry], ViewerClasses USING [Viewer, ViewerClass, ViewerClassRec, NotifyProc], ViewerOps USING [DestroyViewer, RegisterViewerClass, CreateViewer, PaintViewer], JaM USING [State, SetAbort, Register, PushReal, Execute, ExecuteRope, Stop], JaMImager, JaMIPrivate, JaMImagerContexts, MessageWindow USING [Blink, Append]; JaMIViewerImpl: CEDAR MONITOR LOCKS info USING info:JaMIPrivate.Info IMPORTS Imager, JaMIPrivate, Rope, MessageWindow, TIPUser, Menus, ViewerOps, JaM EXPORTS JaMImager, JaMIPrivate, JaMImagerContexts = BEGIN jamImagerClass: ViewerClasses.ViewerClass _ NEW[ViewerClasses.ViewerClassRec _ [ paint: JaMIPrivate.Paint, notify: InputNotify, destroy: AboutToDestroy, tipTable: TIPUser.InstantiateNewTIPTable["JaMImager.TIP"] ]]; Info: TYPE = JaMIPrivate.Info; State: TYPE = JaM.State; JReloadTIP: PROC [state: State] = { ReloadTIP[] }; ReloadTIP: PUBLIC PROC = { jamImagerClass.tipTable _ TIPUser.InstantiateNewTIPTable["JaMImager.TIP"] }; Create: PUBLIC PROC [state: State, typescript: ViewerClasses.Viewer, iconic: BOOLEAN _ FALSE] RETURNS [viewer: ViewerClasses.Viewer] = { info: Info; menu: Menus.Menu; { -- extra block to make info defined in scope of UNWIND ENABLE UNWIND => -- something went wrong while creating the viewer IF viewer#NIL THEN DestroyViewer[viewer] ELSE IF info#NIL THEN JaMIPrivate.ForgetInfo[state]; IF (info _ JaMIPrivate.GetInfo[state]) # NIL THEN ERROR; info _ JaMIPrivate.CreateInfo[state]; info.trajectory _ NIL; info.font _ Imager.MakeFont["Xerox/PressFonts/Tioga/MRR", 10]; info.text _ NIL; menu _ Menus.CreateMenu[]; Menus.InsertMenuEntry[menu, Menus.CreateEntry["Reset", Reset]]; Menus.InsertMenuEntry[menu, Menus.CreateEntry["Interrupt", InterruptButton]]; info.typescript _ typescript; info.vdc _ Imager.Create[deviceType: $LFDisplay]; info.venabled _ TRUE; viewer _ ViewerOps.CreateViewer[flavor: $JaMImager, info: [data: info, name: Rope.Concat[typescript.name,"Imager "], menu: menu, iconic: iconic, scrollable: FALSE]]; info.viewer _ viewer; Register[state]; JaMIPrivate.RegisterGraphics[state]; JaMIPrivate.RegisterImager[state]; JaMIPrivate.RegisterColor[state]; }}; Reset: Menus.MenuProc = { viewer: ViewerClasses.Viewer _ NARROW[parent]; ViewerOps.PaintViewer[viewer: viewer, hint: client, whatChanged: NIL, clearClient: TRUE]; }; InterruptButton: Menus.MenuProc = { viewer: ViewerClasses.Viewer _ NARROW[parent]; info: Info _ NARROW[viewer.data]; state: State _ info.state; JaM.SetAbort[state,TRUE]; SetPlace[info,0,0]; SetBug[info,0,0] }; DestroyViewer: PROC [viewer: ViewerClasses.Viewer] = { AboutToDestroy[viewer]; ViewerOps.DestroyViewer[viewer]; }; AboutToDestroy: PROC [self: ViewerClasses.Viewer] = { info: Info _ NARROW[self.data]; JaMIPrivate.ForgetInfo[info.state]; }; InitDC: PROCEDURE [state: State] = { info: Info _ JaMIPrivate.GetInfo[state]; IF info.venabled THEN { Imager.Reset[info.vdc]; Imager.ConcatT[info.vdc, Imager.pointsToMeters]; }; FOR l: JaMImagerContexts.DCList _ info.dcList, l.next UNTIL l=NIL DO IF l.enabled THEN l.dc _ l.callMe[l.dc, initdc]; ENDLOOP; }; EnableViewer: PUBLIC PROC [state: State] = { JaMIPrivate.GetInfo[state].venabled _ TRUE; }; DisableViewer: PUBLIC PROC [state: State] = { JaMIPrivate.GetInfo[state].venabled _ FALSE; }; Mouse: PROC [state: State] = { x,y: REAL; [x,y] _ GetPlace[JaMIPrivate.GetInfo[state]]; JaM.PushReal[state, x]; JaM.PushReal[state, y] }; Touch: PROC [state: State] = { x,y: REAL; [x,y] _ GetBug[JaMIPrivate.GetInfo[state]]; JaM.PushReal[state, x]; JaM.PushReal[state, y] }; GetBug: ENTRY PROC [info: Info] RETURNS[x,y: REAL] = { OPEN info; ENABLE UNWIND => NULL; bugflag _ FALSE; UNTIL viewer.destroyed OR bugflag DO WAIT bugged ENDLOOP; IF viewer.destroyed THEN x _ y _ 0 ELSE { x _ bugX; y _ bugY; bugflag _ FALSE }; }; SetBug: PUBLIC ENTRY PROC [info: Info, x,y: REAL] = { OPEN info; ENABLE UNWIND => NULL; bugflag _ TRUE; bugX _ x; bugY _ y; NOTIFY bugged }; GetPlace: ENTRY PROC [info: Info] RETURNS[x,y: REAL] = { OPEN info; ENABLE UNWIND => NULL; mouseflag _ FALSE; UNTIL viewer.destroyed OR mouseflag DO WAIT mouse ENDLOOP; IF viewer.destroyed THEN x _ y _ 0 ELSE { x _ mouseX; y _ mouseY; mouseflag _ FALSE }; }; SetPlace: ENTRY PROC [info: Info, x,y: REAL] = { OPEN info; ENABLE UNWIND => NULL; mouseflag _ TRUE; mouseX _ x; mouseY _ y; NOTIFY mouse; }; DoAtom: PROC [state: State, atom: ATOM] = { JaM.Execute[state, atom ! JaM.Stop => CONTINUE]; }; DoButton: PROC [state: State, button: ATOM, x,y: REAL] = { JaM.PushReal[state, x]; JaM.PushReal[state, y]; SELECT button FROM $RedDown, $CtrlRedDown, $ShiftRedDown, $CtrlShiftRedDown => JaM.ExecuteRope[state,".reddown" ! JaM.Stop => CONTINUE]; $YellowDown, $CtrlYellowDown, $ShiftYellowDown, $CtrlShiftYellowDown => JaM.ExecuteRope[state,".yellowdown" ! JaM.Stop => CONTINUE]; $BlueDown, $CtrlBlueDown, $ShiftBlueDown, $CtrlShiftBlueDown => JaM.ExecuteRope[state,".bluedown" ! JaM.Stop => CONTINUE]; $Track, $CtrlTrack, $ShiftTrack, $CtrlShiftTrack => JaM.ExecuteRope[state,".track" ! JaM.Stop => CONTINUE]; $RedUp, $CtrlRedUp, $ShiftRedUp, $CtrlShiftRedUp => JaM.ExecuteRope[state,".redup" ! JaM.Stop => CONTINUE]; $YellowUp, $CtrlYellowUp, $ShiftYellowUp, $CtrlShiftYellowUp => JaM.ExecuteRope[state,".yellowup" ! JaM.Stop => CONTINUE]; $BlueUp, $CtrlBlueUp, $ShiftBlueUp, $CtrlShiftBlueUp => JaM.ExecuteRope[state,".blueup" ! JaM.Stop => CONTINUE]; ENDCASE => ERROR; }; InputNotify: PUBLIC ViewerClasses.NotifyProc = { AdjustCoords: PROC = { info: Info _ NARROW[self.data]; [x,y] _ JaMIPrivate.ViewToUser[info.vdc, mx,my]; }; mx, my: INTEGER; x, y: REAL; FOR l: LIST OF REF ANY _ input, l.rest UNTIL l = NIL DO WITH l.first SELECT FROM z: ATOM => SELECT z FROM $RedDown, $CtrlRedDown, $ShiftRedDown, $CtrlShiftRedDown => { info: Info _ NARROW[self.data,Info]; SetBug[info,x,y]; SetPlace[info,x,y]; DoButton[info.state,z,x,y]; }; $YellowDown, $CtrlYellowDown, $ShiftYellowDown, $CtrlShiftYellowDown, $BlueDown, $CtrlBlueDown, $ShiftBlueDown, $CtrlShiftBlueDown, $Track, $CtrlTrack, $ShiftTrack, $CtrlShiftTrack, $RedUp, $CtrlRedUp, $ShiftRedUp, $CtrlShiftRedUp, $YellowUp, $CtrlYellowUp, $ShiftYellowUp, $CtrlShiftYellowUp, $BlueUp, $CtrlBlueUp, $ShiftBlueUp, $CtrlShiftBlueUp => DoButton[NARROW[self.data,Info].state,z,x,y]; $Place => SetPlace[NARROW[self.data,Info],x,y]; ENDCASE => DoAtom[NARROW[self.data,Info].state,z]; z: TIPUser.TIPScreenCoords => { [mx, ----, my] _ z^; AdjustCoords[] }; ENDCASE => { MessageWindow.Blink[]; MessageWindow.Append["unknown TIP Atom (JaMImager)", TRUE]; }; ENDLOOP; }; Register: PROC[state: State] = { JaM.Register[state,".initdc",InitDC]; JaM.Register[state,".reloadTIP",JReloadTIP]; JaM.Register[state,".enableviewer",EnableViewer]; JaM.Register[state,".disableviewer",DisableViewer]; JaM.Register[state,".mouse", Mouse]; JaM.Register[state,".touch",Touch]; }; ViewerOps.RegisterViewerClass[$JaMImager, jamImagerClass]; END... pJaMIViewerImpl.mesa Last change by Bill Paxton, October 5, 1982 3:19 pm Last change by McGregor, June 15, 1982 10:05 am Last Edited by: Stone, September 6, 1984 3:53:00 pm PDT JaMIPrivate.RegisterAIS[state]; generic proc for TIP atoms. Normal TIP table never comes here all the *Down, *Up and *Track atoms [self: ViewerClasses.Viewer, input: LIST OF REF ANY] ʘJ˜Jšœ™Jšœ4™4Jšœ0™0Jšœ7™7J˜šÏk ˜ J˜Jšœœ ˜Jšœœ+˜8Jšœœ<˜GJšœœ3˜FJšœ œA˜PJšœœC˜LJ˜ J˜ J˜Jšœœ˜$J˜—šœ ˜Jšœœ˜&JšœI˜PJšœ,˜3Jš˜J˜—šœ,œ!˜PJ˜J˜J˜J˜9J˜—J˜Jšœœ˜šœœ ˜J˜—JšÏn œœ"˜2J˜šž œœœ˜J˜LJ˜—š žœœœ:œœ˜]Jšœ#˜*J˜ J˜JšœÏc6˜8šœœŸ1˜BJšœœœ˜(Jšœœœœ˜4—Jšœ'œœœ˜8Jšœ%˜%Jšœœ˜Jšœ>˜>Jšœ œ˜J˜J˜?J˜MJ˜Jšœ1˜1Jšœœ˜˜FJšœVœ˜^—J˜J˜J˜$J˜"Jšœ!˜!Jšœ™J˜J˜—šœ˜Jšœœ ˜.JšœAœœ˜YJ˜J˜—šœ$˜$Jšœœ ˜.Jšœ œ˜!J˜Jšœœœ˜J˜J˜J˜—šž œœ#˜6J˜J˜ J˜J˜—šžœœ"˜6Jšœ œ ˜J˜#J˜J˜—šžœ œ˜$J˜(šœœ˜Jšœ˜Jšœ0˜0J˜—šœ3œœ˜DJšœ œ ˜1Jšœ˜—J˜J˜—šž œ œ˜,Jšœ&œ˜+J˜J˜—šž œ œ˜-Jšœ&œ˜,J˜J˜—šžœœ˜Jšœœ˜ Jšœ-˜-J˜J˜J˜J˜—šžœœ˜Jšœœ˜ Jšœ+˜+J˜J˜J˜J˜—š žœœœœœœ˜AJšœœœ˜Jšœ œ˜Jš œœ œœœ˜9Jšœœ ˜"Jšœ!œ˜-J˜J˜—š žœœœœœœ˜@Jšœœœ˜Jšœ œ˜#Jšœ ˜J˜—š žœœœœœœ˜CJšœœœ˜Jšœ œ˜Jš œœ œœœ˜:Jšœœ ˜"Jšœ'œ˜3J˜J˜—š žœœœœœ˜;Jšœœœ˜Jšœ œœ˜7J˜J˜—Jšžœœœ˜+šœ>™>Jšœ&œ˜0J˜J˜—Jšžœœœœ˜:šœ#™#J˜J˜šœ˜šœ˜JšœTœ˜^—šœ˜Jšœ\œ˜f—šœ˜JšœVœ˜`—šœ˜JšœMœ˜W—šœ˜JšœMœ˜W—šœ˜JšœVœ˜`—šœ˜JšœPœ˜Z—Jšœœ˜—J˜—J˜Jšœ4™4šœ œ˜1šž œœ˜Jšœ œ ˜Jšœ0˜0J˜—Jšœœ˜Jšœœ˜ šœœœœœœœ˜7šœ œ˜šœœœ˜˜=Jšœ œ˜$Jšœ˜Jšœ˜Jšœ˜Jšœ˜—J˜FJ˜=J˜1J˜1J˜=šœ7˜7Jšœ œ˜.—Jšœœ˜/Jšœ œ˜4—Jšœ%Ÿœ˜Fšœ˜ Jšœ˜Jšœ5œ˜;Jšœ˜——Jšœ˜—J˜J˜—šžœœ˜ Jšœ%˜%Jšœ,˜,Jšœ1˜1Jšœ3˜3Jšœ$˜$Jšœ#˜#J˜—J˜:J˜J˜Jšœ˜J˜J˜J˜—…—–$£