Debugger: "Value Converter Conf" in "Project Options"

This commit is contained in:
Martin 2022-08-28 20:57:03 +02:00
parent af214f8719
commit b41163de42
10 changed files with 155 additions and 35 deletions

View File

@ -219,7 +219,8 @@ const
ProjectOptionsI18N = 600;
ProjectOptionsMisc = 700;
ProjectOptionsDebug = 800;
DbgOptionsLanguageExceptions = 900;
DbgOptionsLanguageExceptions = 900;
ProjectOptionsDbgValueConvert = 1000;
GroupPackage = 200100;
PackageOptionsUsage = 100;

View File

@ -1859,6 +1859,8 @@ type
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure DoBackendConverterChanged; virtual; abstract;
end;
procedure RegisterDebugger(const ADebuggerClass: TDebuggerClass);

View File

@ -59,9 +59,9 @@ uses
EvaluateDlg, RegistersDlg, AssemblerDlg, DebugOutputForm, ExceptionDlg,
InspectDlg, DebugEventsForm, PseudoTerminalDlg, FeedbackDlg, ThreadDlg,
HistoryDlg, ProcessDebugger, IdeDebuggerBase, IdeDebuggerOpts,
DbgIntfBaseTypes, DbgIntfDebuggerBase, DbgIntfMiscClasses,
DbgIntfPseudoTerminal, LazDebuggerIntf, LazDebuggerIntfBaseTypes,
BaseDebugManager;
IdeDebuggerBackendValueConv, DbgIntfBaseTypes, DbgIntfDebuggerBase,
DbgIntfMiscClasses, DbgIntfPseudoTerminal, LazDebuggerIntf,
LazDebuggerIntfBaseTypes, BaseDebugManager;
type
@ -216,6 +216,7 @@ type
procedure DoRestoreDebuggerMarks(AnUnitInfo: TUnitInfo); override;
procedure ClearDebugOutputLog;
procedure ClearDebugEventsLog;
procedure DoBackendConverterChanged; override;
function RequiredCompilerOpts(ATargetCPU, ATargetOS: String
): TDebugCompilerRequirements; override;
@ -2371,6 +2372,22 @@ begin
FEventLogManager.ClearDebugEventsLog;
end;
procedure TDebugManager.DoBackendConverterChanged;
begin
ValueConverterSelectorList.Lock;
try
ValueConverterSelectorList.Clear;
if (Project1 <> nil) and (Project1.UseBackendConverterFromProject) then
Project1.BackendConverterConfig.AssignEnabledTo(ValueConverterSelectorList, True);
if (Project1 = nil) or (Project1.UseBackendConverterFromIDE) then
DebuggerOptions.BackendConverterConfig.AssignEnabledTo(ValueConverterSelectorList, True);
finally
ValueConverterSelectorList.Unlock;
end;
end;
function TDebugManager.RequiredCompilerOpts(ATargetCPU, ATargetOS: String
): TDebugCompilerRequirements;
begin

View File

@ -6657,6 +6657,11 @@ resourcestring
drsTheDebuggerBackendSelecti = 'The "Debugger Backend" selection from the '
+'dropdown (list of IDE debugger backends) is always stored in the session'
+'. The project specific backends (below) are by default stored in the LPI.';
drsStoreConverterConfigInSes = 'Store converter config in session';
drsThisOnlyAffectsTheListOfC = 'This only affects the list of converters '
+'below. The options which list to use are always stored in the session';
drsUseTheIDEGlobalListOfConv = 'Use the IDE-Global list of converters';
drsUseTheProjectListOfConver = 'Use the project list of converters';
implementation

View File

@ -134,6 +134,7 @@ uses
project_application_options, project_forms_options, project_lazdoc_options,
project_save_options, project_versioninfo_options, project_i18n_options,
project_misc_options, project_resources_options, project_debug_options,
project_valconv_options,
// project compiler option frames
compiler_path_options, compiler_config_target, compiler_parsing_options,
compiler_codegen_options, compiler_debugging_options, compiler_verbosity_options,
@ -1390,12 +1391,8 @@ begin
DebuggerOptions.PrimaryConfigPath := GetPrimaryConfigPath;
DebuggerOptions.CreateConfig;
DebuggerOptions.Load;
ValueConverterSelectorList.Lock;
try
DebuggerOptions.BackendConverterConfig.AssignEnabledTo(ValueConverterSelectorList);
finally
ValueConverterSelectorList.Unlock;
end;
if DebugBoss <> nil then
DebugBoss.DoBackendConverterChanged;
Assert(InputHistories = nil, 'TMainIDE.LoadGlobalOptions: InputHistories is already assigned.');
InputHistoriesSO := TInputHistoriesWithSearchOpt.Create;

View File

@ -6,7 +6,7 @@ interface
uses
SysUtils, Forms, Controls, IDEOptEditorIntf, IDEOptionsIntf,
IdeDebuggerStringConstants,
DbgIntfDebuggerBase, IdeDebuggerStringConstants,
IdeDbgValueConverterSettingsFrame, IdeDebuggerOpts,
IdeDebuggerBackendValueConv;
@ -25,7 +25,6 @@ type
procedure ReadSettings({%H-}AOptions: TAbstractIDEOptions); override;
procedure WriteSettings({%H-}AOptions: TAbstractIDEOptions); override;
class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
end;
procedure Register;
@ -76,12 +75,8 @@ begin
DebuggerOptions.BackendConverterConfig.Assign(FValConvList);
DebuggerOptions.BackendConverterConfig.Changed := True;
ValueConverterSelectorList.Lock;
try
DebuggerOptions.BackendConverterConfig.AssignEnabledTo(ValueConverterSelectorList);
finally
ValueConverterSelectorList.Unlock;
end;
if DebugBossManager <> nil then
DebugBossManager.DoBackendConverterChanged;
end;
end;

View File

@ -121,22 +121,22 @@ begin
pnlCurrentConv.Enabled := lstConverters.Count > 0;
FCurIdx := lstConverters.ItemIndex;
if FCurIdx >= FValConvList.Count then begin
if (FCurIdx >= FValConvList.Count) or (FCurIdx < 0) then begin
FCurIdx := -1;
FCurConvConf := nil;
lblDesc.Caption := '';
EdName.Text := '';
memoTypeNames.Text := '';
end
else
else begin
SetCurConv(FValConvList[FCurIdx]);
lblDesc.Caption := FCurConvConf.Converter.GetRegistryEntry.GetName;
EdName.Text := FCurConvConf.Name;
memoTypeNames.Text := FCurConvConf.MatchTypeNames.Text;
lblDesc.Caption := FCurConvConf.Converter.GetRegistryEntry.GetName;
EdName.Text := FCurConvConf.Name;
memoTypeNames.Text := FCurConvConf.MatchTypeNames.Text;
AvailClass := ValueConverterRegistry;
dropAction.ItemIndex := AvailClass.IndexOfConvertorClass(FCurConvConf.Converter.GetObject.ClassType);
AvailClass := ValueConverterRegistry;
dropAction.ItemIndex := AvailClass.IndexOfConvertorClass(FCurConvConf.Converter.GetObject.ClassType);
end;
lstConvertersItemClick(nil, FCurIdx);
end;
@ -270,7 +270,7 @@ begin
lblAction.Caption := dlgBackConvOptAction;
FCurConvConf := nil;
lblDesc.Caption := '-';
lblDesc.Caption := '';
dropAction.Clear;
AvailClass := ValueConverterRegistry;

View File

@ -71,8 +71,8 @@
<UnitName Value="IdeDebuggerStringConstants"/>
</Item>
<Item>
<Filename Value="idedebuggerfpdbgvalueconv.pas"/>
<UnitName Value="IdeDebuggerFpDbgValueConv"/>
<Filename Value="idedebuggerbackendvalueconv.pas"/>
<UnitName Value="IdeDebuggerBackendValueConv"/>
</Item>
<Item>
<Filename Value="idedbgvalueconvertersettingsframe.pas"/>

View File

@ -49,10 +49,12 @@ type
private
FLock: TLazMonitor;
FChanged: Boolean;
FOnChanged: TNotifyEvent;
function Count: Integer;
function Get(Index: Integer): TLazDbgValueConvertSelectorIntf;
function GetIdeItems(Index: Integer): TIdeDbgValueConvertSelector;
procedure PutIdeItems(Index: Integer; AValue: TIdeDbgValueConvertSelector);
procedure SetChanged(AValue: Boolean);
public
constructor Create;
destructor Destroy; override;
@ -61,7 +63,7 @@ type
procedure Lock;
procedure Unlock;
procedure AssignEnabledTo(ADest: TIdeDbgValueConvertSelectorList);
procedure AssignEnabledTo(ADest: TIdeDbgValueConvertSelectorList; AnAppend: Boolean = False);
procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
@ -69,7 +71,8 @@ type
function IdeItemByName(AName: String): TIdeDbgValueConvertSelector;
property IdeItems[Index: Integer]: TIdeDbgValueConvertSelector read GetIdeItems write PutIdeItems; default;
property Changed: Boolean read FChanged write FChanged;
property Changed: Boolean read FChanged write SetChanged;
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
end;
var
@ -183,6 +186,14 @@ begin
Items[Index] := AValue;
end;
procedure TIdeDbgValueConvertSelectorList.SetChanged(AValue: Boolean);
begin
if FChanged = AValue then Exit;
FChanged := AValue;
if FChanged and (FOnChanged <> nil) then
FOnChanged(Self);
end;
constructor TIdeDbgValueConvertSelectorList.Create;
begin
inherited Create(True);
@ -217,11 +228,13 @@ begin
end;
procedure TIdeDbgValueConvertSelectorList.AssignEnabledTo(
ADest: TIdeDbgValueConvertSelectorList);
ADest: TIdeDbgValueConvertSelectorList; AnAppend: Boolean);
var
i: Integer;
begin
ADest.Clear;
if not AnAppend then
ADest.Clear;
for i := 0 to Count - 1 do
if IdeItems[i].Enabled then
ADest.Add(Items[i].CreateCopy);

View File

@ -61,7 +61,7 @@ uses
CompOptsIntf, ProjectIntf, MacroIntf, MacroDefIntf, SrcEditorIntf,
IDEOptionsIntf, IDEOptEditorIntf, IDEDialogs, LazIDEIntf, PackageIntf,
// DebuggerIntf
DbgIntfDebuggerBase, IdeDebuggerOpts,
DbgIntfDebuggerBase, IdeDebuggerOpts, IdeDebuggerBackendValueConv,
// IDE
EnvironmentOpts,
CompOptsModes, ProjectResources, LazConf, ProjectIcon,
@ -730,6 +730,9 @@ type
FLastCompileComplete: boolean;
FMacroEngine: TTransferMacroList;
FOnLoadSafeCustomData: TLazLoadSaveCustomDataEvent;
FStoreBackendConverterConfigInSession: boolean;
FBackendConverterConfigWasFromSession, FBackendConverterConfigWasFromLPI: boolean;
FBackendConverterConfig: TIdeDbgValueConvertSelectorList;
FStoreDebuggerClassConfInSession: boolean;
FDebuggerClassConfWasFromSession, FDebuggerClassConfWasFromLPI: boolean;
FTmpAutoCreatedForms: TStrings; // temporary, used to apply auto create forms changes
@ -783,6 +786,8 @@ type
FOtherDefines: TStrings; // list of user selectable defines for custom options
FUpdateLock: integer;
FUseAsDefault: Boolean;
FUseBackendConverterFromIDE: boolean;
FUseBackendConverterFromProject: boolean;
// Variables used by ReadProject / WriteProject
FXMLConfig: TRttiXMLConfig;
FLoadAllOptions: Boolean; // All options / just options used as default for new projects
@ -814,7 +819,11 @@ type
procedure EmbeddedObjectModified(Sender: TObject);
function FileBackupHandler(const Filename: string): TModalResult;
procedure LoadSaveFilenameHandler(var AFilename: string; Load: boolean);
procedure OnBackendConverterConfigChanged(Sender: TObject);
procedure SetStoreBackendConverterConfigInSession(AValue: boolean);
procedure SetStoreDebuggerClassConfInSession(AValue: boolean);
procedure SetUseBackendConverterFromIDE(AValue: boolean);
procedure SetUseBackendConverterFromProject(AValue: boolean);
procedure UnitNameChangeHandler(AnUnitInfo: TUnitInfo;
const OldUnitName, NewUnitName: string;
CheckIfAllowed: boolean; var Allowed: boolean);
@ -1154,6 +1163,10 @@ type
procedure MarkDebuggerClassConfAsModified;
property StoreDebuggerClassConfInSession: boolean read FStoreDebuggerClassConfInSession write SetStoreDebuggerClassConfInSession;
property BackendConverterConfig: TIdeDbgValueConvertSelectorList read FBackendConverterConfig write FBackendConverterConfig;
property StoreBackendConverterConfigInSession: boolean read FStoreBackendConverterConfigInSession write SetStoreBackendConverterConfigInSession;
property UseBackendConverterFromIDE: boolean read FUseBackendConverterFromIDE write SetUseBackendConverterFromIDE;
property UseBackendConverterFromProject: boolean read FUseBackendConverterFromProject write SetUseBackendConverterFromProject;
end;
@ -2820,6 +2833,13 @@ begin
FHistoryLists := THistoryLists.Create;
FDebuggerProperties := TDebuggerPropertiesConfigList.Create;
FBackendConverterConfig := TIdeDbgValueConvertSelectorList.Create;
FBackendConverterConfig.OnChanged := @OnBackendConverterConfigChanged;
FUseBackendConverterFromIDE := True;
FUseBackendConverterFromProject := True;
if DebugBossManager <> nil then
DebugBossManager.DoBackendConverterChanged;
end;
{------------------------------------------------------------------------------
@ -2851,6 +2871,7 @@ begin
FreeThenNil(FHistoryLists);
FDebuggerProperties.ClearAll;
FreeAndNil(FDebuggerProperties);
FreeAndNil(FBackendConverterConfig);
inherited Destroy;
end;
@ -3069,6 +3090,12 @@ begin
FDebuggerClassConfWasFromLPI := True;
end;
FStoreBackendConverterConfigInSession := FXMLConfig.GetValue(Path+'Debugger/StoreBackendConverterConfigInSession/Value', False);
if not FStoreBackendConverterConfigInSession then begin
FBackendConverterConfig.LoadDataFromXMLConfig(FXMLConfig, Path+'Debugger/BackendConv/');
FBackendConverterConfigWasFromLPI := True;
end;
// This is for backward compatibility (only trunk 2.1 did use this / Can be removed in some time after 2.2 / but needs LoadFromSession to change default to '')
FDebuggerBackend := FXMLConfig.GetValue(Path+'Debugger/Backend/Value', '');
@ -3111,6 +3138,13 @@ begin
FDebuggerClassConfWasFromSession := True;
end;
FUseBackendConverterFromIDE := FXMLConfig.GetValue(Path+'Debugger/BackendConvOpts/UseBackendConverterFromIDE', True);
FUseBackendConverterFromProject := FXMLConfig.GetValue(Path+'Debugger/BackendConvOpts/UseBackendConverterFromProject', True);
if FStoreBackendConverterConfigInSession then begin
FBackendConverterConfig.LoadDataFromXMLConfig(FXMLConfig, Path+'Debugger/BackendConv/');
FBackendConverterConfigWasFromSession := True;
end;
// call hooks to read their info (e.g. DebugBoss)
if Assigned(OnLoadProjectInfo) then
@ -3281,6 +3315,10 @@ begin
FAllEditorsInfoList.SortByPageIndex;
end;
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TProject.ReadProject END');{$ENDIF}
if DebugBossManager <> nil then
DebugBossManager.DoBackendConverterChanged;
Result := mrOk;
end;
@ -3428,8 +3466,8 @@ begin
SaveUnits(Path,FSaveSessionInLPI);
FXMLConfig.DeletePath(Path+'Debugger/Backend'); // remove old value from trunk 2.1
FXMLConfig.SetDeleteValue(Path+'Debugger/StoreDebuggerClassConfInSession/Value', FStoreDebuggerClassConfInSession, False);
FXMLConfig.SetDeleteValue(Path+'Debugger/StoreDebuggerClassConfInSession/Value', FStoreDebuggerClassConfInSession, False);
if not FStoreDebuggerClassConfInSession then
FDebuggerProperties.SaveToXml(FXMLConfig, Path+'Debugger/ClassConfig/')
else
@ -3438,6 +3476,14 @@ begin
FDebuggerClassConfWasFromSession := False;
FDebuggerClassConfWasFromLPI := False;
FXMLConfig.SetDeleteValue(Path+'Debugger/StoreBackendConverterConfigInSession/Value', FStoreBackendConverterConfigInSession, False);
if not FStoreBackendConverterConfigInSession then
FBackendConverterConfig.SaveDataToXMLConfig(FXMLConfig, Path+'Debugger/BackendConv/')
else
if FBackendConverterConfigWasFromLPI then
FXMLConfig.DeletePath(Path+'Debugger/BackendConv');
FBackendConverterConfigWasFromSession := False;
FBackendConverterConfigWasFromLPI := False;
if FSaveSessionInLPI then begin
// save defines used for custom options
@ -3494,6 +3540,7 @@ begin
SaveUnits(Path,true);
FXMLConfig.SetDeleteValue(Path+'Debugger/Backend/Value', DebuggerBackend, '');
if FStoreDebuggerClassConfInSession then
FDebuggerProperties.SaveToXml(FXMLConfig, Path+'Debugger/ClassConfig/')
else
@ -3502,6 +3549,17 @@ begin
FDebuggerClassConfWasFromSession := False;
FDebuggerClassConfWasFromLPI := False;
FXMLConfig.SetDeleteValue(Path+'Debugger/BackendConvOpts/UseBackendConverterFromIDE', FUseBackendConverterFromIDE, True);
FXMLConfig.SetDeleteValue(Path+'Debugger/BackendConvOpts/UseBackendConverterFromProject', FUseBackendConverterFromProject, True);
if FStoreBackendConverterConfigInSession then
FBackendConverterConfig.SaveDataToXMLConfig(FXMLConfig, Path+'Debugger/BackendConv/')
else
if FBackendConverterConfigWasFromSession then
FXMLConfig.DeletePath(Path+'Debugger/BackendConv');
FBackendConverterConfigWasFromSession := False;
FBackendConverterConfigWasFromLPI := False;
// save defines used for custom options
SaveOtherDefines(Path);
// save session info
@ -3932,6 +3990,8 @@ begin
UpdateProjectDirectory;
FPublishOptions.Clear;
Title := '';
FUseBackendConverterFromIDE := True;
FUseBackendConverterFromProject := True;
Modified := false;
SessionModified := false;
@ -4617,6 +4677,22 @@ begin
//debugln('TProject.OnLoadSaveFilename END "',AFilename,'" FileWasAbsolute=',dbgs(FileWasAbsolute));
end;
procedure TProject.OnBackendConverterConfigChanged(Sender: TObject);
begin
if FStoreBackendConverterConfigInSession then
SessionModified := True
else
Modified := True;
end;
procedure TProject.SetStoreBackendConverterConfigInSession(AValue: boolean);
begin
if FStoreBackendConverterConfigInSession = AValue then Exit;
FStoreBackendConverterConfigInSession := AValue;
Modified := True;
SessionModified := True;
end;
procedure TProject.SetStoreDebuggerClassConfInSession(AValue: boolean);
begin
if FStoreDebuggerClassConfInSession = AValue then Exit;
@ -4625,6 +4701,20 @@ begin
SessionModified := True;
end;
procedure TProject.SetUseBackendConverterFromIDE(AValue: boolean);
begin
if FUseBackendConverterFromIDE = AValue then Exit;
FUseBackendConverterFromIDE := AValue;
SessionModified := True;
end;
procedure TProject.SetUseBackendConverterFromProject(AValue: boolean);
begin
if FUseBackendConverterFromProject = AValue then Exit;
FUseBackendConverterFromProject := AValue;
SessionModified := True;
end;
function TProject.RemoveProjectPathFromFilename(const AFilename: string): string;
var
ProjectPath:string;