trestle_by_example/src/switches/Switches.m3


MODULE Switches EXPORTS Main;

IMPORT Trestle, VBT, TextVBT, RigidVBT, ShadowedFeedbackVBT, Shadow,
       HVSplit, HVBar;
IMPORT GuardedBtnVBT, QuickSwitchVBT, TrillSwitchVBT, Axis, PaintOp, Fmt;
FROM Colors IMPORT lblue, dblue;

TYPE
  S = ShadowedFeedbackVBT.T;     (* A shorter synonym *)
  TrillSwitch = TrillSwitchVBT.T OBJECT
                  callbackcount := 0;
                OVERRIDES
                  callback := Trill;
                END;

PROCEDURE Guard (v: GuardedBtnVBT.T; READONLY cd: VBT.MouseRec) =
  BEGIN
    TextVBT.Put(display, "callback of GuardedBtn called");
  END Guard;

PROCEDURE Quick (v: QuickSwitchVBT.T; READONLY cd: VBT.MouseRec) =
  BEGIN
    TextVBT.Put(display, "callback of QuickSwitch called");
  END Quick;

PROCEDURE Trill (v: TrillSwitch; READONLY cd: VBT.MouseRec) =
  BEGIN
    INC(v.callbackcount);
    TextVBT.Put(display, "callback of TrillSwitch called "
                           & Fmt.Int(v.callbackcount) & " times");
  END Trill;

CONST
  shsize = 5.0;                  (* shadow size in points *)
  size   = 40.0;                 (* size of textVBT in millimeters *)
VAR
  sh      := Shadow.New(size := shsize, light := lblue, dark := dblue);
  gfb     := NEW(S).init(ch := TextVBT.New("GuardedBtn"), shadow := sh);
  qfb     := NEW(S).init(ch := TextVBT.New("QuickSwitch"), shadow := sh);
  tfb     := NEW(S).init(ch := TextVBT.New("TrillSwitch"), shadow := sh);
  guard   := NEW(GuardedBtnVBT.T, callback := Guard).init(gfb);
  quick   := NEW(QuickSwitchVBT.T, callback := Quick).init(qfb);
  trill   := NEW(TrillSwitch).init(tfb);
  display := TextVBT.New("");
  rtext   := RigidVBT.FromHV(TextVBT.New("Switches"), size, size / 3.0);
  hsplit := HVSplit.Cons(
              Axis.T.Hor, guard, HVBar.New(), quick, HVBar.New(), trill);
  main := HVSplit.Cons(
            Axis.T.Ver, hsplit, HVBar.New(), display, HVBar.New(), rtext);
BEGIN
  Trestle.Install(main);
  Trestle.AwaitDelete(main);
END Switches.