Breakpoints.pas 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. unit Breakpoints;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls, ExtCtrls, ComCtrls, ImgList, lua, lualib, lauxlib,
  6. LuaUtils, Menus, JvExComCtrls, JvHeaderControl, JvComponent, Misc,
  7. JvDockControlForm, ToolWin, JvListView, JvDotNetControls, TypInfo;
  8. type
  9. TfrmBreakpoints = class(TForm)
  10. Panel2: TPanel;
  11. imlBreakpoints: TImageList;
  12. popmBreakpoints: TPopupMenu;
  13. RemoveBreakpoint1: TMenuItem;
  14. N1: TMenuItem;
  15. Goto1: TMenuItem;
  16. Condition1: TMenuItem;
  17. JvDockClient1: TJvDockClient;
  18. tlbBreakpoints: TToolBar;
  19. tbtnAdd: TToolButton;
  20. tbtnToggle: TToolButton;
  21. tbtnRemove: TToolButton;
  22. tbtnDisableAllBreakpoints: TToolButton;
  23. ToolButton5: TToolButton;
  24. tbtnAllRemove: TToolButton;
  25. ToolButton7: TToolButton;
  26. tbtnGoto: TToolButton;
  27. tbtnEditCondition: TToolButton;
  28. lvwBreakpoints: TJvDotNetListView;
  29. tbtnEnableAllBreakpoints: TToolButton;
  30. procedure tbtnGotoClick(Sender: TObject);
  31. procedure tbtnEditConditionClick(Sender: TObject);
  32. procedure lvwBreakpointsChange(Sender: TObject; Item: TListItem; Change: TItemChange);
  33. procedure RefreshBreakpointList;
  34. procedure tbtnRemoveClick(Sender: TObject);
  35. procedure tbtnToggleClick(Sender: TObject);
  36. procedure lvwBreakpointsDblClick(Sender: TObject);
  37. procedure tbtnDisableAllBreakpointsClick(Sender: TObject);
  38. procedure tbtnEnableAllBreakpointsClick(Sender: TObject);
  39. procedure tbtnAllRemoveClick(Sender: TObject);
  40. procedure lvwBreakpointsChanging(Sender: TObject; Item: TListItem;
  41. Change: TItemChange; var AllowChange: Boolean);
  42. procedure FormCreate(Sender: TObject);
  43. procedure tbtnAddClick(Sender: TObject);
  44. procedure popmBreakpointsPopup(Sender: TObject);
  45. procedure Condition1Click(Sender: TObject);
  46. procedure Goto1Click(Sender: TObject);
  47. procedure RemoveBreakpoint1Click(Sender: TObject);
  48. private
  49. { Private declarations }
  50. public
  51. { Public declarations }
  52. WasItemChecked: Boolean;
  53. end;
  54. var
  55. frmBreakpoints: TfrmBreakpoints;
  56. implementation
  57. uses Main, AddBreakpoint;
  58. {$R *.dfm}
  59. procedure TfrmBreakpoints.RefreshBreakpointList;
  60. var
  61. x, y: Integer;
  62. SubItem: TListItem;
  63. pLuaUnit: TLuaEditUnit;
  64. begin
  65. // Begin update and claer actual list
  66. lvwBreakpoints.Items.BeginUpdate();
  67. lvwBreakpoints.Items.Clear();
  68. // Add all breakpoints in the listview
  69. for x := 0 to LuaOpenedFiles.Count - 1 do
  70. begin
  71. if TLuaEditBasicTextFile(LuaOpenedFiles.Items[x]).FileType in LuaEditDebugFilesTypeSet then
  72. begin
  73. pLuaUnit := TLuaEditUnit(LuaOpenedFiles.Items[x]);
  74. for y := 0 to pLuaUnit.DebugInfos.lstBreakpoint.Count - 1 do
  75. begin
  76. SubItem := lvwBreakpoints.Items.Add;
  77. if TBreakpoint(pLuaUnit.DebugInfos.lstBreakpoint.Items[y]).iStatus = BKPT_ENABLED then
  78. begin
  79. SubItem.Checked := True;
  80. WasItemChecked := True;
  81. Subitem.ImageIndex := 7;
  82. end
  83. else
  84. begin
  85. SubItem.Checked := False;
  86. WasItemChecked := False;
  87. Subitem.ImageIndex := 8;
  88. end;
  89. SubItem.Data := pLuaUnit;
  90. SubItem.Caption := pLuaUnit.Name+', line '+IntToStr(TBreakpoint(pLuaUnit.DebugInfos.lstBreakpoint.Items[y]).iLine);
  91. if TBreakpoint(pLuaUnit.DebugInfos.lstBreakpoint.Items[y]).sCondition <> '' then
  92. SubItem.SubItems.Add(TBreakpoint(pLuaUnit.DebugInfos.lstBreakpoint.Items[y]).sCondition)
  93. else
  94. SubItem.SubItems.Add('(no condition)');
  95. SubItem.SubItems.Add(IntToStr(TBreakpoint(pLuaUnit.DebugInfos.lstBreakpoint.Items[y]).iHitCount));
  96. SubItem.SubItems.Add(IntToStr(TBreakpoint(pLuaUnit.DebugInfos.lstBreakpoint.Items[y]).iLine));
  97. end;
  98. end;
  99. end;
  100. // End update
  101. lvwBreakpoints.Items.EndUpdate();
  102. // Control buttons enable status
  103. if lvwBreakpoints.Items.Count = 0 then
  104. begin
  105. tbtnEditCondition.Enabled := False;
  106. tbtnGoto.Enabled := False;
  107. tbtnRemove.Enabled := False;
  108. tbtnToggle.Enabled := False;
  109. tbtnDisableAllBreakpoints.Enabled := False;
  110. tbtnEnableAllBreakpoints.Enabled := False;
  111. tbtnAllRemove.Enabled := False;
  112. end;
  113. if LuaOpenedFiles.Count = 0 then
  114. tbtnAdd.Enabled := False
  115. else
  116. tbtnAdd.Enabled := True;
  117. end;
  118. procedure TfrmBreakpoints.tbtnGotoClick(Sender: TObject);
  119. begin
  120. ModalResult := mrNone;
  121. if Assigned(lvwBreakpoints.Selected) then
  122. begin
  123. ModalResult := mrOk;
  124. if not Assigned(TLuaEditUnit(lvwBreakpoints.Selected.Data).AssociatedTab) then
  125. frmLuaEditMain.AddFileInTab(TLuaEditUnit(lvwBreakpoints.Selected.Data))
  126. else
  127. frmLuaEditMain.jvUnitBar.SelectedTab := TLuaEditUnit(lvwBreakpoints.Selected.Data).AssociatedTab; //frmMain.GetAssociatedTab(TLuaEditUnit(lvwBreakpoints.Selected.Data));
  128. TLuaEditUnit(lvwBreakpoints.Selected.Data).synUnit.GotoLineAndCenter(StrToInt(lvwBreakpoints.Selected.SubItems.Strings[2]));
  129. end;
  130. end;
  131. procedure TfrmBreakpoints.tbtnEditConditionClick(Sender: TObject);
  132. var
  133. Answer: String;
  134. ReturnMsg: String;
  135. L: PLua_State;
  136. begin
  137. if Assigned(lvwBreakpoints.Selected) then
  138. begin
  139. Answer := InputBox('Breakpoint Condition', 'Enter condition for selected breakpoint:', lvwBreakpoints.Selected.SubItems.Strings[0]);
  140. if Answer <> lvwBreakpoints.Selected.SubItems.Strings[0] then
  141. begin
  142. if Answer = '' then
  143. begin
  144. lvwBreakpoints.Selected.SubItems.Strings[0] := '(no condition)';
  145. TLuaEditDebugFile(lvwBreakpoints.Selected.Data).DebugInfos.GetBreakpointAtLine(StrToInt(lvwBreakpoints.Selected.SubItems.Strings[2])).sCondition := '';
  146. end
  147. else
  148. begin
  149. L := lua_open;
  150. // Test the given expression
  151. if luaL_loadbuffer(L, PChar('return ('+Answer+')'), Length('return ('+Answer+')'), 'Main') <> 0 then
  152. begin
  153. ReturnMsg := lua_tostring(L, 1);
  154. ReturnMsg := Copy(ReturnMsg, Pos(':', ReturnMsg) + 1, Length(ReturnMsg) - Pos(':', ReturnMsg));
  155. ReturnMsg := Copy(ReturnMsg, Pos(':', ReturnMsg) + 1, Length(ReturnMsg) - Pos(':', ReturnMsg));
  156. Application.MessageBox(PChar('The expression "'+Answer+'" is not a valid expression: '#13#10#13#10#13#10+ReturnMsg), 'LuaEdit', MB_OK+MB_ICONERROR);
  157. end
  158. else
  159. begin
  160. lvwBreakpoints.Selected.SubItems.Strings[0] := Answer;
  161. TLuaEditDebugFile(lvwBreakpoints.Selected.Data).DebugInfos.GetBreakpointAtLine(StrToInt(lvwBreakpoints.Selected.SubItems.Strings[2])).sCondition := Answer;
  162. end;
  163. lua_close(L);
  164. end;
  165. end;
  166. end;
  167. end;
  168. procedure TfrmBreakpoints.lvwBreakpointsChange(Sender: TObject; Item: TListItem; Change: TItemChange);
  169. begin
  170. if Assigned(Item) then
  171. begin
  172. tbtnEditCondition.Enabled := Assigned(lvwBreakpoints.Selected);
  173. tbtnGoto.Enabled := Assigned(lvwBreakpoints.Selected);
  174. tbtnRemove.Enabled := Assigned(lvwBreakpoints.Selected);
  175. tbtnToggle.Enabled := Assigned(lvwBreakpoints.Selected);
  176. tbtnAllRemove.Enabled := Assigned(lvwBreakpoints.Selected);
  177. tbtnDisableAllBreakpoints.Enabled := Assigned(lvwBreakpoints.Selected);
  178. tbtnEnableAllBreakpoints.Enabled := Assigned(lvwBreakpoints.Selected);
  179. if WasItemChecked <> Item.Checked then
  180. begin
  181. if Assigned(Item.Data) then
  182. begin
  183. if TLuaEditUnit(Item.Data).DebugInfos.GetBreakpointStatus(StrToInt(Item.SubItems.Strings[2])) = BKPT_DISABLED then
  184. begin
  185. TLuaEditUnit(Item.Data).DebugInfos.GetBreakpointAtLine(StrToInt(Item.SubItems.Strings[2])).iStatus := BKPT_ENABLED;
  186. Item.ImageIndex := 7;
  187. end
  188. else
  189. begin
  190. TLuaEditUnit(Item.Data).DebugInfos.GetBreakpointAtLine(StrToInt(Item.SubItems.Strings[2])).iStatus := BKPT_DISABLED;
  191. Item.ImageIndex := 8;
  192. end;
  193. if Assigned(frmLuaEditMain.jvUnitBar.SelectedTab.Data) then
  194. TLuaEditUnit(frmLuaEditMain.jvUnitBar.SelectedTab.Data).SynUnit.Refresh;
  195. end;
  196. end;
  197. end;
  198. end;
  199. procedure TfrmBreakpoints.tbtnRemoveClick(Sender: TObject);
  200. begin
  201. if Assigned(lvwBreakpoints.Selected) then
  202. begin
  203. TLuaEditUnit(lvwBreakpoints.Selected.Data).DebugInfos.RemoveBreakpointAtLine(StrToInt(lvwBreakpoints.Selected.SubItems.Strings[2]));
  204. lvwBreakpoints.Selected.Delete;
  205. end;
  206. if Assigned(frmLuaEditMain.jvUnitBar.SelectedTab.Data) then
  207. TLuaEditUnit(frmLuaEditMain.jvUnitBar.SelectedTab.Data).SynUnit.Refresh;
  208. end;
  209. procedure TfrmBreakpoints.tbtnToggleClick(Sender: TObject);
  210. begin
  211. if Assigned(lvwBreakpoints.Selected) then
  212. begin
  213. if TLuaEditUnit(lvwBreakpoints.Selected.Data).DebugInfos.GetBreakpointStatus(StrToInt(lvwBreakpoints.Selected.SubItems.Strings[2])) = BKPT_DISABLED then
  214. lvwBreakpoints.Selected.Checked := True
  215. else
  216. lvwBreakpoints.Selected.Checked := False;
  217. end;
  218. if Assigned(frmLuaEditMain.jvUnitBar.SelectedTab.Data) then
  219. TLuaEditUnit(frmLuaEditMain.jvUnitBar.SelectedTab.Data).SynUnit.Refresh;
  220. end;
  221. procedure TfrmBreakpoints.lvwBreakpointsDblClick(Sender: TObject);
  222. begin
  223. tbtnGoto.Click;
  224. end;
  225. procedure TfrmBreakpoints.tbtnDisableAllBreakpointsClick(Sender: TObject);
  226. var
  227. x: Integer;
  228. begin
  229. for x := 0 to lvwBreakpoints.Items.Count - 1 do
  230. begin
  231. lvwBreakpoints.Items[x].Checked := False;
  232. end;
  233. if Assigned(frmLuaEditMain.jvUnitBar.SelectedTab.Data) then
  234. TLuaEditUnit(frmLuaEditMain.jvUnitBar.SelectedTab.Data).synUnit.Refresh;
  235. end;
  236. procedure TfrmBreakpoints.tbtnEnableAllBreakpointsClick(Sender: TObject);
  237. var
  238. x: Integer;
  239. begin
  240. for x := 0 to lvwBreakpoints.Items.Count - 1 do
  241. begin
  242. lvwBreakpoints.Items[x].Checked := True;
  243. end;
  244. if Assigned(frmLuaEditMain.jvUnitBar.SelectedTab.Data) then
  245. TLuaEditUnit(frmLuaEditMain.jvUnitBar.SelectedTab.Data).synUnit.Refresh;
  246. end;
  247. procedure TfrmBreakpoints.tbtnAllRemoveClick(Sender: TObject);
  248. begin
  249. if Application.MessageBox('Are you sure you want to remove all breakpoints?', 'LuaEdit', MB_YESNO+MB_ICONERROR) = IDYES then
  250. begin
  251. while Assigned(lvwBreakpoints.Items[0]) do
  252. begin
  253. TLuaEditUnit(lvwBreakpoints.Items[0].Data).DebugInfos.RemoveBreakpointAtLine(StrToInt(lvwBreakpoints.Items[0].SubItems.Strings[2]));
  254. lvwBreakpoints.Items[0].Delete;
  255. end;
  256. if Assigned(frmLuaEditMain.jvUnitBar.SelectedTab.Data) then
  257. TLuaEditUnit(frmLuaEditMain.jvUnitBar.SelectedTab.Data).SynUnit.Refresh;
  258. end;
  259. end;
  260. procedure TfrmBreakpoints.lvwBreakpointsChanging(Sender: TObject; Item: TListItem; Change: TItemChange; var AllowChange: Boolean);
  261. begin
  262. if Assigned(Item) then
  263. WasItemChecked := Item.Checked;
  264. end;
  265. procedure TfrmBreakpoints.FormCreate(Sender: TObject);
  266. begin
  267. RefreshBreakpointList;
  268. end;
  269. procedure TfrmBreakpoints.tbtnAddClick(Sender: TObject);
  270. begin
  271. if frmAddBreakpoint.ShowModal = mrOk then
  272. RefreshBreakpointList;
  273. end;
  274. procedure TfrmBreakpoints.popmBreakpointsPopup(Sender: TObject);
  275. begin
  276. RemoveBreakpoint1.Enabled := (lvwBreakpoints.Items.Count > 0);
  277. Goto1.Enabled := (lvwBreakpoints.Items.Count > 0);
  278. Condition1.Enabled := (lvwBreakpoints.Items.Count > 0);
  279. end;
  280. procedure TfrmBreakpoints.Condition1Click(Sender: TObject);
  281. begin
  282. tbtnEditCondition.Click;
  283. end;
  284. procedure TfrmBreakpoints.Goto1Click(Sender: TObject);
  285. begin
  286. tbtnGoto.Click;
  287. end;
  288. procedure TfrmBreakpoints.RemoveBreakpoint1Click(Sender: TObject);
  289. begin
  290. tbtnRemove.Click;
  291. end;
  292. end.