1
{ $Id: registersdlg.pp 23459 2010-01-15 02:41:46Z paul $ }
1
{ $Id: registersdlg.pp 37200 2012-05-06 12:33:51Z martin $ }
2
2
{ ----------------------------------------------
3
3
registersdlg.pp - Overview of registers
4
4
----------------------------------------------
6
6
@created(Sun Nov 16th WET 2008)
7
@lastmod($Date: 2010-01-15 02:41:46 +0000 (Fri, 15 Jan 2010) $)
7
@lastmod($Date: 2012-05-06 14:33:51 +0200 (Sun, 06 May 2012) $)
8
8
@author(Marc Weustink <marc@@dommelstein.net>)
10
10
This unit contains the registers debugger dialog.
39
SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
40
ComCtrls, Debugger, DebuggerDlg;
39
SysUtils, Classes, Controls, Forms, Clipbrd,
40
BaseDebugManager, IDEWindowIntf, DebuggerStrConst,
41
ComCtrls, ActnList, Menus, Debugger, DebuggerDlg,
42
LazarusIDEStrConsts, IDEImagesIntf;
46
48
TRegistersDlg = class(TDebuggerDlg)
50
actCopyValue: TAction;
52
ActionList1: TActionList;
47
53
ImageList1: TImageList;
48
54
lvRegisters: TListView;
55
DispDefault: TMenuItem;
61
PopDispDefault: TMenuItem;
62
PopDispHex: TMenuItem;
63
PopDispBin: TMenuItem;
64
PopDispOct: TMenuItem;
65
PopDispDec: TMenuItem;
66
PopDispRaw: TMenuItem;
67
popCopyValue: TMenuItem;
68
popCopyName: TMenuItem;
71
PopupDispType: TPopupMenu;
72
PopupMenu1: TPopupMenu;
74
ToolButton1: TToolButton;
75
ToolButtonDispType: TToolButton;
76
ToolButtonPower: TToolButton;
77
procedure actCopyNameExecute(Sender: TObject);
78
procedure actCopyValueExecute(Sender: TObject);
79
procedure actPowerExecute(Sender: TObject);
80
procedure DispDefaultClick(Sender: TObject);
81
procedure lvRegistersSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
82
procedure ToolButtonDispTypeClick(Sender: TObject);
50
84
FRegisters: TIDERegisters;
51
85
FRegistersNotification: TIDERegistersNotification;
86
FPowerImgIdx, FPowerImgIdxGrey: Integer;
52
87
procedure RegistersChanged(Sender: TObject);
53
88
procedure SetRegisters(const AValue: TIDERegisters);
89
function IndexOfName(AName: String): Integer;
55
91
procedure DoBeginUpdate; override;
56
92
procedure DoEndUpdate; override;
93
function ColSizeGetter(AColId: Integer; var ASize: Integer): Boolean;
94
procedure ColSizeSetter(AColId: Integer; ASize: Integer);
58
96
constructor Create(AOwner: TComponent); override;
59
97
destructor Destroy; override;
108
RegisterDlgWindowCreator: TIDEWindowCreator;
111
COL_REGISTER_NAME = 1;
112
COL_REGISTER_VALUE = 2;
113
COL_WIDTHS: Array[0..1] of integer = ( 150, 50);
115
function RegisterDlgColSizeGetter(AForm: TCustomForm; AColId: Integer; var ASize: Integer): Boolean;
117
Result := AForm is TRegistersDlg;
119
Result := TRegistersDlg(AForm).ColSizeGetter(AColId, ASize);
122
procedure RegisterDlgColSizeSetter(AForm: TCustomForm; AColId: Integer; ASize: Integer);
124
if AForm is TRegistersDlg then
125
TRegistersDlg(AForm).ColSizeSetter(AColId, ASize);
74
130
constructor TRegistersDlg.Create(AOwner: TComponent);
76
134
inherited Create(AOwner);
77
135
FRegistersNotification := TIDERegistersNotification.Create;
78
136
FRegistersNotification.AddReference;
79
137
FRegistersNotification.OnChange := @RegistersChanged;
80
138
Caption:= lisRegisters;
81
lvRegisters.Columns[0].Caption:= lisRegistersDlgName;
82
lvRegisters.Columns[1].Caption:= lisRegistersDlgValue;
139
lvRegisters.Columns[0].Caption:= lisName;
140
lvRegisters.Columns[1].Caption:= lisValue;
142
ActionList1.Images := IDEImages.Images_16;
143
ToolBar1.Images := IDEImages.Images_16;
145
FPowerImgIdx := IDEImages.LoadImage(16, 'debugger_power');
146
FPowerImgIdxGrey := IDEImages.LoadImage(16, 'debugger_power_grey');
147
actPower.ImageIndex := FPowerImgIdx;
148
//actPower.Caption := lisDbgWinPower;
149
actPower.Hint := lisDbgWinPowerHint;
151
actCopyName.Caption := lisLocalsDlgCopyName;
152
actCopyValue.Caption := lisLocalsDlgCopyValue;
154
ToolButtonDispType.Hint := regdlgDisplayTypeForSelectedRegisters;
156
DispDefault.Caption := dlgPasStringKeywordsOptDefault;
157
DispHex.Caption := regdlgHex;
158
DispBin.Caption := regdlgBinary;
159
DispOct.Caption := regdlgOctal;
160
DispDec.Caption := regdlgDecimal;
161
DispRaw.Caption := regdlgRaw;
162
DispDefault.Tag := ord(rdDefault);
163
DispHex.Tag := ord(rdHex);
164
DispBin.Tag := ord(rdBinary);
165
DispOct.Tag := ord(rdOctal);
166
DispDec.Tag := ord(rdDecimal);
167
DispRaw.Tag := ord(rdRaw);
169
PopDispDefault.Caption := dlgPasStringKeywordsOptDefault;
170
PopDispHex.Caption := regdlgHex;
171
PopDispBin.Caption := regdlgBinary;
172
PopDispOct.Caption := regdlgOctal;
173
PopDispDec.Caption := regdlgDecimal;
174
PopDispRaw.Caption := regdlgRaw;
175
PopDispDefault.Tag := ord(rdDefault);
176
PopDispHex.Tag := ord(rdHex);
177
PopDispBin.Tag := ord(rdBinary);
178
PopDispOct.Tag := ord(rdOctal);
179
PopDispDec.Tag := ord(rdDecimal);
180
PopDispRaw.Tag := ord(rdRaw);
182
popFormat.Caption := regdlgFormat;
184
actCopyName.Caption := lisLocalsDlgCopyName;
185
actCopyValue.Caption := lisLocalsDlgCopyValue;
187
for i := low(COL_WIDTHS) to high(COL_WIDTHS) do
188
lvRegisters.Column[i].Width := COL_WIDTHS[i];
85
191
destructor TRegistersDlg.Destroy;
90
196
inherited Destroy;
199
procedure TRegistersDlg.actPowerExecute(Sender: TObject);
201
if ToolButtonPower.Down
203
actPower.ImageIndex := FPowerImgIdx;
204
ToolButtonPower.ImageIndex := FPowerImgIdx;
205
RegistersChanged(nil);
208
actPower.ImageIndex := FPowerImgIdxGrey;
209
ToolButtonPower.ImageIndex := FPowerImgIdxGrey;
213
procedure TRegistersDlg.actCopyNameExecute(Sender: TObject);
216
Clipboard.AsText := lvRegisters.Selected.Caption;
220
procedure TRegistersDlg.actCopyValueExecute(Sender: TObject);
223
Clipboard.AsText := lvRegisters.Selected.SubItems[0];
227
procedure TRegistersDlg.DispDefaultClick(Sender: TObject);
232
ToolButtonPower.Down := True;
233
FRegisters.BeginUpdate;
235
for n := 0 to lvRegisters.Items.Count -1 do
237
Item := lvRegisters.Items[n];
238
if Item.Selected then begin
239
i := IndexOfName(Item.Caption);
241
then FRegisters.Formats[i] := TRegisterDisplayFormat(TMenuItem(Sender).Tag);
245
FRegisters.EndUpdate;
247
lvRegistersSelectItem(nil, nil, True);
250
procedure TRegistersDlg.lvRegistersSelectItem(Sender: TObject; Item: TListItem;
254
SelFormat: TRegisterDisplayFormat;
255
MultiFormat: Boolean;
258
MultiFormat := False;
259
SelFormat := rdDefault;
260
for n := 0 to lvRegisters.Items.Count -1 do
262
Item := lvRegisters.Items[n];
263
if Item.Selected then begin
264
i := IndexOfName(Item.Caption);
267
then SelFormat := FRegisters.Formats[i];
269
if SelFormat <> FRegisters.Formats[i] then begin
276
ToolButtonDispType.Enabled := j > 0;
277
popFormat.Enabled := j > 0;
278
actCopyName.Enabled := j > 0;
279
actCopyValue.Enabled := j > 0;
281
PopDispDefault.Checked := False;
282
PopDispHex.Checked := False;
283
PopDispBin.Checked := False;
284
PopDispOct.Checked := False;
285
PopDispDec.Checked := False;
286
PopDispRaw.Checked := False;
288
then ToolButtonDispType.Caption := '...'
292
ToolButtonDispType.Caption := DispDefault.Caption;
293
PopDispDefault.Checked := True;
296
ToolButtonDispType.Caption := DispHex.Caption;
297
PopDispHex.Checked := True;
300
ToolButtonDispType.Caption := DispBin.Caption;
301
PopDispBin.Checked := True;
304
ToolButtonDispType.Caption := DispOct.Caption;
305
PopDispOct.Checked := True;
308
ToolButtonDispType.Caption := DispDec.Caption;
309
PopDispDec.Checked := True;
312
ToolButtonDispType.Caption := DispRaw.Caption;
313
PopDispRaw.Checked := True;
319
procedure TRegistersDlg.ToolButtonDispTypeClick(Sender: TObject);
321
ToolButtonDispType.CheckMenuDropdown;
93
324
procedure TRegistersDlg.RegistersChanged(Sender: TObject);
96
327
List: TStringList;
331
if (not ToolButtonPower.Down) then exit;
100
333
List := TStringList.Create;
184
424
lvRegisters.EndUpdate;
427
function TRegistersDlg.ColSizeGetter(AColId: Integer; var ASize: Integer): Boolean;
429
if (AColId - 1 >= 0) and (AColId - 1 < lvRegisters.ColumnCount) then begin
430
ASize := lvRegisters.Column[AColId - 1].Width;
431
Result := ASize <> COL_WIDTHS[AColId - 1];
437
procedure TRegistersDlg.ColSizeSetter(AColId: Integer; ASize: Integer);
440
COL_REGISTER_NAME: lvRegisters.Column[0].Width := ASize;
441
COL_REGISTER_VALUE: lvRegisters.Column[1].Width := ASize;
447
RegisterDlgWindowCreator := IDEWindowCreators.Add(DebugDialogNames[ddtRegisters]);
448
RegisterDlgWindowCreator.OnCreateFormProc := @CreateDebugDialog;
449
RegisterDlgWindowCreator.OnSetDividerSize := @RegisterDlgColSizeSetter;
450
RegisterDlgWindowCreator.OnGetDividerSize := @RegisterDlgColSizeGetter;
451
RegisterDlgWindowCreator.DividerTemplate.Add('RegisterName', COL_REGISTER_NAME, @drsColWidthName);
452
RegisterDlgWindowCreator.DividerTemplate.Add('RegisterValue', COL_REGISTER_VALUE, @drsColWidthValue);
453
RegisterDlgWindowCreator.CreateSimpleLayout;