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.