# The HVBar interface

An `HVBar.T` is an adjustable bar that allows a user to adjust the division of space between the children of an `HVSplit`.

An `HVBar` must be a child of an `HVSplit`. When the user pushes a mouse button over the bar, the cursor changes shape and the outline of the bar is highlighted. The highlight follows the cursor as long as the button is down. When the button comes up, the bar calls `HVSplit.Adjust` to move the bar to the currently highlighted position. If the user tries to move the bar outside the range of positions that are consistent with the size constraints of the children of the parent `HVSplit`, the highlighted bar will not follow the cursor. If the user chords while dragging, then adjusting mode is cancelled.

The bar has methods that you can override that are called each time the bar is moved, or continuously during adjustment.

In order for the bar to highlight correctly, some ancestor of the `HVSplit` on which it is installed must be a `HighlightVBT`. Since `Trestle.Install` automatically inserts a `HighlightVBT` over top-level windows, you usually don't have to worry about this.

    INTERFACE HVBar;

    IMPORT VBT, PaintOp, Pixmap, TextureVBT;

    TYPE
      T <: Public;
      Public = TextureVBT.T OBJECT METHODS
        <* LL = VBT.mu *>
        pre(READONLY cd: VBT.MouseRec);
        post(READONLY cd: VBT.MouseRec);
        during(n: INTEGER);
        <* LL <= VBT.mu *>
        init(size: REAL := DefaultSize;
          op: PaintOp.T := PaintOp.BgFg;
          txt: Pixmap.T := Pixmap.Gray): T
      END;

The call `v.init(...)` initializes `v` as an `HVBar` with the given properties and returns `v`. This includes calling `TextureVBT.T.init(v, op, txt)`.

The argument `size` gives the number of millimeters that the bar will occupy in the parent `HVSplit`.

An adjusting bar `b` calls `b.pre(cd)` when it begins adjusting in response to a mouse click `cd`. It calls `b.during(k)` each time the mouse moves during dragging, where `k` is the coordinate that the `lo` (i.e., west or north) edge of the bar would move to if dragging were stopped at that instant. Finally, the bar calls `b.post(cd)` when it stops adjusting in response to an upclick or chord `cd`. The `HVSplit` will be adjusted (but not redisplayed) before `b.post(cd)` is called.

The default `pre` and `during` methods highlight the position the bar would move to if dragging were stopped. The default `post` method removes the highlighting.

    CONST
      DefaultSize = 2.5;

    PROCEDURE New(
        size := DefaultSize;
        op := PaintOp.BgFg;
        txt := Pixmap.Gray): T; <* LL.sup <= VBT.mu *>

`New(...)` is equivalent to `NEW(T).init(...)`.

    END HVBar.