<<>> <> <> <> <> <> <<>> DIRECTORY GGBasicTypes, GGBoundBox, GGCaret, GGInterfaceTypes, GGModelTypes, GGSegmentTypes, GGSliceOps; GGCaretImpl: CEDAR PROGRAM IMPORTS GGBoundBox, GGSliceOps EXPORTS GGCaret = BEGIN Caret: TYPE = REF CaretObj; CaretObj: TYPE = GGInterfaceTypes.CaretObj; GGData: TYPE = GGInterfaceTypes.GGData; Joint: TYPE = GGModelTypes.Joint; Point: TYPE = GGBasicTypes.Point; Segment: TYPE = GGSegmentTypes.Segment; Sequence: TYPE = GGModelTypes.Sequence; Slice: TYPE = GGModelTypes.Slice; SliceDescriptor: TYPE = GGModelTypes.SliceDescriptor; Traj: TYPE = GGModelTypes.Traj; TrajData: TYPE = GGModelTypes.TrajData; TrajPartType: TYPE = GGModelTypes.TrajPartType; Vector: TYPE = GGBasicTypes.Vector; NotYetImplemented: PUBLIC SIGNAL = CODE; Create: PUBLIC PROC RETURNS [caret: Caret] = { caret ¬ NEW[CaretObj]; }; Copy: PUBLIC PROC [to, from: Caret] = { <> to­ ¬ from­; }; 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] = { fudge: REAL ¬ 4.0; -- needed to make control points erase properly 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 ]]; }; <> <<>> SitOn: PUBLIC PROC [caret: Caret, chair: SliceDescriptor ¬ NIL] = { caret.chair ¬ chair; }; GetChair: PUBLIC PROC [caret: Caret] RETURNS [chair: SliceDescriptor] = { chair ¬ caret.chair; }; SittingOnEnd: PUBLIC PROC [caret: Caret] RETURNS [BOOL] = { IF caret.chair = NIL THEN RETURN[FALSE]; RETURN[GGSliceOps.IsDescriptorOfEnd[caret.chair]]; }; <<>> <> NoAttractor: PUBLIC PROC [caret: Caret] = { caret.attractor ¬ NIL; }; SetAttractor: PUBLIC PROC [caret: Caret, point: Point, normal: Vector, attractor: REF ANY] = { caret.exists ¬ TRUE; caret.point ¬ point; caret.normal ¬ normal; caret.attractor ¬ attractor; }; GetAttractor: PUBLIC PROC [caret: Caret] RETURNS [attractor: REF ANY] = { attractor ¬ caret.attractor; }; GetPoint: PUBLIC PROC [caret: Caret] RETURNS [point: Point] = { point ¬ caret.point; }; GetNormal: PUBLIC PROC [caret: Caret] RETURNS [normal: Vector] = { normal ¬ caret.normal; }; END.