GGContainerImpl.mesa
Last edited by Bier on March 4, 1987 3:20:28 pm PST
Copyright © 1985 by Xerox Corporation. All rights reserved.
Created on June 5, 1985 11:16:46 pm PDT
A container-type class for Gargoyle.
Pier, May 15, 1987 5:38:48 pm PDT
DIRECTORY
BiScrollers,
Icons,
GGBasicTypes,
GGEvent,
GGInterfaceTypes,
Rope,
ViewerClasses,
ViewerOps;
GGContainerImpl: CEDAR PROGRAM
IMPORTS BiScrollers, GGEvent, ViewerOps = BEGIN
Viewer: TYPE = ViewerClasses.Viewer;
Point: TYPE = GGBasicTypes.Point;
GGData: TYPE = GGInterfaceTypes.GGData;
GargoyleContainerPaint: PRIVATE ViewerClasses.PaintProc = CHECKED {
ggData: GGData ← NARROW[self.data];
v: Viewer;
update: BOOLFALSE;
hdiff, wdiff: INTEGER;
FOR l: LIST OF Viewer ← ggData.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;
Do children of v as well as v
FOR vChild: Viewer ← v.child, vChild.sibling UNTIL vChild=NIL DO
IF vChild.class.flavor=$BiScrollBarY THEN LOOP;
wdiff ← vChild.ww-vChild.cw;
vChild.ww ← MAX[v.cw-vChild.wx-1, 5];
vChild.cw ← vChild.ww-wdiff;
ENDLOOP;
ENDLOOP;
FOR l: LIST OF Viewer ← ggData.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;
Do children of v as well as v
FOR vChild: Viewer ← v.child, vChild.sibling UNTIL vChild=NIL DO
IF vChild.class.flavor=$BiScrollBarX THEN LOOP;
hdiff ← vChild.wh-vChild.ch;
vChild.wh ← MAX[v.ch-vChild.wy-1, 5];
vChild.ch ← vChild.wh-hdiff;
ENDLOOP;
ENDLOOP;
IF ggData.xBounded#NIL OR ggData.yBounded#NIL
THEN ViewerOps.ResetPaintCache[self, FALSE];
IF update THEN {
oldx: LIST OF Viewer ← ggData.xBounded;
oldy: LIST OF Viewer ← ggData.yBounded;
ggData.xBounded ← ggData.yBounded ← NIL;
FOR l: LIST OF Viewer ← oldx, l.rest UNTIL l=NIL DO
IF ~l.first.destroyed
THEN ggData.xBounded ← CONS[l.first, ggData.xBounded];
ENDLOOP;
FOR l: LIST OF Viewer ← oldy, l.rest UNTIL l=NIL DO
IF ~l.first.destroyed
THEN ggData.yBounded ← CONS[l.first, ggData.yBounded];
ENDLOOP;
};
};
GargoyleContainerDestroy: PRIVATE ViewerClasses.DestroyProc = CHECKED {
};
GargoyleContainerSet: PRIVATE ViewerClasses.SetProc = CHECKED {
Add a constrained child to the list.
child: Viewer;
ggData: GGData ← NARROW[self.data];
IF data=NIL THEN RETURN; -- November 27, 1985 KAP
child ← NARROW[data];
IF child.parent#self THEN ERROR; -- November 27, 1985 KAP
IF op=$YBound THEN ggData.yBounded ← CONS[child, ggData.yBounded]
ELSE IF op=$XBound THEN ggData.xBounded ← CONS[child, ggData.xBounded]
ELSE ERROR;
};
GargoyleContainerSave: ViewerClasses.SaveProc = {
[self: ViewerClasses.Viewer, force: BOOLFALSE]
ggData: GGData ← NARROW[BiScrollers.ClientDataOfViewer[self.child.child]];
ggData: GGData ← NARROW[self.data];
filename: Rope.ROPEIF ggData.outer.file=NIL THEN "Emergency.gargoyle" ELSE ggData.outer.file;
GGEvent.Store[ggData, LIST[$Emergency, filename]]; -- save the action area
};
GargoyleContainerInit: PRIVATE ViewerClasses.InitProc = CHECKED {};
gargoyleContainerClass: ViewerClasses.ViewerClass ← NEW[ViewerClasses.ViewerClassRec ← [
init: GargoyleContainerInit,
paint: GargoyleContainerPaint,
destroy: GargoyleContainerDestroy,
set: GargoyleContainerSet,
save: GargoyleContainerSave, -- used when Shift-Shift-Swat is invoked
topDownCoordSys: TRUE
icon: Icons.NewIconFromFile["SolidViews.icons", 0]
]];
ViewerOps.RegisterViewerClass[$GargoyleContainer, gargoyleContainerClass]; -- plug in to Viewers
END.