Copyright (C) 1994, Digital Equipment Corp.
MODULEThe first child (anchor) is MultiFilter.Child (Filter.Child (v)). The second child (menu) is MultiFilter.Child (v.menu).; IMPORT AnchorBtnVBT, FeedbackVBT, Filter, MultiClass, MultiFilter, SwitchVBT, VBT; AnchorSplit
REVEAL T = Public BRANDED OBJECT METHODS getAnchorChild (): VBT.T := GetAnchorChild; setAnchorChild (ch: VBT.T) := SetAnchorChild; getMenuChild (): VBT.T := GetMenuChild; setMenuChild (ch: VBT.T) := SetMenuChild; OVERRIDES init := Init; pre := SwitchVBT.Pre; post := SwitchVBT.Post; cancel := SwitchVBT.Cancel; END; TYPE MC = MultiClass.Split OBJECT OVERRIDES replace := Replace; insert := Insert; succ := Succ; END; PROCEDUREInit (v : T; feedback : FeedbackVBT.T; menuFrame : MultiFilter.T; n : CARDINAL := 0; anchorParent : VBT.T := NIL; hfudge, vfudge := 0.0 ): T = BEGIN <* ASSERT MultiFilter.Child (feedback) = NIL *> <* ASSERT MultiFilter.Child (menuFrame) = NIL *> EVAL AnchorBtnVBT.T.init ( v, feedback, menuFrame, n, anchorParent, hfudge, vfudge); MultiClass.Be (v, NEW (MC)); RETURN v END Init; PROCEDUREGetAnchorChild (v: T): VBT.T = BEGIN RETURN MultiFilter.Child (Filter.Child (v)) END GetAnchorChild; PROCEDURESetAnchorChild (v: T; ch: VBT.T) = BEGIN EVAL MultiFilter.Replace (Filter.Child (v), ch) END SetAnchorChild; PROCEDUREGetMenuChild (v: T): VBT.T = BEGIN RETURN MultiFilter.Child (v.menu) END GetMenuChild; PROCEDURESetMenuChild (v: T; ch: VBT.T) = BEGIN EVAL MultiFilter.Replace (v.menu, ch) END SetMenuChild; PROCEDUREInsert (m: MC; pred, ch: VBT.T) = VAR v: T := m.vbt; BEGIN IF pred = NIL THEN v.setAnchorChild (ch) ELSIF pred = v.getAnchorChild () THEN IF v.getMenuChild () = NIL THEN v.setMenuChild (ch) ELSE v.setAnchorChild (ch) (* See Trestle Ref Man, p. 46 *) END ELSE v.setMenuChild (ch) (* See Trestle Ref Man, p. 46 *) END END Insert; PROCEDUREReplace (m: MC; ch, new: VBT.T) = VAR v: T := m.vbt; BEGIN IF ch = NIL THEN <* ASSERT FALSE *> ELSIF ch = v.getAnchorChild () THEN v.setAnchorChild (new) ELSIF ch = v.getMenuChild () THEN v.setMenuChild (new) ELSE <* ASSERT FALSE *> END END Replace; PROCEDURESucc (m: MC; ch: VBT.T): VBT.T = VAR v: T := m.vbt; BEGIN IF ch = NIL THEN RETURN v.getAnchorChild () ELSIF ch = v.getAnchorChild () THEN RETURN v.getMenuChild () ELSIF ch = v.getMenuChild () THEN RETURN NIL ELSE <* ASSERT FALSE *> END END Succ; BEGIN END AnchorSplit.