| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- MODULE demo;
- (* Demo of the terminal TVision-style toolkit (view tree, widgets, mouse).
- Build (from this directory):
- gm2 -fiso -I. tv.o demo.mod -o demo
- Run from a normal terminal. Tab cycles widgets, arrow keys navigate,
- Enter/Space activate, the mouse drags windows and clicks controls,
- Esc exits. *)
- FROM InOut IMPORT WriteString, WriteLn;
- FROM SYSTEM IMPORT ADR, CAST;
- IMPORT tv;
- CONST
- mNew = 100;
- mQuit = 101;
- mAbout = 102;
- mCut = 103;
- mCopy = 104;
- mPaste = 105;
- VAR
- desk, w1, w2, status : tv.ViewPtr;
- input, check, r1, r2, listv, okb, closeb : tv.ViewPtr;
- t : tv.ViewPtr;
- listData : tv.ListData;
- e : tv.Event;
- quit : BOOLEAN;
- cmd : INTEGER;
- sender : tv.ViewPtr;
- tmp, msgbuf : ARRAY [0..63] OF CHAR;
- BEGIN
- IF NOT tv.Init() THEN
- WriteString("cannot initialise the terminal (not a tty?)"); WriteLn;
- HALT
- END;
- desk := tv.Desk();
- (* menu bar *)
- tv.MenuBarInit;
- tv.MenuAdd("File");
- tv.MenuItemAdd("New", mNew);
- tv.MenuItemAdd("Open...", mNew);
- tv.MenuSep;
- tv.MenuItemAdd("Quit", mQuit);
- tv.MenuAdd("Edit");
- tv.MenuItemAdd("Cut", mCut);
- tv.MenuItemAdd("Copy", mCopy);
- tv.MenuItemAdd("Paste", mPaste);
- tv.MenuAdd("Help");
- tv.MenuItemAdd("About", mAbout);
- (* status bar (bottom line) *)
- status := tv.NewView(tv.VText, 0, tv.Rows() - 1, tv.Cols(), 1);
- tv.SetText(status, " F10/click: menu Tab: next Enter: press mouse: drag titles Esc: quit");
- tv.AddView(desk, status);
- (* ---- Editor window ---- *)
- w1 := tv.NewView(tv.VWindow, 3, 2, 56, 16);
- tv.SetText(w1, "Editor");
- t := tv.NewView(tv.VText, 5, 4, 24, 1);
- tv.SetText(t, "Name:"); tv.AddView(w1, t);
- input := tv.NewView(tv.VInput, 12, 4, 32, 1);
- tv.SetText(input, "Modula-2"); tv.AddView(w1, input);
- check := tv.NewView(tv.VCheck, 12, 6, 24, 1);
- tv.SetText(check, "Enabled"); check^.flags := tv.vfSelected; tv.AddView(w1, check);
- t := tv.NewView(tv.VText, 5, 8, 6, 1);
- tv.SetText(t, "Mode:"); tv.AddView(w1, t);
- r1 := tv.NewView(tv.VRadio, 12, 8, 12, 1);
- tv.SetText(r1, "Fast"); r1^.flags := tv.vfSelected; tv.AddView(w1, r1);
- r2 := tv.NewView(tv.VRadio, 26, 8, 12, 1);
- tv.SetText(r2, "Safe"); tv.AddView(w1, r2);
- listData.items[0] := "Alpha"; listData.items[1] := "Bravo";
- listData.items[2] := "Charlie"; listData.items[3] := "Delta";
- listData.items[4] := "Echo"; listData.items[5] := "Foxtrot";
- listData.count := 6;
- listv := tv.NewView(tv.VList, 5, 10, 22, 6);
- listv^.list := CAST(tv.ListDataPtr, ADR(listData));
- tv.AddView(w1, listv);
- okb := tv.NewView(tv.VButton, 30, 15, 8, 1);
- tv.SetText(okb, "OK"); tv.SetTag(okb, tv.cmOK); tv.AddView(w1, okb);
- closeb := tv.NewView(tv.VButton, 41, 15, 10, 1);
- tv.SetText(closeb, "Close"); tv.SetTag(closeb, tv.cmCancel); tv.AddView(w1, closeb);
- tv.AddView(desk, w1);
- (* ---- About window ---- *)
- w2 := tv.NewView(tv.VWindow, 38, 7, 38, 8);
- tv.SetText(w2, "About");
- t := tv.NewView(tv.VText, 40, 9, 34, 1);
- tv.SetText(t, "tvision-m2"); tv.AddView(w2, t);
- t := tv.NewView(tv.VText, 40, 10, 34, 1);
- tv.SetText(t, "A TVision-style toolkit in GNU M2."); tv.AddView(w2, t);
- t := tv.NewView(tv.VText, 40, 11, 34, 1);
- tv.SetText(t, "Drag window titles with the mouse."); tv.AddView(w2, t);
- tv.AddView(desk, w2);
- tv.BringToFront(w1);
- tv.FocusView(input);
- tv.Finish;
- quit := FALSE;
- WHILE NOT quit DO
- IF tv.Resized() THEN tv.Finish END;
- IF tv.ReadEvent(e) THEN
- IF (e.kind = tv.evKey) AND (e.key = tv.kEsc) THEN
- quit := TRUE
- ELSE
- cmd := tv.HandleEvent(e);
- sender := tv.Sender();
- IF cmd = mQuit THEN
- quit := TRUE
- ELSIF cmd = mAbout THEN
- tv.Message("About", "tvision-m2 menus - GNU Modula-2")
- ELSIF cmd >= 100 THEN
- tv.CopyText(msgbuf, "Menu command: ");
- tv.IntToText(tmp, cmd, 0);
- tv.AppendText(msgbuf, tmp);
- tv.SetText(status, msgbuf)
- ELSIF cmd = tv.cmClose THEN
- IF sender # NIL THEN tv.DelView(sender) END
- ELSIF cmd = tv.cmOK THEN
- tv.Message("Info", "You pressed OK.")
- ELSIF cmd = tv.cmCancel THEN
- tv.DelView(w1)
- ELSIF (sender = r1) OR (sender = r2) THEN
- r1^.flags := 0; r2^.flags := 0;
- IF sender # NIL THEN sender^.flags := tv.vfSelected END
- END
- END;
- IF NOT quit THEN tv.Finish END
- END
- END;
- tv.Done
- END demo.
|