<> <> <> <> <> <<>> DIRECTORY Basics, Feedback, GGAlign, GGBasicTypes, GGCaret, GGDescribe, GGInterfaceTypes, GGModelTypes, GGMouseEvent, GGMultiGravity, GGOutline, GGRefresh, GGScene, GGSegmentTypes, GGSelect, GGSequence, GGSlice, GGState, GGUtility, GGWindow, GList, ImagerTransformation, InputFocus, IO, Menus, Rope; GGMouseEventImplB: CEDAR PROGRAM IMPORTS Feedback, GGAlign, GGCaret, GGDescribe, GGMouseEvent, GGMultiGravity, GGScene, GGOutline, GGRefresh, GGSelect, GGSequence, GGSlice, GGState, GGWindow, ImagerTransformation, InputFocus, IO, Rope EXPORTS GGMouseEvent = BEGIN AlignmentPoint: TYPE = GGInterfaceTypes.AlignmentPoint; BoundBox: TYPE = GGModelTypes.BoundBox; Caret: TYPE = GGInterfaceTypes.Caret; EntityGenerator: TYPE = GGModelTypes.EntityGenerator; FeatureData: TYPE = GGInterfaceTypes.FeatureData; GGData: TYPE = GGInterfaceTypes.GGData; Joint: TYPE = GGModelTypes.Joint; MouseButton: TYPE = Menus.MouseButton; MouseProc: TYPE = GGMouseEvent.MouseProc; AlignBag: TYPE = GGInterfaceTypes.AlignBag; Outline: TYPE = GGModelTypes.Outline; OutlineDescriptor: TYPE = REF OutlineDescriptorObj; OutlineDescriptorObj: TYPE = GGModelTypes.OutlineDescriptorObj; Point: TYPE = GGBasicTypes.Point; ResultFeatureType: TYPE = GGModelTypes.ResultFeatureType; Scene: TYPE = GGModelTypes.Scene; SelectMode: TYPE = GGModelTypes.SelectMode; Segment: TYPE = GGSegmentTypes.Segment; Sequence: TYPE = GGModelTypes.Sequence; Slice: TYPE = GGModelTypes.Slice; SliceDescriptor: TYPE = GGModelTypes.SliceDescriptor; SliceDescriptorObj: TYPE = GGModelTypes.SliceDescriptorObj; SliceGenerator: TYPE = GGModelTypes.SliceGenerator; SliceClass: TYPE = GGModelTypes.SliceClass; SliceParts: TYPE = GGModelTypes.SliceParts; StartProc: TYPE = GGMouseEvent.StartProc; TouchGroup: TYPE = GGSegmentTypes.TouchGroup; Traj: TYPE = GGModelTypes.Traj; TrajEnd: TYPE = GGModelTypes.TrajEnd; TrajGenerator: TYPE = GGModelTypes.TrajGenerator; Vector: TYPE = GGBasicTypes.Vector; Problem: SIGNAL [msg: Rope.ROPE] = Feedback.Problem; SaveSavedState: PROC [ggData: GGData] = { GGScene.SaveSelections[ggData.scene]; GGWindow.SaveCaretPos[ggData]; GGCaret.Copy[from: ggData.caret, to: ggData.drag.savedCaret]; }; DescribeSelectionAction: PUBLIC PROC [ggData: GGData, feature: FeatureData, hitData: REF ANY, selectMode: SelectMode, action: Rope.ROPE] = { Feedback.PutFHerald[ggData.feedback, oneLiner, "%g %g", [rope[action]], [rope[GGDescribe.DescribeFeature[feature, hitData, ggData]]]]; }; SetCaretAttractorEndpoint: PUBLIC PROC [ggData: GGData, mapPoint: Point, feature: FeatureData, hitData: REF ANY] = { IF feature=NIL THEN GGCaret.SetAttractor[ggData.caret, mapPoint, NIL] ELSE { shape: REF ANY _ feature.shape; SELECT feature.type FROM < {>> <> <> <> <<[jointD, pos] _ sliceD.slice.class.closestJointToHitData[sliceD, mapPoint, hitData];>> <> <<};>> outline, slice => { pos: Point; sliceD: SliceDescriptor _ NARROW[shape]; jointD: SliceDescriptor; [jointD, pos] _ sliceD.slice.class.closestJointToHitData[sliceD, mapPoint, hitData]; GGCaret.SetAttractor[ggData.caret, pos, jointD]; }; ENDCASE => GGCaret.SetAttractor[ggData.caret, mapPoint, NIL]; }; }; <> StartSelectJoint: PUBLIC StartProc = { ggData.drag.selectState _ joint; StartSelectAux[ggData, worldPt]; DuringSelect[NIL, ggData, worldPt]; }; StartSelectSegment: PUBLIC StartProc = { ggData.drag.selectState _ segment; StartSelectAux[ggData, worldPt]; DuringSelect[NIL, ggData, worldPt]; }; StartSelectTrajectory: PUBLIC StartProc = { ggData.drag.selectState _ traj; StartSelectAux[ggData, worldPt]; DuringSelect[NIL, ggData, worldPt]; }; StartSelectTopLevel: PUBLIC StartProc = { ggData.drag.selectState _ topLevel; StartSelectAux[ggData, worldPt]; DuringSelect[NIL, ggData, worldPt]; }; StartSelectAux: PROC [ggData: GGData, worldPt: Point] = { IF NOT GGRefresh.EmptyOverlay[ggData] THEN ERROR; SaveSavedState[ggData]; }; DuringSelect: PUBLIC MouseProc = { <> opRope: Rope.ROPE = "Selecting "; resultPoint: Point; feature: FeatureData; hitData: REF ANY; IF GGState.GetSelectMode[ggData] = joint THEN [resultPoint, feature, hitData] _ GGMultiGravity.PointsPreferred[worldPt, ggData.hitTest.criticalR, ggData.hitTest.innerR, GGAlign.emptyAlignBag, ggData.hitTest.sceneBag, ggData, FALSE] ELSE [resultPoint, feature, hitData] _ GGMultiGravity.StrictDistance[worldPt, ggData.hitTest.criticalR, GGAlign.emptyAlignBag, ggData.hitTest.sceneBag, ggData]; GGMouseEvent.SetCaretAttractorEndpoint[ggData, resultPoint, feature, hitData]; GGSelect.DeselectAll[ggData.scene, normal]; IF feature#NIL THEN SelectAndDescribeSlicePart[feature, hitData, ggData, ggData.drag.selectState, opRope] ELSE DescribeOperationOnNothing[ggData, opRope]; GGWindow.RestoreScreenAndInvariants[paintAction: $DuringSelect, ggData: ggData, remake: none, backgndOK: TRUE, edited: FALSE, okToClearFeedback: FALSE]; }; -- end DuringSelect EndSelect: PUBLIC MouseProc = { resultPoint: Point; feature: FeatureData; hitData: REF ANY; <> IF ggData.drag.selectState = joint THEN [resultPoint, feature, hitData] _ GGMultiGravity.PointsPreferred[worldPt, ggData.hitTest.criticalR, ggData.hitTest.innerR, GGAlign.emptyAlignBag, ggData.hitTest.sceneBag, ggData, FALSE] ELSE [resultPoint, feature, hitData] _ GGMultiGravity.StrictDistance[worldPt, ggData.hitTest.criticalR, GGAlign.emptyAlignBag, ggData.hitTest.sceneBag, ggData]; <> GGMouseEvent.SetCaretAttractorEndpoint[ggData, resultPoint, feature, hitData]; <> <> GGWindow.NewCaretPos[ggData]; <> GGSelect.DeselectAll[ggData.scene, normal]; <> SELECT ggData.drag.selectState FROM joint => EndSelectAux[ggData, resultPoint, feature, hitData, joint, "joint"]; segment => EndSelectAux[ggData, resultPoint, feature, hitData, segment, "segment"]; traj => EndSelectAux[ggData, resultPoint, feature, hitData, traj, "trajectory"]; topLevel => EndSelectAux[ggData, resultPoint, feature, hitData, topLevel, "object"]; ENDCASE => ERROR; ggData.drag.selectState _ none; -- added to help DescribeFeature work. KAP. }; -- end EndSelect <> <> <> <> <> <<}>> <> <> <> < {>> <> <> <> <> <> <> <<};>> < {>> <> <> <> <<}>> <> <> <> <<};>> <> <> <> <<};>> < ERROR Problem[msg: "Unexpected feature type"];>> <<};>> <> <<}; -- end EndSelectAux>> <<>> EndSelectAux: PROC [ggData: GGData, resultPoint: Point, feature: FeatureData, hitData: REF ANY, mode: SelectMode, opName: Rope.ROPE] = { <> IF feature = NIL THEN { GGCaret.SitOn[ggData.caret, NIL]; Feedback.PutFHerald[ggData.feedback, oneLiner, "No near %g found.", [rope[opName]]]; } ELSE { sliceD: SliceDescriptor; <> SELECT mode FROM joint => ggData.drag.extendMode _ joint; segment => ggData.drag.extendMode _ segmentRange; traj => ggData.drag.extendMode _ traj; topLevel => ggData.drag.extendMode _ topLevel; ENDCASE => ERROR; sliceD _ SelectSlicePart[feature, hitData, ggData, mode]; IF sliceD.slice.class.type=$Outline THEN SitTheCaret[ggData.caret, sliceD, hitData, mode] ELSE GGCaret.SitOn[ggData.caret, sliceD]; Feedback.AppendHerald[ggData.feedback, Rope.Concat[sliceD.slice.class.describe[sliceD], " selected"], oneLiner]; ggData.drag.sliceToExtend _ sliceD; }; GGWindow.RestoreScreenAndInvariants[paintAction: $SelectionChanged, ggData: ggData, remake: none, backgndOK: TRUE, edited: FALSE, okToClearFeedback: FALSE]; }; -- end EndSelectAux SelectAndDescribeSlicePart: PUBLIC PROC [feature: FeatureData, hitData: REF ANY, ggData: GGData, mode: SelectMode, opRope: Rope.ROPE] = { selectedD: REF ANY _ SelectSlicePart[feature, hitData, ggData, mode]; description: Rope.ROPE _ WITH selectedD SELECT FROM outlineD: OutlineDescriptor => outlineD.slice.class.describe[outlineD], sliceD: SliceDescriptor => sliceD.slice.class.describe[sliceD], ENDCASE => GGDescribe.DescribeFeature[feature, hitData, ggData]; Feedback.PutFHerald[ggData.feedback, oneLiner, "%g %g", [rope[opRope]], [rope[description]] ]; }; SelectSlicePart: PUBLIC PROC [feature: FeatureData, hitData: REF ANY, ggData: GGData, mode: SelectMode] RETURNS [selectedD: SliceDescriptor] = { <> SELECT feature.type FROM < {>> <> <> <> <> <> <<};>> outline, slice => { slice: Slice _ NARROW[feature.shape, SliceDescriptor].slice; selectedSliceD: SliceDescriptor; selectedSliceD _ slice.class.newParts[slice, hitData, mode]; GGSelect.SelectSlice[selectedSliceD, ggData.scene, normal]; selectedD _ selectedSliceD; }; slopeLine, angleLine, distanceLine, intersectionPoint, radiiCircle, midpoint => ERROR; ENDCASE => ERROR Problem[msg: "unimplemented result type"]; }; DescribeOperationOnNothing: PUBLIC PROC [ggData: GGData, opRope: Rope.ROPE] = { Feedback.PutFHerald[ggData.feedback, oneLiner, "%g %g", [rope[opRope]], [rope["nothing"]] ]; }; <> <