<> <> <> <> <<>> DIRECTORY CubicSplines, GGAlign, GGAngle, GGBasicTypes, GGBoundBox, AtomButtons, GGCaret, GGEditTool, GGError, GGEvent, GGGraphicsButton, GGGravity, GGInterface, GGInterfaceTypes, GGMeasure, GGModelTypes, GGObjects, GGOutline, GGRefresh, GGParseIn, GGSegmentTypes, GGSelect, GGSequence, GGTraj, GGUserInput, GGVector, GGViewerOps, GGWindow, IO, List, Real, RealFns, Rope, TiogaButtons, ViewerClasses, ViewerTools; GGEventImplB: CEDAR PROGRAM IMPORTS AtomButtons, GGAlign, GGAngle, GGBoundBox, GGCaret, GGEditTool, GGError, GGGraphicsButton, GGInterface, GGMeasure, GGObjects, GGParseIn, GGSelect, GGRefresh, GGSequence, GGOutline, GGTraj, GGVector, GGUserInput, GGViewerOps, GGWindow, IO, List, RealFns, Rope, TiogaButtons, ViewerTools EXPORTS GGEvent = BEGIN BoundBox: TYPE = GGModelTypes.BoundBox; Caret: TYPE = GGInterfaceTypes.Caret; EntityGenerator: TYPE = GGModelTypes.EntityGenerator; FeatureData: TYPE = GGGravity.FeatureData; GargoyleData: TYPE = GGInterfaceTypes.GargoyleData; 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; Segment: TYPE = GGSegmentTypes.Segment; SegmentGenerator: TYPE = GGModelTypes.SegmentGenerator; Sequence: TYPE = GGModelTypes.Sequence; SequenceGenerator: TYPE = GGModelTypes.SequenceGenerator; Slice: TYPE = GGModelTypes.Slice; SliceDescriptor: TYPE = GGModelTypes.SliceDescriptor; SliceParts: TYPE = GGModelTypes.SliceParts; SliceGenerator: TYPE = GGModelTypes.SliceGenerator; Traj: TYPE = GGModelTypes.Traj; TrajEnd: TYPE = GGModelTypes.TrajEnd; TrajGenerator: TYPE = GGModelTypes.TrajGenerator; SegAndIndex: TYPE = GGSequence.SegAndIndex; 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] = GGError.Problem; <> Top: PUBLIC PROC [event: LIST OF REF ANY, clientData: REF ANY] = { gargoyleData: GargoyleData _ NARROW[clientData]; trueEntity: REF ANY; scene: Scene _ gargoyleData.scene; selected: LIST OF REF ANY _ OrderedSelectionList[gargoyleData, 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; traj: Traj => trueEntity _ GGOutline.OutlineOfTraj[traj]; seq: Sequence => trueEntity _ GGOutline.OutlineOfTraj[seq.traj]; ENDCASE => ERROR; GGObjects.DeleteEntity[scene, trueEntity]; GGObjects.AddEntity[scene, trueEntity, -1]; ENDLOOP; GGWindow.RestoreScreenAndInvariants[paintAction: $ObjectChangedInPlace, gargoyleData: gargoyleData, remake: none, backgndOK: FALSE, edited: TRUE, okToClearFeedback: TRUE]; }; Bottom: PUBLIC PROC [event: LIST OF REF ANY, clientData: REF ANY] = { gargoyleData: GargoyleData _ NARROW[clientData]; trueEntity: REF ANY; scene: Scene _ gargoyleData.scene; selected: LIST OF REF ANY _ OrderedSelectionList[gargoyleData, 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; traj: Traj => trueEntity _ GGOutline.OutlineOfTraj[traj]; seq: Sequence => trueEntity _ GGOutline.OutlineOfTraj[seq.traj]; ENDCASE => ERROR; GGObjects.DeleteEntity[scene, trueEntity]; GGObjects.AddEntity[scene, trueEntity, 0]; ENDLOOP; GGWindow.RestoreScreenAndInvariants[paintAction: $ObjectChangedInPlace, gargoyleData: gargoyleData, remake: none, backgndOK: FALSE, edited: TRUE, okToClearFeedback: TRUE]; }; UpOne: PUBLIC PROC [event: LIST OF REF ANY, clientData: REF ANY] = { gargoyleData: GargoyleData _ NARROW[clientData]; selected: LIST OF REF ANY _ OrderedSelectionList[gargoyleData, incr]; FOR list: LIST OF REF ANY _ selected, list.rest UNTIL list=NIL DO GGObjects.UpOne[gargoyleData.scene, list.first]; ENDLOOP; GGWindow.RestoreScreenAndInvariants[paintAction: $ObjectChangedInPlace, gargoyleData: gargoyleData, remake: none, backgndOK: FALSE, edited: TRUE, okToClearFeedback: TRUE]; }; DownOne: PUBLIC PROC [event: LIST OF REF ANY, clientData: REF ANY] = { gargoyleData: GargoyleData _ NARROW[clientData]; selected: LIST OF REF ANY _ OrderedSelectionList[gargoyleData, decr]; FOR list: LIST OF REF ANY _ selected, list.rest UNTIL list=NIL DO GGObjects.DownOne[gargoyleData.scene, list.first]; ENDLOOP; GGWindow.RestoreScreenAndInvariants[paintAction: $ObjectChangedInPlace, gargoyleData: gargoyleData, remake: none, backgndOK: FALSE, edited: TRUE, okToClearFeedback: TRUE]; }; OrderedSelectionList: PROC [gargoyleData: GargoyleData, order: OverlapOrder] RETURNS [list: LIST OF REF ANY] = { <> entityGen: EntityGenerator; list _ NIL; entityGen _ GGObjects.TopLevelEntitiesInScene[gargoyleData.scene]; FOR entity: REF ANY _ GGObjects.NextEntity[entityGen], GGObjects.NextEntity[entityGen] UNTIL entity = NIL DO IF GGSelect.IsSelectedInPart[entity, gargoyleData.scene, normal] THEN list _ CONS[entity, list]; ENDLOOP; IF order=decr THEN list _ List.Reverse[list]; }; <