| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- MODULE edit;
- (* A small full-screen editor, Turbo-Pascal style: a window containing a
- multi-line editor with its own status row, plus a File menu
- (New / Save / Quit).
- Arrows, Home/End, PgUp/PgDn move; Ins toggles insert/overwrite; Tab
- indents; the mouse positions the cursor and the wheel scrolls. It loads
- and saves "tvision-edit.txt". *)
- FROM InOut IMPORT WriteString, WriteLn;
- FROM SYSTEM IMPORT ADR, CAST;
- IMPORT tv;
- CONST
- mNew = 100;
- mSave = 101;
- mQuit = 102;
- mModula2 = 110;
- mPascal = 111;
- mOberon = 112;
- VAR
- ed : tv.EditorData;
- edp : tv.EditorDataPtr;
- w, edView, bar : tv.ViewPtr;
- e : tv.Event;
- quit : BOOLEAN;
- cmd : INTEGER;
- sender : tv.ViewPtr;
- status : ARRAY [0..95] OF CHAR;
- PROCEDURE Sample;
- BEGIN
- tv.EditorInit(edp);
- tv.EditorAddLine(edp, "MODULE hello; (* sample for tvision-m2 *)");
- tv.EditorAddLine(edp, "");
- tv.EditorAddLine(edp, "FROM InOut IMPORT WriteString, WriteLn;");
- tv.EditorAddLine(edp, "");
- tv.EditorAddLine(edp, "BEGIN");
- tv.EditorAddLine(edp, " WriteString('Hello, world.'); WriteLn");
- tv.EditorAddLine(edp, "END hello.");
- ed.dirty := FALSE
- END Sample;
- PROCEDURE Refresh;
- BEGIN
- IF tv.EditorDirty(edp) THEN
- tv.SetText(bar, " Ins/arrows/Tab edit F10: menu * modified")
- ELSE
- tv.SetText(bar, " Ins/arrows/Tab edit F10: menu saved")
- END;
- tv.Finish
- END Refresh;
- BEGIN
- IF NOT tv.Init() THEN
- WriteString("not a tty"); WriteLn; HALT
- END;
- edp := CAST(tv.EditorDataPtr, ADR(ed));
- tv.MenuBarInit;
- tv.MenuAdd("File");
- tv.MenuItemAdd("New", mNew);
- tv.MenuItemAdd("Save", mSave);
- tv.MenuSep;
- tv.MenuItemAdd("Quit", mQuit);
- tv.MenuAdd("Syntax");
- tv.MenuItemAdd("Modula-2", mModula2);
- tv.MenuItemAdd("Pascal", mPascal);
- tv.MenuItemAdd("Oberon", mOberon);
- bar := tv.NewView(tv.VText, 0, tv.Rows() - 1, tv.Cols(), 1);
- tv.AddView(tv.Desk(), bar);
- w := tv.NewView(tv.VWindow, 1, 1, tv.Cols() - 2, tv.Rows() - 3);
- tv.SetText(w, "Editor");
- tv.AddView(tv.Desk(), w);
- IF NOT tv.EditorLoad(edp, "tvision-edit.txt") THEN Sample END;
- tv.EditorSetLanguage(edp, tv.langModula2);
- edView := tv.NewView(tv.VEditor, 2, 2, tv.Cols() - 4, tv.Rows() - 5);
- tv.EditorAttach(edView, CAST(tv.EditorDataPtr, ADR(ed)));
- tv.AddView(w, edView);
- tv.FocusView(edView);
- Refresh;
- quit := FALSE;
- WHILE NOT quit DO
- IF tv.Resized() THEN Refresh 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 = mNew THEN
- Sample; Refresh
- ELSIF cmd = mSave THEN
- IF tv.EditorSave(edp, "tvision-edit.txt") THEN
- tv.Message("Save", "Saved tvision-edit.txt.")
- ELSE
- tv.Message("Save", "Could not save the file.")
- END;
- Refresh
- ELSIF cmd = mModula2 THEN
- tv.EditorSetLanguage(edp, tv.langModula2); Refresh
- ELSIF cmd = mPascal THEN
- tv.EditorSetLanguage(edp, tv.langPascal); Refresh
- ELSIF cmd = mOberon THEN
- tv.EditorSetLanguage(edp, tv.langOberon); Refresh
- ELSIF cmd = tv.cmClose THEN
- quit := TRUE
- END
- END;
- IF NOT quit THEN Refresh END
- END
- END;
- tv.Done
- END edit.
|