Copyright (C) 1994, Digital Equipment Corp. MODULE; IMPORT DisplayList, DPS, DPSWindow, Linked2Tree, Err; PROCEDURE HContainerDLE Repaint (e: E; box: DPS.Box; only: REFANY := NIL): TEXT = BEGIN TYPECASE only OF NULL => RETURN DisplayList.Repaint (e, box, NIL); (* Goal: paint my children. *) | E(ee)=> IF ee = e THEN RETURN DisplayList.Repaint (e, box, NIL); ELSE Err.Msg ("ee # e in HContainerDLE.Repaint"); RETURN ee.Repaint (box, only); END; ELSE <*ASSERT FALSE*> END; END Repaint; PROCEDUREInitialize (e: E; <*UNUSED*> window: DPSWindow.T) = BEGIN IF e.initialized THEN RETURN; END; e.initialized := TRUE; END Initialize; PROCEDUREMouse (e: E; window: DPSWindow.T; event: DPS.MouseEvent): BOOLEAN = BEGIN Initialize(e, window); RETURN DisplayList.Mouse (e, window, event); END Mouse; PROCEDUREChar (t: T; window: DPSWindow.T; char: CHAR): BOOLEAN = VAR e: E; BEGIN Initialize(t, window); e := t.childWithInputFocus; IF e#NIL THEN RETURN e.Char (window, char); END; RETURN FALSE; END Char; PROCEDUREPrepend (t: Linked2Tree.T; e: Linked2Tree.E) = BEGIN Linked2Tree.Prepend (t, e); Rearrange (t); END Prepend; PROCEDUREAppend (t: Linked2Tree.T; e: Linked2Tree.E) = BEGIN Linked2Tree.Append (t, e); Rearrange (t); END Append; PROCEDURERemove (e: Linked2Tree.E) = VAR me: T; BEGIN me := e.parent; Linked2Tree.Remove (e); Rearrange (me); END Remove; PROCEDUREMakeChildLast (t: Linked2Tree.T; <*UNUSED*> e: Linked2Tree.E): Linked2Tree.E = BEGIN (* Since our children are not overlapped, we can maintain their order. *) (* Important as we use the ordering as the left-to-right order. *) RETURN t.MoveToLast(); END MakeChildLast; PROCEDURERearrange (me: T) = VAR ee: DisplayList.E; VAR x, h, w, maxH: REAL; BEGIN maxH := 0.0; x := me.box.low.x; ee := me.First(); IF ee = NIL THEN me.box.high.x := x; RETURN; END; WHILE ee # NIL DO w := ee.box.high.x - ee.box.low.x; h := ee.box.high.y - ee.box.low.y; maxH := MAX (maxH, h); ee.box.low.y := me.box.low.y; ee.box.high.y := ee.box.low.y + h; ee.box.low.x := x; ee.box.high.x := x + w; x := x + w + me.separation; ee := ee.Next(); END; me.box.high.x := x - me.separation; me.box.high.y := me.box.low.y + maxH; END Rearrange; BEGIN END HContainerDLE.