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;