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. ²GGCaretImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Pier, February 3, 1988 9:58:53 am PST Bier, November 1, 1988 4:01:05 pm PST Contents: Facilities for moving the caret and storing information about the neighborhood it inhabits (such as what trajectory it is sitting on). Used for dropping the anchor. This caret no longer exists. It should disappear from the screen. The Chair. The Attractor. Κ,˜code™Kšœ Οmœ1™