edit.mod 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. mModula2 = 110;
  16. mPascal = 111;
  17. mOberon = 112;
  18. mSize = 120;
  19. mMax = 121;
  20. VAR
  21. ed : tv.EditorData;
  22. edp : tv.EditorDataPtr;
  23. w, edView, bar : tv.ViewPtr;
  24. e : tv.Event;
  25. quit : BOOLEAN;
  26. cmd : INTEGER;
  27. sender : tv.ViewPtr;
  28. status : ARRAY [0..95] OF CHAR;
  29. s1, s2, tmp : ARRAY [0..31] OF CHAR;
  30. iW, iH, nw, nh : INTEGER;
  31. PROCEDURE ToInt (s : ARRAY OF CHAR) : INTEGER;
  32. VAR i, n : INTEGER; neg : BOOLEAN;
  33. BEGIN
  34. i := 0; n := 0; neg := FALSE;
  35. IF s[0] = '-' THEN neg := TRUE; i := 1 END;
  36. WHILE (i <= VAL(INTEGER, HIGH(s))) AND (s[i] >= '0') AND (s[i] <= '9') DO
  37. n := n * 10 + VAL(INTEGER, ORD(s[i]) - ORD('0'));
  38. i := i + 1
  39. END;
  40. IF neg THEN n := 0 - n END;
  41. RETURN n
  42. END ToInt;
  43. PROCEDURE Sample;
  44. BEGIN
  45. tv.EditorInit(edp);
  46. tv.EditorAddLine(edp, "MODULE hello; (* sample for tvision-m2 *)");
  47. tv.EditorAddLine(edp, "");
  48. tv.EditorAddLine(edp, "FROM InOut IMPORT WriteString, WriteLn;");
  49. tv.EditorAddLine(edp, "");
  50. tv.EditorAddLine(edp, "BEGIN");
  51. tv.EditorAddLine(edp, " WriteString('Hello, world.'); WriteLn");
  52. tv.EditorAddLine(edp, "END hello.");
  53. ed.dirty := FALSE
  54. END Sample;
  55. PROCEDURE Refresh;
  56. BEGIN
  57. IF tv.EditorDirty(edp) THEN
  58. tv.SetText(bar, " Ins/arrows/Tab edit F10: menu * modified")
  59. ELSE
  60. tv.SetText(bar, " Ins/arrows/Tab edit F10: menu saved")
  61. END;
  62. tv.Finish
  63. END Refresh;
  64. BEGIN
  65. IF NOT tv.Init() THEN
  66. WriteString("not a tty"); WriteLn; HALT
  67. END;
  68. edp := CAST(tv.EditorDataPtr, ADR(ed));
  69. tv.MenuBarInit;
  70. tv.MenuAdd("File");
  71. tv.MenuItemAdd("New", mNew);
  72. tv.MenuItemAdd("Save", mSave);
  73. tv.MenuSep;
  74. tv.MenuItemAdd("Quit", mQuit);
  75. tv.MenuAdd("Window");
  76. tv.MenuItemAdd("Size...", mSize);
  77. tv.MenuItemAdd("Maximize", mMax);
  78. tv.MenuAdd("Syntax");
  79. tv.MenuItemAdd("Modula-2", mModula2);
  80. tv.MenuItemAdd("Pascal", mPascal);
  81. tv.MenuItemAdd("Oberon", mOberon);
  82. bar := tv.NewView(tv.VText, 0, tv.Rows() - 1, tv.Cols(), 1);
  83. tv.AddView(tv.Desk(), bar);
  84. w := tv.NewView(tv.VWindow, 1, 1, tv.Cols() - 2, tv.Rows() - 3);
  85. tv.SetText(w, "Editor");
  86. tv.AddView(tv.Desk(), w);
  87. IF NOT tv.EditorLoad(edp, "tvision-edit.txt") THEN Sample END;
  88. tv.EditorSetLanguage(edp, tv.langModula2);
  89. tv.EditorSetIndent(edp, 2);
  90. edView := tv.NewView(tv.VEditor, 2, 2, tv.Cols() - 4, tv.Rows() - 5);
  91. edView^.flags := edView^.flags + tv.vfExpand; (* grow with the window *)
  92. tv.EditorAttach(edView, CAST(tv.EditorDataPtr, ADR(ed)));
  93. tv.AddView(w, edView);
  94. tv.FocusView(edView);
  95. Refresh;
  96. quit := FALSE;
  97. WHILE NOT quit DO
  98. IF tv.Resized() THEN Refresh END;
  99. IF tv.ReadEvent(e) THEN
  100. IF (e.kind = tv.evKey) AND (e.key = tv.kEsc) THEN
  101. quit := TRUE
  102. ELSE
  103. cmd := tv.HandleEvent(e);
  104. sender := tv.Sender();
  105. IF cmd = mQuit THEN
  106. quit := TRUE
  107. ELSIF cmd = mNew THEN
  108. tv.EditorInit(edp);
  109. tv.EditorSetLanguage(edp, tv.langModula2);
  110. tv.EditorSetIndent(edp, 2);
  111. Refresh
  112. ELSIF cmd = mSave THEN
  113. IF tv.EditorSave(edp, "tvision-edit.txt") THEN
  114. tv.Message("Save", "Saved tvision-edit.txt.")
  115. ELSE
  116. tv.Message("Save", "Could not save the file.")
  117. END;
  118. Refresh
  119. ELSIF cmd = mSize THEN
  120. tv.IntToText(s1, w^.rect.w, 0);
  121. tv.IntToText(s2, w^.rect.h, 0);
  122. tv.Dialog("Window size", 34, 9);
  123. iW := tv.DlgInput("Width:", s1);
  124. iH := tv.DlgInput("Height:", s2);
  125. tv.DlgButton("OK", tv.cmOK);
  126. tv.DlgButton("Cancel", tv.cmCancel);
  127. IF tv.DlgRun() = tv.cmOK THEN
  128. tv.DlgTextAt(iW, s1);
  129. tv.DlgTextAt(iH, s2);
  130. nw := ToInt(s1); nh := ToInt(s2);
  131. tv.WindowResize(w, nw, nh);
  132. Refresh
  133. END
  134. ELSIF cmd = mMax THEN
  135. tv.WindowResize(w, tv.Cols() - 2, tv.Rows() - 3);
  136. Refresh
  137. ELSIF cmd = mModula2 THEN
  138. tv.EditorSetLanguage(edp, tv.langModula2); Refresh
  139. ELSIF cmd = mPascal THEN
  140. tv.EditorSetLanguage(edp, tv.langPascal); Refresh
  141. ELSIF cmd = mOberon THEN
  142. tv.EditorSetLanguage(edp, tv.langOberon); Refresh
  143. ELSIF cmd = tv.cmClose THEN
  144. quit := TRUE
  145. END
  146. END;
  147. IF NOT quit THEN Refresh END
  148. END
  149. END;
  150. tv.Done
  151. END edit.