-- JaMGraphicsTool.mesa -- Last change by Doug Wyatt, 7-Nov-81 14:44:34 DIRECTORY JaMGraphics USING [], JaMTajo, CGScreen USING [Bits], Tool USING [AddThisSW, Create, MakeSWsProc, RegisterSWType, SWType], ToolWindow USING [CreateSubwindow, DisplayProcType, TransitionProcType], UserInput USING [GetMouseAndCursorPosition, KeyPNRType, SetKeyPNR], Window USING [BitmapPlace, DisplayData, Handle, InvalidateBox, Place, Validate]; JaMGraphicsTool: MONITOR IMPORTS CGScreen, Tool, ToolWindow, UserInput, Window, JaMTajo EXPORTS JaMGraphics = BEGIN -- Globals wh: Window.Handle; -- Tool's window swtype: Tool.SWType; -- unique type for subwindow sw: Window.Handle ← NIL; -- subwindow for graphics data: LONG POINTER ← NIL; -- pointer to Cedar screen raster: CARDINAL ← 0; -- screen words per line height: CARDINAL ← 0; -- screen height bugflag: BOOLEAN ← FALSE; bugplace: Window.Place ← [0,0]; Bugged: CONDITION; -- Tool needed routines ClientTransition: ENTRY ToolWindow.TransitionProcType = -- This procedure is called whenever the system determines that this -- Tool's state is undergoing a user invoked transition. BEGIN IF new = inactive THEN sw ← NIL; END; Init: PROCEDURE = BEGIN swtype ← Tool.RegisterSWType[]; [data,raster,height] ← CGScreen.Bits[]; wh ← Tool.Create[initialBox: [[0,408],[400,400]], makeSWsProc: MakeSWs, initialState: default, clientTransition: ClientTransition, name: "JaM Graphics"L]; END; MakeSWs: Tool.MakeSWsProc = BEGIN sw ← ToolWindow.CreateSubwindow[ parent: window, display: MyDisplay, boxesCount: none]; UserInput.SetKeyPNR[sw,redButton,MyButton]; UserInput.SetKeyPNR[sw,blueButton,MyButton]; sw.clearingNotRequired ← TRUE; Tool.AddThisSW[window,sw,swtype]; JaMTajo.AcceptTypeInFrom[sw]; END; MyDisplay: ToolWindow.DisplayProcType = { Window.DisplayData[ window: window, box: [[0,0],[raster*16,height]], data: data, wpl: raster, bbop: replace]; }; SetBug: ENTRY PROC[place: Window.Place] = --INLINE-- { IF sw=NIL THEN RETURN; bugflag ← TRUE; bugplace ← place; NOTIFY Bugged }; GetBug: ENTRY PROC[clr: BOOLEAN ← TRUE] RETURNS[Window.Place] = --INLINE-- { place: Window.Place; IF clr THEN bugflag ← FALSE; UNTIL sw=NIL OR bugflag DO WAIT Bugged ENDLOOP; IF sw=NIL THEN place ← UserInput.GetMouseAndCursorPosition[] ELSE { place ← bugplace; bugflag ← FALSE }; RETURN[place] }; GetPlace: ENTRY PROC RETURNS[Window.Place] = --INLINE-- { place: Window.Place ← UserInput.GetMouseAndCursorPosition[]; IF sw#NIL THEN { w: Window.Place ← Window.BitmapPlace[sw]; place.x ← place.x - w.x; place.y ← place.y - w.y }; RETURN[place] }; MyButton: UserInput.KeyPNRType = { doit: BOOLEAN ← TRUE; button: JaMTajo.Button; IF key=Red AND downUp=down THEN SetBug[place]; SELECT key FROM Red => button ← IF downUp=down THEN rd ELSE ru; Blue => button ← IF downUp=down THEN bd ELSE bu; ENDCASE => doit ← FALSE; JaMTajo.DoButton[button,place.x,place.y]; }; Mouse: PUBLIC PROC[click: BOOLEAN] RETURNS[x,y: INTEGER] = { place: Window.Place; IF click THEN place ← GetBug[] ELSE place ← GetPlace[]; RETURN[place.x, place.y]; }; Update: PUBLIC ENTRY PROC = { IF sw#NIL THEN { w: INTEGER ← raster*16; h: INTEGER ← height; Window.InvalidateBox[sw,[[0,0],[w,h]]]; Window.Validate[sw] }; }; -- Mainline code Init[]; -- this gets string out of global frame END...