trestle_by_example/src/menu2/Menu2.m3


MODULE Menu2 EXPORTS Main;

IMPORT Trestle, VBT, TextVBT, MenuSwitchVBT, ShadowedFeedbackVBT, Shadow;
IMPORT HVSplit, Axis, AnchorBtnVBT, Rect, RigidVBT;
IMPORT Wr, Stdio;
FROM Colors IMPORT lblue, dblue;

CONST
  shsize = 5.0;                  (* shadow size in points *)
  hmin   = 15.0;
  vmin   = 10.0;                 (* button size in millimeters *)

PROCEDURE Cut (v: MenuSwitchVBT.T; READONLY cd: VBT.MouseRec) =
  BEGIN
    Wr.PutText(Stdio.stdout, "Cut\n");
    Wr.Flush(Stdio.stdout);
  END Cut;

PROCEDURE Paste (v: MenuSwitchVBT.T; READONLY cd: VBT.MouseRec) =
  BEGIN
    Wr.PutText(Stdio.stdout, "Paste\n");
    Wr.Flush(Stdio.stdout);
  END Paste;

VAR
  sh      := Shadow.New(size := shsize, light := lblue, dark := dblue);
  fcut    := ShadowedFeedbackVBT.NewMenu(TextVBT.New("Cut"), sh);
  fpaste  := ShadowedFeedbackVBT.NewMenu(TextVBT.New("Paste"), sh);
  cut     := NEW(MenuSwitchVBT.T, callback := Cut).init(fcut);
  paste   := NEW(MenuSwitchVBT.T, callback := Paste).init(fpaste);
  menu    := HVSplit.Cons(Axis.T.Ver, cut, paste);
  edit    := TextVBT.New("Edit");
  fanchor := NEW(ShadowedFeedbackVBT.T).init(ch := edit, shadow := sh);
  anchor  := AnchorBtnVBT.New(ch := fanchor, menu := menu);
  main    := RigidVBT.FromHV(anchor, hmin, vmin);
BEGIN
  AnchorBtnVBT.Set(anchor, n := 0, hfudge := hmin, vfudge := -vmin / 2.0);
  Trestle.Install(main);
  Trestle.AwaitDelete(main);
END Menu2.