diff --git a/ide/codeexplopts.pas b/ide/codeexplopts.pas index de6e31fe14..0464d14330 100644 --- a/ide/codeexplopts.pas +++ b/ide/codeexplopts.pas @@ -155,7 +155,7 @@ type public class function GetGroupCaption:string; override; class function GetInstance: TAbstractIDEOptions; override; - procedure DoAfterWrite; override; + procedure DoAfterWrite(Restore: boolean); override; public constructor Create; destructor Destroy; override; @@ -414,9 +414,10 @@ begin Result := CodeExplorerOptions; end; -procedure TCodeExplorerOptions.DoAfterWrite; +procedure TCodeExplorerOptions.DoAfterWrite(Restore: boolean); begin - Save; + if not Restore then + Save; end; procedure TCodeExplorerOptions.Clear; diff --git a/ide/codetoolsoptions.pas b/ide/codetoolsoptions.pas index b1679c6cf6..6321d894e4 100644 --- a/ide/codetoolsoptions.pas +++ b/ide/codetoolsoptions.pas @@ -104,7 +104,7 @@ type public class function GetGroupCaption:string; override; class function GetInstance: TAbstractIDEOptions; override; - procedure DoAfterWrite; override; + procedure DoAfterWrite(Restore: boolean); override; public constructor Create; destructor Destroy; override; @@ -317,10 +317,11 @@ begin Result := CodeToolsOpts; end; -procedure TCodeToolsOptions.DoAfterWrite; +procedure TCodeToolsOptions.DoAfterWrite(Restore: boolean); begin - inherited DoAfterWrite; - Save; + inherited DoAfterWrite(Restore); + if not Restore then + Save; end; procedure TCodeToolsOptions.Load; diff --git a/ide/compileroptions.pp b/ide/compileroptions.pp index 50f6cf76c6..bc65ded7f3 100644 --- a/ide/compileroptions.pp +++ b/ide/compileroptions.pp @@ -91,7 +91,8 @@ - history - refactor compiler options (default options, load, save to file) - disabled project compiler options, used only for storage - - replaced OwnerProject with LazProject + - replaced project compiler options OwnerProject+Project with LazProject + - addded changestamp, assign, equals to compiler options - added buildmodes to project - moved compileroptions and macrovalues to active buildmode diff --git a/ide/compoptsmodes.pas b/ide/compoptsmodes.pas index edf5552c35..4a4d79ec81 100644 --- a/ide/compoptsmodes.pas +++ b/ide/compoptsmodes.pas @@ -45,7 +45,7 @@ uses type { TCompilerDiffTool - A tool to create the difference between two option sets } + A tool to collect the difference between two option sets } TCompilerDiffTool = class private diff --git a/ide/editoroptions.pp b/ide/editoroptions.pp index a82acab76f..1a1a42022a 100644 --- a/ide/editoroptions.pp +++ b/ide/editoroptions.pp @@ -1009,7 +1009,7 @@ type public class function GetGroupCaption:string; override; class function GetInstance: TAbstractIDEOptions; override; - procedure DoAfterWrite; override; + procedure DoAfterWrite(Restore: boolean); override; public constructor Create; constructor CreateDefaultOnly; @@ -3709,9 +3709,10 @@ begin Result := EditorOpts; end; -procedure TEditorOptions.DoAfterWrite; +procedure TEditorOptions.DoAfterWrite(Restore: boolean); begin - Save; + if not Restore then + Save; end; function TEditorOptions.GetSynEditOptionName(SynOption: TSynEditorOption): string; diff --git a/ide/environmentopts.pp b/ide/environmentopts.pp index 2ddda23b3b..6965b9dc3e 100644 --- a/ide/environmentopts.pp +++ b/ide/environmentopts.pp @@ -286,7 +286,7 @@ type public class function GetGroupCaption:string; override; class function GetInstance: TAbstractIDEOptions; override; - procedure DoAfterWrite; override; + procedure DoAfterWrite(Restore: boolean); override; public constructor Create; destructor Destroy; override; @@ -797,10 +797,11 @@ begin Result := EnvironmentOptions; end; -procedure TEnvironmentOptions.DoAfterWrite; +procedure TEnvironmentOptions.DoAfterWrite(Restore: boolean); begin - Save(False); - inherited DoAfterWrite; + if not Restore then + Save(False); + inherited DoAfterWrite(Restore); end; procedure TEnvironmentOptions.SetLazarusDefaultFilename; diff --git a/ide/frames/buildmodeseditor.pas b/ide/frames/buildmodeseditor.pas index 1d96724166..71871b2faf 100644 --- a/ide/frames/buildmodeseditor.pas +++ b/ide/frames/buildmodeseditor.pas @@ -20,7 +20,7 @@ Abstract: The frame for 'build modes' on the compiler options. - Allows to edit build modes and build macro values. + Allows to add/delete/edit build modes and build macro values. It does not allow to define new build macros, only values. ToDo: diff --git a/ide/helpoptions.pas b/ide/helpoptions.pas index f686f46ed6..18acd8dc31 100644 --- a/ide/helpoptions.pas +++ b/ide/helpoptions.pas @@ -54,7 +54,7 @@ type public class function GetGroupCaption:string; override; class function GetInstance: TAbstractIDEOptions; override; - procedure DoAfterWrite; override; + procedure DoAfterWrite(Restore: boolean); override; public constructor Create; procedure Clear; @@ -110,9 +110,10 @@ begin Result := HelpOpts; end; -procedure THelpOptions.DoAfterWrite; +procedure THelpOptions.DoAfterWrite(Restore: boolean); begin - Save; + if not Restore then + Save; end; procedure THelpOptions.Clear; diff --git a/ide/ideoptionsdlg.pas b/ide/ideoptionsdlg.pas index cc132adc76..d3a39d74a1 100644 --- a/ide/ideoptionsdlg.pas +++ b/ide/ideoptionsdlg.pas @@ -85,7 +85,7 @@ type function FindEditorClass(GroupIndex, AIndex: integer): TAbstractIDEOptionsEditorClass; override; procedure TraverseSettings(AOptions: TAbstractIDEOptions; anAction: TIDEOptsDlgAction); procedure ReadAll; - procedure WriteAll; + procedure WriteAll(Restore: boolean); property OptionsFilter: TAbstractIDEOptionsClass read FOptionsFilter write FOptionsFilter; property OnLoadIDEOptions: TOnLoadIDEOptions read FOnLoadOptions write FOnLoadOptions; @@ -277,7 +277,7 @@ begin InstanceList.Free; end; -procedure TIDEOptionsDialog.WriteAll; +procedure TIDEOptionsDialog.WriteAll(Restore: boolean); var i: integer; Rec: PIDEOptionsGroupRec; @@ -295,9 +295,12 @@ begin Instance := Rec^.GroupClass.GetInstance; if Instance <> nil then begin - Instance.DoBeforeWrite; - TraverseSettings(Instance,iodaWrite); - Instance.DoAfterWrite; + Instance.DoBeforeWrite(Restore); + if Restore then + TraverseSettings(Instance,iodaWrite) + else + TraverseSettings(Instance,iodaRestore); + Instance.DoAfterWrite(Restore); end; end; end; diff --git a/ide/main.pp b/ide/main.pp index 9756f60f12..d6ad32cd95 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -366,16 +366,16 @@ type AOptionsFilter: TAbstractIDEOptionsClass = nil); override; procedure DoEnvironmentOptionsBeforeRead(Sender: TObject); - procedure DoEnvironmentOptionsBeforeWrite(Sender: TObject); - procedure DoEnvironmentOptionsAfterWrite(Sender: TObject); + procedure DoEnvironmentOptionsBeforeWrite(Sender: TObject; Restore: boolean); + procedure DoEnvironmentOptionsAfterWrite(Sender: TObject; Restore: boolean); procedure DoEditorOptionsBeforeRead(Sender: TObject); - procedure DoEditorOptionsAfterWrite(Sender: TObject); - procedure DoCodetoolsOptionsAfterWrite(Sender: TObject); - procedure DoCodeExplorerOptionsAfterWrite(Sender: TObject); + procedure DoEditorOptionsAfterWrite(Sender: TObject; Restore: boolean); + procedure DoCodetoolsOptionsAfterWrite(Sender: TObject; Restore: boolean); + procedure DoCodeExplorerOptionsAfterWrite(Sender: TObject; Restore: boolean); procedure DoProjectOptionsBeforeRead(Sender: TObject); - procedure DoProjectOptionsAfterWrite(Sender: TObject); - procedure DoCompilerOptionsBeforeWrite(Sender: TObject); - procedure DoCompilerOptionsAfterWrite(Sender: TObject); + procedure DoProjectOptionsAfterWrite(Sender: TObject; Restore: boolean); + procedure DoCompilerOptionsBeforeWrite(Sender: TObject; Restore: boolean); + procedure DoCompilerOptionsAfterWrite(Sender: TObject; Restore: boolean); // SourceNotebook events procedure OnSrcNoteBookActivated(Sender: TObject); @@ -4294,7 +4294,7 @@ begin ReadAll; end; if IDEOptionsDialog.ShowModal = mrOk then begin - IDEOptionsDialog.WriteAll; + IDEOptionsDialog.WriteAll(false); MainBuildBoss.SetBuildTarget(Project1.CompilerOptions.TargetOS, Project1.CompilerOptions.TargetCPU,Project1.CompilerOptions.LCLWidgetType); UpdateHighlighters(True); @@ -4303,6 +4303,8 @@ begin Application.TaskBarBehavior := tbSingleButton else Application.TaskBarBehavior := tbDefault; + end else begin + IDEOptionsDialog.WriteAll(true); end; finally IDEOptionsDialog.Free; @@ -4315,13 +4317,16 @@ begin SaveDesktopSettings(EnvironmentOptions); end; -procedure TMainIDE.DoEnvironmentOptionsBeforeWrite(Sender: TObject); +procedure TMainIDE.DoEnvironmentOptionsBeforeWrite(Sender: TObject; + Restore: boolean); begin + if Restore then exit; OldCompilerFilename:=EnvironmentOptions.CompilerFilename; OldLanguage:=EnvironmentOptions.LanguageID; end; -procedure TMainIDE.DoEnvironmentOptionsAfterWrite(Sender: TObject); +procedure TMainIDE.DoEnvironmentOptionsAfterWrite(Sender: TObject; + Restore: boolean); var MacroValueChanged, FPCSrcDirChanged, FPCCompilerChanged, @@ -4373,6 +4378,7 @@ var end; begin + if Restore then exit; // invalidate cached substituted macros IncreaseCompilerParseStamp; CompileProgress.SetEnabled(EnvironmentOptions.ShowCompileDialog); @@ -4416,21 +4422,25 @@ begin Project1.UpdateAllCustomHighlighter; end; -procedure TMainIDE.DoEditorOptionsAfterWrite(Sender: TObject); +procedure TMainIDE.DoEditorOptionsAfterWrite(Sender: TObject; Restore: boolean); begin + if Restore then exit; Project1.UpdateAllSyntaxHighlighter; UpdateHighlighters(True); SourceEditorManager.ReloadEditorOptions; ReloadMenuShortCuts; end; -procedure TMainIDE.DoCodetoolsOptionsAfterWrite(Sender: TObject); +procedure TMainIDE.DoCodetoolsOptionsAfterWrite(Sender: TObject; Restore: boolean); begin + if Restore then exit; CodeToolsOpts.AssignTo(CodeToolBoss); end; -procedure TMainIDE.DoCodeExplorerOptionsAfterWrite(Sender: TObject); +procedure TMainIDE.DoCodeExplorerOptionsAfterWrite(Sender: TObject; + Restore: boolean); begin + if Restore then exit; if CodeExplorerView<>nil then CodeExplorerView.Refresh(true); end; @@ -4448,7 +4458,8 @@ begin end; end; -procedure TMainIDE.DoProjectOptionsAfterWrite(Sender: TObject); +procedure TMainIDE.DoProjectOptionsAfterWrite(Sender: TObject; Restore: boolean + ); var Project: TProject absolute Sender; @@ -4534,6 +4545,7 @@ var end; begin + if Restore then exit; SetTitle; SetAutoCreateForms; // extend include path @@ -4547,17 +4559,21 @@ begin Project.DefineTemplates.AllChanged; end; -procedure TMainIDE.DoCompilerOptionsBeforeWrite(Sender: TObject); +procedure TMainIDE.DoCompilerOptionsBeforeWrite(Sender: TObject; + Restore: boolean); begin + if Restore then exit; OldCompOpts := TBaseCompilerOptionsClass(Sender.ClassType).Create(nil); OldCompOpts.Assign(TBaseCompilerOptions(Sender)); end; -procedure TMainIDE.DoCompilerOptionsAfterWrite(Sender: TObject); +procedure TMainIDE.DoCompilerOptionsAfterWrite(Sender: TObject; Restore: boolean + ); var ProjCompOpts: TProjectCompilerOptions; aFilename: String; begin + if Restore then exit; if not OldCompOpts.IsEqual(TBaseCompilerOptions(Sender)) then begin TBaseCompilerOptions(Sender).Modified := True; diff --git a/ide/msgquickfixes.pas b/ide/msgquickfixes.pas index bca78c2b0f..075e5d0f04 100644 --- a/ide/msgquickfixes.pas +++ b/ide/msgquickfixes.pas @@ -22,6 +22,13 @@ Abstract: Defines the standard message Quick Fix menu items. + + ToDo: + - There is no method in an ancestor class to be overriden: + 1. option: if the ancestor has a function with the same name: update the parameter list + 2. option: remove the method + 3. option: add a virtual method to the ancestor + } unit MsgQuickFixes; diff --git a/ideintf/ideoptionsintf.pas b/ideintf/ideoptionsintf.pas index 6f64e8b9bf..ea990c8892 100644 --- a/ideintf/ideoptionsintf.pas +++ b/ideintf/ideoptionsintf.pas @@ -25,7 +25,7 @@ unit IDEOptionsIntf; interface uses - Classes, SysUtils, Controls, Buttons, Forms; + Classes, SysUtils, LCLProc, Controls, Buttons, Forms; const NoParent = -1; @@ -36,27 +36,50 @@ type // types + TIDEOptionsHandler = ( + iohBeforeRead, + iohAfterRead, + iohBeforeWrite, + iohAfterWrite + ); + TIDEOptionsHandlers = set of TIDEOptionsHandler; + + TIDEOptionsWriteEvent = procedure(Sender: TObject; Restore: boolean) of object; + { TAbstractIDEOptions } TAbstractIDEOptions = class(TPersistent) private + fHandlers: array[TIDEOptionsHandler] of TMethodList; FOnAfterRead: TNotifyEvent; - FOnAfterWrite: TNotifyEvent; + FOnAfterWrite: TIDEOptionsWriteEvent; FOnBeforeRead: TNotifyEvent; - FOnBeforeWrite: TNotifyEvent; + FOnBeforeWrite: TIDEOptionsWriteEvent; public + constructor Create; + destructor Destroy; override; + class function GetGroupCaption: string; virtual; abstract; class function GetInstance: TAbstractIDEOptions; virtual; abstract; procedure DoBeforeRead; virtual; procedure DoAfterRead; virtual; - procedure DoBeforeWrite; virtual; - procedure DoAfterWrite; virtual; + procedure DoBeforeWrite(Restore: boolean); virtual; + procedure DoAfterWrite(Restore: boolean); virtual; + + procedure AddHandlerBeforeRead(const Handler: TNotifyEvent; const AsFirst: boolean = true); // AsFirst means: first to call + procedure RemoveHandlerBeforeRead(const Handler: TNotifyEvent); + procedure AddHandlerAfterRead(const Handler: TNotifyEvent; const AsFirst: boolean = true); // AsFirst means: first to call + procedure RemoveHandlerAfterRead(const Handler: TNotifyEvent); + procedure AddHandlerBeforeWrite(const Handler: TIDEOptionsWriteEvent; const AsFirst: boolean = true); // AsFirst means: first to call + procedure RemoveHandlerBeforeWrite(const Handler: TIDEOptionsWriteEvent); + procedure AddHandlerAfterWrite(const Handler: TIDEOptionsWriteEvent; const AsFirst: boolean = true); // AsFirst means: first to call + procedure RemoveHandlerAfterWrite(const Handler: TIDEOptionsWriteEvent); property OnBeforeRead: TNotifyEvent read FOnBeforeRead write FOnBeforeRead; property OnAfterRead: TNotifyEvent read FOnAfterRead write FOnAfterRead; - property OnBeforeWrite: TNotifyEvent read FOnBeforeWrite write FOnBeforeWrite; - property OnAfterWrite: TNotifyEvent read FOnAfterWrite write FOnAfterWrite; + property OnBeforeWrite: TIDEOptionsWriteEvent read FOnBeforeWrite write FOnBeforeWrite; + property OnAfterWrite: TIDEOptionsWriteEvent read FOnAfterWrite write FOnAfterWrite; end; TAbstractIDEOptionsClass = class of TAbstractIDEOptions; @@ -139,7 +162,7 @@ type procedure Notify(Ptr: Pointer; Action: TListNotification); override; public procedure Resort; - procedure DoAfterWrite; + procedure DoAfterWrite(Restore: boolean); function GetByIndex(AIndex: Integer): PIDEOptionsGroupRec; function GetByGroupClass(AGroupClass: TAbstractIDEOptionsClass): PIDEOptionsGroupRec; function Add(AGroupIndex: Integer; AGroupClass: TAbstractIDEOptionsClass): PIDEOptionsGroupRec; reintroduce; @@ -470,7 +493,7 @@ begin Items[i]^.Items.Resort; end; -procedure TIDEOptionsGroupList.DoAfterWrite; +procedure TIDEOptionsGroupList.DoAfterWrite(Restore: boolean); var i: integer; Rec: PIDEOptionsGroupRec; @@ -485,7 +508,7 @@ begin begin Instance := Rec^.GroupClass.GetInstance; if Instance <> nil then - Instance.DoAfterWrite; + Instance.DoAfterWrite(Restore); end; end; end; @@ -510,28 +533,105 @@ end; { TAbstractIDEOptions } +constructor TAbstractIDEOptions.Create; +var + h: TIDEOptionsHandler; +begin + for h:=low(TIDEOptionsHandler) to high(TIDEOptionsHandler) do + fHandlers[h]:=TMethodList.Create; +end; + +destructor TAbstractIDEOptions.Destroy; +var + h: TIDEOptionsHandler; +begin + for h:=low(TIDEOptionsHandler) to high(TIDEOptionsHandler) do + FreeAndNil(fHandlers[h]); + inherited Destroy; +end; + procedure TAbstractIDEOptions.DoBeforeRead; begin if Assigned(FOnBeforeRead) then - OnBeforeRead(Self); + FOnBeforeRead(Self); + fHandlers[iohBeforeRead].CallNotifyEvents(Self); end; procedure TAbstractIDEOptions.DoAfterRead; begin if Assigned(FOnAfterRead) then - OnAfterRead(Self); + FOnAfterRead(Self); + fHandlers[iohAfterRead].CallNotifyEvents(Self); end; -procedure TAbstractIDEOptions.DoBeforeWrite; +procedure TAbstractIDEOptions.DoBeforeWrite(Restore: boolean); +var + i: LongInt; begin if Assigned(FOnBeforeWrite) then - OnBeforeWrite(Self); + FOnBeforeWrite(Self,Restore); + i:=fHandlers[iohBeforeWrite].Count; + while fHandlers[iohBeforeWrite].NextDownIndex(i) do + TIDEOptionsWriteEvent(fHandlers[iohBeforeWrite][i])(Self,Restore); end; -procedure TAbstractIDEOptions.DoAfterWrite; +procedure TAbstractIDEOptions.DoAfterWrite(Restore: boolean); +var + i: LongInt; begin if Assigned(FOnAfterWrite) then - OnAfterWrite(Self); + FOnAfterWrite(Self,Restore); + i:=fHandlers[iohBeforeWrite].Count; + while fHandlers[iohBeforeWrite].NextDownIndex(i) do + TIDEOptionsWriteEvent(fHandlers[iohBeforeWrite][i])(Self,Restore); +end; + +procedure TAbstractIDEOptions.AddHandlerBeforeRead(const Handler: TNotifyEvent; + const AsFirst: boolean); +begin + fHandlers[iohBeforeRead].Add(TMethod(Handler),AsFirst); +end; + +procedure TAbstractIDEOptions.RemoveHandlerBeforeRead( + const Handler: TNotifyEvent); +begin + fHandlers[iohBeforeRead].Remove(TMethod(Handler)); +end; + +procedure TAbstractIDEOptions.AddHandlerAfterRead(const Handler: TNotifyEvent; + const AsFirst: boolean); +begin + fHandlers[iohAfterRead].Add(TMethod(Handler),AsFirst); +end; + +procedure TAbstractIDEOptions.RemoveHandlerAfterRead(const Handler: TNotifyEvent + ); +begin + fHandlers[iohAfterRead].Remove(TMethod(Handler)); +end; + +procedure TAbstractIDEOptions.AddHandlerBeforeWrite( + const Handler: TIDEOptionsWriteEvent; const AsFirst: boolean); +begin + fHandlers[iohBeforeWrite].Add(TMethod(Handler),AsFirst); +end; + +procedure TAbstractIDEOptions.RemoveHandlerBeforeWrite( + const Handler: TIDEOptionsWriteEvent); +begin + fHandlers[iohBeforeWrite].Remove(TMethod(Handler)); +end; + +procedure TAbstractIDEOptions.AddHandlerAfterWrite( + const Handler: TIDEOptionsWriteEvent; const AsFirst: boolean); +begin + fHandlers[iohAfterWrite].Add(TMethod(Handler),AsFirst); +end; + +procedure TAbstractIDEOptions.RemoveHandlerAfterWrite( + const Handler: TIDEOptionsWriteEvent); +begin + fHandlers[iohAfterWrite].Remove(TMethod(Handler)); end; initialization