DIRECTORY Atom, CD, CDBasics, CDDraw, CDInstances, CDViewHighlight, CDVPrivate, ViewerClasses USING [Viewer]; CDViewHighlightImpl: CEDAR MONITOR IMPORTS Atom, CDBasics, CDDraw, CDInstances, CDVPrivate EXPORTS CDViewHighlight = BEGIN State: TYPE = RECORD [pr: REF CDVPrivate.PainterRec, included: BOOL _ FALSE]; RemoveAll: PUBLIC PROC[v: ViewerClasses.Viewer] = BEGIN keyList: LIST OF REF_NIL; me: CDVPrivate.MyGraphicRef = NARROW[v.data]; FOR list: Atom.PropList _ me.properties, list.rest WHILE list#NIL DO IF list.first#NIL THEN WITH list.first.val SELECT FROM s: REF State => keyList _ CONS[list.first.key, keyList] ENDCASE => NULL ENDLOOP; FOR list: LIST OF REF _ keyList, list.rest WHILE list#NIL DO ShowInstance[v, NIL, TRUE, list.first]; ENDLOOP; END; GetData: INTERNAL PROC [me: CDVPrivate.MyGraphicRef, key: REF] RETURNS [state: REF State] = BEGIN IF key=NIL THEN key _ defaultKey; WITH Atom.GetPropFromList[me.properties, key] SELECT FROM s: REF State => state _ s; ENDCASE => { state _ NEW[State]; state.pr _ NEW[CDVPrivate.PainterRec _ [rect: CDBasics.empty, proc: PaintIt, data: NIL]]; me.properties _ Atom.PutPropOnList[me.properties, key, state]; }; END; ToInstList: PROC [x: REF] RETURNS [CD.InstanceList] = BEGIN WITH x SELECT FROM l: CD.InstanceList => RETURN [l]; inst: CD.Instance => RETURN [LIST[inst]]; ENDCASE => RETURN [NIL]; END; Paint: PROC [me: CDVPrivate.MyGraphicRef, rect: CD.Rect, erase: BOOL] = INLINE BEGIN IF CDBasics.NonEmpty[rect] THEN CDDraw.InsertCommand[me.ct, CDDraw.Comm[cmd: rect, erase: erase, rect: rect, ref: NIL]]; END; Update: PUBLIC ENTRY PROC [v: ViewerClasses.Viewer, key: REF_NIL] = BEGIN ENABLE UNWIND => NULL; me: CDVPrivate.MyGraphicRef = NARROW[v.data]; state: REF State = GetData[me, key]; clearRect: CD.Rect _ state.pr.rect; paintRect: CD.Rect _ CDInstances.BoundingRectO[ToInstList[state.pr.data]]; state.pr.rect _ paintRect; Paint[me, paintRect, FALSE]; Paint[me, clearRect, TRUE]; END; ShowInstance: PUBLIC ENTRY PROC[v: ViewerClasses.Viewer, instOrList: REF_NIL, removeOthers: BOOL_TRUE, key: REF_NIL] = BEGIN ENABLE UNWIND => NULL; me: CDVPrivate.MyGraphicRef = NARROW[v.data]; state: REF State = GetData[me, key]; instL: CD.InstanceList _ ToInstList[instOrList]; clearRect: CD.Rect _ CDBasics.empty; paintRect: CD.Rect _ CDInstances.BoundingRectO[instL]; IF removeOthers THEN { clearRect _ state.pr.rect; state.pr.rect _ CDBasics.empty; state.pr.data _ NIL; }; FOR list: CD.InstanceList _ ToInstList[state.pr.data], list.rest WHILE list#NIL DO instL _ CONS[list.first, instL] ENDLOOP; state.pr.data _ instL; state.pr.rect _ CDBasics.Surround[paintRect, state.pr.rect]; IF state.pr.data#NIL AND ~state.included THEN { state.included _ TRUE; CDVPrivate.IncludeAPainterRec[me, state.pr]; } ELSE IF state.pr.data=NIL THEN { state.included _ FALSE; CDVPrivate.RemoveAPainterRec[me, state.pr]; }; Paint[me, paintRect, FALSE]; Paint[me, clearRect, TRUE]; END; PaintIt: PROC [me: CDVPrivate.MyGraphicRef, paintRef: REF CDVPrivate.PainterRec, interrestRect: CD.Rect] = BEGIN WITH paintRef.data SELECT FROM instL: CD.InstanceList => { FOR l: CD.InstanceList _ instL, l.rest WHILE l#NIL DO IF me.stoprequest^ THEN EXIT; IF CDBasics.Intersect[CDInstances.InstRectO[l.first], interrestRect] THEN l.first.ob.class.quickDrawMe[l.first, l.first.location, l.first.orientation, me.deviceDrawRef] ENDLOOP; }; inst: CD.Instance => { inst.ob.class.quickDrawMe[inst, inst.location, inst.orientation, me.deviceDrawRef] }; ENDCASE => NULL; END; defaultKey: REF _ NEW[INT]; END. æCDViewHighlightImpl.mesa (part of ChipNDale) Copyright c 1985 by Xerox Corporation. All rights reserved. by Christian Jacobi, July 4, 1985 1:34:38 pm PDT last edited by Christian Jacobi, July 4, 1985 3:38:41 pm PDT Ê ˜šœ3™3Jšœ Ïmœ1™˜>Jšœ˜——Jšžœ˜—J˜š   œžœžœžœžœ˜5Jšž˜šžœžœž˜Jšœžœžœ˜!Jšœžœ žœžœ˜)Jšžœžœžœ˜—Jšžœ˜—J˜š œžœ%žœžœ˜GJšžœž˜ šžœž˜JšœRžœ˜X—Jšžœ˜—J˜š  œžœžœžœ žœžœ˜Cšž˜Jšžœžœžœ˜—Jšœžœ ˜-Jšœžœ˜$Jšœ žœ˜#Jšœ žœ>˜KJšœ˜Jšœžœ˜Jšœžœ˜Jšžœ˜—J˜š  œž œžœ&žœžœžœžœžœžœ˜všž˜Jšžœžœžœ˜—Jšœžœ ˜-Jšœžœ˜$Jšœ0˜0Jšœ žœ˜$Jšœ žœ*˜7šžœžœ˜Jšœ˜Jšœ˜Jšœžœ˜Jšœ˜—š žœžœ5žœžœž˜RJšœžœ˜Jšžœ˜—Jšœ˜Jšœ=˜=šžœžœžœžœ˜0Jšœžœ˜Jšœ,˜,Jšœ˜—šžœžœžœžœ˜!Jšœžœ˜Jšœ+˜+Jšœ˜—Jšœžœ˜Jšœžœ˜Jšžœ˜—J˜š œžœ)žœ'žœ˜jJšž˜šžœžœž˜šœžœ˜š žœžœžœžœž˜5Jšžœžœžœ˜šžœCž˜IJšœ^˜^—Jšžœ˜—Jšœ˜—šœžœ˜JšœR˜RJ˜—Jšžœžœ˜—Jšžœ˜—J˜Jšœ žœžœžœ˜Jšžœ˜J˜—…— ÐV