<> <> <> <> <> DIRECTORY GGModelTypes, Icons, GGInterfaceTypes, ViewerClasses, ViewerOps; GGContainerImpl: CEDAR PROGRAM IMPORTS ViewerOps SHARES ViewerOps = BEGIN OPEN ViewerClasses; Point: TYPE = GGModelTypes.Point; GargoyleData: TYPE = GGInterfaceTypes.GargoyleData; GargoyleContainerPaint: PRIVATE PaintProc = CHECKED { gargoyleData: GargoyleData _ NARROW[self.data]; v: Viewer; update: BOOL _ FALSE; hdiff, wdiff: INTEGER; FOR l: LIST OF Viewer _ gargoyleData.xBounded, l.rest UNTIL l=NIL DO v _ l.first; IF v.destroyed THEN {update _ TRUE; LOOP}; wdiff _ v.ww-v.cw; v.ww _ MAX[v.parent.cw-v.wx-1, 5]; v.cw _ v.ww-wdiff; ENDLOOP; FOR l: LIST OF Viewer _ gargoyleData.yBounded, l.rest UNTIL l=NIL DO v _ l.first; IF v.destroyed THEN {update _ TRUE; LOOP}; hdiff _ v.wh-v.ch; v.wh _ MAX[v.parent.ch-v.wy-1, 5]; v.ch _ v.wh-hdiff; ENDLOOP; <> <> IF update THEN { oldx: LIST OF Viewer _ gargoyleData.xBounded; oldy: LIST OF Viewer _ gargoyleData.yBounded; gargoyleData.xBounded _ gargoyleData.yBounded _ NIL; FOR l: LIST OF Viewer _ oldx, l.rest UNTIL l=NIL DO IF ~l.first.destroyed THEN gargoyleData.xBounded _ CONS[l.first, gargoyleData.xBounded]; ENDLOOP; FOR l: LIST OF Viewer _ oldy, l.rest UNTIL l=NIL DO IF ~l.first.destroyed THEN gargoyleData.yBounded _ CONS[l.first, gargoyleData.yBounded]; ENDLOOP; }; }; GargoyleContainerDestroy: PRIVATE DestroyProc = CHECKED { }; GargoyleContainerSet: PRIVATE SetProc = CHECKED { <> gargoyleData: GargoyleData _ NARROW[self.data]; child: Viewer = NARROW[data]; IF child.parent#self THEN ERROR; IF op=$YBound THEN gargoyleData.yBounded _ CONS[child, gargoyleData.yBounded] ELSE IF op=$XBound THEN gargoyleData.xBounded _ CONS[child, gargoyleData.xBounded] ELSE ERROR; }; GargoyleContainerInit: PRIVATE InitProc = CHECKED {}; gargoyleContainerClass: ViewerClasses.ViewerClass _ NEW[ViewerClasses.ViewerClassRec _ [ init: GargoyleContainerInit, paint: GargoyleContainerPaint, destroy: GargoyleContainerDestroy, set: GargoyleContainerSet, topDownCoordSys: TRUE <> ]]; ViewerOps.RegisterViewerClass[$GargoyleContainer, gargoyleContainerClass]; -- plug in to Viewers END.