diff --git a/components/education/eduoptions.pas b/components/education/eduoptions.pas index b9f06456bf..ce56f958a1 100644 --- a/components/education/eduoptions.pas +++ b/components/education/eduoptions.pas @@ -116,7 +116,7 @@ type property ChangeStep: integer read FChangeStep write SetChangeStep; end; - TEduOptions = class(TAbstractIDEOptions) + TEduOptions = class(TAbstractIDEEnvironmentOptions) private FEnabled: boolean; FFilename: string; @@ -129,6 +129,7 @@ type constructor Create; destructor Destroy; override; class function GetGroupCaption: string; override; + class function GetInstance: TAbstractIDEOptions; property Root: TEduOptionsNode read FRoot; function Load(Config: TConfigStorage): TModalResult; virtual; function Save(Config: TConfigStorage): TModalResult; virtual; @@ -321,6 +322,12 @@ begin Result:=EduRSEducation; end; +class function TEduOptions.GetInstance: TAbstractIDEOptions; +begin + Result := EducationOptions; +end; + + function TEduOptions.Load(Config: TConfigStorage): TModalResult; begin FEnabled:=Config.GetValue('Enabled',false); diff --git a/components/jcf2/Settings/JcfSettings.pas b/components/jcf2/Settings/JcfSettings.pas index fd3b14a6a9..1dcc5f5e03 100644 --- a/components/jcf2/Settings/JcfSettings.pas +++ b/components/jcf2/Settings/JcfSettings.pas @@ -46,7 +46,7 @@ type { TFormatSettings } - TFormatSettings = class(TAbstractIDEOptions) + TFormatSettings = class(TAbstractIDEEnvironmentOptions) private fcObfuscate: TSetObfuscate; fcClarify: TSetClarify; diff --git a/ide/basedebugmanager.pas b/ide/basedebugmanager.pas index c3bd37ba86..bcc9f8dcd4 100644 --- a/ide/basedebugmanager.pas +++ b/ide/basedebugmanager.pas @@ -57,7 +57,7 @@ type { TDebuggerOptions } - TDebuggerOptions = class(TAbstractIDEOptions) + TDebuggerOptions = class(TAbstractIDEEnvironmentOptions) public class function GetGroupCaption:string; override; class function GetInstance: TAbstractIDEOptions; override; diff --git a/ide/codeexplopts.pas b/ide/codeexplopts.pas index d6df6f3bd1..de6e31fe14 100644 --- a/ide/codeexplopts.pas +++ b/ide/codeexplopts.pas @@ -128,7 +128,7 @@ const type - TCodeExplorerOptions = class(TAbstractIDEOptions) + TCodeExplorerOptions = class(TAbstractIDEEnvironmentOptions) private FCategories: TCodeExplorerCategories; FChangeStep: integer; diff --git a/ide/codetoolsoptions.pas b/ide/codetoolsoptions.pas index c2726a5e23..1359ae1644 100644 --- a/ide/codetoolsoptions.pas +++ b/ide/codetoolsoptions.pas @@ -47,7 +47,7 @@ type { TCodeToolsOptions } - TCodeToolsOptions = class(TAbstractIDEOptions) + TCodeToolsOptions = class(TAbstractIDEEnvironmentOptions) private FClassHeaderComments: boolean; FClassImplementationComments: boolean; diff --git a/ide/editoroptions.pp b/ide/editoroptions.pp index 4e9dd899ae..987565e0f8 100644 --- a/ide/editoroptions.pp +++ b/ide/editoroptions.pp @@ -844,7 +844,7 @@ type { TEditorOptions - Editor Options object used to hold the editor options } - TEditorOptions = class(TAbstractIDEOptions) + TEditorOptions = class(TAbstractIDEEnvironmentOptions) private xmlconfig: TRttiXMLConfig; diff --git a/ide/environmentopts.pp b/ide/environmentopts.pp index 2b131889a7..ae9519b29d 100644 --- a/ide/environmentopts.pp +++ b/ide/environmentopts.pp @@ -137,13 +137,14 @@ const type { TEnvironmentOptions - class for storing environment options } - TEnvironmentOptions = class(TAbstractIDEOptions) + TEnvironmentOptions = class(TAbstractIDEEnvironmentOptions) private FFilename: string; FFileAge: longint; FFileHasChangedOnDisk: boolean; FIDESpeedButtonsVisible: boolean; FIDETitleStartsWithProject: boolean; + FOnChange: TNotifyEvent; FShowButtonGlyphs: TApplicationShowGlyphs; FShowMenuGlyphs: TApplicationShowGlyphs; FXMLCfg: TXMLConfig; @@ -771,6 +772,7 @@ end; procedure TEnvironmentOptions.DoAfterWrite; begin Save(False); + inherited DoAfterWrite; end; procedure TEnvironmentOptions.SetLazarusDefaultFilename; diff --git a/ide/helpoptions.pas b/ide/helpoptions.pas index 376538dfee..d50ee42614 100644 --- a/ide/helpoptions.pas +++ b/ide/helpoptions.pas @@ -43,7 +43,7 @@ uses type { THelpOptions } - THelpOptions = class(TAbstractIDEOptions) + THelpOptions = class(TAbstractIDEEnvironmentOptions) private FFilename: string; FFPCDocsHTMLDirectory: string; diff --git a/ide/ideoptionsdlg.pas b/ide/ideoptionsdlg.pas index 03be17065e..00ab7c3fe5 100644 --- a/ide/ideoptionsdlg.pas +++ b/ide/ideoptionsdlg.pas @@ -50,25 +50,32 @@ type private FOnLoadOptions: TOnLoadIDEOptions; FOnSaveOptions: TOnSaveIDEOptions; + FOptionsFilter: TAbstractIDEOptionsClass; PrevEditor: TAbstractIDEOptionsEditor; + FEditorToOpen: TAbstractIDEOptionsEditorClass; + FEditorsCreated: Boolean; function CheckValues: boolean; + procedure DoOpenEditor; procedure LoadIDEOptions(Sender: TObject; AOptions: TAbstractIDEOptions); procedure SaveIDEOptions(Sender: TObject; AOptions: TAbstractIDEOptions); procedure CreateEditors; function SearchEditorNode(AEditor: TAbstractIDEOptionsEditorClass): TTreeNode; - published - property OnLoadIDEOptions: TOnLoadIDEOptions read FOnLoadOptions write FOnLoadOptions; - property OnSaveIDEOptions: TOnSaveIDEOptions read FOnSaveOptions write FOnSaveOptions; + function PassesFilter(ARec: PIDEOptionsGroupRec): Boolean; public constructor Create(AOwner: TComponent); override; + function ShowModal: Integer; override; + procedure OpenEditor(AEditor: TAbstractIDEOptionsEditorClass); override; function FindEditor(AEditor: TAbstractIDEOptionsEditorClass): TAbstractIDEOptionsEditor; override; procedure ReadSettings(AOptions: TAbstractIDEOptions); procedure WriteSettings(AOptions: TAbstractIDEOptions); - procedure ReadAll; procedure WriteAll; + + property OptionsFilter: TAbstractIDEOptionsClass read FOptionsFilter write FOptionsFilter; + property OnLoadIDEOptions: TOnLoadIDEOptions read FOnLoadOptions write FOnLoadOptions; + property OnSaveIDEOptions: TOnSaveIDEOptions read FOnSaveOptions write FOnSaveOptions; end; implementation @@ -82,18 +89,14 @@ constructor TIDEOptionsDialog.Create(AOwner: TComponent); begin inherited Create(AOwner); PrevEditor := nil; + FEditorToOpen := nil; + FEditorsCreated := False; IDEDialogLayoutList.ApplyLayout(Self, Width, Height); Caption := dlgIDEOptions; - - CreateEditors; - ButtonPanel.OKButton.OnClick := @OKButtonClick; ButtonPanel.CancelButton.OnClick := @CancelButtonClick; ButtonPanel.HelpButton.OnClick := @HelpButtonClick; - - if CategoryTree.Items.Count > 0 then - CategoryTree.Selected := CategoryTree.Items.GetFirstNode; end; procedure TIDEOptionsDialog.HelpButtonClick(Sender: TObject); @@ -187,6 +190,7 @@ var end; begin + CreateEditors; if AOptions <> nil then ClassTypeForCompare := AOptions.ClassType else @@ -230,13 +234,19 @@ begin for i := 0 to IDEEditorGroups.Count - 1 do begin Rec := IDEEditorGroups[i]; + if not PassesFilter(Rec) then + Continue; if Rec^.Items <> nil then begin if Rec^.GroupClass <> nil then begin Instance := Rec^.GroupClass.GetInstance; if Instance <> nil then + begin + Instance.DoBeforeRead; ReadSettings(Instance); + Instance.DoAfterRead; + end; end; end; end; @@ -253,13 +263,19 @@ begin for i := 0 to IDEEditorGroups.Count - 1 do begin Rec := IDEEditorGroups[i]; + if not PassesFilter(Rec) then + Continue; if Rec^.Items <> nil then begin if Rec^.GroupClass <> nil then begin Instance := Rec^.GroupClass.GetInstance; if Instance <> nil then + begin + Instance.DoBeforeWrite; WriteSettings(Instance); + Instance.DoAfterWrite; + end; end; end; end; @@ -331,17 +347,22 @@ var Rec: PIDEOptionsGroupRec; ACaption: string; begin + if FEditorsCreated then + Exit; + FEditorsCreated := True; IDEEditorGroups.Resort; for i := 0 to IDEEditorGroups.Count - 1 do begin Rec := IDEEditorGroups[i]; + if not PassesFilter(Rec) then + Continue; if Rec^.Items <> nil then begin if Rec^.GroupClass<>nil then ACaption := Rec^.GroupClass.GetGroupCaption else - ACaption := format('g<%d>',[i]); + ACaption := format('Group<%d>',[i]); GroupNode := CategoryTree.Items.AddChild(nil, ACaption); for j := 0 to Rec^.Items.Count - 1 do begin @@ -392,15 +413,41 @@ begin Result := Traverse(CategoryTree.Items.GetFirstNode); end; -procedure TIDEOptionsDialog.OpenEditor(AEditor: TAbstractIDEOptionsEditorClass); +function TIDEOptionsDialog.PassesFilter(ARec: PIDEOptionsGroupRec): Boolean; +begin + if (ARec^.GroupClass = nil) and (OptionsFilter <> nil) then + Exit(False); + if (ARec^.GroupClass <> nil) and not ARec^.GroupClass.InheritsFrom(OptionsFilter) then + Exit(False); + Result := True; +end; + +procedure TIDEOptionsDialog.DoOpenEditor; var Node: TTreeNode; begin - Node := SearchEditorNode(AEditor); + if FEditorToOpen = nil then + Node := CategoryTree.Items.GetFirstNode + else + Node := SearchEditorNode(FEditorToOpen); if Node <> nil then CategoryTree.Selected := Node; end; +function TIDEOptionsDialog.ShowModal: Integer; +begin + CreateEditors; + DoOpenEditor; + Result := inherited ShowModal; +end; + +procedure TIDEOptionsDialog.OpenEditor(AEditor: TAbstractIDEOptionsEditorClass); +begin + FEditorToOpen := AEditor; + if Visible then + DoOpenEditor; +end; + function TIDEOptionsDialog.FindEditor(AEditor: TAbstractIDEOptionsEditorClass): TAbstractIDEOptionsEditor; var Node: TTreeNode; diff --git a/ide/main.pp b/ide/main.pp index aa2dbd930f..9e29e6d332 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -347,7 +347,16 @@ type // Environment options dialog events procedure OnLoadIDEOptions(Sender: TObject; AOptions: TAbstractIDEOptions); procedure OnSaveIDEOptions(Sender: TObject; AOptions: TAbstractIDEOptions); - procedure DoOpenIDEOptions(AEditor: TAbstractIDEOptionsEditorClass); override; + procedure DoOpenIDEOptions(AEditor: TAbstractIDEOptionsEditorClass; + AOptionsFilter: TAbstractIDEOptionsClass = nil); override; + + procedure DoEnvironmentOptionsBeforeRead(Sender: TObject); + procedure DoEnvironmentOptionsBeforeWrite(Sender: TObject); + procedure DoEnvironmentOptionsAfterWrite(Sender: TObject); + procedure DoEditorOptionsBeforeRead(Sender: TObject); + procedure DoEditorOptionsAfterWrite(Sender: TObject); + procedure DoCodetoolsOptionsAfterWrite(Sender: TObject); + procedure DoCodeExplorerOptionsAfterWrite(Sender: TObject); // SourceNotebook events procedure OnSrcNoteBookActivated(Sender: TObject); @@ -558,6 +567,7 @@ type FOIHelpProvider: TAbstractIDEHTMLProvider; FWaitForClose: Boolean; FFixingGlobalComponentLock: integer; + OldCompilerFilename, OldLanguage: String; procedure RenameInheritedMethods(AnUnitInfo: TUnitInfo; List: TStrings); function OIHelpProvider: TAbstractIDEHTMLProvider; @@ -1120,6 +1130,9 @@ begin EnvironmentOptions := TEnvironmentOptions.Create; with EnvironmentOptions do begin + OnBeforeRead := @DoEnvironmentOptionsBeforeRead; + OnBeforeWrite := @DoEnvironmentOptionsBeforeWrite; + OnAfterWrite := @DoEnvironmentOptionsAfterWrite; SetLazarusDefaultFilename; Load(false); if Application.HasOption('language') then @@ -1140,6 +1153,8 @@ begin UpdateDefaultPascalFileExtensions; EditorOpts := TEditorOptions.Create; + EditorOpts.OnBeforeRead := @DoEditorOptionsBeforeRead; + EditorOpts.OnAfterWrite := @DoEditorOptionsAfterWrite; SetupIDECommands; SetupIDEMsgQuickFixItems; EditorOpts.Load; @@ -1152,11 +1167,13 @@ begin CodeToolsOpts := TCodeToolsOptions.Create; with CodeToolsOpts do begin + OnAfterWrite := @DoCodetoolsOptionsAfterWrite; SetLazarusDefaultFilename; Load; end; CodeExplorerOptions := TCodeExplorerOptions.Create; + CodeExplorerOptions.OnAfterWrite := @DoCodeExplorerOptionsAfterWrite; CodeExplorerOptions.Load; MainBuildBoss.SetupInputHistories; @@ -4154,14 +4171,52 @@ begin SaveDesktopSettings(AOptions as TEnvironmentOptions); end; -procedure TMainIDE.DoOpenIDEOptions(AEditor: TAbstractIDEOptionsEditorClass); +procedure TMainIDE.DoOpenIDEOptions(AEditor: TAbstractIDEOptionsEditorClass; + AOptionsFilter: TAbstractIDEOptionsClass = nil); var IDEOptionsDialog: TIDEOptionsDialog; +begin + IDEOptionsDialog := TIDEOptionsDialog.Create(nil); + + try + if AOptionsFilter = nil then + if AEditor <> nil then + AOptionsFilter := AEditor.SupportedOptionsClass + else + AOptionsFilter := TAbstractIDEEnvironmentOptions; + IDEOptionsDialog.OptionsFilter := AOptionsFilter; + IDEOptionsDialog.OpenEditor(AEditor); + + with IDEOptionsDialog do + begin + OnLoadIDEOptions:=@Self.OnLoadIDEOptions; + OnSaveIDEOptions:=@Self.OnSaveIDEOptions; + ReadAll; + end; + if IDEOptionsDialog.ShowModal = mrOk then + IDEOptionsDialog.WriteAll; + finally + IDEOptionsDialog.Free; + end; +end; + +procedure TMainIDE.DoEnvironmentOptionsBeforeRead(Sender: TObject); +begin + // update EnvironmentOptions (save current window positions) + SaveDesktopSettings(EnvironmentOptions); +end; + +procedure TMainIDE.DoEnvironmentOptionsBeforeWrite(Sender: TObject); +begin + OldCompilerFilename:=EnvironmentOptions.CompilerFilename; + OldLanguage:=EnvironmentOptions.LanguageID; +end; + +procedure TMainIDE.DoEnvironmentOptionsAfterWrite(Sender: TObject); +var MacroValueChanged, FPCSrcDirChanged, FPCCompilerChanged, LazarusSrcDirChanged: boolean; - OldCompilerFilename: string; - OldLanguage: String; procedure ChangeMacroValue(const MacroName, NewValue: string); begin @@ -4208,87 +4263,65 @@ var EnvironmentOptions.ObjectInspectorOptions.AssignTo(ObjectInspector1); end; - procedure UpdateEditorOptions; - begin - Project1.UpdateAllSyntaxHighlighter; - SourceNotebook.ReloadEditorOptions; - ReloadMenuShortCuts; - end; - begin - IDEOptionsDialog := TIDEOptionsDialog.Create(nil); - - try - IDEOptionsDialog.OpenEditor(AEditor); - // update EnvironmentOptions (save current window positions) - SaveDesktopSettings(EnvironmentOptions); - // update editor options? - Project1.UpdateAllCustomHighlighter; - - with IDEOptionsDialog do - begin - OnLoadIDEOptions:=@Self.OnLoadIDEOptions; - OnSaveIDEOptions:=@Self.OnSaveIDEOptions; - ReadAll; - end; - if IDEOptionsDialog.ShowModal = mrOk then - begin - // invalidate cached substituted macros - IncreaseCompilerParseStamp; - - // load settings from IDEOptionsDialog to EnvironmentOptions - OldCompilerFilename:=EnvironmentOptions.CompilerFilename; - OldLanguage:=EnvironmentOptions.LanguageID; - IDEOptionsDialog.WriteAll; - CompileProgress.SetEnabled(EnvironmentOptions.ShowCompileDialog); - - UpdateDefaultPascalFileExtensions; - - if OldLanguage<>EnvironmentOptions.LanguageID then - begin - TranslateResourceStrings(EnvironmentOptions.LazarusDirectory, - EnvironmentOptions.LanguageID); - PkgBoss.TranslateResourceStrings; - end; - - // set global variables - UpdateEnglishErrorMsgFilename; - MacroValueChanged:=false; - FPCSrcDirChanged:=false; - FPCCompilerChanged:=OldCompilerFilename<>EnvironmentOptions.CompilerFilename; - LazarusSrcDirChanged:=false; - ChangeMacroValue('LazarusDir',EnvironmentOptions.LazarusDirectory); - ChangeMacroValue('FPCSrcDir',EnvironmentOptions.FPCSourceDirectory); - - if MacroValueChanged then CodeToolBoss.DefineTree.ClearCache; - if FPCCompilerChanged or FPCSrcDirChanged then - MainBuildBoss.RescanCompilerDefines(true, false); - - UpdateEditorOptions; - - CodeToolsOpts.AssignTo(CodeToolBoss); - // save to disk - IDEEditorGroups.DoAfterWrite; - - // update environment - UpdateDesigners; - UpdateObjectInspector; - SetupHints; - Application.ShowButtonGlyphs := EnvironmentOptions.ShowButtonGlyphs; - Application.ShowMenuGlyphs := EnvironmentOptions.ShowMenuGlyphs; - - // reload lazarus packages - if LazarusSrcDirChanged then - PkgBoss.LazarusSrcDirChanged; - - UpdateCaption; - - if CodeExplorerView<>nil then - CodeExplorerView.Refresh(true); - end; - finally - IDEOptionsDialog.Free; + // invalidate cached substituted macros + IncreaseCompilerParseStamp; + CompileProgress.SetEnabled(EnvironmentOptions.ShowCompileDialog); + UpdateDefaultPascalFileExtensions; + if OldLanguage <> EnvironmentOptions.LanguageID then + begin + TranslateResourceStrings(EnvironmentOptions.LazarusDirectory, + EnvironmentOptions.LanguageID); + PkgBoss.TranslateResourceStrings; end; + // set global variables + UpdateEnglishErrorMsgFilename; + MacroValueChanged:=false; + FPCSrcDirChanged:=false; + FPCCompilerChanged:=OldCompilerFilename<>EnvironmentOptions.CompilerFilename; + LazarusSrcDirChanged:=false; + ChangeMacroValue('LazarusDir',EnvironmentOptions.LazarusDirectory); + ChangeMacroValue('FPCSrcDir',EnvironmentOptions.FPCSourceDirectory); + + if MacroValueChanged then CodeToolBoss.DefineTree.ClearCache; + if FPCCompilerChanged or FPCSrcDirChanged then + MainBuildBoss.RescanCompilerDefines(true, false); + + // update environment + UpdateDesigners; + UpdateObjectInspector; + SetupHints; + Application.ShowButtonGlyphs := EnvironmentOptions.ShowButtonGlyphs; + Application.ShowMenuGlyphs := EnvironmentOptions.ShowMenuGlyphs; + + // reload lazarus packages + if LazarusSrcDirChanged then + PkgBoss.LazarusSrcDirChanged; + UpdateCaption; +end; + +procedure TMainIDE.DoEditorOptionsBeforeRead(Sender: TObject); +begin + // update editor options? + Project1.UpdateAllCustomHighlighter; +end; + +procedure TMainIDE.DoEditorOptionsAfterWrite(Sender: TObject); +begin + Project1.UpdateAllSyntaxHighlighter; + SourceNotebook.ReloadEditorOptions; + ReloadMenuShortCuts; +end; + +procedure TMainIDE.DoCodetoolsOptionsAfterWrite(Sender: TObject); +begin + CodeToolsOpts.AssignTo(CodeToolBoss); +end; + +procedure TMainIDE.DoCodeExplorerOptionsAfterWrite(Sender: TObject); +begin + if CodeExplorerView<>nil then + CodeExplorerView.Refresh(true); end; procedure TMainIDE.mnuEnvEditorOptionsClicked(Sender: TObject); diff --git a/ideintf/ideoptionsintf.pas b/ideintf/ideoptionsintf.pas index 9a5f23725f..e74d643439 100644 --- a/ideintf/ideoptionsintf.pas +++ b/ideintf/ideoptionsintf.pas @@ -39,13 +39,30 @@ type { TAbstractIDEOptions } TAbstractIDEOptions = class(TPersistent) + private + FOnAfterRead: TNotifyEvent; + FOnAfterWrite: TNotifyEvent; + FOnBeforeRead: TNotifyEvent; + FOnBeforeWrite: TNotifyEvent; public class function GetGroupCaption:string; virtual; abstract; class function GetInstance: TAbstractIDEOptions; virtual; abstract; + + procedure DoBeforeRead; virtual; + procedure DoAfterRead; virtual; + procedure DoBeforeWrite; virtual; procedure DoAfterWrite; virtual; + + 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; end; TAbstractIDEOptionsClass = class of TAbstractIDEOptions; + TAbstractIDEEnvironmentOptions = class(TAbstractIDEOptions); + TAbstractIDEProjectOptions = class(TAbstractIDEOptions); + TOnLoadIDEOptions = procedure(Sender: TObject; AOptions: TAbstractIDEOptions) of object; TOnSaveIDEOptions = procedure(Sender: TObject; AOptions: TAbstractIDEOptions) of object; @@ -417,9 +434,28 @@ end; { TAbstractIDEOptions } +procedure TAbstractIDEOptions.DoBeforeRead; +begin + if Assigned(FOnBeforeRead) then + OnBeforeRead(Self); +end; + +procedure TAbstractIDEOptions.DoAfterRead; +begin + if Assigned(FOnAfterRead) then + OnAfterRead(Self); +end; + +procedure TAbstractIDEOptions.DoBeforeWrite; +begin + if Assigned(FOnBeforeWrite) then + OnBeforeWrite(Self); +end; + procedure TAbstractIDEOptions.DoAfterWrite; begin - // nothing + if Assigned(FOnAfterWrite) then + OnAfterWrite(Self); end; initialization diff --git a/ideintf/lazideintf.pas b/ideintf/lazideintf.pas index 2a595826c1..371e3cb6be 100644 --- a/ideintf/lazideintf.pas +++ b/ideintf/lazideintf.pas @@ -215,7 +215,8 @@ type function GetPrimaryConfigPath: String; virtual; abstract; function GetSecondaryConfigPath: String; virtual; abstract; procedure CopySecondaryConfigFile(const AFilename: String); virtual; abstract; - procedure DoOpenIDEOptions(AEditor: TAbstractIDEOptionsEditorClass); virtual; abstract; + procedure DoOpenIDEOptions(AEditor: TAbstractIDEOptionsEditorClass; + AOptionsFilter: TAbstractIDEOptionsClass = nil); virtual; abstract; // filenames, paths function CreateNewUniqueFilename(const Prefix, Ext: string;