(* Copyright (C) 1992, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* *) (* Last modified on Tue Aug 4 17:26:49 PDT 1992 by meehan *) (* modified on Tue Jun 16 13:08:32 PDT 1992 by muller *) (* modified on Sat Jun 13 00:34:26 1992 by mhb *) (* modified on Fri Mar 27 02:32:50 1992 by steveg *) <* PRAGMA LL *> MODULE NumericScrollerVBT; IMPORT Axis, PaintOp, ScrollerVBT, VBT; REVEAL T = Public BRANDED "NumericScrollerVBT.T 2.0" OBJECT mu: MUTEX; <* LL = v.mu *> min, max, value: INTEGER; step, stripe : CARDINAL; OVERRIDES callback := DefaultCallback; init := Init; (* ScrollerVBT.T overrides *) scroll := Scroll; autoScroll := Auto; thumb := Thumb; END; PROCEDURE Init (v : T; axis : Axis.T; min : INTEGER; max : INTEGER; colors: PaintOp.ColorQuad; step : CARDINAL := 1; thumb : CARDINAL := 0 ): T = BEGIN <* LL.sup = VBT.mu *> EVAL ScrollerVBT.T.init (v, axis, colors); v.mu := NEW (MUTEX); LOCK v.mu DO max := MAX (min, max); v.min := min; v.max := max; v.value := (min + max) DIV 2; v.step := step; v.stripe := MIN (thumb, max - min) END; UpdateScroller (v); RETURN v END Init; PROCEDURE DefaultCallback (<* UNUSED *> v : T; <* UNUSED *> READONLY cd: VBT.MouseRec) = BEGIN END DefaultCallback; PROCEDURE Scroll ( v : T; READONLY cd : VBT.MouseRec; part : INTEGER; height : INTEGER; towardsEOF: BOOLEAN ) = <* LL = VBT.mu *> VAR total: INTEGER := MAX(part, MAX(1, height - 1)); delta: INTEGER := MAX(1, (part * v.stripe + (v.stripe DIV 2)) DIV total); BEGIN IF NOT towardsEOF THEN delta := -delta END; IF Project(v, v.value + delta) THEN UpdateScroller(v); v.callback(cd); END; END Scroll; PROCEDURE Auto ( v : T; READONLY cd: VBT.MouseRec; <* UNUSED *> linesToScroll: CARDINAL; towardsEOF : BOOLEAN ) = <* LL = VBT.mu *> VAR delta: INTEGER := v.step; BEGIN IF NOT towardsEOF THEN delta := -delta END; IF Project(v, v.value + delta) THEN UpdateScroller(v); v.callback(cd); END; END Auto; PROCEDURE Thumb ( v : T; READONLY cd : VBT.MouseRec; part : INTEGER; height: INTEGER ) = <* LL = VBT.mu *> VAR total := MAX(part, MAX(1, height - 1)); BEGIN IF Project(v, v.min + part * (v.max - v.min) DIV total) THEN UpdateScroller(v); v.callback(cd); END END Thumb; PROCEDURE UpdateScroller (v: T) = <* LL = VBT.mu *> VAR start := v.value - v.min; length := v.max - v.min; end := start + v.stripe; BEGIN ScrollerVBT.Update(v, start, end, length); END UpdateScroller; PROCEDURE Project (v: T; newValue: INTEGER): BOOLEAN = VAR oldValue := v.value; BEGIN v.value := MIN (MAX (newValue, v.min), v.max - v.stripe); RETURN oldValue # v.value END Project; PROCEDURE Put (v: T; n: INTEGER) = BEGIN IF Project(v, n) THEN UpdateScroller(v) END; END Put; PROCEDURE PutBounds (v : T; min : INTEGER; max : INTEGER; thumb: CARDINAL := 0) = BEGIN LOCK v.mu DO v.min := min; v.max := MAX (min, max); v.stripe := MIN (thumb, max - min); UpdateScroller (v) END END PutBounds; PROCEDURE PutStep (v: T; step: CARDINAL) = BEGIN LOCK v.mu DO v.step := step END END PutStep; PROCEDURE Get (v: T): INTEGER = BEGIN LOCK v.mu DO RETURN v.value END END Get; PROCEDURE GetMin (v: T): INTEGER = BEGIN LOCK v.mu DO RETURN v.min END END GetMin; PROCEDURE GetMax (v: T): INTEGER = BEGIN LOCK v.mu DO RETURN v.max END END GetMax; PROCEDURE GetThumb (v: T): CARDINAL = BEGIN LOCK v.mu DO RETURN v.stripe END END GetThumb; PROCEDURE GetStep (v: T): CARDINAL = BEGIN LOCK v.mu DO RETURN v.step END END GetStep; BEGIN END NumericScrollerVBT.