<*PRAGMA LL*> INTERFACEThe callJoinParent ; IMPORT ETAgent, JoinedVBT, VBT, Rect, ScrnCursor; TYPE Join = JoinedVBT.Public OBJECT parents: T := NIL END; TYPE T <: Public; Public = ETAgent.T OBJECT <* LL >= {JoinedVBT.T child of T, VBT.mu} *> link: T METHODS <* LL.sup <= VBT.mu *> init (join: JoinedVBT.T): T; END;
v.init(join, north, west) initializes v as a
JoinParent.T with child join, and returns v.
The northwest corner of the parent's domain is positioned at
point (north, west) in Joined's domain; this will be
maintained as the parent is reshaped or rescreened.
PROCEDURE New (v: JoinedVBT.T): T; <* LL.sup <= VBT.mu *>
New(...)is equivalent toNEW(ParentT).init(...).
PROCEDURE Rem (prnt: T); <* LL = VBT.mu *>
Cause the child of prnt to lose parent prnt, and mark it for
redisplay. PROCEDURE Child (prnt: T): JoinedVBT.T; <* LL = VBT.mu *>
Return theJoinedVBTfor whichprntis a parent.
PROCEDURE Succ (v: JoinedVBT.T; prnt: T): T; <* LL.sup = VBT.mu OR LL.sup = v *>
Return the successor to parentprntofv. It is a checked runtime error ifprntis not a parent ofv. As withSplit.Succ, the successor ofNILis the first parent; the successor the last parent isNIL; and the successor ofNILisNILifvhas no parents.
PROCEDURE Current(v: JoinedVBT.T): T; <* LL.sup = v OR LL.sup = VBT.mu *> PROCEDURE SetInput(v: JoinedVBT.T; prnt: T); <* LL.sup = VBT.mu *> PROCEDURE NeedsRescreen(v: JoinedVBT.T): BOOLEAN; <* LL.sup = VBT.mu *> PROCEDURE ST(v: JoinedVBT.T): VBT.ScreenType; <* LL.sup = VBT.mu *> PROCEDURE Domain(v: JoinedVBT.T): Rect.T; <* LL.sup = VBT.mu *> PROCEDURE SetCursor(v: T; cs: ScrnCursor.T); <* LL.sup = JoinedVBT child of v *> END JoinParent.