LuaConsole.pas 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. unit LuaConsole;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls, ComCtrls, ExtCtrls, JvComponent, JvDockControlForm,
  6. VirtualTrees, Menus, Clipbrd, lua, lauxlib, luaconf, LuaUtils;
  7. type
  8. PLuaConsoleLine = ^TPLuaConsoleLine;
  9. TPLuaConsoleLine = record
  10. FileName: String;
  11. LineText: String;
  12. LineNumber: Integer;
  13. end;
  14. TfrmLuaConsole = class(TForm)
  15. JvDockClient1: TJvDockClient;
  16. vstLuaConsole: TVirtualStringTree;
  17. ppmLuaOutput: TPopupMenu;
  18. Clear1: TMenuItem;
  19. N1: TMenuItem;
  20. FindSource1: TMenuItem;
  21. Copy1: TMenuItem;
  22. N2: TMenuItem;
  23. SelectAll1: TMenuItem;
  24. ClearAll1: TMenuItem;
  25. Panel1: TPanel;
  26. cboConsole: TComboBox;
  27. procedure vstLuaConsoleGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
  28. procedure vstLuaConsoleGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer);
  29. procedure ppmLuaOutputPopup(Sender: TObject);
  30. procedure SelectAll1Click(Sender: TObject);
  31. procedure Copy1Click(Sender: TObject);
  32. procedure FindSource1Click(Sender: TObject);
  33. procedure Clear1Click(Sender: TObject);
  34. procedure ClearAll1Click(Sender: TObject);
  35. procedure vstLuaConsoleDblClick(Sender: TObject);
  36. procedure cboConsoleKeyPress(Sender: TObject; var Key: Char);
  37. private
  38. { Private declarations }
  39. public
  40. { Public declarations }
  41. procedure Put(FileName, LineText: String; LineNumber: Integer);
  42. end;
  43. var
  44. frmLuaConsole: TfrmLuaConsole;
  45. implementation
  46. uses Main, Misc;
  47. {$R *.dfm}
  48. procedure TfrmLuaConsole.Put(FileName, LineText: String; LineNumber: Integer);
  49. var
  50. pData: PLuaConsoleLine;
  51. pNode: PVirtualNode;
  52. begin
  53. if LineText <> #13#10 then
  54. begin
  55. pNode := vstLuaConsole.AddChild(vstLuaConsole.RootNode);
  56. pData := vstLuaConsole.GetNodeData(pNode);
  57. pData.FileName := FileName;
  58. pData.LineText := LUA_PROMPT + LineText;
  59. pData.LineNumber := LineNumber;
  60. end;
  61. end;
  62. procedure TfrmLuaConsole.vstLuaConsoleGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
  63. var
  64. pData: PLuaConsoleLine;
  65. begin
  66. case Column of
  67. -1:
  68. begin
  69. pData := vstLuaConsole.GetNodeData(Node);
  70. CellText := pData.LineText;
  71. end;
  72. end;
  73. end;
  74. procedure TfrmLuaConsole.vstLuaConsoleGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer);
  75. begin
  76. NodeDataSize := SizeOf(TPLuaConsoleLine);
  77. end;
  78. procedure TfrmLuaConsole.ppmLuaOutputPopup(Sender: TObject);
  79. begin
  80. ClearAll1.Enabled := True;
  81. SelectAll1.Enabled := True;
  82. FindSource1.Enabled := (vstLuaConsole.SelectedCount = 1);
  83. Clear1.Enabled := (vstLuaConsole.SelectedCount > 0);
  84. Copy1.Enabled := (vstLuaConsole.SelectedCount > 0);
  85. end;
  86. procedure TfrmLuaConsole.SelectAll1Click(Sender: TObject);
  87. begin
  88. vstLuaConsole.SelectAll(False);
  89. end;
  90. procedure TfrmLuaConsole.Copy1Click(Sender: TObject);
  91. var
  92. pNode: PVirtualNode;
  93. pData: PLuaConsoleLine;
  94. ClipboardText: String;
  95. begin
  96. ClipboardText := '';
  97. pNode := vstLuaConsole.GetFirstSelected();
  98. while Assigned(pNode) do
  99. begin
  100. pData := vstLuaConsole.GetNodeData(pNode);
  101. ClipboardText := ClipboardText + pData.LineText;
  102. pNode := vstLuaConsole.GetNextSelected(pNode);
  103. // Add carriage return if required
  104. if Assigned(pNode) then
  105. ClipboardText := ClipboardText + #13#10;
  106. end;
  107. Clipboard.SetTextBuf(PChar(ClipboardText));
  108. end;
  109. procedure TfrmLuaConsole.FindSource1Click(Sender: TObject);
  110. var
  111. pNode: PVirtualNode;
  112. pData: PLuaConsoleLine;
  113. begin
  114. pNode := vstLuaConsole.GetFirstSelected();
  115. if Assigned(pNode) then
  116. begin
  117. pData := vstLuaConsole.GetNodeData(pNode);
  118. frmLuaEditMain.PopUpUnitToScreen(pData.FileName, pData.LineNumber, False, HIGHLIGHT_SELECT);
  119. end;
  120. end;
  121. procedure TfrmLuaConsole.Clear1Click(Sender: TObject);
  122. begin
  123. vstLuaConsole.DeleteSelectedNodes();
  124. end;
  125. procedure TfrmLuaConsole.ClearAll1Click(Sender: TObject);
  126. begin
  127. vstLuaConsole.Clear;
  128. end;
  129. procedure TfrmLuaConsole.vstLuaConsoleDblClick(Sender: TObject);
  130. begin
  131. FindSource1Click(Sender);
  132. end;
  133. procedure TfrmLuaConsole.cboConsoleKeyPress(Sender: TObject; var Key: Char);
  134. var
  135. L: PLua_State;
  136. x, ArgToPop: Integer;
  137. CallResult, ArgVal: String;
  138. begin
  139. L := frmLuaEditMain.LuaState;
  140. CallResult := '';
  141. if ((Key = Char(VK_RETURN)) and frmLuaEditMain.Running) then
  142. begin
  143. if luaL_loadstring(L, PChar(cboConsole.Text)) = 0 then
  144. begin
  145. x := lua_gettop(L) - 1;
  146. if lua_pcall(L, 0, LUA_MULTRET, 0) <> 0 then
  147. begin
  148. // retrieve error message...
  149. Application.MessageBox(lua_tostring(L, -1), 'LuaEdit', MB_OK + MB_ICONERROR);
  150. // Pop the error message from the lua stack
  151. lua_pop(L, 1);
  152. end;
  153. if x <> lua_gettop(L) then
  154. begin
  155. ArgToPop := lua_gettop(L) - x;
  156. for x := x to lua_gettop(L) - 1 do
  157. begin
  158. ArgVal := lua_tostring(L, x);
  159. if ArgVal = '' then
  160. ArgVal := 'nil';
  161. if CallResult = '' then
  162. CallResult := CallResult + ArgVal
  163. else
  164. CallResult := CallResult + ' ' + ArgVal;
  165. end;
  166. // Print the returned values
  167. Put('', CallResult, -1);
  168. // Pop all returned values from the lua stack
  169. lua_pop(L, ArgToPop);
  170. end;
  171. end
  172. else
  173. // retrieve error message...
  174. Application.MessageBox(lua_tostring(L, -1), 'LuaEdit', MB_OK + MB_ICONERROR);
  175. // Pop either the error message or the function pushed on the lua stack
  176. lua_pop(L, 1);
  177. // Add last entry to combobox' list
  178. if cboConsole.Items.Count > 0 then
  179. begin
  180. if cboConsole.Text <> cboConsole.Items[0] then
  181. cboConsole.Items.Insert(0, cboConsole.Text);
  182. end
  183. else
  184. cboConsole.Items.Add(cboConsole.Text);
  185. // Remove the text
  186. cboConsole.Text := '';
  187. // Remove 11th item (if any) to ensure there is never more than 10 items in the list
  188. if cboConsole.Items.Count > 10 then
  189. cboConsole.Items.Delete(11);
  190. end;
  191. end;
  192. end.