DIRECTORY CD, CDViewer, CDVPrivate, CDInline, Rope USING [ROPE, Equal], ViewerClasses USING [Viewer], ViewerOps; CDViewerImpl: CEDAR PROGRAM IMPORTS CDVPrivate, CDInline, Rope, ViewerOps EXPORTS CDViewer SHARES CDVPrivate = BEGIN ViewerList: TYPE = LIST OF ViewerClasses.Viewer; ViewersOf: PUBLIC PROC[design: REF] RETURNS [vl: ViewerList_NIL] = BEGIN FOR l: CDVPrivate.MyGraphicRef _ CDVPrivate.linkBase, l.link WHILE l#NIL DO IF design=l.actualDesign OR design=l.actualDesign.technology THEN vl _ CONS[l.viewer, vl]; ENDLOOP END; DesignOf: PUBLIC PROC[viewer: ViewerClasses.Viewer] RETURNS [isDesign: BOOL_FALSE, design: CD.Design_NIL, rect: CD.DesignRect_CDInline.empty] = BEGIN IF viewer#NIL AND viewer.data#NIL AND ISTYPE[viewer.data, CDVPrivate.MyGraphicRef] THEN { me: CDVPrivate.MyGraphicRef = NARROW[viewer.data]; design _ me.actualDesign; IF me.deviceDrawRef#NIL THEN rect _ me.deviceDrawRef.worldClip; isDesign_TRUE; }; END; ShowPosition: PUBLIC PROC[viewer: ViewerClasses.Viewer, pos: CD.DesignPosition] = BEGIN viewerCenterOffset: CD.Position _ [viewer.cw/2, viewer.ch/2]; designCenterOffset: CD.Position; IF viewer#NIL AND viewer.data#NIL AND ISTYPE[viewer.data, CDVPrivate.MyGraphicRef] THEN { me: CDVPrivate.MyGraphicRef = NARROW[viewer.data]; IF CDInline.InsidePos[pos, me.deviceDrawRef.worldClip] THEN RETURN; me.noff _ [0, 0]; designCenterOffset _ CDVPrivate.ViewerToDesignPosition[me, viewerCenterOffset]; CDVPrivate.SetScale[me, me.nscale, me.ngrid, CDInline.SubPoints[pos, designCenterOffset]]; ViewerOps.PaintViewer[viewer, client, FALSE, NIL]; }; END; ShowAndScale: PUBLIC PROC[viewer: ViewerClasses.Viewer, rect: CD.DesignRect] = BEGIN viewerCenterOffset: CD.Position _ [viewer.cw/2, viewer.ch/2]; nw, nh: CD.DesignNumber; IF viewer#NIL AND viewer.data#NIL AND ISTYPE[viewer.data, CDVPrivate.MyGraphicRef] THEN { me: CDVPrivate.MyGraphicRef = NARROW[viewer.data]; noff: CD.DesignPosition = me.noff; FOR j: CARDINAL _ 0, j+1 WHILE j(rect.x2-rect.x1) AND CDVPrivate.ScaleViewerToDesign[me, viewer.ch]>(rect.y2-rect.y1) THEN EXIT ENDLOOP; nw _ CDVPrivate.ScaleViewerToDesign[me, viewer.cw]; nh _ CDVPrivate.ScaleViewerToDesign[me, viewer.ch]; CDVPrivate.SetScale[me, me.nscale, me.ngrid, [rect.x1-(nw-(rect.x2-rect.x1))/2, rect.y1-(nh-(rect.y2-rect.y1))/2]]; ViewerOps.PaintViewer[viewer, client, FALSE, NIL]; }; END; CreateViewer: PUBLIC PROC [design: CD.Design] RETURNS [ViewerClasses.Viewer] = {RETURN [CDVPrivate.CreateViewer[design]]}; ShowArrow: PUBLIC PROC [design: CD.Design, pos: CD.DesignPosition] = {CDVPrivate.ShowArrow[design, pos]}; RemoveArrow: PUBLIC PROC[design: CD.Design] = {CDVPrivate.RemoveArrow[design]}; FindDesign: PUBLIC PROC[name: Rope.ROPE, case: BOOL _ TRUE] RETURNS [CD.Design] = BEGIN FOR l: CDVPrivate.MyGraphicRef _ CDVPrivate.linkBase, l.link WHILE l#NIL DO IF Rope.Equal[l.actualDesign.name, name, case] THEN RETURN[l.actualDesign]; ENDLOOP; RETURN [NIL] END; END. ÚCDViewerImpl.mesa (part of Chipndale) by Christian Jacobi October 13, 1983 3:07 pm last edited by Christian Jacobi November 21, 1983 8:38 pm --moves viewer such that pos is in visible area (does not open closed viewer) --approximative only --moves and scales viewer such that rect is in visible area (does not open closed viewer) --approximative only --only designs with viewers can be found; --if multiple designs have the same name, find arbitrary one ÊD˜Jšœ,™,J˜Jšœ/™/Jšœ;™;J˜šÏk ˜ Jšœ˜J˜ Jšœ ˜ J˜ Jšœœœ ˜Jšœœ ˜J˜ J˜—šÏn œœœ˜Jšœ'˜.Jšœ ˜Jšœ ˜—Jš˜J˜Jšœ œœœ˜0J˜š ž œœœ œœœ˜BJš˜šœ:œœ˜KJšœœ"œœ˜[Jš˜—Jšœ˜J˜—šžœœœœ˜