1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
{***************************************************************************
* *
* This unit is distributed under the LGPL version 2 *
* *
* Additionally this unit can be used under any newer version (3 or up) *
* of the LGPL *
* *
* Users are also granted the same "linking exception" as defined *
* for the LCL. *
* See the LCL license for details *
* *
* *
***************************************************************************
@author(Martin Friebe)
}
unit LazDebuggerValueConverter;
{$mode objfpc}{$H+}
{$INTERFACES CORBA}
interface
uses
Classes, SysUtils, fgl;
type
ILazDbgValueConverterIntf = interface;
TLazDbgValueConvertRegistryEntry = class;
TLazDbgValueConvertRegistryEntryClass = class of TLazDbgValueConvertRegistryEntry;
ILazDbgValueConverterSettingsFrameIntf = interface
['{0A2F548B-0621-4E2C-A94A-8DE5C3DF81B8}']
procedure ReadFrom(AConvertor: ILazDbgValueConverterIntf);
function WriteTo(AConvertor: ILazDbgValueConverterIntf): Boolean; // return TRUE, if anything changed
function GetFrame: TObject; // TFrame
procedure Free;
end;
ILazDbgValueConverterIntf = interface
['{FC054A2E-17D3-4616-9F68-20E1169C29E8}']
procedure AddReference;
procedure ReleaseReference;
function CreateCopy: ILazDbgValueConverterIntf;
function GetObject: TObject;
function GetRegistryEntry: TLazDbgValueConvertRegistryEntryClass;
function GetSettingsFrame: ILazDbgValueConverterSettingsFrameIntf;
end;
ILazDbgValueConvertSelectorIntf = interface
['{BEF1676E-0404-4F82-80BD-ABA4522A505E}']
procedure AddFreeNotification(ANotification: TNotifyEvent);
procedure RemoveFreeNotification(ANotification: TNotifyEvent);
function GetConverter: ILazDbgValueConverterIntf;
function AllowedTypeNames: TStrings;
end;
{ ILazDbgValueConvertSelectorListIntf }
(* List of currently configured instance / passed to debugger *)
ILazDbgValueConvertSelectorListIntf = interface
['{7004204B-14ED-4282-A150-81AF71D133E3}']
function Count: Integer;
function Get(Index: Integer): ILazDbgValueConvertSelectorIntf;
property Items[Index: Integer]: ILazDbgValueConvertSelectorIntf read Get; default;
procedure Lock;
procedure Unlock;
//function CreateCopy: ILazDbgValueConvertSelectorListIntf;
//procedure Assign(ASource: ILazDbgValueConvertSelectorListIntf);
//procedure Free;
end;
{ TLazDbgValueConvertRegistryEntry }
TLazDbgValueConvertRegistryEntry = class
public
class function CreateValueConvertorIntf: ILazDbgValueConverterIntf; virtual; abstract;
class function GetName: String; virtual; abstract;
class function GetConvertorClass: TClass; virtual; abstract; // Used as XML-NAME in XmlConfig
class function GetDebuggerClass: TClass; virtual; abstract; // class of TDebuggerIntf
end;
{ TLazDbgValueConvertRegistry }
TLazDbgValueConvertRegistry = class(specialize TFPGList<TLazDbgValueConvertRegistryEntryClass>)
function FindByConvertorClassName(AName: String): TLazDbgValueConvertRegistryEntryClass;
function IndexOfConvertorClass(AClass: TClass): integer;
end;
function ValueConverterRegistry: TLazDbgValueConvertRegistry;
var
ValueConverterConfigList: ILazDbgValueConvertSelectorListIntf;
implementation
var
TheValueConverterRegistry: TLazDbgValueConvertRegistry;
function ValueConverterRegistry: TLazDbgValueConvertRegistry;
begin
if TheValueConverterRegistry = nil then
TheValueConverterRegistry := TLazDbgValueConvertRegistry.Create;
Result := TheValueConverterRegistry;
end;
{ TLazDbgValueConvertRegistry }
function TLazDbgValueConvertRegistry.FindByConvertorClassName(AName: String
): TLazDbgValueConvertRegistryEntryClass;
var
i: Integer;
begin
Result := nil;
for i := 0 to Count -1 do
if Items[i].GetConvertorClass.ClassName = AName then
exit(Items[i]);
end;
function TLazDbgValueConvertRegistry.IndexOfConvertorClass(AClass: TClass
): integer;
begin
Result := Count - 1;
while Result >= 0 do begin
if Items[Result].GetConvertorClass = AClass then
exit;
dec(Result);
end;
end;
finalization
FreeAndNil(TheValueConverterRegistry);
end.
|