MODULE Scroll EXPORTS Main;
IMPORT Trestle, VBT, TextVBT, ScrollerVBT, Axis, PaintOp, Font;
IMPORT HVSplit, RigidVBT, FlexVBT;
IMPORT Latin1Key, Text, Fmt;
PROCEDURE Scroller (min, max, step: INTEGER): ScrollerVBT.T =
VAR v := NEW(ScrollerVBT.T, callback := Degrees);
BEGIN
RETURN (v.init(Axis.T.Ver, min, max, quad, step));
END Scroller;
PROCEDURE Degrees (v: ScrollerVBT.T; READONLY cd: VBT.MouseRec) =
VAR
deg := ScrollerVBT.Get(scr1);
min := ScrollerVBT.Get(scr2);
sec := ScrollerVBT.Get(scr3);
cir := Text.FromChar(VAL(Latin1Key.degree, CHAR));
text := Fmt.Int(deg) & cir & " " & Fmt.Int(min) & "' " & Fmt.Int(sec)
& "\"";
BEGIN
TextVBT.Put(display, text);
END Degrees;
CONST
hMin = 10.0; (* size in millimeters *)
vMin = 50.0; (* size in millimeters *)
times14 = "-*-times-*-r-*-*-14-*-*-*-*-*-*-*";
VAR
font := Font.FromName(ARRAY OF TEXT{times14});
display := TextVBT.New("", fnt := font);
quad := PaintOp.MakeColorQuad(PaintOp.Bg, PaintOp.Fg);
scr1 := Scroller(-180, 180, 15);
scr2 := Scroller(0, 59, 5);
scr3 := Scroller(0, 59, 5);
hor := FlexVBT.Shape{FlexVBT.StretchyRange, FlexVBT.FixedRange};
deg := FlexVBT.New(TextVBT.New("deg", fnt := font), hor);
min := FlexVBT.New(TextVBT.New("min", fnt := font), hor);
sec := FlexVBT.New(TextVBT.New("sec", fnt := font), hor);
col1 := RigidVBT.FromHV(HVSplit.Cons(Axis.T.Ver, deg, scr1), hMin, vMin);
col2 := RigidVBT.FromHV(HVSplit.Cons(Axis.T.Ver, min, scr2), hMin, vMin);
col3 := RigidVBT.FromHV(HVSplit.Cons(Axis.T.Ver, sec, scr3), hMin, vMin);
scs := HVSplit.Cons(Axis.T.Hor, col1, col2, col3);
main := HVSplit.Cons(Axis.T.Ver, scs, display);
BEGIN
ScrollerVBT.Put(scr1, 0);
ScrollerVBT.Put(scr2, 0);
ScrollerVBT.Put(scr3, 0);
Trestle.Install(main);
Trestle.AwaitDelete(main)
END Scroll.