ide, debugger: add "Toggle breakpoint" menu item to the callstack dialog, show address in the source column if source file is not available

git-svn-id: trunk@18984 -
This commit is contained in:
paul 2009-03-13 17:48:53 +00:00
parent 7402655037
commit 41ff1a63f0
3 changed files with 122 additions and 89 deletions

View File

@ -1,7 +1,7 @@
inherited CallStackDlg: TCallStackDlg
Left = 247
Left = 516
Height = 246
Top = 176
Top = 219
Width = 562
ActiveControl = lvCallStack
Caption = 'CallStack'
@ -144,13 +144,17 @@ inherited CallStackDlg: TCallStackDlg
end
end
object mnuPopup: TPopupMenu[2]
left = 66
top = 88
left = 16
top = 120
object popShow: TMenuItem
Action = actShow
Default = True
OnClick = actShowClick
end
object MenuItem1: TMenuItem
Action = actToggleBreakPoint
OnClick = actToggleBreakPointExecute
end
object N1: TMenuItem
Caption = '-'
end
@ -164,8 +168,8 @@ inherited CallStackDlg: TCallStackDlg
end
end
object aclActions: TActionList[3]
left = 128
top = 104
left = 16
top = 80
object actShow: TAction
Caption = 'Show'
DisableIfNoHandler = True
@ -211,10 +215,15 @@ inherited CallStackDlg: TCallStackDlg
DisableIfNoHandler = True
OnExecute = actViewBottomExecute
end
object actToggleBreakPoint: TAction
Caption = 'Toggle Breakpoint'
DisableIfNoHandler = True
OnExecute = actToggleBreakPointExecute
end
end
object mnuLimit: TPopupMenu[4]
left = 192
top = 112
left = 48
top = 120
object popLimit10: TMenuItem
Tag = 10
Caption = 'Max 10'

View File

@ -1,64 +1,67 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TCallStackDlg','FORMDATA',[
'TPF0'#241#13'TCallStackDlg'#12'CallStackDlg'#4'Left'#3#247#0#6'Height'#3#246
+#0#3'Top'#3#176#0#5'Width'#3'2'#2#13'ActiveControl'#7#11'lvCallStack'#7'Capt'
+'ion'#6#9'CallStack'#12'ClientHeight'#3#246#0#11'ClientWidth'#3'2'#2#8'OnCre'
+'ate'#7#10'FormCreate'#7'Visible'#9#0#242#2#0#9'TListView'#11'lvCallStack'#4
+'Left'#2#0#6'Height'#3#204#0#3'Top'#2'*'#5'Width'#3'2'#2#5'Align'#7#8'alClie'
+'nt'#7'Columns'#14#1#5'Width'#2#20#0#1#7'Caption'#6#5'Index'#5'Width'#2'#'#0
+#1#7'Caption'#6#6'Source'#5'Width'#3#150#0#0#1#7'Caption'#6#4'Line'#0#1#7'Ca'
+'ption'#6#8'Function'#5'Width'#3'"'#1#0#0#9'PopupMenu'#7#8'mnuPopup'#8'ReadO'
+'nly'#9#9'RowSelect'#9#8'TabOrder'#2#0#9'ViewStyle'#7#8'vsReport'#7'OnClick'
+#7#16'lvCallStackClick'#10'OnDblClick'#7#19'lvCallStackDBLCLICK'#0#0#242#2#1
+#8'TToolBar'#8'ToolBar1'#4'Left'#2#0#6'Height'#2'*'#3'Top'#2#0#5'Width'#3'2'
+#2#12'ButtonHeight'#2'('#11'ButtonWidth'#2'2'#7'Caption'#6#9'tbButtons'#11'E'
+'dgeBorders'#11#0#12'ShowCaptions'#9#8'TabOrder'#2#1#0#11'TToolButton'#14'To'
+'olButtonShow'#4'Left'#2#1#3'Top'#2#0#6'Action'#7#7'actShow'#10'ImageIndex'#2
+#0#0#0#11'TToolButton'#17'ToolButtonCurrent'#4'Left'#2'3'#3'Top'#2#0#6'Actio'
+'n'#7#13'actSetCurrent'#0#0#11'TToolButton'#11'ToolButton4'#4'Left'#2'e'#3'T'
+'op'#2#0#5'Width'#2#3#7'Caption'#6#11'ToolButton4'#5'Style'#7#12'tbsSeparato'
+'r'#0#0#11'TToolButton'#14'ToolButtonMore'#4'Left'#3#159#0#3'Top'#2#0#6'Acti'
+'on'#7#11'actViewMore'#10'ImageIndex'#2#1#0#0#11'TToolButton'#13'ToolButtonM'
+'ax'#4'Left'#2'h'#3'Top'#2#0#6'Action'#7#12'actViewLimit'#7'Caption'#6#6'Max'
+' 10'#12'DropdownMenu'#7#8'mnuLimit'#5'Style'#7#11'tbsDropDown'#0#0#11'TTool'
+'Button'#14'ToolButtonGoto'#4'Left'#3'j'#1#3'Top'#2#0#6'Action'#7#11'actView'
+'Goto'#10'ImageIndex'#2#4#0#0#11'TToolButton'#17'ToolButtonCopyAll'#4'Left'#3
+#159#1#3'Top'#2#0#6'Action'#7#10'actCopyAll'#10'ImageIndex'#2#5#0#0#11'TTool'
+'Button'#11'ToolButton8'#4'Left'#3#156#1#3'Top'#2#0#5'Width'#2#3#7'Caption'#6
+#11'ToolButton8'#5'Style'#7#12'tbsSeparator'#0#0#11'TToolButton'#11'ToolButt'
+'on9'#4'Left'#3#209#0#3'Top'#2#0#5'Width'#2#3#7'Caption'#6#11'ToolButton9'#5
+'Style'#7#12'tbsSeparator'#0#0#11'TToolButton'#13'ToolButtonTop'#4'Left'#3
+#212#0#3'Top'#2#0#6'Action'#7#10'actViewTop'#10'ImageIndex'#2#2#0#0#11'TTool'
+'Button'#16'ToolButtonBottom'#4'Left'#3#6#1#3'Top'#2#0#6'Action'#7#13'actVie'
+'wBottom'#10'ImageIndex'#2#3#0#0#6'TPanel'#6'Panel1'#4'Left'#3'8'#1#6'Height'
+#2'('#3'Top'#2#0#5'Width'#2'2'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2
+'('#11'ClientWidth'#2'2'#8'TabOrder'#2#0#0#5'TEdit'#7'txtGoto'#4'Left'#2#2#6
+'Height'#2#22#3'Top'#2#8#5'Width'#2'.'#10'OnKeyPress'#7#15'txtGotoKeyPress'#8
+'TabOrder'#2#0#4'Text'#6#1'0'#0#0#0#0#242#2#2#10'TPopupMenu'#8'mnuPopup'#4'l'
+'eft'#2'B'#3'top'#2'X'#0#9'TMenuItem'#7'popShow'#6'Action'#7#7'actShow'#7'De'
+'fault'#9#7'OnClick'#7#12'actShowClick'#0#0#9'TMenuItem'#2'N1'#7'Caption'#6#1
+'-'#0#0#9'TMenuItem'#15'popSetAsCurrent'#6'Action'#7#13'actSetCurrent'#7'OnC'
+'lick'#7#20'actSetAsCurrentClick'#0#0#9'TMenuItem'#10'popCopyAll'#6'Action'#7
+#10'actCopyAll'#7'OnClick'#7#15'actCopyAllClick'#0#0#0#242#2#3#11'TActionLis'
+'t'#10'aclActions'#4'left'#3#128#0#3'top'#2'h'#0#7'TAction'#7'actShow'#7'Cap'
+'tion'#6#4'Show'#18'DisableIfNoHandler'#9#9'OnExecute'#7#12'actShowClick'#0#0
+#7'TAction'#13'actSetCurrent'#7'Caption'#6#7'Current'#18'DisableIfNoHandler'
+#9#9'OnExecute'#7#20'actSetAsCurrentClick'#0#0#7'TAction'#10'actCopyAll'#7'C'
+'aption'#6#8'Copy All'#18'DisableIfNoHandler'#9#9'OnExecute'#7#15'actCopyAll'
+'Click'#0#0#7'TAction'#11'actViewMore'#8'Category'#6#4'View'#7'Caption'#6#4
+'More'#18'DisableIfNoHandler'#9#9'OnExecute'#7#18'actViewMoreExecute'#0#0#7
+'TAction'#11'actViewGoto'#8'Category'#6#4'View'#7'Caption'#6#4'Goto'#18'Disa'
+'bleIfNoHandler'#9#9'OnExecute'#7#18'actViewGotoExecute'#0#0#7'TAction'#12'a'
+'ctViewLimit'#8'Category'#6#4'View'#7'Caption'#6#2'10'#18'DisableIfNoHandler'
+#9#9'OnExecute'#7#19'actViewLimitExecute'#0#0#7'TAction'#10'actViewTop'#8'Ca'
+'tegory'#6#4'View'#7'Caption'#6#3'Top'#18'DisableIfNoHandler'#9#9'OnExecute'
+#7#17'actViewTopExecute'#0#0#7'TAction'#13'actViewBottom'#8'Category'#6#4'Vi'
+'ew'#7'Caption'#6#6'Bottom'#18'DisableIfNoHandler'#9#9'OnExecute'#7#20'actVi'
+'ewBottomExecute'#0#0#0#242#2#4#10'TPopupMenu'#8'mnuLimit'#4'left'#3#192#0#3
+'top'#2'p'#0#9'TMenuItem'#10'popLimit10'#3'Tag'#2#10#7'Caption'#6#6'Max 10'#7
+'OnClick'#7#13'popCountClick'#0#0#9'TMenuItem'#10'popLimit25'#3'Tag'#2#25#7
+'Caption'#6#6'Max 25'#7'OnClick'#7#13'popCountClick'#0#0#9'TMenuItem'#10'pop'
+'Limit50'#3'Tag'#2'2'#7'Caption'#6#6'Max 50'#7'OnClick'#7#13'popCountClick'#0
+#0#0#0
'TPF0'#241#13'TCallStackDlg'#12'CallStackDlg'#4'Left'#3#4#2#6'Height'#3#246#0
+#3'Top'#3#219#0#5'Width'#3'2'#2#13'ActiveControl'#7#11'lvCallStack'#7'Captio'
+'n'#6#9'CallStack'#12'ClientHeight'#3#246#0#11'ClientWidth'#3'2'#2#8'OnCreat'
+'e'#7#10'FormCreate'#7'Visible'#9#0#242#2#0#9'TListView'#11'lvCallStack'#4'L'
+'eft'#2#0#6'Height'#3#204#0#3'Top'#2'*'#5'Width'#3'2'#2#5'Align'#7#8'alClien'
+'t'#7'Columns'#14#1#5'Width'#2#20#0#1#7'Caption'#6#5'Index'#5'Width'#2'#'#0#1
+#7'Caption'#6#6'Source'#5'Width'#3#150#0#0#1#7'Caption'#6#4'Line'#0#1#7'Capt'
+'ion'#6#8'Function'#5'Width'#3'"'#1#0#0#9'PopupMenu'#7#8'mnuPopup'#8'ReadOnl'
+'y'#9#9'RowSelect'#9#8'TabOrder'#2#0#9'ViewStyle'#7#8'vsReport'#7'OnClick'#7
+#16'lvCallStackClick'#10'OnDblClick'#7#19'lvCallStackDBLCLICK'#0#0#242#2#1#8
+'TToolBar'#8'ToolBar1'#4'Left'#2#0#6'Height'#2'*'#3'Top'#2#0#5'Width'#3'2'#2
+#12'ButtonHeight'#2'('#11'ButtonWidth'#2'2'#7'Caption'#6#9'tbButtons'#11'Edg'
+'eBorders'#11#0#12'ShowCaptions'#9#8'TabOrder'#2#1#0#11'TToolButton'#14'Tool'
+'ButtonShow'#4'Left'#2#1#3'Top'#2#0#6'Action'#7#7'actShow'#10'ImageIndex'#2#0
+#0#0#11'TToolButton'#17'ToolButtonCurrent'#4'Left'#2'3'#3'Top'#2#0#6'Action'
+#7#13'actSetCurrent'#0#0#11'TToolButton'#11'ToolButton4'#4'Left'#2'e'#3'Top'
+#2#0#5'Width'#2#3#7'Caption'#6#11'ToolButton4'#5'Style'#7#12'tbsSeparator'#0
+#0#11'TToolButton'#14'ToolButtonMore'#4'Left'#3#159#0#3'Top'#2#0#6'Action'#7
+#11'actViewMore'#10'ImageIndex'#2#1#0#0#11'TToolButton'#13'ToolButtonMax'#4
+'Left'#2'h'#3'Top'#2#0#6'Action'#7#12'actViewLimit'#7'Caption'#6#6'Max 10'#12
+'DropdownMenu'#7#8'mnuLimit'#5'Style'#7#11'tbsDropDown'#0#0#11'TToolButton'
+#14'ToolButtonGoto'#4'Left'#3'j'#1#3'Top'#2#0#6'Action'#7#11'actViewGoto'#10
+'ImageIndex'#2#4#0#0#11'TToolButton'#17'ToolButtonCopyAll'#4'Left'#3#159#1#3
+'Top'#2#0#6'Action'#7#10'actCopyAll'#10'ImageIndex'#2#5#0#0#11'TToolButton'
+#11'ToolButton8'#4'Left'#3#156#1#3'Top'#2#0#5'Width'#2#3#7'Caption'#6#11'Too'
+'lButton8'#5'Style'#7#12'tbsSeparator'#0#0#11'TToolButton'#11'ToolButton9'#4
+'Left'#3#209#0#3'Top'#2#0#5'Width'#2#3#7'Caption'#6#11'ToolButton9'#5'Style'
+#7#12'tbsSeparator'#0#0#11'TToolButton'#13'ToolButtonTop'#4'Left'#3#212#0#3
+'Top'#2#0#6'Action'#7#10'actViewTop'#10'ImageIndex'#2#2#0#0#11'TToolButton'
+#16'ToolButtonBottom'#4'Left'#3#6#1#3'Top'#2#0#6'Action'#7#13'actViewBottom'
+#10'ImageIndex'#2#3#0#0#6'TPanel'#6'Panel1'#4'Left'#3'8'#1#6'Height'#2'('#3
+'Top'#2#0#5'Width'#2'2'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2'('#11
+'ClientWidth'#2'2'#8'TabOrder'#2#0#0#5'TEdit'#7'txtGoto'#4'Left'#2#2#6'Heigh'
+'t'#2#22#3'Top'#2#8#5'Width'#2'.'#10'OnKeyPress'#7#15'txtGotoKeyPress'#8'Tab'
+'Order'#2#0#4'Text'#6#1'0'#0#0#0#0#242#2#2#10'TPopupMenu'#8'mnuPopup'#4'left'
+#2#16#3'top'#2'x'#0#9'TMenuItem'#7'popShow'#6'Action'#7#7'actShow'#7'Default'
+#9#7'OnClick'#7#12'actShowClick'#0#0#9'TMenuItem'#9'MenuItem1'#6'Action'#7#19
+'actToggleBreakPoint'#7'OnClick'#7#26'actToggleBreakPointExecute'#0#0#9'TMen'
+'uItem'#2'N1'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#15'popSetAsCurrent'#6'Actio'
+'n'#7#13'actSetCurrent'#7'OnClick'#7#20'actSetAsCurrentClick'#0#0#9'TMenuIte'
+'m'#10'popCopyAll'#6'Action'#7#10'actCopyAll'#7'OnClick'#7#15'actCopyAllClic'
+'k'#0#0#0#242#2#3#11'TActionList'#10'aclActions'#4'left'#2#16#3'top'#2'P'#0#7
+'TAction'#7'actShow'#7'Caption'#6#4'Show'#18'DisableIfNoHandler'#9#9'OnExecu'
+'te'#7#12'actShowClick'#0#0#7'TAction'#13'actSetCurrent'#7'Caption'#6#7'Curr'
+'ent'#18'DisableIfNoHandler'#9#9'OnExecute'#7#20'actSetAsCurrentClick'#0#0#7
+'TAction'#10'actCopyAll'#7'Caption'#6#8'Copy All'#18'DisableIfNoHandler'#9#9
+'OnExecute'#7#15'actCopyAllClick'#0#0#7'TAction'#11'actViewMore'#8'Category'
+#6#4'View'#7'Caption'#6#4'More'#18'DisableIfNoHandler'#9#9'OnExecute'#7#18'a'
+'ctViewMoreExecute'#0#0#7'TAction'#11'actViewGoto'#8'Category'#6#4'View'#7'C'
+'aption'#6#4'Goto'#18'DisableIfNoHandler'#9#9'OnExecute'#7#18'actViewGotoExe'
+'cute'#0#0#7'TAction'#12'actViewLimit'#8'Category'#6#4'View'#7'Caption'#6#2
+'10'#18'DisableIfNoHandler'#9#9'OnExecute'#7#19'actViewLimitExecute'#0#0#7'T'
+'Action'#10'actViewTop'#8'Category'#6#4'View'#7'Caption'#6#3'Top'#18'Disable'
+'IfNoHandler'#9#9'OnExecute'#7#17'actViewTopExecute'#0#0#7'TAction'#13'actVi'
+'ewBottom'#8'Category'#6#4'View'#7'Caption'#6#6'Bottom'#18'DisableIfNoHandle'
+'r'#9#9'OnExecute'#7#20'actViewBottomExecute'#0#0#7'TAction'#19'actToggleBre'
+'akPoint'#7'Caption'#6#17'Toggle Breakpoint'#18'DisableIfNoHandler'#9#9'OnEx'
+'ecute'#7#26'actToggleBreakPointExecute'#0#0#0#242#2#4#10'TPopupMenu'#8'mnuL'
+'imit'#4'left'#2'0'#3'top'#2'x'#0#9'TMenuItem'#10'popLimit10'#3'Tag'#2#10#7
+'Caption'#6#6'Max 10'#7'OnClick'#7#13'popCountClick'#0#0#9'TMenuItem'#10'pop'
+'Limit25'#3'Tag'#2#25#7'Caption'#6#6'Max 25'#7'OnClick'#7#13'popCountClick'#0
+#0#9'TMenuItem'#10'popLimit50'#3'Tag'#2'2'#7'Caption'#6#6'Max 50'#7'OnClick'
+#7#13'popCountClick'#0#0#0#0
]);

View File

@ -38,7 +38,7 @@ interface
uses
LResources, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, Debugger, DebuggerDlg, Menus, ClipBrd, ExtCtrls, StdCtrls, Spin,
ActnList, MainBase, IDEImagesIntf;
ActnList, MainBase, IDEImagesIntf, IDECommands;
type
@ -47,6 +47,7 @@ type
TCallStackDlg = class(TDebuggerDlg)
aclActions: TActionList;
actCopyAll: TAction;
actToggleBreakPoint: TAction;
actViewBottom: TAction;
actViewTop: TAction;
actViewLimit: TAction;
@ -54,6 +55,7 @@ type
actViewMore: TAction;
actSetCurrent: TAction;
actShow: TAction;
MenuItem1: TMenuItem;
ToolButtonTop: TToolButton;
ToolButtonBottom: TToolButton;
ToolButtonCopyAll: TToolButton;
@ -78,6 +80,7 @@ type
ToolButtonMore: TToolButton;
ToolButtonMax: TToolButton;
ToolButtonGoto: TToolButton;
procedure actToggleBreakPointExecute(Sender: TObject);
procedure actViewBottomExecute(Sender: TObject);
procedure actViewGotoExecute(Sender: TObject);
procedure actViewMoreExecute(Sender: TObject);
@ -113,6 +116,7 @@ type
procedure UpdateView;
procedure JumpToSource;
procedure CopyToClipBoard;
procedure ToggleBreakpoint(Item: TListItem);
protected
procedure DoBeginUpdate; override;
procedure DoEndUpdate; override;
@ -158,6 +162,7 @@ begin
FViewCount := 10;
FViewStart := 0;
actViewLimit.Caption := popLimit10.Caption;
actToggleBreakPoint.ShortCut:= IDECommandList.FindIDECommand(ecToggleBreakPoint).AsShortCut;
end;
procedure TCallStackDlg.CallStackChanged(Sender: TObject);
@ -192,6 +197,7 @@ var
Item: TListItem;
Entry: TCallStackEntry;
First, Count: Integer;
Source: String;
begin
BeginUpdate;
try
@ -256,7 +262,10 @@ begin
end;
Item.SubItems[0] := IntToStr(Entry.Index);
Item.SubItems[1] := Entry.Source;
Source := Entry.Source;
if Source = '' then // we dont have a source file => just show an adress
Source := ':' + IntToHex(Entry.Adress, 8);
Item.SubItems[1] := Source;
Item.SubItems[2] := IntToStr(Entry.Line);
Item.SubItems[3] := GetFunction(Entry);
end;
@ -317,7 +326,7 @@ begin
if Entry = nil then Exit;
Filename := Entry.Source;
if DebugBoss.GetFullFilename(Filename, true)
if (FileName <> '') and DebugBoss.GetFullFilename(Filename, True)
then MainIDE.DoJumpToSourcePosition(Filename, 0, Entry.Line, 0, True);
end;
@ -343,6 +352,29 @@ begin
ClipBoard.AsText := S;
end;
procedure TCallStackDlg.ToggleBreakpoint(Item: TListItem);
var
idx: Integer;
Entry: TCallStackEntry;
BreakPoint: TIDEBreakPoint;
FileName: String;
begin
if (Item <> nil) and (BreakPoints <> nil) then
begin
idx := FViewStart + Item.Index;
if idx >= CallStack.Count then Exit;
Entry := CallStack.Entries[idx];
FileName := Entry.Source;
if (FileName = '') or not DebugBoss.GetFullFilename(FileName, False) then
Exit;
BreakPoint := BreakPoints.Find(FileName, Entry.Line);
if BreakPoint <> nil then
DebugBoss.DoDeleteBreakPoint(BreakPoint.Source, BreakPoint.Line)
else
DebugBoss.DoCreateBreakPoint(FileName, Entry.Line, False);
end;
end;
procedure TCallStackDlg.lvCallStackDBLCLICK(Sender: TObject);
begin
JumpToSource;
@ -393,6 +425,11 @@ begin
else SetViewStart(0);
end;
procedure TCallStackDlg.actToggleBreakPointExecute(Sender: TObject);
begin
ToggleBreakpoint(lvCallStack.Selected);
end;
procedure TCallStackDlg.actViewGotoExecute(Sender: TObject);
begin
SetViewStart(StrToIntDef(txtGoto.Text, 0));
@ -454,29 +491,13 @@ procedure TCallStackDlg.lvCallStackClick(Sender: TObject);
var
P: TPoint;
Item: TListItem;
idx: Integer;
Entry: TCallStackEntry;
BreakPoint: TIDEBreakPoint;
FileName: String;
begin
// toggle breakpoint
P := lvCallStack.ScreenToClient(Mouse.CursorPos);
Item := lvCallStack.GetItemAt(P.X, P.Y);
// if clicked on the first column of a valid item
if (Item <> nil) and (P.X <= lvCallStack.Column[0].Width) and (BreakPoints <> nil) then
begin
idx := FViewStart + Item.Index;
if idx >= CallStack.Count then Exit;
Entry := CallStack.Entries[idx];
FileName := Entry.Source;
if (FileName = '') or not DebugBoss.GetFullFilename(FileName, False) then
Exit;
BreakPoint := BreakPoints.Find(FileName, Entry.Line);
if BreakPoint <> nil then
DebugBoss.DoDeleteBreakPoint(BreakPoint.Source, BreakPoint.Line)
else
DebugBoss.DoCreateBreakPoint(FileName, Entry.Line, False);
end;
if (Item <> nil) and (P.X <= lvCallStack.Column[0].Width) then
ToggleBreakPoint(Item);
end;
procedure TCallStackDlg.actViewLimitExecute(Sender: TObject);