<> <> <> <> <> <> <> DIRECTORY TextEdit USING [CapChange], TextLooks USING [allLooks, Looks, noLooks], TextNode USING [Location, nullLocation, nullSpan, Ref, RefTextNode, Span], UndoEvent USING [Ref]; EditSpan: CEDAR DEFINITIONS = BEGIN Ref: TYPE = TextNode.Ref; RefTextNode: TYPE = TextNode.RefTextNode; Location: TYPE = TextNode.Location; nullLocation: Location = TextNode.nullLocation; Span: TYPE = TextNode.Span; nullSpan: Span = TextNode.nullSpan; Event: TYPE = UndoEvent.Ref; <> Looks: TYPE = TextLooks.Looks; noLooks: Looks = TextLooks.noLooks; allLooks: Looks = TextLooks.allLooks; ChangeLooks: PROC [root: Ref, span: Span, remove, add: Looks, event: Event _ NIL]; <> AddLooks: PROC [root: Ref, span: Span, add: Looks, event: Event _ NIL] = INLINE { ChangeLooks[root, span, noLooks, add, event] }; RemoveLooks: PROC [root: Ref, span: Span, remove: Looks, event: Event _ NIL] = INLINE { ChangeLooks[root, span, remove, noLooks, event] }; SetLooks: PROC [root: Ref, span: Span, new: Looks, event: Event _ NIL] = INLINE { ChangeLooks[root, span, allLooks, new, event] }; ClearLooks: PROC [root: Ref, span: Span, event: Event _ NIL] = INLINE { ChangeLooks[root, span, allLooks, noLooks, event] }; <> Replace: PROC [destRoot, sourceRoot: Ref, dest, source: Span, saveForPaste: BOOL _ TRUE, event: Event _ NIL] RETURNS [result: Span]; <> <> Delete: PROC [root: Ref, del: Span, event: Event _ NIL, saveForPaste: BOOL _ TRUE]; SaveForPaste: PROC [span: Span, event: Event _ NIL]; SavedForPaste: PROC RETURNS [span: Span]; <> Place: TYPE = { before, after, sibling, child }; <> <> <> <> <> <> Copy: PROC [destRoot, sourceRoot: Ref, dest: Location, source: Span, where: Place _ after, nesting: INTEGER _ 0, event: Event _ NIL] RETURNS [result: Span]; <> Move: PROC [destRoot, sourceRoot: Ref, dest: Location, source: Span, where: Place _ after, nesting: INTEGER _ 0, event: Event _ NIL] RETURNS [result: Span]; <> <> <> <> MoveOnto: PROC [destRoot, sourceRoot: Ref, dest, source: Span, saveForPaste: BOOL _ TRUE, event: Event _ NIL] RETURNS [result: Span]; <> <> Transpose: PROC [alphaRoot, betaRoot: Ref, alpha, beta: Span, event: Event _ NIL] RETURNS [newAlpha, newBeta: Span]; <> <> <> Insert: PROC [root, old: Ref, where: Place _ after, event: Event _ NIL] RETURNS [new: Ref]; <> Inherit: PROC [old, new: Ref, allprops: BOOL _ FALSE]; InsertTextNode: PROC [root, old: Ref, where: Place _ after, inherit: BOOL _ FALSE, event: Event _ NIL] RETURNS [new: RefTextNode]; <> Split: PROC [root: Ref, loc: Location, event: Event _ NIL] RETURNS [new: Ref]; <> <> <> <> <> <> Merge: PROC [root, node: Ref, event: Event _ NIL] RETURNS [loc: Location]; <> <> <> ChangeNesting: PROC [root: Ref, span: Span, change: INTEGER, event: Event _ NIL] RETURNS [new: Span]; <> Nest: PROC [root: Ref, span: Span, event: Event _ NIL] RETURNS [new: Span] = INLINE { new _ ChangeNesting[root, span, +1, event] }; <> UnNest: PROC [root: Ref, span: Span, event: Event _ NIL] RETURNS [new: Span] = INLINE { new _ ChangeNesting[root, span, -1, event] }; <> <> CapChange: TYPE = TextEdit.CapChange; ChangeCaps: PROC [root: Ref, span: Span, how: CapChange _ allCaps, event: Event _ NIL]; AllCaps: PROC [root: Ref, span: Span, event: Event _ NIL] = INLINE { ChangeCaps[root, span, allCaps, event] }; <> AllLower: PROC [root: Ref, span: Span, event: Event _ NIL] = INLINE { ChangeCaps[root, span, allLower, event] }; <> InitialCaps: PROC [root: Ref, span: Span, event: Event _ NIL] = INLINE { ChangeCaps[root, span, initCaps, event] }; <> <> NodeOrder: TYPE = { before, same, after, disjoint }; <<>> CompareNodeOrder: PROC [node1, node2: Ref] RETURNS [order: NodeOrder]; <> <> <> <> <> CannotDoEdit: ERROR; afterMoved1, afterMoved2: Location; <> <> END.