<* PRAGMA LL *>The
ScrollerVBTClass
interface allows you to customize the
user interface of a scrollbar.
INTERFACEThe call toScrollerVBTClass ; IMPORT Axis, PaintOp, Pixmap, ScrollerVBT, VBT; REVEAL ScrollerVBT.Private <: T; TYPE T <: Public; Public = VBT.Leaf OBJECT METHODS <* LL.sup = VBT.mu *> init (axis := Axis.T.Ver; colors: PaintOp.ColorQuad := NIL): T; <* LL = VBT.mu *> scroll (READONLY cd : VBT.MouseRec; part : INTEGER; height : INTEGER; towardsEOF: BOOLEAN ); autoScroll (READONLY cd : VBT.MouseRec; linesToScroll: CARDINAL; towardsEOF : BOOLEAN ); thumb (READONLY cd: VBT.MouseRec; part: INTEGER; height: INTEGER); END;
v.init(axis, colors)
initializes v
as a
ScrollerVBT
in the axis
orientation, and returns v
.
It is displayed using colors
. If colors
is NIL
,
PaintOp.bgFg
will be used.
The default methods for scroll
, autoScroll
, and thumb
are no-ops: the stripe within the scroller doesn't change.
When the user scrolls, the implementation calls
v.scroll(cd, part, height, towardsEOF)on the up-click.
cd
is the mouse event; height
is the number
of pixels in the domain of v
in the v.axis
orientation. part
is number of pixels away from the top/left edge that the upclick
happened. towardEOF
is TRUE
when invoked from a left-upclick,
FALSE
when invoked from a right-upclick. (Of these, only cd
is really needed; the others can be computed from v
and cd
.)
While the user is in continuous or proportional scrolling,
the implementation calls v.autoScroll(...)
repeatedly. The
linesToScroll
is somewhat of a misnomer (but kept for
historical purposes). For continuous scrolling, the value
is always 1. For proportional scrolling, the value is the
number of pixels the mouse has moved. Think of
linesToScroll
as simply the ``amount that should be
scrolled.'' The cd
field in proportional scrolling is fine,
except it's really a position event, not a mouse event, that
caused the action (this is a good use for an AnyEvent
, but
for historical reasons\dots). For continuous scrolling, cd
is set to be the mouse record for the down-click that initiate
the scrolling, but with cd.time = 0
.
Finally, v.thumb(cd, part, height)
is called when the user
thumbs or continuous thumbs. height
is the number of pixels
in the domain of v
in the v.axis
orientation. part
is
the distance in pixels between the mouse and the top/left
edge. The cd
always has a valid time, cursor position, and
modifier fields. (OK, it isn't the real event, since
continuous thumbing is a position event whereas thumbing is
a mouse event. Again, a good potential client of AnyEvent
.)
By and large, these methods will change the position and size of the stripe. This is done using the following procedure:
PROCEDURE Update (v: T; start, end, length: CARDINAL); <* LL.sup < v *>
Set new values of the stripe and (if they've changed) mark v
for
redisplay.
The coordinate system for
start
, end
, and length
is as
follows (we'll consider just a horizontal scrollbar): The left
edge of the domain of v
is at coordinate 0, and the right
edge consider to be at length
. The stripe extends from
max(start,0)
to max(min(end,length),start)
. The
implementation will draw a stripe to represent these
quantities, scaled to the actual length of the scrollbar.
The visual appearance of a ScrollerVBT
is governed by the
following data structures and procedures:
TYPE Attributes = RECORD axis : Axis.T; margin : REAL; scrollPaintOps : ARRAY Axis.T OF PaintOp.T; scrollPixmaps : ARRAY Axis.T OF Pixmap.T; minStripeLen : REAL; stripeWidth : REAL; stripePaintOps : ARRAY Axis.T OF PaintOp.T; stripePixmaps : ARRAY Axis.T OF Pixmap.T; stripeBorder : REAL; stripeBorderPaintOp: PaintOp.T; stripeBorderPixmap : Pixmap.T; END; PROCEDURE GetAttributes (v: T): Attributes;
Return the attribute currently in effect for v
.
PROCEDURE SetAttributes (v: T; READONLY a: Attributes); <* LL.sup = VBT.mu *>
Change the attributes onv
to bea
. Markv
for redisplay and notifyv
's parent that its shape might have changed.
PROCEDURE Colorize (v: T; colors: PaintOp.ColorQuad); <* LL.sup = VBT.mu *>
Sets the paint op of all the scroller's textures and borders to becolors.bgFg
. Markv
for redisplay.
END ScrollerVBTClass.