mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-13 16:49:07 +02:00
IdeDebugger: ValueFormatter "Custom Displayformat"
This commit is contained in:
parent
72fa9a1c96
commit
fcaca1fe6a
@ -15,15 +15,23 @@ unit IdeDebuggerValueFormatterIntf experimental;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses fgl, SysUtils, IdeDebuggerWatchValueIntf,
|
uses fgl, SysUtils, IdeDebuggerWatchValueIntf,
|
||||||
DbgIntfDebuggerBase;
|
DbgIntfDebuggerBase, Laz2_XMLCfg;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
|
ILazDbgIdeValueFormatterConfigStorageIntf = interface ['{FCB5F11D-47EF-4701-AEE2-7E22A2B2601C}']
|
||||||
|
procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
|
procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
|
end;
|
||||||
|
|
||||||
TLazDbgIdeValFormatterFeature = (
|
TLazDbgIdeValFormatterFeature = (
|
||||||
vffFormatValue, // FormatValue() for IWatchResultDataIntf
|
vffFormatValue, // FormatValue() for IWatchResultDataIntf
|
||||||
vffFormatOldValue, // FormatValue() for older backends TDBGType
|
vffFormatOldValue, // FormatValue() for older backends TDBGType
|
||||||
vffValueData, // Normal data
|
vffValueData, // Normal data
|
||||||
vffValueMemDump // MemDump
|
vffValueMemDump, // MemDump
|
||||||
|
|
||||||
|
vffPreventOrigValue, // Does not support having the orig value shown with the translated result
|
||||||
|
vffSkipOnRecursion // The formatter may match during printing the value => skip it in this case
|
||||||
) experimental;
|
) experimental;
|
||||||
TLazDbgIdeValFormatterFeatures = set of TLazDbgIdeValFormatterFeature;
|
TLazDbgIdeValFormatterFeatures = set of TLazDbgIdeValFormatterFeature;
|
||||||
|
|
||||||
@ -52,6 +60,7 @@ type
|
|||||||
function GetDefaultsObject: TObject; // for TXmlConfig.WriteObject / all published fields with DEFAULT values
|
function GetDefaultsObject: TObject; // for TXmlConfig.WriteObject / all published fields with DEFAULT values
|
||||||
function CreateCopy: ILazDbgIdeValueFormatterIntf;
|
function CreateCopy: ILazDbgIdeValueFormatterIntf;
|
||||||
procedure Free;
|
procedure Free;
|
||||||
|
function GetInterface(const iidstr : shortstring;out obj) : boolean; // provided by TObject
|
||||||
end;
|
end;
|
||||||
|
|
||||||
(* ILazDbgIdeValueFormatterSettingsFrameIntf
|
(* ILazDbgIdeValueFormatterSettingsFrameIntf
|
||||||
|
@ -168,6 +168,7 @@ type
|
|||||||
class operator = (a,b: TWatchDisplayFormat): boolean;
|
class operator = (a,b: TWatchDisplayFormat): boolean;
|
||||||
function HasOverrides: boolean;
|
function HasOverrides: boolean;
|
||||||
procedure MakeAllOverrides;
|
procedure MakeAllOverrides;
|
||||||
|
procedure CopyInheritedFrom(AnOther: TWatchDisplayFormat);
|
||||||
end;
|
end;
|
||||||
PWatchDisplayFormat = ^TWatchDisplayFormat;
|
PWatchDisplayFormat = ^TWatchDisplayFormat;
|
||||||
|
|
||||||
@ -283,8 +284,40 @@ type
|
|||||||
|
|
||||||
IWatchResultDataIntf = interface;
|
IWatchResultDataIntf = interface;
|
||||||
|
|
||||||
IWatchResultPrinter = interface
|
(* IWatchResultPrinter & ValueFormmatters:
|
||||||
function PrintWatchValue(AResValue: IWatchResultDataIntf; const ADispFormat: TWatchDisplayFormat): String;
|
If a Valueformatter's FormatValue is called, it is given an IWatchResultPrinter.
|
||||||
|
Calling PrintWatchValue on this, will format the value WITHOUT ANY ValueFormmatters.
|
||||||
|
This can be changed by
|
||||||
|
- Setting a specific ValueFormatter with SetValueFormatter
|
||||||
|
- Specifing flags
|
||||||
|
~ "Default Valueformatter" is the formatter that was used before calling
|
||||||
|
(the outermost) value formatter.
|
||||||
|
This is either the global list, or list set by the IDE, or a specific
|
||||||
|
fomatter set by the IDE (e.g. due to watch properties specifing a
|
||||||
|
formatter)
|
||||||
|
~ "Current Valueformatter" is the formatter or list that was in use before
|
||||||
|
the current formatter was called.
|
||||||
|
This can be the "default", or it can be the formatter specified by the
|
||||||
|
next outer value formatter (if they are called nested)
|
||||||
|
In either case, the top "AResValue" passed from a value formatter to
|
||||||
|
IWatchResultPrinter is NOT going to any value formatter (to avoid circles).
|
||||||
|
The exception is, if wpfResValueIsNestedValue is used, as then the value
|
||||||
|
should be a nested value.
|
||||||
|
*)
|
||||||
|
TWatchResultPrinterFlag = (
|
||||||
|
wpfResValueIsNestedValue, // inc nest level / allow ValueFormatter directly on new top AResValue
|
||||||
|
wpfUseCurrentValueFormatterList,
|
||||||
|
wpfUseDefaultValueFormatterList
|
||||||
|
);
|
||||||
|
TWatchResultPrinterFlags = set of TWatchResultPrinterFlag;
|
||||||
|
|
||||||
|
IWatchResultPrinter = interface ['{DD3F17BB-0875-4882-8D8B-348A30166984}']
|
||||||
|
function PrintWatchValue(AResValue: IWatchResultDataIntf;
|
||||||
|
const ADispFormat: TWatchDisplayFormat;
|
||||||
|
AFlags: TWatchResultPrinterFlags = []
|
||||||
|
): String;
|
||||||
|
|
||||||
|
//procedure SetValueFormatter
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -297,7 +330,7 @@ type
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
IWatchResultDataIntf = interface
|
IWatchResultDataIntf = interface ['{C69FF0ED-94F1-4F1A-BB67-CCED487A3DE5}']
|
||||||
// function GetClassID: TWatchResultDataClassID;
|
// function GetClassID: TWatchResultDataClassID;
|
||||||
function GetInternalObject: TObject;
|
function GetInternalObject: TObject;
|
||||||
|
|
||||||
@ -638,5 +671,24 @@ begin
|
|||||||
Pointer.Address.UseInherited := False;
|
Pointer.Address.UseInherited := False;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TWatchDisplayFormat.CopyInheritedFrom(AnOther: TWatchDisplayFormat);
|
||||||
|
var
|
||||||
|
a: TWatchDisplayFormatAddr;
|
||||||
|
begin
|
||||||
|
if Num.UseInherited then Num := AnOther.Num;
|
||||||
|
if Num2.UseInherited then Num2 := AnOther.Num2;
|
||||||
|
if Enum.UseInherited then Enum := AnOther.Enum;
|
||||||
|
if EnumVal.UseInherited then EnumVal := AnOther.EnumVal;
|
||||||
|
if Bool.UseInherited then Bool := AnOther.Bool;
|
||||||
|
if Char.UseInherited then Char := AnOther.Char;
|
||||||
|
if Float.UseInherited then Float := AnOther.Float;
|
||||||
|
a := Struct.Address;
|
||||||
|
if Struct.UseInherited then Struct := AnOther.Struct;
|
||||||
|
if not a.UseInherited then Struct.Address := a;
|
||||||
|
a := Pointer.Address;
|
||||||
|
if Pointer.UseInherited then Pointer := AnOther.Pointer;
|
||||||
|
if not a.UseInherited then Pointer.Address := a;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ object DisplayFormatFrame: TDisplayFormatFrame
|
|||||||
ClientWidth = 592
|
ClientWidth = 592
|
||||||
Constraints.MaxWidth = 850
|
Constraints.MaxWidth = 850
|
||||||
Constraints.MinWidth = 480
|
Constraints.MinWidth = 480
|
||||||
|
LCLVersion = '3.99.0.0'
|
||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
DesignLeft = 427
|
DesignLeft = 427
|
||||||
DesignTop = 213
|
DesignTop = 213
|
||||||
@ -43,7 +44,7 @@ object DisplayFormatFrame: TDisplayFormatFrame
|
|||||||
end
|
end
|
||||||
object ToolButton2: TToolButton
|
object ToolButton2: TToolButton
|
||||||
Left = 45
|
Left = 45
|
||||||
Height = 22
|
Height = 8
|
||||||
Top = 2
|
Top = 2
|
||||||
Caption = 'ToolButton2'
|
Caption = 'ToolButton2'
|
||||||
Enabled = False
|
Enabled = False
|
||||||
@ -65,7 +66,7 @@ object DisplayFormatFrame: TDisplayFormatFrame
|
|||||||
end
|
end
|
||||||
object ToolButton4: TToolButton
|
object ToolButton4: TToolButton
|
||||||
Left = 71
|
Left = 71
|
||||||
Height = 22
|
Height = 8
|
||||||
Top = 2
|
Top = 2
|
||||||
Caption = 'ToolButton4'
|
Caption = 'ToolButton4'
|
||||||
Enabled = False
|
Enabled = False
|
||||||
@ -171,7 +172,7 @@ object DisplayFormatFrame: TDisplayFormatFrame
|
|||||||
end
|
end
|
||||||
object ToolButton12: TToolButton
|
object ToolButton12: TToolButton
|
||||||
Left = 132
|
Left = 132
|
||||||
Height = 22
|
Height = 8
|
||||||
Top = 2
|
Top = 2
|
||||||
Caption = 'ToolButton12'
|
Caption = 'ToolButton12'
|
||||||
Enabled = False
|
Enabled = False
|
||||||
@ -180,7 +181,7 @@ object DisplayFormatFrame: TDisplayFormatFrame
|
|||||||
end
|
end
|
||||||
object ToolButton13: TToolButton
|
object ToolButton13: TToolButton
|
||||||
Left = 175
|
Left = 175
|
||||||
Height = 22
|
Height = 8
|
||||||
Top = 2
|
Top = 2
|
||||||
Caption = 'ToolButton13'
|
Caption = 'ToolButton13'
|
||||||
Enabled = False
|
Enabled = False
|
||||||
@ -189,7 +190,7 @@ object DisplayFormatFrame: TDisplayFormatFrame
|
|||||||
end
|
end
|
||||||
object ToolButton14: TToolButton
|
object ToolButton14: TToolButton
|
||||||
Left = 211
|
Left = 211
|
||||||
Height = 22
|
Height = 8
|
||||||
Top = 2
|
Top = 2
|
||||||
Caption = 'ToolButton14'
|
Caption = 'ToolButton14'
|
||||||
Enabled = False
|
Enabled = False
|
||||||
@ -198,7 +199,7 @@ object DisplayFormatFrame: TDisplayFormatFrame
|
|||||||
end
|
end
|
||||||
object ToolButton15: TToolButton
|
object ToolButton15: TToolButton
|
||||||
Left = 248
|
Left = 248
|
||||||
Height = 22
|
Height = 8
|
||||||
Top = 2
|
Top = 2
|
||||||
Caption = 'ToolButton15'
|
Caption = 'ToolButton15'
|
||||||
Enabled = False
|
Enabled = False
|
||||||
@ -207,7 +208,7 @@ object DisplayFormatFrame: TDisplayFormatFrame
|
|||||||
end
|
end
|
||||||
object ToolButton16: TToolButton
|
object ToolButton16: TToolButton
|
||||||
Left = 286
|
Left = 286
|
||||||
Height = 22
|
Height = 8
|
||||||
Top = 2
|
Top = 2
|
||||||
Caption = 'ToolButton16'
|
Caption = 'ToolButton16'
|
||||||
Enabled = False
|
Enabled = False
|
||||||
@ -216,7 +217,7 @@ object DisplayFormatFrame: TDisplayFormatFrame
|
|||||||
end
|
end
|
||||||
object ToolButton17: TToolButton
|
object ToolButton17: TToolButton
|
||||||
Left = 351
|
Left = 351
|
||||||
Height = 22
|
Height = 8
|
||||||
Top = 2
|
Top = 2
|
||||||
Caption = 'ToolButton17'
|
Caption = 'ToolButton17'
|
||||||
Enabled = False
|
Enabled = False
|
||||||
|
@ -254,7 +254,9 @@ type
|
|||||||
private type
|
private type
|
||||||
TFmtButtons = (bsNum, bsEnum, bsBool, bsChar, bsFloat, bsStruct, bsPtr);
|
TFmtButtons = (bsNum, bsEnum, bsBool, bsChar, bsFloat, bsStruct, bsPtr);
|
||||||
private
|
private
|
||||||
|
FAllowMultiTabs: boolean;
|
||||||
FHighlightModifiedTabs: boolean;
|
FHighlightModifiedTabs: boolean;
|
||||||
|
FShowAll: boolean;
|
||||||
FShowCurrent: boolean;
|
FShowCurrent: boolean;
|
||||||
|
|
||||||
FDisplayFormatCount: integer;
|
FDisplayFormatCount: integer;
|
||||||
@ -279,6 +281,7 @@ type
|
|||||||
procedure SetDisplayFormatCount(AValue: integer);
|
procedure SetDisplayFormatCount(AValue: integer);
|
||||||
procedure SetDisplayFormats(AIndex: integer; AValue: TWatchDisplayFormat);
|
procedure SetDisplayFormats(AIndex: integer; AValue: TWatchDisplayFormat);
|
||||||
procedure SetHighlightModifiedTabs(AValue: boolean);
|
procedure SetHighlightModifiedTabs(AValue: boolean);
|
||||||
|
procedure SetShowAll(AValue: boolean);
|
||||||
procedure SetShowCurrent(AValue: boolean);
|
procedure SetShowCurrent(AValue: boolean);
|
||||||
procedure SetShowExtraSettings(AValue: boolean);
|
procedure SetShowExtraSettings(AValue: boolean);
|
||||||
procedure SetShowMemDump(AValue: boolean);
|
procedure SetShowMemDump(AValue: boolean);
|
||||||
@ -314,6 +317,8 @@ type
|
|||||||
property CurrentResDataType: TWatchResultDataKind read FCurrentResDataType write SetCurrentResDataType;
|
property CurrentResDataType: TWatchResultDataKind read FCurrentResDataType write SetCurrentResDataType;
|
||||||
published
|
published
|
||||||
property ShowCurrent: boolean read FShowCurrent write SetShowCurrent;
|
property ShowCurrent: boolean read FShowCurrent write SetShowCurrent;
|
||||||
|
property ShowAll: boolean read FShowAll write SetShowAll;
|
||||||
|
property AllowMultiTabs: boolean read FAllowMultiTabs write FAllowMultiTabs;
|
||||||
property ShowMemDump: boolean read FShowMemDump write SetShowMemDump;
|
property ShowMemDump: boolean read FShowMemDump write SetShowMemDump;
|
||||||
property ShowMultiRadio: boolean read FShowMultiRadio write SetShowMultiRadio;
|
property ShowMultiRadio: boolean read FShowMultiRadio write SetShowMultiRadio;
|
||||||
property ShowOverrideChecks: boolean read FShowOverrideChecks write SetShowOverrideChecks;
|
property ShowOverrideChecks: boolean read FShowOverrideChecks write SetShowOverrideChecks;
|
||||||
@ -629,9 +634,16 @@ begin
|
|||||||
|
|
||||||
if FCurrentResDataType = rdkUnknown then begin
|
if FCurrentResDataType = rdkUnknown then begin
|
||||||
FInButtonClick := True;
|
FInButtonClick := True;
|
||||||
tbAll.Down := True;
|
if FShowAll then begin
|
||||||
FInButtonClick := False;
|
tbAll.Down := True;
|
||||||
tbAllClick(nil);
|
FInButtonClick := False;
|
||||||
|
tbAllClick(nil);
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
tbNumber.Down := True;
|
||||||
|
FInButtonClick := False;
|
||||||
|
tbFormatClick(tbNumber);
|
||||||
|
end;
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -686,6 +698,7 @@ begin
|
|||||||
try
|
try
|
||||||
UpdateFormat;
|
UpdateFormat;
|
||||||
if (not(ssShift in GetKeyShiftState)) or
|
if (not(ssShift in GetKeyShiftState)) or
|
||||||
|
(not FAllowMultiTabs) or
|
||||||
(not(tbNumber.Down or tbEnum.Down or tbBool.Down or tbChar.Down or tbFloat.Down or tbStruct.Down or tbPointer.Down))
|
(not(tbNumber.Down or tbEnum.Down or tbBool.Down or tbChar.Down or tbFloat.Down or tbStruct.Down or tbPointer.Down))
|
||||||
then begin
|
then begin
|
||||||
tbNumber.Down := tbNumber = Sender;
|
tbNumber.Down := tbNumber = Sender;
|
||||||
@ -709,8 +722,9 @@ begin
|
|||||||
rdkStruct: tbCurrent.Down := tbStruct.Down;
|
rdkStruct: tbCurrent.Down := tbStruct.Down;
|
||||||
else tbCurrent.Down := False;
|
else tbCurrent.Down := False;
|
||||||
end;
|
end;
|
||||||
tbAll.Down := tbNumber.Down and tbEnum.Down and tbBool.Down and tbChar.Down and
|
if FShowAll then
|
||||||
tbFloat.Down and tbStruct.Down and tbPointer.Down;
|
tbAll.Down := tbNumber.Down and tbEnum.Down and tbBool.Down and tbChar.Down and
|
||||||
|
tbFloat.Down and tbStruct.Down and tbPointer.Down;
|
||||||
finally
|
finally
|
||||||
FInButtonClick := False;
|
FInButtonClick := False;
|
||||||
end;
|
end;
|
||||||
@ -801,11 +815,20 @@ begin
|
|||||||
UpdateTabs;
|
UpdateTabs;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TDisplayFormatFrame.SetShowAll(AValue: boolean);
|
||||||
|
begin
|
||||||
|
if FShowAll = AValue then Exit;
|
||||||
|
FShowAll := AValue;
|
||||||
|
tbAll.Visible := AValue;
|
||||||
|
ToolButton4.Visible := FShowCurrent;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TDisplayFormatFrame.SetShowCurrent(AValue: boolean);
|
procedure TDisplayFormatFrame.SetShowCurrent(AValue: boolean);
|
||||||
begin
|
begin
|
||||||
if FShowCurrent = AValue then Exit;
|
if FShowCurrent = AValue then Exit;
|
||||||
FShowCurrent := AValue;
|
FShowCurrent := AValue;
|
||||||
tbCurrent.Visible := FShowCurrent;
|
tbCurrent.Visible := FShowCurrent;
|
||||||
|
ToolButton2.Visible := FShowCurrent;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TDisplayFormatFrame.SetShowExtraSettings(AValue: boolean);
|
procedure TDisplayFormatFrame.SetShowExtraSettings(AValue: boolean);
|
||||||
@ -1791,6 +1814,8 @@ begin
|
|||||||
DisplayFormatCount := 1;
|
DisplayFormatCount := 1;
|
||||||
FHighlightModifiedTabs := True;
|
FHighlightModifiedTabs := True;
|
||||||
FShowCurrent := True;
|
FShowCurrent := True;
|
||||||
|
FShowAll := True;
|
||||||
|
FAllowMultiTabs := True;
|
||||||
FShowMemDump := True;
|
FShowMemDump := True;
|
||||||
FShowMultiRadio := True;
|
FShowMultiRadio := True;
|
||||||
FShowOverrideChecks := True;
|
FShowOverrideChecks := True;
|
||||||
@ -1944,7 +1969,7 @@ begin
|
|||||||
rdkSet: tbEnum.Down := True;
|
rdkSet: tbEnum.Down := True;
|
||||||
rdkStruct: tbStruct.Down := True;
|
rdkStruct: tbStruct.Down := True;
|
||||||
else begin
|
else begin
|
||||||
tbAll.Down := True;
|
if FShowAll then tbAll.Down := True;
|
||||||
tbNumber.Down := True;
|
tbNumber.Down := True;
|
||||||
tbEnum.Down := True;
|
tbEnum.Down := True;
|
||||||
tbBool.Down := True;
|
tbBool.Down := True;
|
||||||
|
@ -189,6 +189,7 @@ begin
|
|||||||
SpinMaxNest.Value := 0;
|
SpinMaxNest.Value := 0;
|
||||||
|
|
||||||
cbAppendOriginalValue.ItemIndex := -1;
|
cbAppendOriginalValue.ItemIndex := -1;
|
||||||
|
cbAppendOriginalValue.Enabled := False;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
pnlCurrentFormatter.Enabled := True;
|
pnlCurrentFormatter.Enabled := True;
|
||||||
@ -202,7 +203,16 @@ begin
|
|||||||
SpinMinNest.Value := FCurFormatter.LimitByNestMin;
|
SpinMinNest.Value := FCurFormatter.LimitByNestMin;
|
||||||
SpinMaxNest.Value := FCurFormatter.LimitByNestMax;
|
SpinMaxNest.Value := FCurFormatter.LimitByNestMax;
|
||||||
|
|
||||||
cbAppendOriginalValue.ItemIndex := ord(FCurFormatter.OriginalValue);
|
if (FCurFormatter.ValFormatter = nil) or
|
||||||
|
(vffPreventOrigValue in FCurFormatter.ValFormatter.SupportedFeatures)
|
||||||
|
then begin
|
||||||
|
cbAppendOriginalValue.ItemIndex := -1;
|
||||||
|
cbAppendOriginalValue.Enabled := False;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
cbAppendOriginalValue.ItemIndex := ord(FCurFormatter.OriginalValue);
|
||||||
|
cbAppendOriginalValue.Enabled := True;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
@ -295,6 +295,14 @@
|
|||||||
<Item>
|
<Item>
|
||||||
<Filename Value="idedebuggervalueformatterarrayofchartostring.pas"/>
|
<Filename Value="idedebuggervalueformatterarrayofchartostring.pas"/>
|
||||||
<UnitName Value="IdeDebuggerValueFormatterArrayOfCharToString"/>
|
<UnitName Value="IdeDebuggerValueFormatterArrayOfCharToString"/>
|
||||||
|
<ResourceBaseClass Value="Frame"/>
|
||||||
|
<ResourceBaseClassname Value=""/>
|
||||||
|
</Item>
|
||||||
|
<Item>
|
||||||
|
<Filename Value="idedebuggervalueformatterdisplayformat.pas"/>
|
||||||
|
<UnitName Value="IdeDebuggerValueFormatterDisplayFormat"/>
|
||||||
|
<ResourceBaseClass Value="Frame"/>
|
||||||
|
<ResourceBaseClassname Value=""/>
|
||||||
</Item>
|
</Item>
|
||||||
</Files>
|
</Files>
|
||||||
<i18n>
|
<i18n>
|
||||||
|
@ -21,7 +21,8 @@ uses
|
|||||||
IdeDebuggerValueFormatterDateTime, IdeDebuggerValueFormatterColor,
|
IdeDebuggerValueFormatterDateTime, IdeDebuggerValueFormatterColor,
|
||||||
IdeDebuggerValueFormatterSetup, IdeDebuggerValueFormatterCurrency, DisplayFormatConfigFrame,
|
IdeDebuggerValueFormatterSetup, IdeDebuggerValueFormatterCurrency, DisplayFormatConfigFrame,
|
||||||
DisplayFormatDefaultsConfigFrame, IdeDebuggerDisplayFormats, IdeDebugger_DisplayFormat_Options,
|
DisplayFormatDefaultsConfigFrame, IdeDebuggerDisplayFormats, IdeDebugger_DisplayFormat_Options,
|
||||||
ProjectDebugLink, IdeDebuggerValueFormatterArrayOfCharToString, LazarusPackageIntf;
|
ProjectDebugLink, IdeDebuggerValueFormatterArrayOfCharToString,
|
||||||
|
IdeDebuggerValueFormatterDisplayFormat, LazarusPackageIntf;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
@ -503,6 +503,7 @@ resourcestring
|
|||||||
DispFormatOptProjectText = 'General and specific project settings will be used first. Only if none of them sets a default, then the IDE-wide settings will be tried.';
|
DispFormatOptProjectText = 'General and specific project settings will be used first. Only if none of them sets a default, then the IDE-wide settings will be tried.';
|
||||||
|
|
||||||
dbgDoNotShowThisMessageAgain = 'Do not ask again';
|
dbgDoNotShowThisMessageAgain = 'Do not ask again';
|
||||||
|
optDispGutterCustomDisplayformat = 'Custom Displayformat';
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
unit IdeDebuggerValueFormatter;
|
unit IdeDebuggerValueFormatter;
|
||||||
|
|
||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
|
{$INTERFACES CORBA}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
@ -19,9 +20,21 @@ type
|
|||||||
|
|
||||||
TLazDbgIdeValFormatterOriginalValue = (vfovHide, vfovAtEnd, vfovAtFront);
|
TLazDbgIdeValFormatterOriginalValue = (vfovHide, vfovAtEnd, vfovAtFront);
|
||||||
|
|
||||||
|
IIdeDbgValueFormatterIntf = interface ['{2BEC59F6-7CD8-4CFE-B399-C25AFCADB700}']
|
||||||
|
function FormatValue(AWatchValue: IWatchResultDataIntf;
|
||||||
|
ADisplayFormat: TWatchDisplayFormat; ANestLevel: integer;
|
||||||
|
AWatchResultPrinter: IWatchResultPrinter; out APrintedValue: String
|
||||||
|
): Boolean;
|
||||||
|
function FormatValue(aDBGType: TDBGType;
|
||||||
|
aValue: string;
|
||||||
|
ADisplayFormat: TWatchDisplayFormat;
|
||||||
|
out APrintedValue: String
|
||||||
|
): boolean; deprecated 'For values from older backends only - to be removed as backends are upgraded';
|
||||||
|
end;
|
||||||
|
|
||||||
{ TIdeDbgValueFormatterSelector }
|
{ TIdeDbgValueFormatterSelector }
|
||||||
|
|
||||||
TIdeDbgValueFormatterSelector = class(TFreeNotifyingObject)
|
TIdeDbgValueFormatterSelector = class(TFreeNotifyingObject, IIdeDbgValueFormatterIntf)
|
||||||
private
|
private
|
||||||
FLimitByNestLevel: Boolean;
|
FLimitByNestLevel: Boolean;
|
||||||
FLimitByNestMax: integer;
|
FLimitByNestMax: integer;
|
||||||
@ -32,6 +45,7 @@ type
|
|||||||
FEnabled: Boolean;
|
FEnabled: Boolean;
|
||||||
FName: String;
|
FName: String;
|
||||||
FValFormatterRegEntry: TLazDbgIdeValueFormatterRegistryEntryClass;
|
FValFormatterRegEntry: TLazDbgIdeValueFormatterRegistryEntryClass;
|
||||||
|
FInFormatValue: boolean;
|
||||||
|
|
||||||
procedure FreeValFormater;
|
procedure FreeValFormater;
|
||||||
function GetMatchInherited: boolean;
|
function GetMatchInherited: boolean;
|
||||||
@ -54,6 +68,11 @@ type
|
|||||||
ADisplayFormat: TWatchDisplayFormat; ANestLevel: integer;
|
ADisplayFormat: TWatchDisplayFormat; ANestLevel: integer;
|
||||||
AWatchResultPrinter: IWatchResultPrinter; out APrintedValue: String
|
AWatchResultPrinter: IWatchResultPrinter; out APrintedValue: String
|
||||||
): Boolean; experimental;
|
): Boolean; experimental;
|
||||||
|
function FormatValue(aDBGType: TDBGType;
|
||||||
|
aValue: string;
|
||||||
|
ADisplayFormat: TWatchDisplayFormat;
|
||||||
|
out APrintedValue: String
|
||||||
|
): boolean; deprecated 'For values from older backends only - to be removed as backends are upgraded';
|
||||||
|
|
||||||
function IsMatchingTypeName(ATypeName: String): boolean;
|
function IsMatchingTypeName(ATypeName: String): boolean;
|
||||||
function IsMatchingInheritedTypeName(ATypeName: String): boolean;
|
function IsMatchingInheritedTypeName(ATypeName: String): boolean;
|
||||||
@ -74,7 +93,8 @@ type
|
|||||||
{ TIdeDbgValueFormatterSelectorList }
|
{ TIdeDbgValueFormatterSelectorList }
|
||||||
|
|
||||||
TIdeDbgValueFormatterSelectorList = class(
|
TIdeDbgValueFormatterSelectorList = class(
|
||||||
specialize TChangeNotificationGeneric< specialize TFPGObjectList<TIdeDbgValueFormatterSelector> >
|
specialize TChangeNotificationGeneric< specialize TFPGObjectList<TIdeDbgValueFormatterSelector> >,
|
||||||
|
IIdeDbgValueFormatterIntf
|
||||||
)
|
)
|
||||||
private
|
private
|
||||||
FChanged: Boolean;
|
FChanged: Boolean;
|
||||||
@ -136,6 +156,7 @@ function TIdeDbgValueFormatterSelector.DoFormatValue(AWatchValue: IWatchResultDa
|
|||||||
ADisplayFormat: TWatchDisplayFormat; AWatchResultPrinter: IWatchResultPrinter; out
|
ADisplayFormat: TWatchDisplayFormat; AWatchResultPrinter: IWatchResultPrinter; out
|
||||||
APrintedValue: String): Boolean;
|
APrintedValue: String): Boolean;
|
||||||
begin
|
begin
|
||||||
|
FInFormatValue := True;
|
||||||
Result := ValFormatter.FormatValue(AWatchValue, ADisplayFormat, AWatchResultPrinter, APrintedValue);
|
Result := ValFormatter.FormatValue(AWatchValue, ADisplayFormat, AWatchResultPrinter, APrintedValue);
|
||||||
if Result then begin
|
if Result then begin
|
||||||
case OriginalValue of
|
case OriginalValue of
|
||||||
@ -143,6 +164,7 @@ begin
|
|||||||
vfovAtFront: APrintedValue := AWatchResultPrinter.PrintWatchValue(AWatchValue, ADisplayFormat) + ' = ' + APrintedValue;
|
vfovAtFront: APrintedValue := AWatchResultPrinter.PrintWatchValue(AWatchValue, ADisplayFormat) + ' = ' + APrintedValue;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
FInFormatValue := False;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TIdeDbgValueFormatterSelector.Create;
|
constructor TIdeDbgValueFormatterSelector.Create;
|
||||||
@ -194,7 +216,8 @@ procedure TIdeDbgValueFormatterSelector.LoadDataFromXMLConfig(
|
|||||||
const AConfig: TRttiXMLConfig; const APath: string);
|
const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
var
|
var
|
||||||
s: String;
|
s: String;
|
||||||
Def: TObject;
|
Def, o: TObject;
|
||||||
|
intf: ILazDbgIdeValueFormatterConfigStorageIntf;
|
||||||
begin
|
begin
|
||||||
FreeValFormater;
|
FreeValFormater;
|
||||||
AConfig.ReadObject(APath + 'Filter/', Self);
|
AConfig.ReadObject(APath + 'Filter/', Self);
|
||||||
@ -207,24 +230,35 @@ begin
|
|||||||
|
|
||||||
FValFormatter := FValFormatterRegEntry.CreateValueFormatter;
|
FValFormatter := FValFormatterRegEntry.CreateValueFormatter;
|
||||||
|
|
||||||
Def := FValFormatter.GetDefaultsObject;
|
o := FValFormatter.GetObject;
|
||||||
AConfig.ReadObject(APath + 'Formatter/', FValFormatter.GetObject, Def);
|
if o <> nil then begin
|
||||||
Def.Free;
|
Def := FValFormatter.GetDefaultsObject;
|
||||||
|
AConfig.ReadObject(APath + 'Formatter/', o, Def);
|
||||||
|
Def.Free;
|
||||||
|
end;
|
||||||
|
if FValFormatter.GetInterface(ILazDbgIdeValueFormatterConfigStorageIntf, intf) and (intf <> nil) then
|
||||||
|
intf.LoadDataFromXMLConfig(AConfig, APath);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TIdeDbgValueFormatterSelector.SaveDataToXMLConfig(
|
procedure TIdeDbgValueFormatterSelector.SaveDataToXMLConfig(
|
||||||
const AConfig: TRttiXMLConfig; const APath: string);
|
const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
var
|
var
|
||||||
Def: TObject;
|
Def, o: TObject;
|
||||||
|
intf: ILazDbgIdeValueFormatterConfigStorageIntf;
|
||||||
begin
|
begin
|
||||||
AConfig.WriteObject(APath + 'Filter/', Self);
|
AConfig.WriteObject(APath + 'Filter/', Self);
|
||||||
AConfig.SetDeleteValue(APath + 'Filter/MatchTypeNames', MatchTypeNames.CommaText, '');
|
AConfig.SetDeleteValue(APath + 'Filter/MatchTypeNames', MatchTypeNames.CommaText, '');
|
||||||
|
|
||||||
AConfig.SetValue(APath + 'FormatterClass', FValFormatterRegEntry.GetClassName);
|
AConfig.SetValue(APath + 'FormatterClass', FValFormatterRegEntry.GetClassName);
|
||||||
|
|
||||||
Def := FValFormatter.GetDefaultsObject;
|
o := FValFormatter.GetObject;
|
||||||
AConfig.WriteObject(APath + 'Formatter/', FValFormatter.GetObject, Def);
|
if o <> nil then begin
|
||||||
Def.Free;
|
Def := FValFormatter.GetDefaultsObject;
|
||||||
|
AConfig.WriteObject(APath + 'Formatter/', o, Def);
|
||||||
|
Def.Free;
|
||||||
|
end;
|
||||||
|
if FValFormatter.GetInterface(ILazDbgIdeValueFormatterConfigStorageIntf, intf) and (intf <> nil) then
|
||||||
|
intf.SaveDataToXMLConfig(AConfig, APath);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TIdeDbgValueFormatterSelector.MatchesAll(AWatchValue: IWatchResultDataIntf;
|
function TIdeDbgValueFormatterSelector.MatchesAll(AWatchValue: IWatchResultDataIntf;
|
||||||
@ -236,6 +270,7 @@ begin
|
|||||||
Result := False;
|
Result := False;
|
||||||
if (ValFormatter = nil) or
|
if (ValFormatter = nil) or
|
||||||
(not (vffFormatValue in ValFormatter.SupportedFeatures)) or
|
(not (vffFormatValue in ValFormatter.SupportedFeatures)) or
|
||||||
|
((vffSkipOnRecursion in ValFormatter.SupportedFeatures) and FInFormatValue) or
|
||||||
(not (AWatchValue.ValueKind in ValFormatter.SupportedDataKinds)) or
|
(not (AWatchValue.ValueKind in ValFormatter.SupportedDataKinds)) or
|
||||||
( ADisplayFormat.MemDump and (not(vffValueMemDump in ValFormatter.SupportedFeatures)) ) or
|
( ADisplayFormat.MemDump and (not(vffValueMemDump in ValFormatter.SupportedFeatures)) ) or
|
||||||
( (not ADisplayFormat.MemDump) and (not(vffValueData in ValFormatter.SupportedFeatures)) ) or
|
( (not ADisplayFormat.MemDump) and (not(vffValueData in ValFormatter.SupportedFeatures)) ) or
|
||||||
@ -269,6 +304,33 @@ begin
|
|||||||
Result := DoFormatValue(AWatchValue, ADisplayFormat, AWatchResultPrinter, APrintedValue);
|
Result := DoFormatValue(AWatchValue, ADisplayFormat, AWatchResultPrinter, APrintedValue);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TIdeDbgValueFormatterSelector.FormatValue(aDBGType: TDBGType; aValue: string;
|
||||||
|
ADisplayFormat: TWatchDisplayFormat; out APrintedValue: String): boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
if (ValFormatter = nil) or
|
||||||
|
(not (vffFormatOldValue in ValFormatter.SupportedFeatures)) or
|
||||||
|
((vffSkipOnRecursion in ValFormatter.SupportedFeatures) and FInFormatValue) or
|
||||||
|
( ADisplayFormat.MemDump and (not(vffValueMemDump in ValFormatter.SupportedFeatures)) ) or
|
||||||
|
( (not ADisplayFormat.MemDump) and (not(vffValueData in ValFormatter.SupportedFeatures)) ) or
|
||||||
|
( LimitByNestLevel and (LimitByNestMin > 0) ) // only level 0 for old style watches
|
||||||
|
then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
if not IsMatchingTypeName(aDBGType.TypeName) then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
FInFormatValue := True;
|
||||||
|
Result := ValFormatter.FormatValue(aDBGType, aValue, ADisplayFormat, APrintedValue);
|
||||||
|
if Result then begin
|
||||||
|
case OriginalValue of
|
||||||
|
vfovAtEnd: APrintedValue := APrintedValue + ' = ' + aValue;
|
||||||
|
vfovAtFront: APrintedValue := aValue + ' = ' + APrintedValue;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
FInFormatValue := False;
|
||||||
|
end;
|
||||||
|
|
||||||
function TIdeDbgValueFormatterSelector.IsMatchingTypeName(ATypeName: String): boolean;
|
function TIdeDbgValueFormatterSelector.IsMatchingTypeName(ATypeName: String): boolean;
|
||||||
begin
|
begin
|
||||||
Result := FMatchTypeNames.CheckTypeName(ATypeName);
|
Result := FMatchTypeNames.CheckTypeName(ATypeName);
|
||||||
@ -405,34 +467,14 @@ function TIdeDbgValueFormatterSelectorList.FormatValue(aDBGType: TDBGType;
|
|||||||
): boolean;
|
): boolean;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
f: TIdeDbgValueFormatterSelector;
|
|
||||||
v: ILazDbgIdeValueFormatterIntf;
|
|
||||||
begin
|
begin
|
||||||
Result := aDBGType <> nil;
|
Result := aDBGType <> nil;
|
||||||
if not Result then
|
if not Result then
|
||||||
exit;
|
exit;
|
||||||
for i := 0 to Count - 1 do begin
|
for i := 0 to Count - 1 do begin
|
||||||
f := Items[i];
|
Result := Items[i].FormatValue(aDBGType, aValue, ADisplayFormat, APrintedValue);
|
||||||
v := f.ValFormatter;
|
if Result then
|
||||||
|
|
||||||
if (v = nil) or
|
|
||||||
(not (vffFormatOldValue in v.SupportedFeatures)) or
|
|
||||||
( ADisplayFormat.MemDump and (not(vffValueMemDump in v.SupportedFeatures)) ) or
|
|
||||||
( (not ADisplayFormat.MemDump) and (not(vffValueData in v.SupportedFeatures)) ) or
|
|
||||||
( f.LimitByNestLevel and (f.LimitByNestMin > 0) ) // only level 0 for old style watches
|
|
||||||
then
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if not f.IsMatchingTypeName(aDBGType.TypeName) then
|
|
||||||
continue;
|
|
||||||
Result := f.ValFormatter.FormatValue(aDBGType, aValue, ADisplayFormat, APrintedValue);
|
|
||||||
if Result then begin
|
|
||||||
case f.OriginalValue of
|
|
||||||
vfovAtEnd: APrintedValue := APrintedValue + ' = ' + aValue;
|
|
||||||
vfovAtFront: APrintedValue := aValue + ' = ' + APrintedValue;
|
|
||||||
end;
|
|
||||||
exit;
|
exit;
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
Result := False;
|
Result := False;
|
||||||
end;
|
end;
|
||||||
|
@ -0,0 +1,643 @@
|
|||||||
|
object IdeDebuggerValueFormatterDisplayFormatFrame: TIdeDebuggerValueFormatterDisplayFormatFrame
|
||||||
|
Left = 0
|
||||||
|
Height = 399
|
||||||
|
Top = 0
|
||||||
|
Width = 642
|
||||||
|
ClientHeight = 399
|
||||||
|
ClientWidth = 642
|
||||||
|
Constraints.MinHeight = 90
|
||||||
|
TabOrder = 0
|
||||||
|
DesignLeft = 425
|
||||||
|
DesignTop = 16
|
||||||
|
object Panel1: TPanel
|
||||||
|
Left = 0
|
||||||
|
Height = 25
|
||||||
|
Top = 0
|
||||||
|
Width = 642
|
||||||
|
Align = alTop
|
||||||
|
AutoSize = True
|
||||||
|
BevelOuter = bvNone
|
||||||
|
ClientHeight = 25
|
||||||
|
ClientWidth = 642
|
||||||
|
TabOrder = 1
|
||||||
|
object cbOverrideWatch: TCheckBox
|
||||||
|
Left = 3
|
||||||
|
Height = 19
|
||||||
|
Top = 3
|
||||||
|
Width = 110
|
||||||
|
BorderSpacing.Around = 3
|
||||||
|
Caption = 'cbOverrideWatch'
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inline DisplayFormatFrame1: TDisplayFormatFrame
|
||||||
|
Height = 374
|
||||||
|
Top = 25
|
||||||
|
Width = 642
|
||||||
|
VertScrollBar.Increment = 37
|
||||||
|
VertScrollBar.Page = 374
|
||||||
|
Align = alClient
|
||||||
|
ClientHeight = 374
|
||||||
|
ClientWidth = 625
|
||||||
|
Constraints.MinHeight = 90
|
||||||
|
inherited ToolBar1: TToolBar
|
||||||
|
Width = 625
|
||||||
|
inherited ToolButton2: TToolButton
|
||||||
|
Height = 22
|
||||||
|
end
|
||||||
|
inherited ToolButton4: TToolButton
|
||||||
|
Height = 22
|
||||||
|
end
|
||||||
|
inherited ToolButton12: TToolButton
|
||||||
|
Height = 22
|
||||||
|
end
|
||||||
|
inherited ToolButton13: TToolButton
|
||||||
|
Height = 22
|
||||||
|
end
|
||||||
|
inherited ToolButton14: TToolButton
|
||||||
|
Height = 22
|
||||||
|
end
|
||||||
|
inherited ToolButton15: TToolButton
|
||||||
|
Height = 22
|
||||||
|
end
|
||||||
|
inherited ToolButton16: TToolButton
|
||||||
|
Height = 22
|
||||||
|
end
|
||||||
|
inherited ToolButton17: TToolButton
|
||||||
|
Height = 22
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelNum: TPanel
|
||||||
|
AnchorSideLeft.Control = DisplayFormatFrame1
|
||||||
|
AnchorSideRight.Control = DisplayFormatFrame1
|
||||||
|
Width = 625
|
||||||
|
ClientWidth = 625
|
||||||
|
inherited Spacer1: TLabel
|
||||||
|
Width = 113
|
||||||
|
end
|
||||||
|
inherited Spacer2: TLabel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
end
|
||||||
|
inherited DividerBevelNum: TDividerBevel
|
||||||
|
Width = 625
|
||||||
|
end
|
||||||
|
inherited lbOverrideNumBase: TLabel
|
||||||
|
Width = 95
|
||||||
|
end
|
||||||
|
inherited PanelNumBase: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbNumDec: TRadioButton
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbNumHex: TRadioButton
|
||||||
|
Left = 85
|
||||||
|
Width = 84
|
||||||
|
end
|
||||||
|
inherited rbNumOct: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbNumBin: TRadioButton
|
||||||
|
Left = 254
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbNumChar: TRadioButton
|
||||||
|
Left = 339
|
||||||
|
Width = 84
|
||||||
|
end
|
||||||
|
inherited Label3: TLabel
|
||||||
|
Left = 423
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelNumSign: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbSignAuto: TRadioButton
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
inherited rbSignSigned: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 170
|
||||||
|
end
|
||||||
|
inherited rbSignUnsigned: TRadioButton
|
||||||
|
Left = 339
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelNumDigits: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited DigitSpacer2: TLabel
|
||||||
|
Width = 339
|
||||||
|
end
|
||||||
|
inherited DigitSpacer1: TLabel
|
||||||
|
Left = 339
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
inherited lbNumDigits: TLabel
|
||||||
|
Left = 339
|
||||||
|
end
|
||||||
|
inherited SpinDigits: TSpinEdit
|
||||||
|
Left = 409
|
||||||
|
Width = 90
|
||||||
|
end
|
||||||
|
inherited cbNumSeparator: TCheckBox
|
||||||
|
Width = 335
|
||||||
|
end
|
||||||
|
inherited PanelNumSepGroup: TPanel
|
||||||
|
Width = 243
|
||||||
|
ClientWidth = 243
|
||||||
|
inherited rbNumSepNone: TRadioButton
|
||||||
|
Width = 58
|
||||||
|
end
|
||||||
|
inherited rbNumSepByte: TRadioButton
|
||||||
|
Left = 64
|
||||||
|
Width = 55
|
||||||
|
end
|
||||||
|
inherited rbNumSepWord: TRadioButton
|
||||||
|
Left = 121
|
||||||
|
Width = 59
|
||||||
|
end
|
||||||
|
inherited rbNumSepLong: TRadioButton
|
||||||
|
Left = 182
|
||||||
|
Width = 57
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited Shape13: TShape
|
||||||
|
Left = 335
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited Shape10: TShape
|
||||||
|
Left = 113
|
||||||
|
end
|
||||||
|
inherited Shape11: TShape
|
||||||
|
Left = 113
|
||||||
|
end
|
||||||
|
inherited Shape12: TShape
|
||||||
|
Left = 113
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelNum2: TPanel
|
||||||
|
AnchorSideLeft.Control = DisplayFormatFrame1
|
||||||
|
AnchorSideRight.Control = DisplayFormatFrame1
|
||||||
|
Width = 625
|
||||||
|
ClientWidth = 625
|
||||||
|
inherited Spacer13: TLabel
|
||||||
|
Width = 113
|
||||||
|
end
|
||||||
|
inherited Spacer14: TLabel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
end
|
||||||
|
inherited DividerBevelNum2: TDividerBevel
|
||||||
|
Width = 625
|
||||||
|
end
|
||||||
|
inherited lbOverrideNum2Base: TLabel
|
||||||
|
Width = 95
|
||||||
|
end
|
||||||
|
inherited PanelNum2Visible: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited cbNum2Visibile: TCheckBox
|
||||||
|
Width = 508
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelNum2All: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited PanelNum2Base: TPanel
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbNum2Dec: TRadioButton
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbNum2Hex: TRadioButton
|
||||||
|
Left = 85
|
||||||
|
Width = 84
|
||||||
|
end
|
||||||
|
inherited rbNum2Oct: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbNum2Bin: TRadioButton
|
||||||
|
Left = 254
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbNum2Char: TRadioButton
|
||||||
|
Left = 339
|
||||||
|
Width = 84
|
||||||
|
end
|
||||||
|
inherited Label1: TLabel
|
||||||
|
Left = 423
|
||||||
|
Height = 1
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelNum2Sign: TPanel
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbSign2Auto: TRadioButton
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
inherited rbSign2Signed: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 170
|
||||||
|
end
|
||||||
|
inherited rbSign2Unsigned: TRadioButton
|
||||||
|
Left = 339
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelNum2Digits: TPanel
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited DigitSpacer4: TLabel
|
||||||
|
Width = 339
|
||||||
|
end
|
||||||
|
inherited DigitSpacer3: TLabel
|
||||||
|
Left = 339
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
inherited lbNum2Digits: TLabel
|
||||||
|
Left = 339
|
||||||
|
end
|
||||||
|
inherited Spin2Digits: TSpinEdit
|
||||||
|
Left = 415
|
||||||
|
Width = 88
|
||||||
|
end
|
||||||
|
inherited cbNum2Separator: TCheckBox
|
||||||
|
Width = 339
|
||||||
|
end
|
||||||
|
inherited PanelNum2SepGroup: TPanel
|
||||||
|
Width = 274
|
||||||
|
ClientWidth = 274
|
||||||
|
inherited rbNum2SepNone: TRadioButton
|
||||||
|
Width = 66
|
||||||
|
end
|
||||||
|
inherited rbNum2SepByte: TRadioButton
|
||||||
|
Left = 72
|
||||||
|
Width = 63
|
||||||
|
end
|
||||||
|
inherited rbNum2SepWord: TRadioButton
|
||||||
|
Left = 137
|
||||||
|
Width = 66
|
||||||
|
end
|
||||||
|
inherited rbNum2SepLong: TRadioButton
|
||||||
|
Left = 205
|
||||||
|
Width = 65
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelEnum: TPanel
|
||||||
|
AnchorSideLeft.Control = DisplayFormatFrame1
|
||||||
|
AnchorSideRight.Control = DisplayFormatFrame1
|
||||||
|
Width = 625
|
||||||
|
ClientWidth = 625
|
||||||
|
inherited Spacer3: TLabel
|
||||||
|
Width = 113
|
||||||
|
end
|
||||||
|
inherited Spacer4: TLabel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
end
|
||||||
|
inherited DividerBevelEnum: TDividerBevel
|
||||||
|
Width = 625
|
||||||
|
end
|
||||||
|
inherited lbOverrideEnum: TLabel
|
||||||
|
Width = 95
|
||||||
|
end
|
||||||
|
inherited PanelEnumRb1: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbEnumName: TRadioButton
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
inherited rbEnumOrd: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 170
|
||||||
|
end
|
||||||
|
inherited rbEnumNameAndOrd: TRadioButton
|
||||||
|
Left = 339
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelENumBase: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbENumDec: TRadioButton
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbENumHex: TRadioButton
|
||||||
|
Left = 85
|
||||||
|
Width = 84
|
||||||
|
end
|
||||||
|
inherited rbENumOct: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbENumBin: TRadioButton
|
||||||
|
Left = 254
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbENumChar: TRadioButton
|
||||||
|
Left = 339
|
||||||
|
Width = 81
|
||||||
|
end
|
||||||
|
inherited cbEnumSign: TCheckBox
|
||||||
|
Left = 423
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited lbEnumBaseSpace: TLabel
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited Shape18: TShape
|
||||||
|
Left = 419
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited Shape16: TShape
|
||||||
|
Left = 113
|
||||||
|
end
|
||||||
|
inherited Shape17: TShape
|
||||||
|
Left = 113
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelEnumVal: TPanel
|
||||||
|
AnchorSideLeft.Control = DisplayFormatFrame1
|
||||||
|
AnchorSideRight.Control = DisplayFormatFrame1
|
||||||
|
Width = 625
|
||||||
|
ClientWidth = 625
|
||||||
|
inherited Spacer15: TLabel
|
||||||
|
Width = 113
|
||||||
|
end
|
||||||
|
inherited Spacer16: TLabel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
end
|
||||||
|
inherited DividerBevelEnumVal: TDividerBevel
|
||||||
|
Width = 625
|
||||||
|
end
|
||||||
|
inherited lbOverrideEnumVal: TLabel
|
||||||
|
Width = 95
|
||||||
|
end
|
||||||
|
inherited PanelEnumValRb: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbEnumValName: TRadioButton
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
inherited rbEnumValOrd: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 170
|
||||||
|
end
|
||||||
|
inherited rbEnumValNameAndOrd: TRadioButton
|
||||||
|
Left = 339
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelENumValBase: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbENumValDec: TRadioButton
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbENumValHex: TRadioButton
|
||||||
|
Left = 85
|
||||||
|
Width = 84
|
||||||
|
end
|
||||||
|
inherited rbENumValOct: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbENumValBin: TRadioButton
|
||||||
|
Left = 254
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbENumValChar: TRadioButton
|
||||||
|
Left = 339
|
||||||
|
Width = 81
|
||||||
|
end
|
||||||
|
inherited cbEnumValSign: TCheckBox
|
||||||
|
Left = 423
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited lbEnumValBaseSpace: TLabel
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelFloat: TPanel
|
||||||
|
AnchorSideLeft.Control = DisplayFormatFrame1
|
||||||
|
AnchorSideRight.Control = DisplayFormatFrame1
|
||||||
|
Width = 625
|
||||||
|
ClientWidth = 625
|
||||||
|
inherited Spacer5: TLabel
|
||||||
|
Width = 113
|
||||||
|
end
|
||||||
|
inherited Spacer6: TLabel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
end
|
||||||
|
inherited DividerBevelFloat: TDividerBevel
|
||||||
|
Width = 625
|
||||||
|
end
|
||||||
|
inherited lbOverrideFloat: TLabel
|
||||||
|
Width = 95
|
||||||
|
end
|
||||||
|
inherited PanelFloatRb: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbFloatPoint: TRadioButton
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
inherited rbFloatScience: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 170
|
||||||
|
end
|
||||||
|
inherited lbFloatPrec: TLabel
|
||||||
|
Left = 339
|
||||||
|
end
|
||||||
|
inherited SpinFloatDigits: TSpinEdit
|
||||||
|
Left = 401
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelStruct: TPanel
|
||||||
|
AnchorSideLeft.Control = DisplayFormatFrame1
|
||||||
|
AnchorSideRight.Control = DisplayFormatFrame1
|
||||||
|
Width = 625
|
||||||
|
ClientWidth = 625
|
||||||
|
inherited Spacer7: TLabel
|
||||||
|
Width = 113
|
||||||
|
end
|
||||||
|
inherited Spacer8: TLabel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
end
|
||||||
|
inherited DividerBevelStruct: TDividerBevel
|
||||||
|
Width = 625
|
||||||
|
end
|
||||||
|
inherited lbOverrideStruct: TLabel
|
||||||
|
Width = 95
|
||||||
|
end
|
||||||
|
inherited PanelStructFld: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbStructValOnly: TRadioButton
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
inherited rbStructFields: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 170
|
||||||
|
end
|
||||||
|
inherited rbStructFull: TRadioButton
|
||||||
|
Left = 339
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelStructPointer: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbStructAddrOff: TRadioButton
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
inherited rbStructAddrOn: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 170
|
||||||
|
end
|
||||||
|
inherited rbStructAddrOnly: TRadioButton
|
||||||
|
Left = 339
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelPointer: TPanel
|
||||||
|
AnchorSideLeft.Control = DisplayFormatFrame1
|
||||||
|
AnchorSideRight.Control = DisplayFormatFrame1
|
||||||
|
Width = 625
|
||||||
|
ClientWidth = 625
|
||||||
|
inherited Spacer9: TLabel
|
||||||
|
Width = 113
|
||||||
|
end
|
||||||
|
inherited Spacer10: TLabel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
end
|
||||||
|
inherited DividerBevelPointerDeref: TDividerBevel
|
||||||
|
Width = 625
|
||||||
|
end
|
||||||
|
inherited lbOverridePointerDeref: TLabel
|
||||||
|
Width = 95
|
||||||
|
end
|
||||||
|
inherited PanelPointerDeref: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbPointerDerefOn: TRadioButton
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
inherited rbPointerDerefOff: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 170
|
||||||
|
end
|
||||||
|
inherited rbPointerDerefOnly: TRadioButton
|
||||||
|
Left = 339
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelAddressFormat: TPanel
|
||||||
|
AnchorSideLeft.Control = DisplayFormatFrame1
|
||||||
|
AnchorSideRight.Control = DisplayFormatFrame1
|
||||||
|
Width = 625
|
||||||
|
ClientWidth = 625
|
||||||
|
inherited Spacer11: TLabel
|
||||||
|
Width = 113
|
||||||
|
end
|
||||||
|
inherited Spacer12: TLabel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
end
|
||||||
|
inherited DividerBevelAddressFormat: TDividerBevel
|
||||||
|
Width = 625
|
||||||
|
end
|
||||||
|
inherited lbOverrideAddressFormat: TLabel
|
||||||
|
Width = 95
|
||||||
|
end
|
||||||
|
inherited PanelAddressType: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbAddressPlain: TRadioButton
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
inherited rbAddressTyped: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 170
|
||||||
|
end
|
||||||
|
inherited Label5: TLabel
|
||||||
|
Left = 339
|
||||||
|
Height = 1
|
||||||
|
Width = 169
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelAddressBase: TPanel
|
||||||
|
Left = 117
|
||||||
|
Width = 508
|
||||||
|
ClientWidth = 508
|
||||||
|
inherited rbAddrNumHex: TRadioButton
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbAddrNumDec: TRadioButton
|
||||||
|
Left = 85
|
||||||
|
Width = 84
|
||||||
|
end
|
||||||
|
inherited rbAddrNumOct: TRadioButton
|
||||||
|
Left = 169
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited rbAddrNumBin: TRadioButton
|
||||||
|
Left = 254
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
inherited lpAddrSpace: TLabel
|
||||||
|
Left = 339
|
||||||
|
Height = 1
|
||||||
|
Width = 84
|
||||||
|
end
|
||||||
|
inherited cbAddrSign: TCheckBox
|
||||||
|
Left = 423
|
||||||
|
Width = 85
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited PanelMemDump: TPanel
|
||||||
|
AnchorSideLeft.Control = DisplayFormatFrame1
|
||||||
|
AnchorSideRight.Control = DisplayFormatFrame1
|
||||||
|
Width = 625
|
||||||
|
ClientWidth = 625
|
||||||
|
inherited DividerBevelMemDump: TDividerBevel
|
||||||
|
Width = 625
|
||||||
|
end
|
||||||
|
inherited cbMemDump: TCheckBox
|
||||||
|
Width = 615
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,174 @@
|
|||||||
|
unit IdeDebuggerValueFormatterDisplayFormat;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, Forms, Controls, ActnList, ExtCtrls, StdCtrls, DisplayFormatConfigFrame,
|
||||||
|
IdeDebuggerDisplayFormats,
|
||||||
|
// IdeIntf
|
||||||
|
IdeDebuggerValueFormatterIntf, IdeDebuggerWatchValueIntf,
|
||||||
|
// LazUtils
|
||||||
|
Laz2_XMLCfg,
|
||||||
|
// IdeDebugger
|
||||||
|
IdeDebuggerStringConstants;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
{ TIdeDebuggerValueFormatterDisplayFormatFrame }
|
||||||
|
|
||||||
|
TIdeDebuggerValueFormatterDisplayFormatFrame = class(TFrame, ILazDbgIdeValueFormatterSettingsFrameIntf)
|
||||||
|
cbOverrideWatch: TCheckBox;
|
||||||
|
DisplayFormatFrame1: TDisplayFormatFrame;
|
||||||
|
Panel1: TPanel;
|
||||||
|
protected
|
||||||
|
procedure ReadFrom(AFormatter: ILazDbgIdeValueFormatterIntf);
|
||||||
|
function WriteTo(AFormatter: ILazDbgIdeValueFormatterIntf): Boolean;
|
||||||
|
public
|
||||||
|
constructor Create(TheOwner: TComponent); override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TIdeDbgValueFormatterDisplayFormat }
|
||||||
|
|
||||||
|
TIdeDbgValueFormatterDisplayFormat = class(
|
||||||
|
specialize TLazDbgIdeValueFormatterGeneric<TObject>,
|
||||||
|
ILazDbgIdeValueFormatterConfigStorageIntf
|
||||||
|
)
|
||||||
|
private
|
||||||
|
FDisplayFormat: TWatchDisplayFormat;
|
||||||
|
FOverrideWatch: boolean;
|
||||||
|
protected
|
||||||
|
procedure Init; override;
|
||||||
|
procedure Assign(AnOther: TObject); override;
|
||||||
|
public
|
||||||
|
class function GetRegisteredDisplayName: String;
|
||||||
|
function FormatValue(AWatchValue: IWatchResultDataIntf;
|
||||||
|
ADisplayFormat: TWatchDisplayFormat;
|
||||||
|
AWatchResultPrinter: IWatchResultPrinter; out APrintedValue: String
|
||||||
|
): Boolean; override; experimental;
|
||||||
|
|
||||||
|
function SupportedFeatures: TLazDbgIdeValFormatterFeatures; override;
|
||||||
|
// function SupportedDataKinds: TWatchResultDataKinds; override;
|
||||||
|
|
||||||
|
procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
|
procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
|
published
|
||||||
|
property OverrideWatch: boolean read FOverrideWatch write FOverrideWatch;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TIdeDbgValueFormatterRegistryDisplayFormat =
|
||||||
|
specialize TLazDbgIdeValueFormatterFrameRegistryEntryGeneric<TIdeDbgValueFormatterDisplayFormat, TIdeDebuggerValueFormatterDisplayFormatFrame>;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$R *.lfm}
|
||||||
|
|
||||||
|
{ TIdeDebuggerValueFormatterDisplayFormatFrame }
|
||||||
|
|
||||||
|
procedure TIdeDebuggerValueFormatterDisplayFormatFrame.ReadFrom(
|
||||||
|
AFormatter: ILazDbgIdeValueFormatterIntf);
|
||||||
|
var
|
||||||
|
vf: TIdeDbgValueFormatterDisplayFormat;
|
||||||
|
begin
|
||||||
|
vf := TIdeDbgValueFormatterDisplayFormat(AFormatter.GetObject);
|
||||||
|
cbOverrideWatch.Checked := vf.OverrideWatch;
|
||||||
|
DisplayFormatFrame1.DisplayFormat := vf.FDisplayFormat;
|
||||||
|
DisplayFormatFrame1.SelectDefaultButton;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TIdeDebuggerValueFormatterDisplayFormatFrame.WriteTo(
|
||||||
|
AFormatter: ILazDbgIdeValueFormatterIntf): Boolean;
|
||||||
|
var
|
||||||
|
vf: TIdeDbgValueFormatterDisplayFormat;
|
||||||
|
df: TWatchDisplayFormat;
|
||||||
|
begin
|
||||||
|
vf := TIdeDbgValueFormatterDisplayFormat(AFormatter.GetObject);
|
||||||
|
df := DisplayFormatFrame1.DisplayFormat;
|
||||||
|
Result := (vf.FDisplayFormat <> df) or
|
||||||
|
(vf.OverrideWatch <> cbOverrideWatch.Checked);
|
||||||
|
|
||||||
|
vf.OverrideWatch := cbOverrideWatch.Checked;
|
||||||
|
vf.FDisplayFormat := df;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TIdeDebuggerValueFormatterDisplayFormatFrame.Create(TheOwner: TComponent);
|
||||||
|
begin
|
||||||
|
inherited Create(TheOwner);
|
||||||
|
DisplayFormatFrame1.Setup;
|
||||||
|
DisplayFormatFrame1.ShowCurrent := False;
|
||||||
|
DisplayFormatFrame1.ShowAll := True;
|
||||||
|
DisplayFormatFrame1.AllowMultiTabs := True;
|
||||||
|
DisplayFormatFrame1.ShowExtraSettings := False;
|
||||||
|
DisplayFormatFrame1.ShowMemDump := False;
|
||||||
|
DisplayFormatFrame1.ShowOverrideChecks := True;
|
||||||
|
|
||||||
|
cbOverrideWatch.Caption := 'Override watch settings';
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TIdeDbgValueFormatterDisplayFormat }
|
||||||
|
|
||||||
|
procedure TIdeDbgValueFormatterDisplayFormat.Init;
|
||||||
|
begin
|
||||||
|
FDisplayFormat := DefaultWatchDisplayFormat;
|
||||||
|
FOverrideWatch := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIdeDbgValueFormatterDisplayFormat.Assign(AnOther: TObject);
|
||||||
|
var
|
||||||
|
f: TIdeDbgValueFormatterDisplayFormat;
|
||||||
|
begin
|
||||||
|
inherited Assign(AnOther);
|
||||||
|
if AnOther is TIdeDbgValueFormatterDisplayFormat then begin
|
||||||
|
f := AnOther as TIdeDbgValueFormatterDisplayFormat;
|
||||||
|
|
||||||
|
FDisplayFormat := f.FDisplayFormat;
|
||||||
|
FOverrideWatch := f.FOverrideWatch;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TIdeDbgValueFormatterDisplayFormat.GetRegisteredDisplayName: String;
|
||||||
|
begin
|
||||||
|
Result := optDispGutterCustomDisplayformat;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TIdeDbgValueFormatterDisplayFormat.FormatValue(AWatchValue: IWatchResultDataIntf;
|
||||||
|
ADisplayFormat: TWatchDisplayFormat; AWatchResultPrinter: IWatchResultPrinter; out
|
||||||
|
APrintedValue: String): Boolean;
|
||||||
|
var
|
||||||
|
d: TWatchDisplayFormat;
|
||||||
|
begin
|
||||||
|
Result := True;
|
||||||
|
if FOverrideWatch then begin
|
||||||
|
d := FDisplayFormat;
|
||||||
|
d.CopyInheritedFrom(ADisplayFormat);
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
d := ADisplayFormat;
|
||||||
|
d.CopyInheritedFrom(FDisplayFormat);
|
||||||
|
end;
|
||||||
|
APrintedValue := AWatchResultPrinter.PrintWatchValue(AWatchValue, d, [wpfUseCurrentValueFormatterList]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TIdeDbgValueFormatterDisplayFormat.SupportedFeatures: TLazDbgIdeValFormatterFeatures;
|
||||||
|
begin
|
||||||
|
Result := [vffFormatValue, vffValueData, vffSkipOnRecursion, vffPreventOrigValue];
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIdeDbgValueFormatterDisplayFormat.LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig;
|
||||||
|
const APath: string);
|
||||||
|
begin
|
||||||
|
LoadDisplayFormatFromXMLConfig(AConfig, APath + 'DispFormat/', FDisplayFormat);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIdeDbgValueFormatterDisplayFormat.SaveDataToXMLConfig(const AConfig: TRttiXMLConfig;
|
||||||
|
const APath: string);
|
||||||
|
begin
|
||||||
|
SaveDisplayFormatToXMLConfig(AConfig, APath + 'DispFormat/', FDisplayFormat);
|
||||||
|
end;
|
||||||
|
|
||||||
|
initialization
|
||||||
|
ValueFormatterRegistry.Add(TIdeDbgValueFormatterRegistryDisplayFormat);
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
@ -70,14 +70,24 @@ type
|
|||||||
private
|
private
|
||||||
FFormatFlags: TWatchResultPrinterFormatFlags;
|
FFormatFlags: TWatchResultPrinterFormatFlags;
|
||||||
FLineSeparator: String;
|
FLineSeparator: String;
|
||||||
FOnlyValueFormatter: TIdeDbgValueFormatterSelector;
|
FOnlyValueFormatter: IIdeDbgValueFormatterIntf;
|
||||||
|
FDefaultValueFormatter, FCurrentValueFormatter, FNextValueFormatter: IIdeDbgValueFormatterIntf;
|
||||||
FTargetAddressSize: integer;
|
FTargetAddressSize: integer;
|
||||||
FDisplayFormatResolver: TDisplayFormatResolver;
|
FDisplayFormatResolver: TDisplayFormatResolver;
|
||||||
FInValueFormatter: Boolean;
|
FNextCallIsValueFormatter: Boolean;
|
||||||
FInValFormNestLevel: integer;
|
FInValFormNestLevel: integer;
|
||||||
|
FResValueInFormatter: TWatchResultData;
|
||||||
protected const
|
protected const
|
||||||
MAX_ALLOWED_NEST_LVL = 100;
|
MAX_ALLOWED_NEST_LVL = 100;
|
||||||
|
protected type
|
||||||
|
TWatchResStoredSettings = record
|
||||||
|
FFormatFlags: TWatchResultPrinterFormatFlags;
|
||||||
|
FCurrentValueFormatter: IIdeDbgValueFormatterIntf;
|
||||||
|
FResValueInFormatter: TWatchResultData;
|
||||||
|
end;
|
||||||
protected
|
protected
|
||||||
|
procedure StoreSetting(var AStorage: TWatchResStoredSettings); inline;
|
||||||
|
procedure RestoreSetting(const AStorage: TWatchResStoredSettings); inline;
|
||||||
function PrintNumber(AUnsignedValue: QWord; ASignedValue: Int64;
|
function PrintNumber(AUnsignedValue: QWord; ASignedValue: Int64;
|
||||||
AByteSize: Integer;
|
AByteSize: Integer;
|
||||||
const ANumFormat: TResolvedDisplayFormatNum;
|
const ANumFormat: TResolvedDisplayFormatNum;
|
||||||
@ -93,10 +103,11 @@ type
|
|||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
function PrintWatchValue(AResValue: TWatchResultData; const ADispFormat: TWatchDisplayFormat): String;
|
function PrintWatchValue(AResValue: TWatchResultData; const ADispFormat: TWatchDisplayFormat): String;
|
||||||
function PrintWatchValue(AResValue: IWatchResultDataIntf; const ADispFormat: TWatchDisplayFormat): String;
|
function PrintWatchValueIntf(AResValue: IWatchResultDataIntf; const ADispFormat: TWatchDisplayFormat; AFlags: TWatchResultPrinterFlags = []): String;
|
||||||
|
function IWatchResultPrinter.PrintWatchValue = PrintWatchValueIntf;
|
||||||
|
|
||||||
property FormatFlags: TWatchResultPrinterFormatFlags read FFormatFlags write FFormatFlags;
|
property FormatFlags: TWatchResultPrinterFormatFlags read FFormatFlags write FFormatFlags;
|
||||||
property OnlyValueFormatter: TIdeDbgValueFormatterSelector read FOnlyValueFormatter write FOnlyValueFormatter;
|
property OnlyValueFormatter: IIdeDbgValueFormatterIntf read FOnlyValueFormatter write FOnlyValueFormatter;
|
||||||
|
|
||||||
property TargetAddressSize: integer read FTargetAddressSize write FTargetAddressSize;
|
property TargetAddressSize: integer read FTargetAddressSize write FTargetAddressSize;
|
||||||
property DisplayFormatResolver: TDisplayFormatResolver read FDisplayFormatResolver;
|
property DisplayFormatResolver: TDisplayFormatResolver read FDisplayFormatResolver;
|
||||||
@ -405,6 +416,20 @@ end;
|
|||||||
|
|
||||||
{ TWatchResultPrinter }
|
{ TWatchResultPrinter }
|
||||||
|
|
||||||
|
procedure TWatchResultPrinter.StoreSetting(var AStorage: TWatchResStoredSettings);
|
||||||
|
begin
|
||||||
|
AStorage.FFormatFlags := FFormatFlags;
|
||||||
|
AStorage.FCurrentValueFormatter := FCurrentValueFormatter;
|
||||||
|
AStorage.FResValueInFormatter := FResValueInFormatter;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TWatchResultPrinter.RestoreSetting(const AStorage: TWatchResStoredSettings);
|
||||||
|
begin
|
||||||
|
FFormatFlags := AStorage.FFormatFlags;
|
||||||
|
FCurrentValueFormatter := AStorage.FCurrentValueFormatter;
|
||||||
|
FResValueInFormatter := AStorage.FResValueInFormatter;
|
||||||
|
end;
|
||||||
|
|
||||||
function TWatchResultPrinter.PrintNumber(AUnsignedValue: QWord; ASignedValue: Int64;
|
function TWatchResultPrinter.PrintNumber(AUnsignedValue: QWord; ASignedValue: Int64;
|
||||||
AByteSize: Integer; const ANumFormat: TResolvedDisplayFormatNum; PrintNil: Boolean): String;
|
AByteSize: Integer; const ANumFormat: TResolvedDisplayFormatNum; PrintNil: Boolean): String;
|
||||||
|
|
||||||
@ -868,6 +893,7 @@ var
|
|||||||
PtrDeref, PtrDeref2: TWatchResultData;
|
PtrDeref, PtrDeref2: TWatchResultData;
|
||||||
Resolved: TResolvedDisplayFormat;
|
Resolved: TResolvedDisplayFormat;
|
||||||
n: Integer;
|
n: Integer;
|
||||||
|
StoredSettings: TWatchResStoredSettings;
|
||||||
begin
|
begin
|
||||||
inc(ANestLvl);
|
inc(ANestLvl);
|
||||||
if ANestLvl > MAX_ALLOWED_NEST_LVL then
|
if ANestLvl > MAX_ALLOWED_NEST_LVL then
|
||||||
@ -875,21 +901,23 @@ begin
|
|||||||
if AResValue = nil then
|
if AResValue = nil then
|
||||||
exit('???');
|
exit('???');
|
||||||
|
|
||||||
if not (FInValueFormatter or (rpfSkipValueFormatter in FFormatFlags)) then begin
|
if FCurrentValueFormatter <> nil then begin
|
||||||
FInValueFormatter := True;
|
StoreSetting(StoredSettings);
|
||||||
FInValFormNestLevel := ANestLvl;
|
// for the next IWatchResultPrinter.FormatValue call
|
||||||
|
FNextCallIsValueFormatter := True;
|
||||||
|
FInValFormNestLevel := ANestLvl;
|
||||||
|
FResValueInFormatter := AResValue;
|
||||||
|
//
|
||||||
try
|
try
|
||||||
if OnlyValueFormatter <> nil then begin
|
if FCurrentValueFormatter.FormatValue(AResValue, ADispFormat, ANestLvl, Self, Result) then
|
||||||
if OnlyValueFormatter.FormatValue(AResValue, ADispFormat, ANestLvl, Self, Result) then
|
|
||||||
exit;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if GlobalValueFormatterSelectorList.FormatValue(AResValue, ADispFormat, ANestLvl, Self, Result) then
|
|
||||||
exit;
|
exit;
|
||||||
finally
|
finally
|
||||||
FInValueFormatter := False;
|
FNextCallIsValueFormatter := False;
|
||||||
|
RestoreSetting(StoredSettings);
|
||||||
end;
|
end;
|
||||||
end;
|
end
|
||||||
|
else
|
||||||
|
FCurrentValueFormatter := FNextValueFormatter;
|
||||||
|
|
||||||
Result := '';
|
Result := '';
|
||||||
case AResValue.ValueKind of
|
case AResValue.ValueKind of
|
||||||
@ -1004,21 +1032,56 @@ end;
|
|||||||
function TWatchResultPrinter.PrintWatchValue(AResValue: TWatchResultData;
|
function TWatchResultPrinter.PrintWatchValue(AResValue: TWatchResultData;
|
||||||
const ADispFormat: TWatchDisplayFormat): String;
|
const ADispFormat: TWatchDisplayFormat): String;
|
||||||
begin
|
begin
|
||||||
|
FNextValueFormatter := nil;
|
||||||
|
if FOnlyValueFormatter <> nil then
|
||||||
|
FDefaultValueFormatter := FOnlyValueFormatter
|
||||||
|
else
|
||||||
|
FDefaultValueFormatter := GlobalValueFormatterSelectorList;
|
||||||
|
|
||||||
|
if rpfSkipValueFormatter in FormatFlags then
|
||||||
|
FCurrentValueFormatter := nil
|
||||||
|
else
|
||||||
|
FCurrentValueFormatter := FDefaultValueFormatter;
|
||||||
|
|
||||||
if rpfMultiLine in FFormatFlags then
|
if rpfMultiLine in FFormatFlags then
|
||||||
FLineSeparator := LineEnding
|
FLineSeparator := LineEnding
|
||||||
else
|
else
|
||||||
FLineSeparator := ' ';
|
FLineSeparator := ' ';
|
||||||
|
|
||||||
if FInValueFormatter then
|
Result := PrintWatchValueEx(AResValue, ADispFormat, -1);
|
||||||
Result := PrintWatchValueEx(AResValue, ADispFormat, FInValFormNestLevel) // This will increase it by one, compared to the value given to the formatter
|
|
||||||
else
|
|
||||||
Result := PrintWatchValueEx(AResValue, ADispFormat, -1);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TWatchResultPrinter.PrintWatchValue(AResValue: IWatchResultDataIntf;
|
function TWatchResultPrinter.PrintWatchValueIntf(AResValue: IWatchResultDataIntf;
|
||||||
const ADispFormat: TWatchDisplayFormat): String;
|
const ADispFormat: TWatchDisplayFormat; AFlags: TWatchResultPrinterFlags): String;
|
||||||
|
var
|
||||||
|
AResValObj: TWatchResultData;
|
||||||
|
IncLvl: Integer;
|
||||||
begin
|
begin
|
||||||
Result := PrintWatchValue(TWatchResultData(AResValue.GetInternalObject), ADispFormat);
|
AResValObj := TWatchResultData(AResValue.GetInternalObject);
|
||||||
|
FNextValueFormatter := nil;
|
||||||
|
if wpfUseDefaultValueFormatterList in AFlags then
|
||||||
|
FNextValueFormatter := FCurrentValueFormatter;
|
||||||
|
if wpfUseCurrentValueFormatterList in AFlags then
|
||||||
|
FNextValueFormatter := FDefaultValueFormatter;
|
||||||
|
|
||||||
|
FCurrentValueFormatter := nil;
|
||||||
|
|
||||||
|
IncLvl := 0;
|
||||||
|
if wpfResValueIsNestedValue in AFlags then begin
|
||||||
|
if AResValObj <> FResValueInFormatter then
|
||||||
|
FCurrentValueFormatter := FNextValueFormatter;
|
||||||
|
IncLvl := 1; // Incrementing the level protects against endless loop
|
||||||
|
end;
|
||||||
|
|
||||||
|
if FNextCallIsValueFormatter then begin
|
||||||
|
FNextCallIsValueFormatter := False;
|
||||||
|
Result := PrintWatchValueEx(AResValObj, ADispFormat, FInValFormNestLevel - 1 + IncLvl); // This will increase it by one, compared to the value given to the formatter
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
// TOOD: full init? Or Call PrintWatchValueEx ?
|
||||||
|
// TODO: inc level/count of iterations
|
||||||
|
Result := PrintWatchValueEx(AResValObj, ADispFormat, -1);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -1660,6 +1660,10 @@ msgctxt "idedebuggerstringconstants.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "idedebuggerstringconstants.regdlgbinary"
|
msgctxt "idedebuggerstringconstants.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1655,6 +1655,10 @@ msgctxt "idedebuggerstringconstants.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "idedebuggerstringconstants.regdlgbinary"
|
msgctxt "idedebuggerstringconstants.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1677,6 +1677,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Controls"
|
msgstr "Controls"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1707,6 +1707,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Sledování"
|
msgstr "Sledování"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1702,6 +1702,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Liste der überwachten Ausdrücke"
|
msgstr "Liste der überwachten Ausdrücke"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1712,6 +1712,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Lista de puntos de observación"
|
msgstr "Lista de puntos de observación"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1700,6 +1700,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Vahdit"
|
msgstr "Vahdit"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1707,6 +1707,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Suivis"
|
msgstr "Suivis"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1739,6 +1739,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "רשימת המשגיחים"
|
msgstr "רשימת המשגיחים"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1707,6 +1707,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Figyelt elemek"
|
msgstr "Figyelt elemek"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1684,6 +1684,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Daftar Pengawasan"
|
msgstr "Daftar Pengawasan"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1712,6 +1712,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Elenco delle viste di Watch"
|
msgstr "Elenco delle viste di Watch"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1710,6 +1710,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "監視リスト"
|
msgstr "監視リスト"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1710,6 +1710,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Stebimų sąrašas"
|
msgstr "Stebimų sąrašas"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1680,6 +1680,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Watches"
|
msgstr "Watches"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1723,6 +1723,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Czujki"
|
msgstr "Czujki"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1679,6 +1679,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1721,6 +1721,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Observadores"
|
msgstr "Observadores"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1692,6 +1692,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Наблюдения"
|
msgstr "Наблюдения"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1695,6 +1695,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Pozorovania"
|
msgstr "Pozorovania"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1702,6 +1702,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "İzlemeler"
|
msgstr "İzlemeler"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1700,6 +1700,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "Спостереження"
|
msgstr "Спостереження"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
@ -1698,6 +1698,10 @@ msgctxt "lazarusidestrconsts.liswlwatchlist"
|
|||||||
msgid "Watches"
|
msgid "Watches"
|
||||||
msgstr "监视(&W)"
|
msgstr "监视(&W)"
|
||||||
|
|
||||||
|
#: idedebuggerstringconstants.optdispguttercustomdisplayformat
|
||||||
|
msgid "Custom Displayformat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: idedebuggerstringconstants.regdlgbinary
|
#: idedebuggerstringconstants.regdlgbinary
|
||||||
msgctxt "lazarusidestrconsts.regdlgbinary"
|
msgctxt "lazarusidestrconsts.regdlgbinary"
|
||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
|
Loading…
Reference in New Issue
Block a user