objectdefs
Griffin object types and manipulating routines
Stone April 1, 1981 10:51 PM
Last Edited by: Stone, July 4, 1985 1:34:29 pm PDT
DIRECTORY
PointDefs USING [ScrPt, ObjPt, ObjPtSequence],
GriffinEncoding USING [EdgeEncoding,AreaEncoding, Link],
StyleDefs USING [StyleHandle],
XFormDefs USING[XFMDescriptor],
CubicSplines USING [SplineType],
Imager USING [Context],
Rope USING [ROPE];
ObjectDefs: CEDAR DEFINITIONS =
BEGIN
ScrPt: TYPE = PointDefs.ScrPt;
ObjPt: TYPE = PointDefs.ObjPt;
ObjPtSequence: TYPE = PointDefs.ObjPtSequence;
StyleHandle: TYPE = StyleDefs.StyleHandle;
ObjectType: TYPE = {shape,caption,token, selectToken, menu};
ObjectHandle: TYPE = REF Object;
TokenType: TYPE = {CP,open, center, hgrid, vgrid};
tokenSize: INT = 5;
View: TYPE = {main,alternate};
MenuOrientation: TYPE = {horizontal, vertical};
ClusterID: TYPE = [0..1023];
OpenCluster: ClusterID = 1;
Object: TYPE = RECORD
[
link: ObjectHandle ← NIL,
backLink: ObjectHandle ← NIL,
style: StyleHandle ← NIL,
cluster: ClusterID ← 0,
view: View ← main,
deleted: BOOLEANFALSE,
visible: BOOLEANTRUE,
selected: BOOLEANFALSE,
cull: {inside,outside,partial} ← partial,
part of encoding, but are here since true for all variants
validEncoding: BOOLEANFALSE,
tl,br: ScrPt ← [0,0],
body: SELECT objectType: ObjectType FROM
shape =>
[
closed: BOOLEANFALSE,
trajectory: TrajectoryHandle ← NIL,
edgeEncoding: GriffinEncoding.EdgeEncoding ← NIL,
areaEncoding: GriffinEncoding.AreaEncoding ← NIL
],
caption =>
[
p0: ObjPt ← [-1,-1],
text: Rope.ROPENIL
],
token =>
[
tokenType: TokenType ← CP,
p0: ObjPt ← [0,0]
],
selectToken =>
[
p0: ObjPt ← [0,0],
located: BOOLEANFALSE,
selectedObj: ObjectHandle ← NIL
],
menu =>
[
orientation: MenuOrientation ← vertical,
head: REF ANYNIL --MenuDefs.MenuItemHandle. There is a loop
],
ENDCASE
];
TrajectoryHandle: TYPE = REF Trajectory;
Trajectory: TYPE = RECORD
[splineType: CubicSplines.SplineType,
traj: SELECT type:* FROM
linked => [links: REF Link ← NIL],
cyclic => [knots: ObjPtSequence ← NIL],
ENDCASE
];
Link: TYPE = RECORD
[link: REF Link ← NIL,
degree: {D0,D1,D2,D3},
knots: ObjPtSequence ← NIL
];
ObjectProc: TYPE = PROCEDURE [obj: ObjectHandle] RETURNS [stop: BOOLEANFALSE];
procedures implemented by objectfns
InitObjectFns: PROC;
Initializes the object list
GetCurrentView: PROCEDURE RETURNS [View];
SetCurrentView: PROCEDURE[view: View];
Visible: PROCEDURE[object: ObjectHandle] RETURNS[BOOLEAN];
GetNextClusterID: PROCEDURE RETURNS[id: ClusterID];
GetNextObject: PROCEDURE [obj: ObjectHandle] RETURNS [ObjectHandle];
ForAllObjects: PROCEDURE [proc: ObjectProc];
back to front (painters order)
ForAllObjectsReversed: PROCEDURE [proc: ObjectProc];
front to back (more efficient for hit testing)
ForAllPictureObjects: PROCEDURE [proc: ObjectProc];
ForAllVisibleObjects: PROCEDURE [proc: ObjectProc] ;
ForAllVisiblePictureObjects: PROCEDURE [proc: ObjectProc] ;
ForAllObjectsThroughObject: PROCEDURE [proc: ObjectProc,
lastObj: ObjectHandle];
GetTopPictureObj: PROCEDURE RETURNS [ObjectHandle];
ForAllInBoxDo: PROCEDURE[tl,br: ScrPt,proc: ObjectProc]
RETURNS [BOOLEAN];
ForAllPictureObjectsInBoxDo: PROCEDURE[tl,br: ScrPt,proc:
ObjectProc] RETURNS [BOOLEAN];
ForAllInCluster: PROCEDURE [id: ClusterID,proc: ObjectProc] ;
StartObject: PROCEDURE[type: ObjectType] RETURNS [ObjectHandle];
AppendLink: PROCEDURE[obj: REF shape Object,link: REF Link] RETURNS [GriffinEncoding.Link];
RemoveLastLink: PROCEDURE[obj: REF shape Object] RETURNS [GriffinEncoding.Link];
CopyObject: PROCEDURE [object: ObjectHandle] RETURNS [ObjectHandle];
DeleteObject: PROCEDURE[object: ObjectHandle]RETURNS [next: ObjectHandle];
ExpungeObjects: PROCEDURE;
FloatObject: PROCEDURE [object: ObjectHandle];
SinkObject: PROCEDURE [object: ObjectHandle];
FlipUpObject: PROCEDURE [object: ObjectHandle];
FlipDownObject: PROCEDURE [object: ObjectHandle];
AddToken: PROCEDURE[pt: ScrPt,type: TokenType] ;
GetTokenBoundingBox: PROC[token: REF token Object] RETURNS [tl,br: ScrPt];
GetSelectTokenBoundingBox: PROC[token: REF selectToken Object] RETURNS [tl,br: ScrPt];
DeleteAllCPs: PROCEDURE;
ReadCPs: PROCEDURE RETURNS[array: ObjPtSequence];
SelectObject: PUBLIC PROCEDURE[obj: ObjectHandle] RETURNS [ObjectHandle];
DeSelectObject: PROCEDURE [object: ObjectHandle];
SelectCluster: PROCEDURE[id: ClusterID] RETURNS [ObjectHandle];
DeSelectCluster: PUBLIC PROCEDURE[id: ClusterID];
ReturnSelectToken: PUBLIC PROCEDURE[object: ObjectHandle] RETURNS[REF Object[selectToken]];
ForAllSelectedDo: PUBLIC PROCEDURE[do: ObjectProc];
procedures implemented by showobjects
ReplotAllObjects: PROCEDURE[dc: Imager.Context];
ObjectsToInterpress: PROCEDURE[s: Rope.ROPE];
ReplotBox: PROCEDURE [tl,br: ScrPt, dc: Imager.Context];
ReplotBoxFromObject: PROC [tl,br: ScrPt,object: ObjectHandle, dc: Imager.Context];
ReplotFromObject: PROCEDURE[startObj: ObjectHandle, dc: Imager.Context];
PlotObject: PROCEDURE [object: ObjectHandle, dc: Imager.Context];
next 4 procs will generate their own call to GriffinViewer.DoPaint
PlotOneObject: PROCEDURE [object: ObjectHandle];
EraseObject: PROCEDURE [object: ObjectHandle];
PlotLink: PUBLIC PROCEDURE[link: GriffinEncoding.Link, style: StyleHandle];
EraseLink: PUBLIC PROCEDURE[link: GriffinEncoding.Link];
just does a RefreshDefs.EraseAndSave of link bounding box
Some handy routines for keeping the encoding up to date
EncodeObject: PROCEDURE[shape: REF shape Object];
AdjustBoxForStyle: PROC[object: ObjectHandle];
Hit Testing
GetObjectHandle: PROCEDURE [pt: ScrPt] RETURNS [ObjectHandle];
GetObjectHandleBetweenObjects: PROCEDURE
[pt: ScrPt,topObject,bottomObject: ObjectHandle] RETURNS [ObjectHandle] ;
implemented by ObjectXForms
MoveObject: PROCEDURE[object: ObjectHandle, from,to: ScrPt];
XFormObject: PROCEDURE[object: ObjectHandle, matrix: XFormDefs.XFMDescriptor];
END.