<> <> <> <> <<>> DIRECTORY Angles2d, AtomButtons, AtomButtonsTypes, CubicSplines, Feedback, GGAlign, GGBasicTypes, GGBoundBox, GGCaret, GGEditTool, GGEvent, GGGravity, GGInterface, GGInterfaceTypes, GGMeasure, GGModelTypes, GGOutline, GGParseIn, GGRefresh, GGScene, GGSegmentTypes, GGSelect, GGSequence, GGSlice, GGState, GGTraj, GGUserInput, GGUtility, GGViewerOps, GGWindow, GraphicsButton, Imager, IO, List, Real, RealFns, Rope, TiogaButtons, Vectors2d, ViewerClasses, ViewerTools; GGEventImplB: CEDAR PROGRAM IMPORTS Angles2d, AtomButtons, Feedback, GGAlign, GGBoundBox, GGCaret, GGEditTool, GGInterface, GGMeasure, GGOutline, GGParseIn, GGRefresh, GGScene, GGSelect, GGSequence, GGSlice, GGState, GGTraj, GGUserInput, GGUtility, GGViewerOps, GGWindow, GraphicsButton, IO, List, RealFns, Rope, TiogaButtons, Vectors2d, ViewerTools EXPORTS GGEvent = BEGIN WalkProc: TYPE = GGModelTypes.WalkProc; BoundBox: TYPE = GGModelTypes.BoundBox; Caret: TYPE = GGInterfaceTypes.Caret; EntityGenerator: TYPE = GGModelTypes.EntityGenerator; FeatureData: TYPE = GGGravity.FeatureData; GGData: TYPE = GGInterfaceTypes.GGData; AlignBag: TYPE = GGInterfaceTypes.AlignBag; Outline: TYPE = GGModelTypes.Outline; OutlineDescriptor: TYPE = REF OutlineDescriptorObj; OutlineDescriptorObj: TYPE = GGModelTypes.OutlineDescriptorObj; OverlapOrder: TYPE = {incr, decr}; Point: TYPE = GGBasicTypes.Point; ScalarButtonClient: TYPE = AtomButtons.ScalarButtonClient; ScalarButtonHandle: TYPE = AtomButtons.ScalarButtonHandle; Scene: TYPE = GGModelTypes.Scene; SegAndIndex: TYPE = GGSequence.SegAndIndex; Segment: TYPE = GGSegmentTypes.Segment; SegmentGenerator: TYPE = GGModelTypes.SegmentGenerator; Sequence: TYPE = GGModelTypes.Sequence; SequenceGenerator: TYPE = GGModelTypes.SequenceGenerator; SequenceOfReal: TYPE = GGBasicTypes.SequenceOfReal; SequenceOfRealObj: TYPE = GGBasicTypes.SequenceOfRealObj; Slice: TYPE = GGModelTypes.Slice; SliceDescriptor: TYPE = GGModelTypes.SliceDescriptor; SliceGenerator: TYPE = GGModelTypes.SliceGenerator; SliceParts: TYPE = GGModelTypes.SliceParts; StrokeEnd: TYPE = Imager.StrokeEnd; StrokeJoint: TYPE = Imager.StrokeJoint; Traj: TYPE = GGModelTypes.Traj; TrajEnd: TYPE = GGModelTypes.TrajEnd; TrajGenerator: TYPE = GGModelTypes.TrajGenerator; TriggerBag: TYPE = GGInterfaceTypes.TriggerBag; TwoState: TYPE = AtomButtons.TwoState; Vector: TYPE = GGBasicTypes.Vector; Viewer: TYPE = ViewerClasses.Viewer; pointsPerIn: REAL = 72.0; pointsPerCm: REAL = 72.0/2.54; Problem: SIGNAL [msg: Rope.ROPE] = Feedback.Problem; <> Top: PUBLIC PROC [clientData: REF ANY, event: LIST OF REF ANY] = { ggData: GGData _ NARROW[clientData]; trueEntity: REF ANY; scene: Scene _ ggData.scene; selected: LIST OF REF ANY _ OrderedSelectionList[ggData, decr]; FOR entity: LIST OF REF ANY _ selected, entity.rest UNTIL entity=NIL DO WITH entity.first SELECT FROM slice: Slice => trueEntity _ slice; outline: Outline => trueEntity _ outline; ENDCASE => ERROR; GGScene.DeleteEntity[scene, trueEntity]; GGScene.AddEntity[scene, trueEntity, -1]; ENDLOOP; GGWindow.RestoreScreenAndInvariants[paintAction: $ObjectChangedInPlace, ggData: ggData, remake: none, backgndOK: FALSE, edited: TRUE, okToClearFeedback: TRUE]; }; Bottom: PUBLIC PROC [clientData: REF ANY, event: LIST OF REF ANY] = { ggData: GGData _ NARROW[clientData]; trueEntity: REF ANY; scene: Scene _ ggData.scene; selected: LIST OF REF ANY _ OrderedSelectionList[ggData, incr]; FOR entity: LIST OF REF ANY _ selected, entity.rest UNTIL entity=NIL DO WITH entity.first SELECT FROM slice: Slice => trueEntity _ slice; outline: Outline => trueEntity _ outline; ENDCASE => ERROR; GGScene.DeleteEntity[scene, trueEntity]; GGScene.AddEntity[scene, trueEntity, 0]; ENDLOOP; GGWindow.RestoreScreenAndInvariants[paintAction: $ObjectChangedInPlace, ggData: ggData, remake: none, backgndOK: FALSE, edited: TRUE, okToClearFeedback: TRUE]; }; UpOne: PUBLIC PROC [clientData: REF ANY, event: LIST OF REF ANY] = { ggData: GGData _ NARROW[clientData]; selected: LIST OF REF ANY _ OrderedSelectionList[ggData, incr]; FOR list: LIST OF REF ANY _ selected, list.rest UNTIL list=NIL DO GGScene.UpOne[ggData.scene, list.first]; ENDLOOP; GGWindow.RestoreScreenAndInvariants[paintAction: $ObjectChangedInPlace, ggData: ggData, remake: none, backgndOK: FALSE, edited: TRUE, okToClearFeedback: TRUE]; }; DownOne: PUBLIC PROC [clientData: REF ANY, event: LIST OF REF ANY] = { ggData: GGData _ NARROW[clientData]; selected: LIST OF REF ANY _ OrderedSelectionList[ggData, decr]; FOR list: LIST OF REF ANY _ selected, list.rest UNTIL list=NIL DO GGScene.DownOne[ggData.scene, list.first]; ENDLOOP; GGWindow.RestoreScreenAndInvariants[paintAction: $ObjectChangedInPlace, ggData: ggData, remake: none, backgndOK: FALSE, edited: TRUE, okToClearFeedback: TRUE]; }; OrderedSelectionList: PROC [ggData: GGData, order: OverlapOrder] RETURNS [list: LIST OF REF ANY] = { <> entityGen: EntityGenerator; list _ NIL; entityGen _ GGScene.TopLevelEntitiesInScene[ggData.scene]; FOR entity: REF ANY _ GGScene.NextEntity[entityGen], GGScene.NextEntity[entityGen] UNTIL entity = NIL DO IF GGSelect.IsSelectedInPart[entity, ggData.scene, normal] THEN list _ CONS[entity, list]; ENDLOOP; IF order=decr THEN list _ List.Reverse[list]; }; <