dps/src/VContainerDLE.m3


Copyright (C) 1994, Digital Equipment Corp.

MODULE VContainerDLE;

IMPORT DisplayList, DPS, DPSWindow, Linked2Tree, Err;

PROCEDURE Repaint (e: E; box: DPS.Box; only: REFANY := NIL): TEXT =
  BEGIN
  TYPECASE only OF
    NULL => RETURN DisplayList.Repaint (e, box, NIL); (* Paint my children. *)
  | E(ee)=>
      IF ee = e THEN RETURN DisplayList.Repaint (e, box, NIL);
       ELSE
        Err.Msg ("ee # e in VContainerDLE.Repaint");
        RETURN ee.Repaint (box, only);
        END;
    ELSE RETURN NIL;
    END;
  END Repaint;

PROCEDURE Init (e: E; <*UNUSED*> window: DPSWindow.T) =
  BEGIN
  IF e.initialized THEN RETURN; END;
  Rearrange (e);
  e.initialized := TRUE;
  END Init;

PROCEDURE Mouse (e: E; window: DPSWindow.T; event: DPS.MouseEvent): BOOLEAN =
  BEGIN
  Init(e, window);
  RETURN DisplayList.Mouse (e, window, event);
  END Mouse;

PROCEDURE Char (t: T; window: DPSWindow.T; char: CHAR): BOOLEAN =
 VAR e: DisplayList.T;
  BEGIN
  e := t.childWithInputFocus;
  IF e # NIL THEN RETURN e.Char (window, char);END;
  RETURN FALSE;
  END Char;

PROCEDURE Prepend (t: Linked2Tree.T; e: Linked2Tree.E) =
  BEGIN
  Linked2Tree.Prepend (t, e);
  Rearrange (t);
  END Prepend;

PROCEDURE Append (t: Linked2Tree.T; e: Linked2Tree.E) =
  BEGIN
  Linked2Tree.Append (t, e);
  Rearrange (t);
  END Append;

PROCEDURE Remove (e: Linked2Tree.E) =
 VAR me: T;
  BEGIN
  me := e.parent;
  Linked2Tree.Remove (e);
  Rearrange (me);
  END Remove;

PROCEDURE MakeChildLast (t: Linked2Tree.T;
                         <*UNUSED*> e: Linked2Tree.E): Linked2Tree.E =
  BEGIN
  (* Since our children are not overlapped, we can leave their order alone. *)
  (* Important, as we use the order as our bottom-to-top ordering. *)
  RETURN t.MoveToLast();
  END MakeChildLast;

PROCEDURE Rearrange (me: T) =
 VAR ee: DisplayList.E;
 VAR y, h, w, maxW: REAL;
  BEGIN
  maxW := 0.0;
  y := me.box.low.y;
  ee := me.First(); (* Forward, so up in Display PostScript. *)
  IF ee = NIL THEN me.box.high.y := y; RETURN; END;
  WHILE ee # NIL DO
    w := ee.box.high.x - ee.box.low.x;
    h := ee.box.high.y - ee.box.low.y;
    maxW := MAX (maxW, w);
    ee.box.low.x := me.box.low.x; ee.box.high.x := ee.box.low.x + w;
    ee.box.low.y := y; ee.box.high.y := y + h;
    y := y + h + me.separation;
    ee := ee.Next();
    END;
  me.box.high.y := y - me.separation;
  me.box.high.x := me.box.low.x + maxW;
  END Rearrange;

  BEGIN
  END VContainerDLE.

interface Err is in: