<* PRAGMA LL *> <* PRAGMA SUBTYPE *>An
ZChildVBT.T is a VBT that is typically used as a subwindow.
   A ZChildVBT is a subclass of a HighlightVBT that insulates any
   highlighting done in the ZChildVBT from highlighting done in
   other subwindows.  Clients should use a ZBackgroundVBT around the
   background child in order to insulate highlighting in the
   background child from highlighting in the subwindows.
   There are two alternate ways to initialize a ZChildVBT. Each
   allows the client to specify whether the subwindow should be
   initially visible (``mapped'') and how the subwindow should
   be reshaped when the parent ZSplit is reshaped.
   The method call v.init(...) allows the client to specify where
   the center or a corner of v should be placed, relative to the
   parent, either in absolute distance (in millimeters) from the
   parent's northwest corner (CoordType.Absolute), or as percentages
   of the parent's width and height (CoordType.Scaled).  The default
   is to align the center of v with the center of the parent. The size
   of v is its preferred sizes in both the horizontal and vertical
   dimensions.
   The method call v.initFromEdges(...) allows the client to specify
   the edges of v, either in absolute distance (in millimeters) from
   the parent's northwest corner (this is the only case in which the
   client specifies the absolute size of v), or as percentages of
   the parent's width and height.
   The implementation will not pop up a subwindow with its northwest
   corner north or west of the visible portion of the ZSplit parent;
   it will override the specified position as necessary to bring it
   into view. It is a checked runtime error to specify scaled
   coordinates (percentages) that are outside the range 0.0--1.0.
   If the specified position is overriden, or if the subwindow is
   not entirely visible when the subwindow is first made visible,
   the implementation will also override the reshape method so that
   the subwindow will be repositioned using the information specified
   when it was initialized.
   Finally, in order for the reformatting to meet specifications
   above, the client must call Inserted after the subwindow is
   inserted as a child of a ZSplit; the client must call Moved
   after the subwindow is repositioned by the user; and the client
   must call Grew after the size of the subwindow is changed by the
   user. 
INTERFACEZChildVBT ; IMPORT HighlightVBT, VBT, ZSplit; TYPE Location = {NW, NE, SW, SE, Center}; CoordType = {Absolute, Scaled}; T <: Public; Public = HighlightVBT.T OBJECT METHODS <* LL <= VBT.mu *> init (ch : VBT.T; h, v := 0.5; loc := Location.Center; type := CoordType.Scaled; shaper: ZSplit.ReshapeControl := NIL; open: BOOLEAN := TRUE): T; initFromEdges (ch: VBT.T; w, e, n, s: REAL; type := CoordType.Absolute; shaper: ZSplit.ReshapeControl := NIL; open := TRUE): T; END; PROCEDURE InitiallyMapped (v: VBT.T): BOOLEAN;
Ifvis aZChild, return the value ofopenwhen it was initialized. Otherwise, returnTRUE.
PROCEDURE Pop (v: VBT.T; forcePlace := FALSE);
Mapvand lift it to the top of its parent's children. IfforcePlaceis set, positionvat its initial location.
PROCEDURE Inserted (v: VBT.T);
The client must call this procedure aftervhas been inserted into aZSplit. This procedure sets aReshapeControlobject onv. Ifvisn't aZChildVBT, theReshapeControltries to centerv, subject to the contraint that its northwest corner is just visible. Ifvis aZChild, theReshapeControlwill followvbt's initial position untilvis moved by the user (usually becauseMovedis called). At that point, the northwest corner ofvwill remain at that position relative to its parent, until the user moves it again.
PROCEDURE Moved (v: VBT.T);
The client must call this procedure aftervhas been moved by a user. Ifvis aZChildVBT, this procedure notes thatvhas been moved by the user, so that the next time it is reshaped,vwill retain its current position relative to its parent. Ifvisn't aZChildVBT, this procedure is a no-op.
PROCEDURE Grew (v: VBT.T; w, h: INTEGER);
The client must call this procedure after the size ofvhas been changed tow-by-h(in pixels) by a user. Ifvis aZChildVBT, this procedure notes thatvhas a new shape and callsVBT.NewShapeto tell the parentZSplit. Subsequently,vwill report its shape asw-by-h. Ifvis not aZChildVBT, this procedure is a no-op.
Finally, here are a few
ZSplit reshape controllers
   that are sometimes useful:  
VAR (*CONST*) Scaled: ZSplit.ReshapeControl; ScaledHFixed: ZSplit.ReshapeControl; ScaledVFixed: ZSplit.ReshapeControl; ScaledHVFixed: ZSplit.ReshapeControl;
Scaled reshapes the child by
   scaling the old child domain to occupy the same relative position
   of the changing parent domain. ScaledHFixed does the same, and then
   insets the west and east edges so that the child's width is not
   changed. Similarly, ScaledVFixed scales the child's domain and then
   insets the north and south edges. ScaledHVFixed insets both the
   north and south edges and the west and east edges so the size of
   the child's domain stays fixed. In other words, ScaledHVFixed can
   be used to reposition the center point of the child without changing
   its size. 
END ZChildVBT.