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 Σ 1985, 1992 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. Κ •NewlineDelimiter –(cedarcode) style™code™Kšœ Οeœ6™BKšœ%™%K™%KšΟnœ‰™‘K™—šΟk ˜ Kšœ^˜^K˜—šž œŸœŸ˜KšŸœ˜KšŸœ Ÿ˜—˜KšœŸœŸœ ˜Kšœ Ÿœ˜+KšœŸœ˜'KšœŸœ˜!KšœŸœ˜!Kšœ Ÿœ˜'Kšœ Ÿœ˜'KšœŸœ˜!KšœŸœ ˜5KšœŸœ˜Kšœ Ÿœ˜'KšœŸœ˜/KšœŸœ˜#—K˜KšžœŸœŸœŸœ˜(K˜šžœŸœŸœŸœ˜.KšœŸœ ˜K˜—šžœŸœŸœ˜'K™K˜ K˜K˜—šžœŸœŸœ˜$K™BKšœŸœ˜K˜K™—š žœŸœŸœŸœŸœ˜5KšŸœ˜K˜K˜—š žœŸœŸœ ŸœŸœ˜hKšœŸœΟc/˜BKšœ2Ÿœ˜=Kš ŸœŸœŸœŸœŸœŸœ˜&šŸœŸœŸ˜šœ˜K˜$K˜K˜K˜#K˜—šœ˜K˜%K˜K˜%K˜K˜—KšŸœŸœŸœ˜—K˜K˜ K˜"K˜KšŸœˆ˜ŽK˜—K˜™ K™—šžœŸœŸœ)Ÿœ˜CKšœΟtœ‘˜K˜K˜—šžœŸœŸœŸœ˜IK˜K˜K˜—š ž œŸœŸœŸœŸœ˜;Kš ŸœŸœŸœŸœŸœ˜)KšŸœ,˜2K˜—K™™K˜—šž œŸœŸœ˜+KšœŸœ˜K˜K˜—š ž œŸœŸœ9ŸœŸœ˜^KšœŸœ˜K˜K˜K˜K˜K˜—š ž œŸœŸœŸœ ŸœŸœ˜IK˜K˜K˜—šžœŸœŸœŸœ˜?K˜K˜K˜—šž œŸœŸœŸœ˜BK˜K˜—K˜KšŸœ˜K˜K˜K˜—…— ψΌ