DIRECTORY CD, CDBasics, CDDirectory, CDFeedback, CDOps, CDProperties, CDRects, CDViewer, CDX, ImagerTransform, Rope; CDFeedbackImpl: CEDAR PROGRAM IMPORTS CDBasics, CDDirectory, CDOps, CDProperties, CDRects, CDViewer, CDX, ImagerTransform EXPORTS CDFeedback = {OPEN CDFeedback; Showing: TYPE = REF ShowingRep; ShowingRep: PUBLIC TYPE = RECORD [ design: CD.Design, insts: InstanceList _ NIL]; InstanceList: TYPE = LIST OF Instance; Instance: TYPE = RECORD [ in: CD.ObPtr, appl: CD.ApplicationPtr]; feedbackKey: PUBLIC ATOM _ $Feedback; EmptyShow: PUBLIC SIGNAL = CODE; NoneVisible: PUBLIC SIGNAL = CODE; Show: PUBLIC PROC [ design: CD.Design, rect: CD.Rect, message: Rope.ROPE _ NIL, flag: ATOM _ $feedback, in: CellType, EnumerateSomeInstances: PROC [ cellType: CellType, to: PROC [transform: Transform, parent: CellType] RETURNS [stop: BOOL] ] ] RETURNS [showing: Showing] = { AddRect: PROC [r: CD.Rect, obj: CD.ObPtr] = { ir: CD.Rect _ IF obj # NIL THEN CDBasics.Intersection[r, CDBasics.RectAt[pos: [0,0], size: obj.size]] ELSE r; ro: CD.ObPtr _ CDRects.CreateRect[size: CDBasics.SizeOfRect[ir], l: CD.highLightError]; appl: CD.ApplicationPtr _ CDX.IncludeOb[design: design, cell: obj, ob: ro, position: CDBasics.BaseOfRect[ir], cellCSystem: cdCoords, obCSystem: interrestCoords].newApp; CDProperties.PutPropOnApplication[appl, $SignalName, message]; CDProperties.PutPropOnApplication[appl, feedbackKey, flag]; showing.insts _ CONS[[obj, appl], showing.insts]; madeMarks _ TRUE; }; someVisibleBounds: CD.Rect; madeMarks, foundVisible: BOOL _ FALSE; FindTop: PROC [r: CD.Rect, ct: CellType] = { IF ct = top THEN { IF foundVisible THEN ERROR ELSE someVisibleBounds _ r; foundVisible _ TRUE} ELSE { TryInstance: PROC [transform: Transform, parent: CellType] RETURNS [stop: BOOL] = { FindTop[TransformRect[r, transform], parent]; stop _ foundVisible }; EnumerateSomeInstances[ct, TryInstance]; }; }; Mark: PROC [r: CD.Rect, ct: CellType] = { IF ct = top THEN { AddRect[r, NIL]; IF NOT foundVisible THEN FindTop[r, top]; } ELSE { MarkInInstance: PROC [transform: Transform, parent: CellType] RETURNS [stop: BOOL] = { Mark[TransformRect[r, transform], parent]; stop _ FALSE; }; shownHere: BOOL -- in names a ChipNDale object that is a cell in design--; found: BOOL; obj: CD.ObPtr; [found, obj] _ CDDirectory.Fetch[design, ct]; shownHere _ found AND ISTYPE[obj.specificRef, CD.CellPtr]; IF shownHere THEN { AddRect[r, obj]; IF NOT foundVisible THEN FindTop[r, ct] } ELSE { EnumerateSomeInstances[ct, MarkInInstance]; } }; }; showing _ NEW [ShowingRep _ [design]]; Mark[rect, in]; IF foundVisible THEN {--scroll to show someVisibleBounds vl: CDViewer.ViewerList _ CDViewer.ViewersOf[design]; FOR vl _ vl, vl.rest WHILE vl # NIL DO IF CDViewer.DesignOf[vl.first].design = design THEN CDViewer.ShowAndScale[viewer: vl.first, rect: someVisibleBounds]; ENDLOOP; } ELSE IF madeMarks THEN NoneVisible[] ELSE EmptyShow[]; }; UnShow: PUBLIC PROC [showing: Showing] = { FOR il: InstanceList _ showing.insts, il.rest WHILE il # NIL DO [] _ CDX.RemoveApp[design: showing.design, cell: il.first.in, app: il.first.appl] ENDLOOP; CDOps.Redraw[showing.design]; }; TransformRect: PROC [r: CD.Rect, t: Transform] RETURNS [s: CD.Rect] = { tr: ImagerTransform.IntRectangle _ ImagerTransform.TransformIntRectangle[[x: r.x1, y: r.y1, w: r.x2 - r.x1, h: r.y2 - r.y1], t]; s _ [x1: tr.x, y1: tr.y, x2: tr.x + tr.w, y2: tr.y + tr.h]; }; Start: PROC = { [] _ CDProperties.RegisterProperty[feedbackKey]; }; Start[]; }. ΦCDFeedbackImpl.Mesa Last Edited by: Spreitzer, December 13, 1984 6:17:18 pm PST Last Edited by: Jacobi, April 17, 1985 11:51:30 am PST Will be clipped to bounding box of containing cells. Goes on the application as value of $SignalName property. Goes on the application as value of feedbackKey property. EnumerateSomeInstances may enumerate as many or as few (even none, if you're willing to live with the consequences) of the instances of cellType as it wishes. Κω– "cedar" style˜Icode™J™;J™6K˜šΟk ˜ Kšœh˜j—K˜š ΠbxœœœœUœ ˜ŽKšœœ ˜K˜Kšœ œœ ˜šœ œœœ˜"Kšœœ˜Kšœœ˜—K˜Kšœœœœ ˜&šœ œœ˜Kšœœ˜ Kšœœ˜—K˜Kšœ œœ ˜%K˜KšΠbl œœœœ˜ K˜KšŸ œœœœ˜"K˜šœ˜ šœ˜Kšœœ˜šœœ˜K™4—šœœœ˜K™9—šœœ ˜K™9—Kšœ ˜ šΟnœœ˜Kšœ˜Kšœœ*œœ˜FKšœ˜Kšœž™ž—K˜—Kšœ˜K˜š œœœ œ ˜-Kš œœœœœGœ˜mKšœœ>œ˜Wšœœœ.˜LJšœ$˜$Jšœ˜Jšœ#˜#—Kšœ>˜>Kšœ;˜;Kšœœ˜1Kšœ œ˜K˜—Kšœœ˜Kšœœœ˜&š œœœ˜,šœ œ˜Kšœœœœ˜6Kšœœ˜—šœ˜š  œœ*œœ˜SKšœ-˜-Kšœ˜K˜—Kšœ(˜(K˜—K˜—š œœœ˜)šœ œ˜Kšœ œ˜Kšœœœ˜)Kšœ˜—šœ˜š œœ*œœ˜VKšœ*˜*Kšœœ˜ K˜—Kšœ œΟc9œ˜JKšœœ˜ Kšœœ˜K˜-Kšœœœœ ˜:šœ œ˜K˜Kšœœœ˜'Kšœ˜—šœ˜K˜+Kšœ˜—K˜—K˜—Kšœ œ˜&Kšœ˜šœœ‘"˜8K˜5šœœœ˜&Kšœ-œB˜uKšœ˜—Kšœ˜—Kšœœ œ˜$Kšœ ˜K˜—K˜š œœœ˜*šœ+œœ˜?KšœœI˜QKšœ˜—K˜K˜—K˜š   œœœœœ ˜GKšœ€˜€K˜;K˜—K˜š œœ˜Kšœ0˜0K˜—K˜K˜K˜K˜——…— ΄ƒ