<> <> <> <> <> <<>> 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.