edit.mod 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. MODULE edit;
  2. (* A small full-screen editor, Turbo-Pascal style: a window containing a
  3. multi-line editor with its own status row, plus a File menu
  4. (New / Save / Quit).
  5. Arrows, Home/End, PgUp/PgDn move; Ins toggles insert/overwrite; Tab
  6. indents; the mouse positions the cursor and the wheel scrolls. It loads
  7. and saves "tvision-edit.txt". *)
  8. FROM InOut IMPORT WriteString, WriteLn;
  9. FROM SYSTEM IMPORT ADR, CAST;
  10. IMPORT tv;
  11. CONST
  12. mNew = 100;
  13. mSave = 101;
  14. mQuit = 102;
  15. VAR
  16. ed : tv.EditorData;
  17. edp : tv.EditorDataPtr;
  18. w, edView, bar : tv.ViewPtr;
  19. e : tv.Event;
  20. quit : BOOLEAN;
  21. cmd : INTEGER;
  22. sender : tv.ViewPtr;
  23. status : ARRAY [0..95] OF CHAR;
  24. PROCEDURE Sample;
  25. BEGIN
  26. tv.EditorInit(edp);
  27. tv.EditorAddLine(edp, "MODULE hello;");
  28. tv.EditorAddLine(edp, "");
  29. tv.EditorAddLine(edp, "FROM InOut IMPORT WriteString, WriteLn;");
  30. tv.EditorAddLine(edp, "");
  31. tv.EditorAddLine(edp, "BEGIN");
  32. tv.EditorAddLine(edp, " WriteString('Hello, world.'); WriteLn");
  33. tv.EditorAddLine(edp, "END hello.");
  34. ed.dirty := FALSE
  35. END Sample;
  36. PROCEDURE Refresh;
  37. BEGIN
  38. IF tv.EditorDirty(edp) THEN
  39. tv.SetText(bar, " Ins/arrows/Tab edit F10: menu * modified")
  40. ELSE
  41. tv.SetText(bar, " Ins/arrows/Tab edit F10: menu saved")
  42. END;
  43. tv.Finish
  44. END Refresh;
  45. BEGIN
  46. IF NOT tv.Init() THEN
  47. WriteString("not a tty"); WriteLn; HALT
  48. END;
  49. edp := CAST(tv.EditorDataPtr, ADR(ed));
  50. tv.MenuBarInit;
  51. tv.MenuAdd("File");
  52. tv.MenuItemAdd("New", mNew);
  53. tv.MenuItemAdd("Save", mSave);
  54. tv.MenuSep;
  55. tv.MenuItemAdd("Quit", mQuit);
  56. bar := tv.NewView(tv.VText, 0, tv.Rows() - 1, tv.Cols(), 1);
  57. tv.AddView(tv.Desk(), bar);
  58. w := tv.NewView(tv.VWindow, 1, 1, tv.Cols() - 2, tv.Rows() - 3);
  59. tv.SetText(w, "Editor");
  60. tv.AddView(tv.Desk(), w);
  61. IF NOT tv.EditorLoad(edp, "tvision-edit.txt") THEN Sample END;
  62. edView := tv.NewView(tv.VEditor, 2, 2, tv.Cols() - 4, tv.Rows() - 5);
  63. tv.EditorAttach(edView, CAST(tv.EditorDataPtr, ADR(ed)));
  64. tv.AddView(w, edView);
  65. tv.FocusView(edView);
  66. Refresh;
  67. quit := FALSE;
  68. WHILE NOT quit DO
  69. IF tv.Resized() THEN Refresh END;
  70. IF tv.ReadEvent(e) THEN
  71. IF (e.kind = tv.evKey) AND (e.key = tv.kEsc) THEN
  72. quit := TRUE
  73. ELSE
  74. cmd := tv.HandleEvent(e);
  75. sender := tv.Sender();
  76. IF cmd = mQuit THEN
  77. quit := TRUE
  78. ELSIF cmd = mNew THEN
  79. Sample; Refresh
  80. ELSIF cmd = mSave THEN
  81. IF tv.EditorSave(edp, "tvision-edit.txt") THEN
  82. tv.Message("Save", "Saved tvision-edit.txt.")
  83. ELSE
  84. tv.Message("Save", "Could not save the file.")
  85. END;
  86. Refresh
  87. ELSIF cmd = tv.cmClose THEN
  88. quit := TRUE
  89. END
  90. END;
  91. IF NOT quit THEN Refresh END
  92. END
  93. END;
  94. tv.Done
  95. END edit.