DIRECTORY Rope, RefStack, IP, IPCoTab USING[Component, CornerTypes], IPCTG USING[Channel, Side, ChType], IPTop USING [Ref], IPTopOpRecs; IPTopOps: CEDAR DEFINITIONS IMPORTS RefStack= BEGIN OPEN TOR: IPTopOpRecs; InvalidArgs: ERROR[op: ATOM]; UndoStackEmpty: ERROR; BreakCross: PROC [top: IPTop.Ref, refCh, chToBreak: IPCTG.Channel, keepTrack: BOOL _ FALSE] RETURNS [fr: TOR.FRBreakCross, ir: TOR.IRFormCross]; FormCross: PROC[top: IPTop.Ref, ch1, ch2: IPCTG.Channel, keepTrack: BOOL _ FALSE] RETURNS [fr: TOR.FRFormCross, ir: TOR.IRBreakCross]; BreakCrosses: PROC[top: IPTop.Ref, refCh, chBnd1, chBnd2: IPCTG.Channel, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.RComposite]; FormZ: PROC[top: IPTop.Ref, comp1, comp2: IPCoTab.Component, zType: IPCTG.Side, keepTrack: BOOL _ FALSE] RETURNS [fr: TOR.FRFormZ, ir: TOR.IRRemoveZ]; RemoveZ: PROC[top: IPTop.Ref, zSpine: IPCTG.Channel, keepTrack: BOOL _ FALSE] RETURNS [fr: TOR.FRRemoveZ, ir: TOR.IRFormZ]; LtoT: PROC[top: IPTop.Ref, ch: IPCTG.Channel, whichEnd: IPCTG.Side, keepTrack: BOOL _ FALSE] RETURNS [fr: TOR.FRLtoT, ir: TOR.RComposite]; TtoL: PROC [top: IPTop.Ref, co: IPCoTab.Component, ch: IPCTG.Channel, lType: IPCTG.Side, keepTrack: BOOL _ FALSE] RETURNS [fr: TOR.FRTtoL, ir: TOR.IRLtoT]; FlexKnee: PROC [top: IPTop.Ref, leg, floor: IPCTG.Channel, whichEnd: IPCTG.Side, keepTrack: BOOL _ FALSE] RETURNS [fr: TOR.FRFlexKnee, ir: TOR.RComposite]; ExtendKnee: PROC [top: IPTop.Ref, shin: IPCTG.Channel, keepTrack: BOOL _ FALSE] RETURNS [fr: TOR.FRExtendKnee, ir: TOR.IRFlexKnee]; Grow: PROC[top: IPTop.Ref, co: IPCoTab.Component, chToSplit, negBnd, posBnd: IPCTG.Channel, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.RComposite]; Grow1: PROC[top: IPTop.Ref, co, host: IPCoTab.Component, hostCorner: IPCoTab.CornerTypes, keepTrack: BOOL _ FALSE] RETURNS [fr: TOR.FRGrow1, ir: TOR.IRRemoveCoAtCorner]; Shrink: PROC[top: IPTop.Ref, co: IPCoTab.Component, shrinkDirectionHint: IPCTG.ChType, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.RComposite]; FlipT: PROC [top: IPTop.Ref, chToBend, attachTo: IPCTG.Channel, whichEnd: IPCTG.Side, keepTrack: BOOL _ FALSE] RETURNS [fr: TOR.FRFlipT, ir: TOR.RComposite]; ClearNegCorner: PROC[top: IPTop.Ref, co: IPCoTab.Component, corner: IPCoTab.CornerTypes, chToUse: IPCTG.ChType, breakOtherIfX, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.RComposite]; --returns NIL if nothing to do-- ClearAllNegCorners: PROC[top: IPTop.Ref, co: IPCoTab.Component, chToUse: IPCTG.ChType, breakOtherIfX, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.RComposite]; --returns NIL if nothing to do-- ClearLCorner: PROC[top: IPTop.Ref, co: IPCoTab.Component, corner: IPCoTab.CornerTypes, hint: IPCTG.ChType, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.RAny]; --returns NIL if nothing to do-- ClearAllLCorners: PROC[top: IPTop.Ref, co: IPCoTab.Component, hint: IPCTG.ChType, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.RComposite]; --returns NIL if nothing to do-- BreakXAtCorner: PROC [top: IPTop.Ref, co: IPCoTab.Component, corner: IPCoTab.CornerTypes, chToBreak: IPCTG.ChType, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.RAny]; --returns NIL if nothing to do-- Mirror: PROC[top: IPTop.Ref, co: IPCoTab.Component, mirrorOrientation: IPCTG.ChType, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.ROrient]; Rotate: PROC[top: IPTop.Ref, co: IPCoTab.Component, numberOfRot: INT _ 1, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.ROrient]; Orient: PROC[top: IPTop.Ref, co: IPCoTab.Component, operation: IP.Orientation, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.ROrient]; SetComponent: PROC[top: IPTop.Ref, co: IPCoTab.Component, active: BOOL, atPosition: IP.IntVector, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.RSetComponent]; MoveComponent: PROC [top: IPTop.Ref, co: IPCoTab.Component, by: IP.IntVector, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.RMoveComponent]; SwapComponents: PROC[top: IPTop.Ref, co1, co2: IPCoTab.Component, keepTrack: BOOL _ FALSE] RETURNS [fr, ir: TOR.RSwapComponents]; SpawnComps: PROC[top: IPTop.Ref, comp: IPCoTab.Component, negChildName, posChildName: Rope.ROPE, negChildShape, posChildShape: IP.ShapeRep, splitDirection: IP.OrientationTypes, chkArgs, keepTrack: BOOL _ TRUE, negChild, posChild: IPCoTab.Component _ NIL] RETURNS [fr: TOR.FRSpawnComps, ir: TOR.RComposite]; SetCompShape: PROC[top: IPTop.Ref, comp: IPCoTab.Component, shape: IP.ShapeRep, chkArgs, keepTrack: BOOL _ TRUE] RETURNS [fr, ir: TOR.RSetCompShape]; FormZChk: PROC[top: IPTop.Ref, comp1, comp2: IPCoTab.Component, zType: IPCTG.Side] RETURNS [BOOL]; FlipTChk: PROC[top: IPTop.Ref, chToBend, attachTo: IPCTG.Channel, whichEnd: IPCTG.Side] RETURNS [BOOL]; SpawnCompsChk: PUBLIC PROC[top: IPTop.Ref, comp: IPCoTab.Component, negChildName, posChildName: Rope.ROPE, negChildShape, posChildShape: IP.ShapeRep, splitDirection: IP.OrientationTypes] RETURNS [BOOL]; SetCompShapeChk: PUBLIC PROC[comp: IPCoTab.Component, shape: IP.ShapeRep] RETURNS [BOOL]; StackSize: PROC[top: IPTop.Ref] RETURNS [NAT]; ResetStacks: PROC[top: IPTop.Ref]; GetTrack: PROC[top: IPTop.Ref, after: NAT _ 0] RETURNS [LIST OF REF]; Undo: PROC[top: IPTop.Ref, n: NAT] RETURNS [LIST OF REF]; --returns the track to the previous state before undo-- Undo1: PROC[top: IPTop.Ref] RETURNS [REF]; --returns the previous step ie. the step undone-- Redo: PROC[top: IPTop.Ref, track: LIST OF REF]; --Traverse track and keep Track-- Redo1: PROC[top: IPTop.Ref, step: REF]; --Take a step and keepTrack-- PushStacks: PROC[top: IPTop.Ref, fr, ir: TOR.RAny] = INLINE { RefStack.Push[top.redoStack, fr]; RefStack.Push[top.undoStack, ir] }; --PushStacks Cons2: PROC[r1: REF, l1: LIST OF REF, r2: REF, l2: LIST OF REF] RETURNS [result1, result2: LIST OF REF] = INLINE {result1 _ CONS[r1, l1]; result2 _ CONS[r2, l2];}; --Cons2-- END. Ò--File: IPTopOps.mesa Last Edited by: CSChow, February 1, 1985 11:01:27 am PST --Intro: This is the top-level interface of all the edit and stack operations on the system. -- I'll not try to give documentation to individual operation. One way to know -- the effect of the operations is to use them and look at the source codes (and good luck.) --General Comment: If you want to be able to use undo and redo facility, -- keepTrack must be set to TRUE, and if at any point in the sequence of operations, one of -- the operation is called (by the user) without keepTrack = TRUE, then the stacks should -- be reset since any previous information is no longer consistent. -- SO IF YOU ARE A CLIENT (NOT AN IMPLEMENTOR) YOU ALMOST ALWAYS -- USE keepTrack: TRUE. -- The chkArgs BOOL is a new design idea, it allows supression of argument checkings -- (for building new edit operations.) --Impl: This interface is exported by: -- (i) IPTopEditOpsImpl, -- (ii) IPTopStackOpsImpl, and -- (iii) IPTopEditOpsExtraImpl -- chkArgs = FALSE => no checking on arguments -- negChild, posChild are for implementors -- chkArgs = FALSE => no checking on arguments --Stack related operations: --after = 0 <=> Get track from bottomost ʘJšœ™J™8J™J™\J™NJ™\J™J™HJšœ^™^J™YJ™DJšœA™AJšœ™J™J™UJ™&J™™'J™J™J™—J™J™šÏk ˜ J˜Jšœ ˜ Jšœ˜Jšœœ˜&Jšœœ˜#Jšœœ˜Jšœ ˜ J˜—šœ œ œ˜Jšœ œœœ˜.J˜Jšœ œœ˜Jšœœ˜J˜JšÏn œœ$œœœœœœ˜Icode˜Kšž œœœœœœœœ˜†K˜Kšž œœ(œœœœ œ ˜ƒK˜Kšžœœ9œœœœœœ ˜–Kšžœœœœœœœœ ˜{K˜Kšžœœœœœœœœ œ ˜ŠJ˜Jšžœœ-œœœœœœ œ ˜›K˜Kšžœœœœœœœœœ ˜›K˜Kšž œœœœœœœœ ˜ƒK˜KšžœœCœœœœ œ ˜–J˜JšžœœZœœœœœ˜©J˜Jšžœœ=œœœœ œ ˜‘J˜Kšžœœ&œœœœœœœ ˜J˜JšžœœNœ#œœœ œÏc ˜ÚJ˜Jšžœœ1œ#œœœ œŸ ˜ÁJ˜Jšž œœLœœœœ œŸ ˜ÁJ˜Jšžœœ/œœœœ œŸ ˜®J˜JšžœœQœœœœ œŸ ˜ÈJ˜Kšžœœ;œœœœ œ ˜ŒK˜Kšžœœ5œœœœ œ ˜K˜Jšžœœ3œœœœ œ ˜†J˜Kšž œœ0œœœœœ œ˜ŸK˜Kšž œœ-œœœœ œ˜ŒK˜Kš žœœ9œœœ œ˜K˜šž œœKœ œœ'œœ(œœœœ ˜²Kšœ.™.KšŸ*™*—K˜š ž œœ1œ œœ œ˜•Kšœ.™.K˜—Kš žœœ9œœœ˜bK˜Kš žœœ%œœœœ˜gK˜Kšž œœœKœ œœœœ˜ÊK˜Kš žœœœ!œ œœ˜YK™K™Kšž œœœœ˜.K˜Kšž œœ˜"K˜šžœœœœœœœ˜EKšœ(™(—J˜KšžœœœœœœœŸ5œ˜qJ˜Kš žœœœœŸ1˜\K˜Kš žœœœœœŸ!˜QJ˜KšžœœœŸ˜EK˜šž œœœ œ˜=Kšœ!˜!Kšœ ˜ KšœŸ ˜—K˜Kš$žœœœœœœœœœœœœœœœ œœ Ÿœ˜­K™K˜Kšœ˜——…—²"†