trestle_by_example/src/menu1/Menu.m3


MODULE Menu EXPORTS Main;
IMPORT Trestle, VBT, TextVBT, RigidVBT, HVSplit;
IMPORT ButtonVBT, MenuBtnVBT, AnchorBtnVBT, BorderedVBT;
IMPORT PaintOp, Axis, Wr, Stdio;

PROCEDURE OpenAction (v: ButtonVBT.T; READONLY cd: VBT.MouseRec) =
  BEGIN
    Wr.PutText(Stdio.stdout, "Open\n");
  END OpenAction;

PROCEDURE CloseAction (v: ButtonVBT.T; READONLY cd: VBT.MouseRec) =
  BEGIN
    Wr.PutText(Stdio.stdout, "Close\n");
  END CloseAction;

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

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

CONST
  horz = 30.0;
  vert = 10.0;                   (* size of main window in millimeters *)
VAR
  (* build up the menu items for pull down menu1 *)
  open  := MenuBtnVBT.TextItem("Open", OpenAction);
  close := MenuBtnVBT.TextItem("Close", CloseAction);
  (* build up the pull down menu1 *)
  menu1 := BorderedVBT.New(HVSplit.Cons(Axis.T.Ver, open, close));
  a1    := AnchorBtnVBT.New(ch := TextVBT.New("File"), menu := menu1);
  (* build up the menu items for pull down menu2 *)
  cut   := MenuBtnVBT.TextItem("Cut", CutAction);
  paste := MenuBtnVBT.TextItem("Paste", PasteAction);
  (* build up the pulldown menu2 *)
  menu2 := BorderedVBT.New(HVSplit.Cons(Axis.T.Ver, cut, paste));
  a2    := AnchorBtnVBT.New(ch := TextVBT.New("Edit"), menu := menu2);
  (* Build up the menu bar containing the two anchor buttons *)
  blue := PaintOp.FromRGB(0.0, 0.0, 1.0);
  bar  := ButtonVBT.MenuBar(a1, a2, op := blue);
  text := RigidVBT.FromHV(TextVBT.New("Menu demo"), horz, vert);
  main := HVSplit.Cons(Axis.T.Ver, bar, text);
BEGIN
  Trestle.Install(main);
  Trestle.AwaitDelete(main);
END Menu.