123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- unit Breakpoints;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ExtCtrls, ComCtrls, ImgList, lua, lualib, lauxlib,
- LuaUtils, Menus, JvExComCtrls, JvHeaderControl, JvComponent, Misc,
- JvDockControlForm, ToolWin, JvListView, JvDotNetControls, TypInfo;
- type
- TfrmBreakpoints = class(TForm)
- Panel2: TPanel;
- imlBreakpoints: TImageList;
- popmBreakpoints: TPopupMenu;
- RemoveBreakpoint1: TMenuItem;
- N1: TMenuItem;
- Goto1: TMenuItem;
- Condition1: TMenuItem;
- JvDockClient1: TJvDockClient;
- tlbBreakpoints: TToolBar;
- tbtnAdd: TToolButton;
- tbtnToggle: TToolButton;
- tbtnRemove: TToolButton;
- tbtnDisableAllBreakpoints: TToolButton;
- ToolButton5: TToolButton;
- tbtnAllRemove: TToolButton;
- ToolButton7: TToolButton;
- tbtnGoto: TToolButton;
- tbtnEditCondition: TToolButton;
- lvwBreakpoints: TJvDotNetListView;
- tbtnEnableAllBreakpoints: TToolButton;
- procedure tbtnGotoClick(Sender: TObject);
- procedure tbtnEditConditionClick(Sender: TObject);
- procedure lvwBreakpointsChange(Sender: TObject; Item: TListItem; Change: TItemChange);
- procedure RefreshBreakpointList;
- procedure tbtnRemoveClick(Sender: TObject);
- procedure tbtnToggleClick(Sender: TObject);
- procedure lvwBreakpointsDblClick(Sender: TObject);
- procedure tbtnDisableAllBreakpointsClick(Sender: TObject);
- procedure tbtnEnableAllBreakpointsClick(Sender: TObject);
- procedure tbtnAllRemoveClick(Sender: TObject);
- procedure lvwBreakpointsChanging(Sender: TObject; Item: TListItem;
- Change: TItemChange; var AllowChange: Boolean);
- procedure FormCreate(Sender: TObject);
- procedure tbtnAddClick(Sender: TObject);
- procedure popmBreakpointsPopup(Sender: TObject);
- procedure Condition1Click(Sender: TObject);
- procedure Goto1Click(Sender: TObject);
- procedure RemoveBreakpoint1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- WasItemChecked: Boolean;
- end;
- var
- frmBreakpoints: TfrmBreakpoints;
- implementation
- uses Main, AddBreakpoint;
- {$R *.dfm}
- procedure TfrmBreakpoints.RefreshBreakpointList;
- var
- x, y: Integer;
- SubItem: TListItem;
- pLuaUnit: TLuaEditUnit;
- begin
- // Begin update and claer actual list
- lvwBreakpoints.Items.BeginUpdate();
- lvwBreakpoints.Items.Clear();
- // Add all breakpoints in the listview
- for x := 0 to LuaOpenedFiles.Count - 1 do
- begin
- if TLuaEditBasicTextFile(LuaOpenedFiles.Items[x]).FileType in LuaEditDebugFilesTypeSet then
- begin
- pLuaUnit := TLuaEditUnit(LuaOpenedFiles.Items[x]);
- for y := 0 to pLuaUnit.DebugInfos.lstBreakpoint.Count - 1 do
- begin
- SubItem := lvwBreakpoints.Items.Add;
- if TBreakpoint(pLuaUnit.DebugInfos.lstBreakpoint.Items[y]).iStatus = BKPT_ENABLED then
- begin
- SubItem.Checked := True;
- WasItemChecked := True;
- Subitem.ImageIndex := 7;
- end
- else
- begin
- SubItem.Checked := False;
- WasItemChecked := False;
- Subitem.ImageIndex := 8;
- end;
- SubItem.Data := pLuaUnit;
- SubItem.Caption := pLuaUnit.Name+', line '+IntToStr(TBreakpoint(pLuaUnit.DebugInfos.lstBreakpoint.Items[y]).iLine);
- if TBreakpoint(pLuaUnit.DebugInfos.lstBreakpoint.Items[y]).sCondition <> '' then
- SubItem.SubItems.Add(TBreakpoint(pLuaUnit.DebugInfos.lstBreakpoint.Items[y]).sCondition)
- else
- SubItem.SubItems.Add('(no condition)');
- SubItem.SubItems.Add(IntToStr(TBreakpoint(pLuaUnit.DebugInfos.lstBreakpoint.Items[y]).iHitCount));
- SubItem.SubItems.Add(IntToStr(TBreakpoint(pLuaUnit.DebugInfos.lstBreakpoint.Items[y]).iLine));
- end;
- end;
- end;
- // End update
- lvwBreakpoints.Items.EndUpdate();
- // Control buttons enable status
- if lvwBreakpoints.Items.Count = 0 then
- begin
- tbtnEditCondition.Enabled := False;
- tbtnGoto.Enabled := False;
- tbtnRemove.Enabled := False;
- tbtnToggle.Enabled := False;
- tbtnDisableAllBreakpoints.Enabled := False;
- tbtnEnableAllBreakpoints.Enabled := False;
- tbtnAllRemove.Enabled := False;
- end;
- if LuaOpenedFiles.Count = 0 then
- tbtnAdd.Enabled := False
- else
- tbtnAdd.Enabled := True;
- end;
- procedure TfrmBreakpoints.tbtnGotoClick(Sender: TObject);
- begin
- ModalResult := mrNone;
- if Assigned(lvwBreakpoints.Selected) then
- begin
- ModalResult := mrOk;
- if not Assigned(TLuaEditUnit(lvwBreakpoints.Selected.Data).AssociatedTab) then
- frmLuaEditMain.AddFileInTab(TLuaEditUnit(lvwBreakpoints.Selected.Data))
- else
- frmLuaEditMain.jvUnitBar.SelectedTab := TLuaEditUnit(lvwBreakpoints.Selected.Data).AssociatedTab; //frmMain.GetAssociatedTab(TLuaEditUnit(lvwBreakpoints.Selected.Data));
- TLuaEditUnit(lvwBreakpoints.Selected.Data).synUnit.GotoLineAndCenter(StrToInt(lvwBreakpoints.Selected.SubItems.Strings[2]));
- end;
- end;
- procedure TfrmBreakpoints.tbtnEditConditionClick(Sender: TObject);
- var
- Answer: String;
- ReturnMsg: String;
- L: PLua_State;
- begin
- if Assigned(lvwBreakpoints.Selected) then
- begin
- Answer := InputBox('Breakpoint Condition', 'Enter condition for selected breakpoint:', lvwBreakpoints.Selected.SubItems.Strings[0]);
- if Answer <> lvwBreakpoints.Selected.SubItems.Strings[0] then
- begin
- if Answer = '' then
- begin
- lvwBreakpoints.Selected.SubItems.Strings[0] := '(no condition)';
- TLuaEditDebugFile(lvwBreakpoints.Selected.Data).DebugInfos.GetBreakpointAtLine(StrToInt(lvwBreakpoints.Selected.SubItems.Strings[2])).sCondition := '';
- end
- else
- begin
- L := lua_open;
- // Test the given expression
- if luaL_loadbuffer(L, PChar('return ('+Answer+')'), Length('return ('+Answer+')'), 'Main') <> 0 then
- begin
- ReturnMsg := lua_tostring(L, 1);
- ReturnMsg := Copy(ReturnMsg, Pos(':', ReturnMsg) + 1, Length(ReturnMsg) - Pos(':', ReturnMsg));
- ReturnMsg := Copy(ReturnMsg, Pos(':', ReturnMsg) + 1, Length(ReturnMsg) - Pos(':', ReturnMsg));
- Application.MessageBox(PChar('The expression "'+Answer+'" is not a valid expression: '#13#10#13#10#13#10+ReturnMsg), 'LuaEdit', MB_OK+MB_ICONERROR);
- end
- else
- begin
- lvwBreakpoints.Selected.SubItems.Strings[0] := Answer;
- TLuaEditDebugFile(lvwBreakpoints.Selected.Data).DebugInfos.GetBreakpointAtLine(StrToInt(lvwBreakpoints.Selected.SubItems.Strings[2])).sCondition := Answer;
- end;
- lua_close(L);
- end;
- end;
- end;
- end;
- procedure TfrmBreakpoints.lvwBreakpointsChange(Sender: TObject; Item: TListItem; Change: TItemChange);
- begin
- if Assigned(Item) then
- begin
- tbtnEditCondition.Enabled := Assigned(lvwBreakpoints.Selected);
- tbtnGoto.Enabled := Assigned(lvwBreakpoints.Selected);
- tbtnRemove.Enabled := Assigned(lvwBreakpoints.Selected);
- tbtnToggle.Enabled := Assigned(lvwBreakpoints.Selected);
- tbtnAllRemove.Enabled := Assigned(lvwBreakpoints.Selected);
- tbtnDisableAllBreakpoints.Enabled := Assigned(lvwBreakpoints.Selected);
- tbtnEnableAllBreakpoints.Enabled := Assigned(lvwBreakpoints.Selected);
- if WasItemChecked <> Item.Checked then
- begin
- if Assigned(Item.Data) then
- begin
- if TLuaEditUnit(Item.Data).DebugInfos.GetBreakpointStatus(StrToInt(Item.SubItems.Strings[2])) = BKPT_DISABLED then
- begin
- TLuaEditUnit(Item.Data).DebugInfos.GetBreakpointAtLine(StrToInt(Item.SubItems.Strings[2])).iStatus := BKPT_ENABLED;
- Item.ImageIndex := 7;
- end
- else
- begin
- TLuaEditUnit(Item.Data).DebugInfos.GetBreakpointAtLine(StrToInt(Item.SubItems.Strings[2])).iStatus := BKPT_DISABLED;
- Item.ImageIndex := 8;
- end;
- if Assigned(frmLuaEditMain.jvUnitBar.SelectedTab.Data) then
- TLuaEditUnit(frmLuaEditMain.jvUnitBar.SelectedTab.Data).SynUnit.Refresh;
- end;
- end;
- end;
- end;
- procedure TfrmBreakpoints.tbtnRemoveClick(Sender: TObject);
- begin
- if Assigned(lvwBreakpoints.Selected) then
- begin
- TLuaEditUnit(lvwBreakpoints.Selected.Data).DebugInfos.RemoveBreakpointAtLine(StrToInt(lvwBreakpoints.Selected.SubItems.Strings[2]));
- lvwBreakpoints.Selected.Delete;
- end;
- if Assigned(frmLuaEditMain.jvUnitBar.SelectedTab.Data) then
- TLuaEditUnit(frmLuaEditMain.jvUnitBar.SelectedTab.Data).SynUnit.Refresh;
- end;
- procedure TfrmBreakpoints.tbtnToggleClick(Sender: TObject);
- begin
- if Assigned(lvwBreakpoints.Selected) then
- begin
- if TLuaEditUnit(lvwBreakpoints.Selected.Data).DebugInfos.GetBreakpointStatus(StrToInt(lvwBreakpoints.Selected.SubItems.Strings[2])) = BKPT_DISABLED then
- lvwBreakpoints.Selected.Checked := True
- else
- lvwBreakpoints.Selected.Checked := False;
- end;
- if Assigned(frmLuaEditMain.jvUnitBar.SelectedTab.Data) then
- TLuaEditUnit(frmLuaEditMain.jvUnitBar.SelectedTab.Data).SynUnit.Refresh;
- end;
- procedure TfrmBreakpoints.lvwBreakpointsDblClick(Sender: TObject);
- begin
- tbtnGoto.Click;
- end;
- procedure TfrmBreakpoints.tbtnDisableAllBreakpointsClick(Sender: TObject);
- var
- x: Integer;
- begin
- for x := 0 to lvwBreakpoints.Items.Count - 1 do
- begin
- lvwBreakpoints.Items[x].Checked := False;
- end;
- if Assigned(frmLuaEditMain.jvUnitBar.SelectedTab.Data) then
- TLuaEditUnit(frmLuaEditMain.jvUnitBar.SelectedTab.Data).synUnit.Refresh;
- end;
- procedure TfrmBreakpoints.tbtnEnableAllBreakpointsClick(Sender: TObject);
- var
- x: Integer;
- begin
- for x := 0 to lvwBreakpoints.Items.Count - 1 do
- begin
- lvwBreakpoints.Items[x].Checked := True;
- end;
- if Assigned(frmLuaEditMain.jvUnitBar.SelectedTab.Data) then
- TLuaEditUnit(frmLuaEditMain.jvUnitBar.SelectedTab.Data).synUnit.Refresh;
- end;
- procedure TfrmBreakpoints.tbtnAllRemoveClick(Sender: TObject);
- begin
- if Application.MessageBox('Are you sure you want to remove all breakpoints?', 'LuaEdit', MB_YESNO+MB_ICONERROR) = IDYES then
- begin
- while Assigned(lvwBreakpoints.Items[0]) do
- begin
- TLuaEditUnit(lvwBreakpoints.Items[0].Data).DebugInfos.RemoveBreakpointAtLine(StrToInt(lvwBreakpoints.Items[0].SubItems.Strings[2]));
- lvwBreakpoints.Items[0].Delete;
- end;
- if Assigned(frmLuaEditMain.jvUnitBar.SelectedTab.Data) then
- TLuaEditUnit(frmLuaEditMain.jvUnitBar.SelectedTab.Data).SynUnit.Refresh;
- end;
- end;
- procedure TfrmBreakpoints.lvwBreakpointsChanging(Sender: TObject; Item: TListItem; Change: TItemChange; var AllowChange: Boolean);
- begin
- if Assigned(Item) then
- WasItemChecked := Item.Checked;
- end;
- procedure TfrmBreakpoints.FormCreate(Sender: TObject);
- begin
- RefreshBreakpointList;
- end;
- procedure TfrmBreakpoints.tbtnAddClick(Sender: TObject);
- begin
- if frmAddBreakpoint.ShowModal = mrOk then
- RefreshBreakpointList;
- end;
- procedure TfrmBreakpoints.popmBreakpointsPopup(Sender: TObject);
- begin
- RemoveBreakpoint1.Enabled := (lvwBreakpoints.Items.Count > 0);
- Goto1.Enabled := (lvwBreakpoints.Items.Count > 0);
- Condition1.Enabled := (lvwBreakpoints.Items.Count > 0);
- end;
- procedure TfrmBreakpoints.Condition1Click(Sender: TObject);
- begin
- tbtnEditCondition.Click;
- end;
- procedure TfrmBreakpoints.Goto1Click(Sender: TObject);
- begin
- tbtnGoto.Click;
- end;
- procedure TfrmBreakpoints.RemoveBreakpoint1Click(Sender: TObject);
- begin
- tbtnRemove.Click;
- end;
- end.
|