<* PRAGMA LL *> <* PRAGMA SUBTYPE *>A
ZChassisVBT multi-filter provides a {\em chassis} for a
   subwindow. The visual display of the chassis is hard-wired into
   this module; in particular, it won't look like a top-level window
   of most of the common X window managers.  The top of the chassis is
   a banner containing (from left to right) a {\em close button}, {\em
   draggable title}, and a {\em grow button}. (See
   Figure~\ref{fig:zchassis}.)
   Clicking on the close button unmaps the ZChassisVBT, thereby
   causing it to disappear.  Dragging the title allows the user to
   reposition the ZChassisVBT within its parent. Clicking on the
   grow button allows the user to change the size of the
   ZChassisVBT, subject to its size constraints.  That is, the user
   isn't allowed to make the interior of the chassis smaller or larger
   than its reported bounds along each dimension.  
INTERFACEThe callZChassisVBT ; IMPORT Shadow, VBT, ZChildVBT, ZSplit; TYPE <* SUBTYPE T <: MultiFilter.T *> T <: Public; Public = ZChildVBT.T OBJECT METHODS <* LL.sup <= VBT.mu *> init (ch : VBT.T; title : VBT.T; shadow : Shadow.T := NIL; closable: BOOLEAN := TRUE; open : BOOLEAN := TRUE; h, v := 0.5; loc := ZChildVBT.Location.Center; type := ZChildVBT.CoordType.Scaled; shaper: ZSplit.ReshapeControl := NIL): T; initFromEdges (ch : VBT.T; title : VBT.T; w, e, n, s: REAL; shadow : Shadow.T := NIL; closable : BOOLEAN := TRUE; open : BOOLEAN := TRUE; type := ZChildVBT.CoordType.Absolute; shaper: ZSplit.ReshapeControl := NIL): T; <* LL = VBT.mu *> callback (READONLY cd: VBT.MouseRec); END; END ZChassisVBT.
v.init(...) initializes v as a ZChassisVBT.  It is
   assumed that v will be a subwindow.  The interior of the chassis,
   ch, is v's child in the multi-child sense.
   An alternative method, v.initFromEdges, also initializes v,
   using different information for specifying the initial location of
   the subwindow.  (See the ZChildVBT interface on
   page~\pageref{ZChildVBTSection} for details of the h, v, loc,
   and type parameters to init, as well as for details of the w,
   e, n, s, and type parameters to initFromEdges.)
   A close button is displayed iff closable is set.  The grow button
   is implemented with a ZGrowVBT.  title also functions as a drag
   bar.  It is implemented by a ZMoveVBT.  The looks of these
   buttons is governed by the shadow parameter.
   If open is TRUE, then v will be visible when it is inserted
   as a child of its parent ZSplit.
In the current implementation, a chassis has the following general structure (using FormsVBT notation):
       (Stable
         (Border
           (VBox
             (HBox (CloseButton "C")
                   (ZMove {\it title})
                   (ZGrow "G"))
             (Frame {\it ch})))))
   See Figure~\ref{fig:zchassis}.
   However, don't try to traverse the VBT tree directly; it is subject
   to change.  To retrieve the contents of a chassis v, use
   MultiFilter.Child(v).
   v.callback(cd) is invoked when the close button is activated.
   The default method is a no-op.
   A ZChassisVBT's move, grow, and close buttons are not
   effective unless the ZChassis is a non-background child of a
   ZSplit.