ideintf, ide, components: IDE options:

- introduce 2 new abstract options classes: TAbstractIDEEnvironmentOptions and TAbstractIDEProjectOptions
  - derive all current options classes from TAbstractIDEEnvironmentOptions
  - fix broken previously education options
  - move away actions triggered by reading / saving of predefined IDE options (like TEnvironmentOption, TIDEOptions, ...) from DoOpenIDEOptions to new read/write event handlers
  - allow filtering of options showed in IDE options dialog by some options class
  - use options filtering when show Object Inspect, Editor, CodeExplorer option
  

git-svn-id: trunk@23252 -
This commit is contained in:
paul 2009-12-24 08:31:23 +00:00
parent 52d15f47b8
commit 6c7c0ee0ad
12 changed files with 232 additions and 106 deletions

View File

@ -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);

View File

@ -46,7 +46,7 @@ type
{ TFormatSettings }
TFormatSettings = class(TAbstractIDEOptions)
TFormatSettings = class(TAbstractIDEEnvironmentOptions)
private
fcObfuscate: TSetObfuscate;
fcClarify: TSetClarify;

View File

@ -57,7 +57,7 @@ type
{ TDebuggerOptions }
TDebuggerOptions = class(TAbstractIDEOptions)
TDebuggerOptions = class(TAbstractIDEEnvironmentOptions)
public
class function GetGroupCaption:string; override;
class function GetInstance: TAbstractIDEOptions; override;

View File

@ -128,7 +128,7 @@ const
type
TCodeExplorerOptions = class(TAbstractIDEOptions)
TCodeExplorerOptions = class(TAbstractIDEEnvironmentOptions)
private
FCategories: TCodeExplorerCategories;
FChangeStep: integer;

View File

@ -47,7 +47,7 @@ type
{ TCodeToolsOptions }
TCodeToolsOptions = class(TAbstractIDEOptions)
TCodeToolsOptions = class(TAbstractIDEEnvironmentOptions)
private
FClassHeaderComments: boolean;
FClassImplementationComments: boolean;

View File

@ -844,7 +844,7 @@ type
{ TEditorOptions - Editor Options object used to hold the editor options }
TEditorOptions = class(TAbstractIDEOptions)
TEditorOptions = class(TAbstractIDEEnvironmentOptions)
private
xmlconfig: TRttiXMLConfig;

View File

@ -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;

View File

@ -43,7 +43,7 @@ uses
type
{ THelpOptions }
THelpOptions = class(TAbstractIDEOptions)
THelpOptions = class(TAbstractIDEEnvironmentOptions)
private
FFilename: string;
FFPCDocsHTMLDirectory: string;

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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;