dps/src/HContainerDLE.m3


Copyright (C) 1994, Digital Equipment Corp.

MODULE HContainerDLE;

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);
            (* 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;

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

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

PROCEDURE Char (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;

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 maintain their order. *)
  (* Important as we use the ordering as the left-to-right order. *)
  RETURN t.MoveToLast();
  END MakeChildLast;

PROCEDURE Rearrange (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.

interface Err is in: