diff --git a/components/buildintf/ideoptionsintf.pas b/components/buildintf/ideoptionsintf.pas
index 8243615ae1..86aed7f5fb 100644
--- a/components/buildintf/ideoptionsintf.pas
+++ b/components/buildintf/ideoptionsintf.pas
@@ -219,7 +219,8 @@ const
ProjectOptionsI18N = 600;
ProjectOptionsMisc = 700;
ProjectOptionsDebug = 800;
- DbgOptionsLanguageExceptions = 900;
+ DbgOptionsLanguageExceptions = 900;
+ ProjectOptionsDbgValueConvert = 1000;
GroupPackage = 200100;
PackageOptionsUsage = 100;
diff --git a/components/debuggerintf/dbgintfdebuggerbase.pp b/components/debuggerintf/dbgintfdebuggerbase.pp
index b2f5ad4762..e68cba7b59 100644
--- a/components/debuggerintf/dbgintfdebuggerbase.pp
+++ b/components/debuggerintf/dbgintfdebuggerbase.pp
@@ -1859,6 +1859,8 @@ type
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
+
+ procedure DoBackendConverterChanged; virtual; abstract;
end;
procedure RegisterDebugger(const ADebuggerClass: TDebuggerClass);
diff --git a/ide/debugmanager.pas b/ide/debugmanager.pas
index a6a4b70dee..0bbb49d946 100644
--- a/ide/debugmanager.pas
+++ b/ide/debugmanager.pas
@@ -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
diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas
index a9d3a4a5ae..4792f60acf 100644
--- a/ide/lazarusidestrconsts.pas
+++ b/ide/lazarusidestrconsts.pas
@@ -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
diff --git a/ide/main.pp b/ide/main.pp
index 11b449a9ab..b056520c03 100644
--- a/ide/main.pp
+++ b/ide/main.pp
@@ -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;
diff --git a/ide/packages/idedebugger/frames/idedebugger_valconv_options.pas b/ide/packages/idedebugger/frames/idedebugger_valconv_options.pas
index f32e962ab2..49706a96a0 100644
--- a/ide/packages/idedebugger/frames/idedebugger_valconv_options.pas
+++ b/ide/packages/idedebugger/frames/idedebugger_valconv_options.pas
@@ -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;
diff --git a/ide/packages/idedebugger/idedbgvalueconvertersettingsframe.pas b/ide/packages/idedebugger/idedbgvalueconvertersettingsframe.pas
index 17c8b25963..32d47fb496 100644
--- a/ide/packages/idedebugger/idedbgvalueconvertersettingsframe.pas
+++ b/ide/packages/idedebugger/idedbgvalueconvertersettingsframe.pas
@@ -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;
diff --git a/ide/packages/idedebugger/idedebugger.lpk b/ide/packages/idedebugger/idedebugger.lpk
index 98d7a64b1e..0a99fdfb1d 100644
--- a/ide/packages/idedebugger/idedebugger.lpk
+++ b/ide/packages/idedebugger/idedebugger.lpk
@@ -71,8 +71,8 @@
-
-
-
+
+
-
diff --git a/ide/packages/idedebugger/idedebuggerbackendvalueconv.pas b/ide/packages/idedebugger/idedebuggerbackendvalueconv.pas
index d934262932..4a6e086fb4 100644
--- a/ide/packages/idedebugger/idedebuggerbackendvalueconv.pas
+++ b/ide/packages/idedebugger/idedebuggerbackendvalueconv.pas
@@ -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);
diff --git a/ide/project.pp b/ide/project.pp
index 414c3b7939..bcfd024f40 100644
--- a/ide/project.pp
+++ b/ide/project.pp
@@ -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;