<> <> <> DIRECTORY GriffinDefs: FROM "GriffinDefs", ObjectDefs: FROM "ObjectDefs", GriffinDisplay: FROM "GriffinDisplay", PointDefs: FROM "PointDefs", RefreshDefs: FROM "RefreshDefs", GriffinViewer USING [PaintProc, DoPaint], GriffinMemoryDefs USING [CZone]; Refresh: CEDAR PROGRAM IMPORTS ObjectDefs,GriffinDisplay,GriffinMemoryDefs, GriffinViewer EXPORTS RefreshDefs = BEGIN OPEN ObjectDefs,PointDefs,GriffinMemoryDefs; Frame: TYPE = REF FrameType; FrameType: TYPE = RECORD [ tl,br: ScrPt, obj: ObjectHandle]; FrameList: LIST OF Frame _ NIL; EraseAndSave: PUBLIC PROCEDURE[obj: ObjectHandle]= BEGIN tl,br: ScrPt; IF obj=NIL THEN RETURN; [tl,br] _ BoxFromObject[obj]; EraseAndSaveBox[tl,br]; END; EraseAndSaveBox: PUBLIC PROCEDURE[tl,br: ScrPt]= BEGIN paint: GriffinViewer.PaintProc = { GriffinDisplay.EraseBox[tl,br, dc]; }; AddFrame[tl,br, NIL]; GriffinViewer.DoPaint[paint]; --do it in a paint proc END; MarkObject: PUBLIC PROCEDURE[obj: ObjectHandle]= BEGIN newframe: Frame _ NIL; tl, br: ScrPt; IF obj=NIL THEN RETURN; [tl,br] _ BoxFromObject[obj]; AddFrame[tl,br,obj]; END; MarkBox: PUBLIC PROCEDURE[tl,br: ScrPt]= BEGIN AddFrame[tl,br, NIL]; END; BoxFromObject: PROCEDURE[obj: ObjectHandle] RETURNS[tl, br: ScrPt]= BEGIN IF obj=NIL THEN ERROR; tl _ obj.tl; br _ obj.br; RETURN[tl,br]; END; EraseAndSaveAllCPs: PUBLIC PROCEDURE= BEGIN EraseCPs: ObjectDefs.ObjectProc = TRUSTED BEGIN WITH token: obj SELECT FROM token=> IF token.tokenType=CP OR token.tokenType=open THEN EraseAndSave[obj]; ENDCASE; END; ObjectDefs.ForAllVisibleObjects[EraseCPs]; END; AddFrame: PROCEDURE[tl,br: ScrPt, obj: ObjectHandle]= BEGIN newframe: Frame _ CZone.NEW[FrameType _ [tl, br, obj]]; FrameList _ CONS[newframe, FrameList]; END; RestoreScreen: PUBLIC PROCEDURE= BEGIN new: LIST OF Frame _ NIL; paint: GriffinViewer.PaintProc = { FOR f: LIST OF Frame _ new, f.rest UNTIL f=NIL DO frame: Frame _ f.first; IF frame.obj=NIL THEN ReplotBox[frame.tl,frame.br, dc] ELSE ReplotBoxFromObject[frame.tl,frame.br,frame.obj, dc]; ENDLOOP; }; IF FrameList=NIL THEN RETURN; <> FOR f: LIST OF Frame _ FrameList, f.rest UNTIL f=NIL DO new _ CONS[f.first, new]; ENDLOOP; GriffinViewer.DoPaint[paint]; --do it in a paint proc FrameList _ NIL; END; END.