DIRECTORY RopeEdit, TiogaLooks, TiogaNode, UndoEvent; TextEdit: CEDAR DEFINITIONS IMPORTS TiogaLooks, RopeEdit = BEGIN Ref: TYPE = TiogaNode.Ref; RefTextNode: TYPE = TiogaNode.RefTextNode; RefItemNode: TYPE = TiogaNode.RefItemNode; RefBranchNode: TYPE = TiogaNode.RefBranchNode; ROPE: TYPE = RopeEdit.ROPE; Looks: TYPE = TiogaLooks.Looks; noLooks: Looks = TiogaLooks.noLooks; allLooks: Looks = TiogaLooks.allLooks; Offset: TYPE = TiogaLooks.Offset; MaxLen, MaxOffset: Offset = LAST[Offset]; MaxNat: NAT = LAST[NAT]; Event: TYPE = UndoEvent.Ref; Flatten: PROC [text: RefTextNode] RETURNS [BOOLEAN]; AlreadySaved: PROC [text: RefTextNode, event: Event] RETURNS [BOOLEAN]; ChangeLooks: PROC [ root: RefBranchNode, text: RefTextNode, remove, add: Looks, start: Offset _ 0, len: Offset _ MaxOffset, event: Event _ NIL]; AddLooks: PROC [ root: RefBranchNode, text: RefTextNode, add: Looks, start: Offset _ 0, len: Offset _ MaxOffset, event: Event _ NIL] = INLINE { ChangeLooks[root, text, noLooks, add, start, len, event] }; RemoveLooks: PROC [ root: RefBranchNode, text: RefTextNode, remove: Looks _ allLooks, start: Offset _ 0, len: Offset _ MaxOffset, event: Event _ NIL] = INLINE { ChangeLooks[root, text, remove, noLooks, start, len, event] }; SetLooks: PROC [ root: RefBranchNode, text: RefTextNode, new: Looks, start: Offset _ 0, len: Offset _ MaxOffset, event: Event _ NIL] = INLINE { ChangeLooks[root, text, allLooks, new, start, len, event] }; ClearLooks: PROC [ root: RefBranchNode, text: RefTextNode, start: Offset _ 0, len: Offset _ MaxOffset, event: Event _ NIL] = INLINE { ChangeLooks[root, text, allLooks, noLooks, start, len, event] }; ChangeFormat: PROC [ node: Ref, formatName: TiogaNode.Name, event: Event _ NIL, root: RefBranchNode _ NIL]; ChangeStyle: PROC [ node: Ref, name: ROPE, event: Event _ NIL, root: RefBranchNode _ NIL]; PutProp: PROC [ node: Ref, name: ROPE, value: REF, event: Event _ NIL, root: RefBranchNode _ NIL]; GetProp: PROC [node: Ref, name: ROPE] RETURNS [value: REF]; TwoSpanProc: TYPE = PROC [ destRoot, sourceRoot: RefBranchNode, dest: RefTextNode, destStart: Offset _ 0, destLen: Offset _ MaxLen, source: RefTextNode, sourceStart: Offset _ 0, sourceLen: Offset _ MaxLen, event: Event _ NIL] RETURNS [resultStart, resultLen: Offset]; DestSpanProc: TYPE = PROC [ destRoot, sourceRoot: RefBranchNode, dest: RefTextNode, destLoc: Offset _ 0, source: RefTextNode, start: Offset _ 0, len: Offset _ MaxLen, event: Event _ NIL] RETURNS [resultStart, resultLen: Offset]; ReplaceText: TwoSpanProc; OneSpanProc: TYPE = PROC [ root: RefBranchNode, text: RefTextNode, start: Offset _ 0, len: Offset _ MaxLen, event: Event _ NIL]; DeleteText: OneSpanProc; CopyText: DestSpanProc; MoveText: DestSpanProc; MoveTextOnto: TwoSpanProc; TransposeProc: TYPE = PROC [ alphaRoot, betaRoot: RefBranchNode, alpha: RefTextNode, alphaStart: Offset _ 0, alphaLen: Offset _ MaxLen, beta: RefTextNode, betaStart: Offset _ 0, betaLen: Offset _ MaxLen, event: Event _ NIL] RETURNS [alphaResultStart, alphaResultLen, betaResultStart, betaResultLen: Offset]; TransposeText: TransposeProc; ReplaceByText: PROC [ root: RefBranchNode, dest: RefTextNode, destStart: Offset _ 0, destLen: Offset _ MaxLen, sourceRope: ROPE, sourceRuns: TiogaLooks.Runs, sourceStart: Offset _ 0, sourceLen: Offset _ MaxLen, event: Event _ NIL] RETURNS [resultStart, resultLen: Offset]; ReplaceWords: TwoSpanProc; DeleteWords: OneSpanProc; CopyWords: DestSpanProc; MoveWords: DestSpanProc; MoveWordsOnto: TwoSpanProc; TransposeWords: TransposeProc; ReplaceByChar: PROC [ root: RefBranchNode, dest: RefTextNode, char: CHAR, start: Offset _ 0, len: Offset _ MaxLen, inherit: BOOLEAN _ TRUE, looks: Looks _ noLooks, event: Event _ NIL] RETURNS [resultStart, resultLen: Offset]; InsertChar: PROC [ root: RefBranchNode, dest: RefTextNode, char: CHAR, destLoc: Offset _ 0, inherit: BOOLEAN _ TRUE, looks: Looks _ noLooks, event: Event _ NIL] RETURNS [resultStart, resultLen: Offset] = INLINE { [resultStart,resultLen] _ ReplaceByChar[root, dest, char, destLoc, 0, inherit, looks, event] }; AppendChar: PROC [ root: RefBranchNode, dest: RefTextNode, char: CHAR, inherit: BOOLEAN _ TRUE, looks: Looks _ noLooks, event: Event _ NIL] RETURNS [resultStart, resultLen: Offset] = INLINE { [resultStart,resultLen] _ InsertChar[root, dest, char, MaxLen, inherit, looks, event] }; ReplaceByString: PROC [ root: RefBranchNode, dest: RefTextNode, string: REF READONLY TEXT, stringStart: NAT _ 0, stringNum: NAT _ MaxNat, start: Offset _ 0, len: Offset _ MaxLen, inherit: BOOLEAN _ TRUE, looks: Looks _ noLooks, event: Event _ NIL] RETURNS [resultStart, resultLen: Offset]; InsertString: PROC [ root: RefBranchNode, dest: RefTextNode, string: REF READONLY TEXT, stringStart: NAT _ 0, stringNum: NAT _ MaxNat, destLoc: Offset _ 0, inherit: BOOLEAN _ TRUE, looks: Looks _ noLooks, event: Event _ NIL] RETURNS [resultStart, resultLen: Offset] = INLINE { [resultStart,resultLen] _ ReplaceByString[root,dest,string,stringStart,stringNum, destLoc,0,inherit,looks,event] }; AppendString: PROC [ root: RefBranchNode, dest: RefTextNode, string: REF READONLY TEXT, stringStart: NAT _ 0, stringNum: NAT _ MaxNat, inherit: BOOLEAN _ TRUE, looks: Looks _ noLooks, event: Event _ NIL] RETURNS [resultStart, resultLen: Offset] = INLINE { [resultStart,resultLen] _ InsertString[root,dest,string,stringStart,stringNum, MaxLen,inherit,looks,event] }; ReplaceByRope: PROC [ root: RefBranchNode, dest: RefTextNode, rope: ROPE, start: Offset _ 0, len: Offset _ MaxLen, inherit: BOOLEAN _ TRUE, looks: Looks _ noLooks, event: Event _ NIL] RETURNS [resultStart, resultLen: Offset]; InsertRope: PROC [ root: RefBranchNode, dest: RefTextNode, rope: ROPE, destLoc: Offset _ 0, inherit: BOOLEAN _ TRUE, looks: Looks _ noLooks, event: Event _ NIL] RETURNS [resultStart, resultLen: Offset] = INLINE { [resultStart,resultLen] _ ReplaceByRope[root,dest,rope,destLoc,0,inherit,looks,event] }; AppendRope: PROC [ root: RefBranchNode, dest: RefTextNode, rope: ROPE, inherit: BOOLEAN _ TRUE, looks: Looks _ noLooks, event: Event _ NIL] RETURNS [resultStart, resultLen: Offset] = INLINE { [resultStart,resultLen] _ InsertRope[root,dest,rope,MaxLen,inherit,looks,event] }; AllCaps: PROC [ root: RefBranchNode, dest: RefTextNode, start: Offset _ 0, len: Offset _ MaxLen, event: Event _ NIL] = INLINE { ChangeCaps[root,dest,start,len,allCaps,event] }; AllLower: PROC [ root: RefBranchNode, dest: RefTextNode, start: Offset _ 0, len: Offset _ MaxLen, event: Event _ NIL] = INLINE { ChangeCaps[root,dest,start,len,allLower,event] }; InitialCaps: PROC [ root: RefBranchNode, dest: RefTextNode, start: Offset _ 0, len: Offset _ MaxLen, event: Event _ NIL] = INLINE { ChangeCaps[root,dest,start,len,initCaps,event] }; CapChange: TYPE = {allCaps, allLower, initCaps, firstCap}; ChangeCaps: PROC [ root: RefBranchNode, dest: RefTextNode, start: Offset _ 0, len: Offset _ MaxLen, how: CapChange _ allCaps, event: Event _ NIL]; END. 4TextEdit.mesa; written by Bill Paxton, February 1981 edited by McGregor, March 18, 1983 10:56 am edited by Bill Paxton, July 11, 1983 12:36 pm **** General operations **** returns true if it decides to flatten rope & runs this is done automatically after a certain number of edits to the node returns TRUE if there is already a ChangingText record for given node in the event **** Operations to add or delete looks **** first remove then add in the given range **** Changing Style / Format / Property of node **** appends style to end of node prefix **** Editing Operations for text **** NOTE: edit operations do not create or delete addrs, but they can change their locations within the text replace the dest text by a copy of the source text addrs that are in the replaced text move to destStart addrs that are after the replaced text are adjusted delete the specified range of text addrs that are in the deleted section move to start copy the specified text add length of inserted text to addrs that are beyond destLoc move [start..start+len) in source to destLoc in dest no-op if dest=source and destLoc IN [start..start+len] addrs that are in the moved text do one of the following: move with the text if dest = source, or move to start if dest # source move [start..start+len) onto [destStart..destStart+destLen) implemented by appropriate calls on MoveText and DeleteText transpose the alpha text and the beta text addrs treated same as in Move move with the text if alpha = beta, or move to respective starts if alpha # beta like ReplaceText, except give rope and runs as source instead of node replace the dest words by a copy of the source words adjusts appropriately to retain proper spacing returns the start location and length of the new text delete the specified words copy the specified words move the words in [start..start+len) onto those in [destStart..destStart+destLen) adjusts appropriately to retain proper spacing transpose the alpha words and the beta words adjusts appropriately to retain proper spacing returns new starts and lengths alphaResultStart, alphaResultLen are new start and length for alpha words betaResultStart, betaResultLen are new start and length for beta words if inherit is false, char gets specifed looks if inherit is true, char gets looks in following manner: if dest length is 0, then gets looks from argument list, else if start > 0, then looks of previous char, else looks of char following replacement ***** Cap's and Lowercase force specified span to all uppercase force specified span to all lowercase force first letter of words uppercase Ê„˜JšÏc4™4Jš+™+Jš-™-J˜šÏk ˜ J˜ J˜ J˜ J˜ —J˜šœ ž˜Jšžœ˜—Jšž˜J˜Jšœžœ˜Jšœ žœ˜*Jšœ žœ˜*Jšœžœ˜.Jšžœžœ žœ˜J˜Jšœžœ˜J˜$J˜&Jšœžœ˜!Jšœžœ ˜)Jšœžœžœžœ˜Jšœžœ˜J˜J˜š™J˜—šÏnœžœžœžœ˜4Jš1™1JšF™FJ˜—šŸ œžœ#žœžœ˜GJšS™SJ˜J˜—Jš+™+J˜šŸ œžœ˜J˜;Jšœ;žœ˜@Jš(™(J˜—šŸœžœ˜J˜3Jšœ;žœ˜?Jšœžœ>˜FJ˜—šŸ œžœ˜J˜AJšœ;žœ˜?JšœžœA˜IJ˜—šŸœžœ˜J˜3Jšœ;žœ˜?Jšœžœ?˜GJ˜—šŸ œžœ˜Jšœcžœ˜gJšœžœC˜KJ˜J˜—Jš4™4J˜šŸ œžœ˜Jšœ6žœžœ˜V—J˜šŸ œžœ˜Jšœžœžœžœ˜FJš*™*J˜—šŸœžœ˜Jš œžœ žœžœžœ˜RJ˜—Jš Ÿœžœžœžœ žœ˜;J˜J˜Jš%™%˜š4™4Jš3™3J˜——šŸ œžœžœ˜J˜$J˜CJ˜IJšœžœ˜Jšžœ"˜)J˜—šŸ œžœžœ˜J˜$J˜'JšœMžœ˜QJšžœ"˜)J˜—˜Jš2™2Jš5™5Jš3™3J˜—šŸ œžœžœ˜J˜JšœKžœ˜PJ˜—˜Jš"™"Jš3™3J˜—˜Jš™Jš<™