-- EditNotify.mesa
-- written by Bill Paxton, March 1981
-- last edit by Bill Paxton, March 18, 1981  4:48 PM


DIRECTORY
TextNode USING [Ref, RefTextNode, StyleName, TypeName],
TextLooks USING [Looks];

EditNotify: DEFINITIONS =
BEGIN OPEN nodeI:TextNode, looksI:TextLooks;

Ref: TYPE = nodeI.Ref;
RefTextNode: TYPE = nodeI.RefTextNode;
Looks: TYPE = looksI.Looks;
Char: TYPE = CHARACTER;
Card: TYPE = LONG CARDINAL;


-- **** Notification Operations ****

EditNotifyProc: TYPE =
	PROC [t1, t2: Ref, change: REF READONLY Change, time: When ← after];
	-- t1 and t2 are text nodes changed by the edit
	-- t2 will be NIL if only one node is changed

When: TYPE = {before, after};
	-- indicates whether before or after the change has taken place

AddNotifyProc: PROC [proc: EditNotifyProc, time: When ← after];
	-- add new proc to list of notification procedures
	-- call such procs before/after any node edit
		-- use time=before for applications such as saving text for undo
		-- use time=after for applications such as reformat & redisplay

RemoveNotifyProc: PROC [proc: EditNotifyProc, time: When ← after];
	-- remove proc from list of notification procedures

CallNotifyProcs: PROC
	[t1, t2: Ref, change: REF READONLY Change, time: When ← after];
	-- call notification procedures
	-- some clients may want to use this for their own applications
	-- standard edit routines do this automatically

Change: TYPE = RECORD [SELECT kind:OfChange FROM

	ChangingLooks => [
		text: RefTextNode,
		removeLooks, addLooks: Looks,
		startLoc, changeLen: Card],
		-- changeLen characters in text starting at startLoc get changed looks
		-- first remove the removeLooks, then add the addLooks
	
	ReplacingText => [
		dest: RefTextNode, destStart, destLen: Card,
		source: RefTextNode, sourceStart, sourceLen: Card],
		-- replace destLen characters in dest starting at destStart
		-- by sourceLen characters from source starting at sourceStart
		-- this covers copying and deleting also
			-- destLen=0 for copying
			-- sourceLen=0 for deleting
	
	MovingText => [ 
		dest: RefTextNode, destLoc:  Card,
		source: RefTextNode, sourceStart, sourceLen:  Card],
			-- delete sourceLen characters from source starting at sourceStart
			-- insert them in dest at destLoc

	TransposingText => [
		alpha: RefTextNode, alphaStart, alphaLen: Card,
		beta: RefTextNode, betaStart, betaLen: Card],
		-- exchange alphaLen characters of alpha starting at alphaStart
		-- with betaLen characters of beta starting at betaStart
	
	InsertingText => [
		-- for InsertChar, InsertString, and InsertRope
		dest: RefTextNode, destLoc, insertLen: Card,
		inherit: BOOLEAN, looks: Looks],
		-- insert insertLen characters at destLoc in dest
		-- if inherit is true, characters gets looks in following manner:
			-- if dest length is 0, then gets looks from argument list, else
			-- if location > 0, then looks and list of previous char,
			-- else looks and list of first char in dest
	
	ChangingType => [
		node: Ref,
		newStyle, newType: BOOLEAN, 
		styleName: nodeI.StyleName,
		typeName: nodeI.TypeName],
		-- change style and/or type of node
	
	ReplacingNodes => [
		destParent: Ref, destStart, destLen: Card,
		sourceParent: Ref, sourceStart, sourceLen: Card],
		-- replace destLen children in destParent starting at destStart
		-- by sourceLen children from sourceParent starting at sourceStart
		-- this covers copying and deleting nodes also
	
	MovingNodes => [
		destParent: Ref, destLoc: Card,
		sourceParent: Ref, sourceStart, sourceLen: Card],
			-- delete sourceLen children from sourceParent starting at sourceStart
			-- insert them in destParent at destLoc
				-- e.g., destLoc=0 to move to start of dest
				-- and destLoc=NumChildren[dest] to move to end
	
	TransposingNodes => [
		alphaParent: Ref, alphaStart, alphaLen: Card,
		betaParent: Ref, betaStart, betaLen: Card],
		-- exchange alphaLen children of alphaParent starting with alphaStart
			-- with betaLen children of betaParent starting with betaStart
	
	InsertingNode => [
		destParent: Ref, destLoc: Card],
		-- insert a new node as destLoc'th child of destParent

	ENDCASE];

OfChange: TYPE = {
	ChangingLooks, ReplacingText, MovingText, TransposingText, InsertingText,
	ChangingType, ReplacingNodes, MovingNodes, TransposingNodes, InsertingNode};
	
END.