<> <> <> <> <> <<>> DIRECTORY GGBasicTypes, GGBoundBox, GGCaret, GGInterfaceTypes, GGModelTypes, GGOutline, GGSegmentTypes, GGTraj; GGCaretImpl: CEDAR PROGRAM IMPORTS GGBoundBox, GGOutline, GGTraj EXPORTS GGCaret = BEGIN Caret: TYPE = REF CaretObj; CaretObj: TYPE = GGInterfaceTypes.CaretObj; CaretOn: TYPE = GGInterfaceTypes.CaretOn; GGData: TYPE = GGInterfaceTypes.GGData; Joint: TYPE = GGModelTypes.Joint; OutlineDescriptor: TYPE = GGModelTypes.OutlineDescriptor; Point: TYPE = GGBasicTypes.Point; Segment: TYPE = GGSegmentTypes.Segment; Sequence: TYPE = GGModelTypes.Sequence; Traj: TYPE = GGModelTypes.Traj; TrajPartType: TYPE = GGModelTypes.TrajPartType; SliceDescriptor: TYPE = GGModelTypes.SliceDescriptor; NotYetImplemented: PUBLIC SIGNAL = CODE; Copy: PUBLIC PROC [to, from: Caret] = { <> to.exists _ from.exists; to.point _ from.point; to.chair _ from.chair; to.attractor _ from.attractor; <> }; Kill: PUBLIC PROC [caret: Caret] = { <> caret.exists _ FALSE; }; <<>> Exists: PUBLIC PROC [caret: Caret] RETURNS [BOOL] = { RETURN[caret.exists]; }; BoundBoxOfCaret: PUBLIC PROC [caret: Caret, ggData: GGData] RETURNS [box: GGBoundBox.BoundBox _ NIL] = { leftOffset, rightOffset, topOffset, bottomOffset: REAL _ 0.0; IF caret=NIL OR ggData=NIL THEN ERROR; SELECT TRUE FROM caret=ggData.caret => { leftOffset _ GGCaret.caretWidth/2.0; rightOffset _ leftOffset; topOffset _ 0.0; bottomOffset _ GGCaret.caretHeight; }; caret=ggData.anchor => { leftOffset _ GGCaret.anchorWidth/2.0; rightOffset _ leftOffset; topOffset _ GGCaret.anchorHeight/2.0; bottomOffset _ topOffset; }; ENDCASE => RETURN[NIL]; leftOffset _ leftOffset+fudge; rightOffset _ rightOffset+fudge; bottomOffset _ bottomOffset+fudge; topOffset _ topOffset+fudge; RETURN[GGBoundBox.CreateBoundBox[ caret.point.x-leftOffset, caret.point.y-bottomOffset, caret.point.x+rightOffset, caret.point.y+topOffset ]]; }; fudge: REAL _ 4.0; -- needed to make control points erase properly <> <> <> <<};>> <<>> <> <> <<};>> <> <<>> SitOn: PUBLIC PROC [caret: Caret, chair: SliceDescriptor _ NIL] = { caret.chair _ chair; }; GetChair: PUBLIC PROC [caret: Caret] RETURNS [chair: SliceDescriptor] = { chair _ caret.chair; }; <> <> <> <> <> <> <> < {>> <<[success, partType, traj, ----, jointNum] _ GGOutline.UnpackSimpleDescriptorOld[outlineD];>> <> <> <<};>> < {>> <> <<[success, partType, traj, ----, jointNum] _ GGOutline.UnpackSimpleDescriptor[sliceD];>> <> <> <<};>> < ERROR;>> <<};>> <<>> SittingOnEnd: PUBLIC PROC [caret: Caret] RETURNS [BOOL] = { success: BOOL; partType: TrajPartType; jointNum: NAT; traj: Traj; IF caret.chair = NIL OR caret.chair.slice.class.type # $Outline THEN RETURN[FALSE]; [success, partType, traj, ----, jointNum] _ GGOutline.UnpackSimpleDescriptor[caret.chair]; RETURN[IF (NOT success OR partType # joint) THEN FALSE ELSE GGTraj.IsEndJoint[traj, jointNum] ]; }; <<>> <> NoAttractor: PUBLIC PROC [caret: Caret] = { caret.attractor _ NIL; }; SetAttractor: PUBLIC PROC [caret: Caret, point: Point, attractor: SliceDescriptor] = { caret.exists _ TRUE; caret.point _ point; caret.attractor _ attractor; }; GetAttractor: PUBLIC PROC [caret: Caret] RETURNS [attractor: SliceDescriptor] = { attractor _ caret.attractor; }; GetPoint: PUBLIC PROC [caret: Caret] RETURNS [point: Point] = { point _ caret.point; }; <> <<>> <> <> <> <> <> <> <<}>> <> <> <> <<}>> <> <> <> <> <> <<}>> <> <> <> <> <<};>> <<};>> <<>> <> <> <> <<};>> <<>> <> <> <> <> <> <<};>> <<>> <> <> <> <> <> <> <> <<}>> <> <> <> <<}>> <> <> <> <> <<}>> <> <> <> <> <> <<};>> <<};>> <<>> <> <> <<};>> <<>> <> <<};>> <<>> <> <<};>> <<>> END.