/ide/codeexplopts.pas
http://github.com/graemeg/lazarus · Pascal · 920 lines · 797 code · 72 blank · 51 comment · 72 complexity · e73a2b62566992b06f92ecf1f2d06032 MD5 · raw file
- {
- /***************************************************************************
- CodeExplOpts.pas
- -------------------
- ***************************************************************************/
- ***************************************************************************
- * *
- * This source is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This code is distributed in the hope that it will be useful, but *
- * WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
- * General Public License for more details. *
- * *
- * A copy of the GNU General Public License is available on the World *
- * Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
- * obtain it by writing to the Free Software Foundation, *
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- ***************************************************************************
- Abstract:
- Dialog for the options of the code explorer.
- }
- unit CodeExplOpts;
- {$mode objfpc}{$H+}
- interface
- uses
- // RTL + FCL + LCL
- Classes, SysUtils,
- LCLProc, Forms, Controls, Graphics, Dialogs, Buttons,
- // CodeTools
- BasicCodeTools, FileProcs,
- // LazUtils
- AvgLvlTree, Laz2_XMLCfg, LazFileUtils, LazFileCache,
- // IDEIntf
- IDEOptionsIntf,
- // IDE
- LazConf, IDEProcs, LazarusIDEStrConsts;
- type
- { TCodeExplorerOptions }
-
- TCodeExplorerPage = (
- cepNone,
- cepCode,
- cepDirectives
- );
- TCodeExplorerRefresh = (
- cerManual, // only via refresh button
- cerSwitchEditorPage,// everytime the source editor switches to another page
- cerOnIdle // on idle
- );
-
- TCodeExplorerMode = (
- cemCategory, // Category - Delphi like
- cemSource // Follows Source Code
- );
-
- TCodeExplorerCategory = (
- cecNone,
- cecUses,
- cecTypes,
- cecVariables,
- cecConstants,
- cecProperties,
- cecProcedures,
- cecCodeObserver,
- cecSurrounding
- );
- TCodeExplorerCategories = set of TCodeExplorerCategory;
- TCEObserverCategory = (
- cefcLongProcs, // procedures with many lines of code
- cefcLongParamLists, // procedures with many parameters
- cefcEmptyProcs, // procs without code (can contain comments)
- cefcNestedProcs, // procs with a lot of nested sub procs
- cefcUnnamedConsts, // numbers, strings in statements
- cefcEmptyBlocks, // empty begin..end block (not even a comment)
- cefcWrongIndentation, // possible missing lines or begin blocks
- cefcPublishedPropWithoutDefault, // published properties without default specifier
- cefcUnsortedClassVisibility, // public,private,protected,published keywords are not sorted
- cefcEmptyClassSections, // empty public,private,protected,published section
- cefcUnsortedClassMembers, // member of a public,private,protected,published section is not sorted alphabetically
- cefcToDos // todo comment
- );
- TCEObserverCategories = set of TCEObserverCategory;
- TCEObserverCategoryGroup = (ocgComplexity, ocgEmpty, ocgStyle, ocgOther);
- const
- FirstCodeExplorerCategory = cecUses;
- DefaultCodeExplorerCategories = [cecUses,
- cecTypes,cecVariables,cecConstants,cecProcedures];
- cefcAll = [low(TCEObserverCategory)..high(TCEObserverCategory)];
- DefaultCodeExplorerPage = cepCode;
- DefaultCodeObserverCategories = [
- cefcLongProcs,
- cefcEmptyProcs,
- cefcUnnamedConsts,
- cefcEmptyBlocks,
- cefcWrongIndentation,
- cefcPublishedPropWithoutDefault,
- cefcToDos
- ];
- DefaultCOLongProcLineCount = 50;
- DefaultCOLongParamListCount = 6;
- DefaultCONestedProcCount = 3;
- DefaultCOureCharConst = false;
- DefaultCOIgnoreConstants: array[1..2] of ansistring // Note: keep this asciiz
- = (
- '0',
- '1'
- );
- DefaultCOIgnoreConstInFuncs: array[1..15] of ansistring // Note: keep this asciiz
- = (
- 'Assert',
- 'Debug',
- 'DebugLn',
- 'DbgOut',
- 'write',
- 'writeln',
- 'Format',
- 'FormatBuf',
- 'StrFmt',
- 'StrLFmt',
- 'FmtStr',
- 'FloatToStrF',
- 'FloatToStr',
- 'CurrToStrF',
- 'FormatDateTime'
- );
- type
- TCodeExplorerOptions = class(TAbstractIDEEnvironmentOptions)
- private
- FCategories: TCodeExplorerCategories;
- FChangeStep: integer;
- FObserveCharConst: boolean;
- FCOIgnoreConstInFuncs: TStringToStringTree;
- FLongParamListCount: integer;
- FLongProcLineCount: integer;
- FNestedProcCount: integer;
- FObserverCategories: TCEObserverCategories;
- FFollowCursor: boolean;
- FMode : TCodeExplorerMode;
- FObserverIgnoreConstants: TAvgLvlTree;// tree of AnsiString
- FOptionsFilename: string;
- FPage: TCodeExplorerPage;
- FRefresh: TCodeExplorerRefresh;
- FSavedChangeStep: integer;
- function GetModified: boolean;
- procedure SetCategories(const AValue: TCodeExplorerCategories);
- procedure SetFollowCursor(const AValue: boolean);
- procedure SetLongParamListCount(const AValue: integer);
- procedure SetLongProcLineCount(const AValue: integer);
- procedure SetMode(const AValue: TCodeExplorerMode);
- procedure SetModified(AValue: boolean);
- procedure SetNestedProcCount(const AValue: integer);
- procedure SetObserveCharConst(const AValue: boolean);
- procedure SetObserverCategories(const AValue: TCEObserverCategories);
- procedure SetPage(AValue: TCodeExplorerPage);
- procedure SetRefresh(const AValue: TCodeExplorerRefresh);
- public
- class function GetGroupCaption:string; override;
- class function GetInstance: TAbstractIDEOptions; override;
- procedure DoAfterWrite(Restore: boolean); override;
- public
- constructor Create;
- destructor Destroy; override;
- procedure Clear;
- procedure Assign(Source: TPersistent); override;
- procedure Load;
- procedure Save;
- procedure LoadFromXMLConfig(XMLConfig: TXMLConfig; const Path: string);
- procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string);
- procedure IncreaseChangeStep;
- property Modified: boolean read GetModified write SetModified;
- public
- // observer: ignore constants
- function CreateListOfCOIgnoreConstants: TStrings;
- procedure SetListOf_COIgnoreConstants(List: TStrings; Add: boolean);
- function COIgnoreConstant(p: PChar): boolean;// test if atom is in COIgnoreConstants
- function COIgnoreConstants_AreDefault(Exactly: boolean): boolean; // true if COIgnoreConstants contain/are default values
- function COIgnoreConstant_IsDefault(const Atom: string): boolean; // true if Atom is in default values
- procedure Add_COIgnoreConstant(const Atom: string);
- procedure Clear_COIgnoreConstants;
- procedure LoadDefaults_COIgnoreConstants;
- public
- // observer: ignore constants in functions
- function CreateListOfCOIgnoreConstInFuncs: TStrings;
- procedure SetListOf_COIgnoreConstInFuncs(List: TStrings; Add: boolean);
- function COIgnoreConstInFunc(const Func: string): boolean;// test if function is in COIgnoreConstInFuncs
- function COIgnoreConstInFuncs_AreDefault(Exactly: boolean): boolean; // true if COIgnoreConstInFuncs contain/are default values
- function COIgnoreConstInFuncs_IsDefault(const Func: string): boolean; // true if Atom is in default values
- procedure Add_COIgnoreConstInFuncs(const Func: string);
- procedure Clear_COIgnoreConstInFuncs;
- procedure LoadDefaults_COIgnoreConstInFuncs;
- public
- property Refresh: TCodeExplorerRefresh read FRefresh write SetRefresh default cerSwitchEditorPage;
- property Mode: TCodeExplorerMode read FMode write SetMode default cemCategory;
- property OptionsFilename: string read FOptionsFilename write FOptionsFilename;
- property FollowCursor: boolean read FFollowCursor write SetFollowCursor default true;
- property Categories: TCodeExplorerCategories read FCategories write SetCategories default DefaultCodeExplorerCategories;
- property Page: TCodeExplorerPage read FPage write SetPage default DefaultCodeExplorerPage;
- property ChangeStep: integer read FChangeStep write FChangeStep;
- public
- // Observer
- property ObserveCharConst: boolean read FObserveCharConst write SetObserveCharConst default DefaultCOureCharConst;
- property ObserverCategories: TCEObserverCategories read FObserverCategories write SetObserverCategories default DefaultCodeObserverCategories;
- property ObserverIgnoreConstants: TAvgLvlTree read FObserverIgnoreConstants;
- property COIgnoreConstInFuncs: TStringToStringTree read FCOIgnoreConstInFuncs;
- property LongParamListCount: integer read FLongParamListCount write SetLongParamListCount default DefaultCOLongParamListCount;
- property LongProcLineCount: integer read FLongProcLineCount write SetLongProcLineCount default DefaultCOLongProcLineCount;
- property NestedProcCount: integer read FNestedProcCount write SetNestedProcCount default DefaultCONestedProcCount;
- end;
- const
- CodeExplorerVersion = 1;
- cerDefault = cerSwitchEditorPage;
- CodeExplorerPageNames: array[TCodeExplorerPage] of string = (
- '?',
- 'Code',
- 'Directives'
- );
- CodeExplorerRefreshNames: array[TCodeExplorerRefresh] of string = (
- 'Manual',
- 'SwitchEditorPage',
- 'OnIdle'
- );
- CodeExplorerModeNames: array[TCodeExplorerMode] of string = (
- 'Category',
- 'Source'
- );
- CodeExplorerCategoryNames: array[TCodeExplorerCategory] of string = (
- '?',
- 'Uses',
- 'Types',
- 'Variables',
- 'Constants',
- 'Properties',
- 'Procedures',
- 'CodeObserver',
- 'Surrounding'
- );
- CodeObserverCategoryNames: array[TCEObserverCategory] of string = (
- 'LongProcs',
- 'LongParamLists',
- 'EmptyProcs',
- 'NestedProcs',
- 'UnnamedConsts',
- 'EmptyBlocks',
- 'WrongIndentation',
- 'PublishedPropWithoutDefault',
- 'UnsortedClassVisibility',
- 'EmptyClassSections',
- 'UnsortedClassMembers',
- 'ToDos'
- );
- var
- CodeExplorerOptions: TCodeExplorerOptions = nil; // set by the IDE
- function CodeExplorerPageNameToEnum(const s: string): TCodeExplorerPage;
- function CodeExplorerRefreshNameToEnum(const s: string): TCodeExplorerRefresh;
- function CodeExplorerModeNameToEnum(const s: string): TCodeExplorerMode;
- function CodeExplorerCategoryNameToEnum(const s: string): TCodeExplorerCategory;
- function CodeExplorerLocalizedString(const c: TCodeExplorerCategory): string;
- function CodeObserverCatNameToEnum(const s: string): TCEObserverCategory;
- function CodeExplorerLocalizedString(const c: TCEObserverCategory): string;
- function dbgs(c: TCodeExplorerCategory): string; overload;
- implementation
- function CodeExplorerPageNameToEnum(const s: string): TCodeExplorerPage;
- begin
- for Result:=Low(TCodeExplorerPage) to High(TCodeExplorerPage) do
- if SysUtils.CompareText(CodeExplorerPageNames[Result],s)=0 then exit;
- Result:=DefaultCodeExplorerPage;
- end;
- function CodeExplorerRefreshNameToEnum(const s: string): TCodeExplorerRefresh;
- begin
- for Result:=Low(TCodeExplorerRefresh) to High(TCodeExplorerRefresh) do
- if SysUtils.CompareText(CodeExplorerRefreshNames[Result],s)=0 then exit;
- Result:=cerDefault;
- end;
- function CodeExplorerModeNameToEnum(const s: string): TCodeExplorerMode;
- begin
- for Result:=Low(TCodeExplorerMode) to High(TCodeExplorerMode) do
- if SysUtils.CompareText(CodeExplorerModeNames[Result],s)=0 then exit;
- Result:=cemCategory;
- end;
- function CodeExplorerCategoryNameToEnum(const s: string): TCodeExplorerCategory;
- begin
- for Result:=FirstCodeExplorerCategory to High(TCodeExplorerCategory) do
- if SysUtils.CompareText(CodeExplorerCategoryNames[Result],s)=0 then exit;
- Result:=cecTypes;
- end;
- function CodeExplorerLocalizedString(const c: TCodeExplorerCategory): string;
- begin
- case c of
- cecUses: Result:=lisCEUses;
- cecTypes: Result:=lisCETypes;
- cecVariables: Result:=lisCEVariables;
- cecConstants: Result:=lisCEConstants;
- cecProcedures: Result:=lisCEProcedures;
- cecProperties: Result:=lisCEProperties;
- cecCodeObserver: Result:=lisCodeObserver;
- cecSurrounding: Result:=lisCESurrounding;
- else Result:='?';
- end;
- end;
- function CodeObserverCatNameToEnum(const s: string): TCEObserverCategory;
- begin
- for Result:=low(TCEObserverCategory) to High(TCEObserverCategory) do
- if SysUtils.CompareText(CodeObserverCategoryNames[Result],s)=0 then exit;
- Result:=cefcLongProcs;
- end;
- function CodeExplorerLocalizedString(const c: TCEObserverCategory): string;
- begin
- case c of
- cefcLongProcs: Result:=lisCELongProcedures;
- cefcLongParamLists: Result:=lisCEManyParameters;
- cefcEmptyProcs: Result:=lisCEEmptyProcedures;
- cefcNestedProcs: Result:=lisCEManyNestedProcedures;
- cefcUnnamedConsts: Result:=lisCEUnnamedConstants;
- cefcEmptyBlocks: Result:=lisCEEmptyBlocks;
- cefcWrongIndentation: Result:=lisCEWrongIndentation;
- cefcPublishedPropWithoutDefault: Result:=lisCEPublishedPropertyWithoutDefault;
- cefcUnsortedClassVisibility: Result:=lisCEUnsortedVisibility;
- cefcEmptyClassSections: Result:=lisCEEmptyClassSections;
- cefcUnsortedClassMembers: Result:=lisCEUnsortedMembers;
- cefcToDos: Result:=lisCEToDos;
- else Result:='?';
- end;
- end;
- function dbgs(c: TCodeExplorerCategory): string;
- begin
- Result:=CodeExplorerCategoryNames[c];
- end;
- { TCodeExplorerOptions }
- procedure TCodeExplorerOptions.SetRefresh(const AValue: TCodeExplorerRefresh);
- begin
- if FRefresh=AValue then exit;
- FRefresh:=AValue;
- IncreaseChangeStep;
- end;
- procedure TCodeExplorerOptions.SetMode(const AValue: TCodeExplorerMode);
- begin
- if FMode=AValue then exit;
- FMode:=AValue;
- IncreaseChangeStep;
- end;
- procedure TCodeExplorerOptions.SetModified(AValue: boolean);
- begin
- if AValue then
- IncreaseChangeStep
- else
- FSavedChangeStep:=FChangeStep;
- end;
- procedure TCodeExplorerOptions.SetNestedProcCount(const AValue: integer);
- begin
- if FNestedProcCount=AValue then exit;
- FNestedProcCount:=AValue;
- IncreaseChangeStep;
- end;
- procedure TCodeExplorerOptions.SetObserveCharConst(const AValue: boolean);
- begin
- if FObserveCharConst=AValue then exit;
- FObserveCharConst:=AValue;
- IncreaseChangeStep;
- end;
- procedure TCodeExplorerOptions.SetObserverCategories(
- const AValue: TCEObserverCategories);
- begin
- if FObserverCategories=AValue then exit;
- FObserverCategories:=AValue;
- IncreaseChangeStep;
- end;
- procedure TCodeExplorerOptions.SetPage(AValue: TCodeExplorerPage);
- begin
- if FPage=AValue then Exit;
- FPage:=AValue;
- IncreaseChangeStep;
- end;
- procedure TCodeExplorerOptions.SetFollowCursor(const AValue: boolean);
- begin
- if FFollowCursor=AValue then exit;
- FFollowCursor:=AValue;
- IncreaseChangeStep;
- end;
- procedure TCodeExplorerOptions.SetLongParamListCount(const AValue: integer);
- begin
- if FLongParamListCount=AValue then exit;
- FLongParamListCount:=AValue;
- IncreaseChangeStep;
- end;
- procedure TCodeExplorerOptions.SetLongProcLineCount(const AValue: integer);
- begin
- if FLongProcLineCount=AValue then exit;
- FLongProcLineCount:=AValue;
- IncreaseChangeStep;
- end;
- procedure TCodeExplorerOptions.SetCategories(
- const AValue: TCodeExplorerCategories);
- begin
- if FCategories=AValue then exit;
- FCategories:=AValue;
- IncreaseChangeStep;
- end;
- function TCodeExplorerOptions.GetModified: boolean;
- begin
- Result:=FSavedChangeStep<>FChangeStep;
- end;
- constructor TCodeExplorerOptions.Create;
- begin
- FOptionsFilename:=AppendPathDelim(GetPrimaryConfigPath)+'codeexploreroptions.xml';
- FObserverIgnoreConstants:=TAvgLvlTree.Create(TListSortCompare(@CompareAtom));
- FCOIgnoreConstInFuncs:=TStringToStringTree.Create(false);
- Clear;
- LoadDefaults_COIgnoreConstants;
- LoadDefaults_COIgnoreConstInFuncs;
- end;
- destructor TCodeExplorerOptions.Destroy;
- begin
- Clear_COIgnoreConstants;
- FreeAndNil(FObserverIgnoreConstants);
- FreeAndNil(FCOIgnoreConstInFuncs);
- inherited Destroy;
- end;
- class function TCodeExplorerOptions.GetGroupCaption: string;
- begin
- Result := dlgGroupCodeExplorer;
- end;
- class function TCodeExplorerOptions.GetInstance: TAbstractIDEOptions;
- begin
- Result := CodeExplorerOptions;
- end;
- procedure TCodeExplorerOptions.DoAfterWrite(Restore: boolean);
- begin
- if not Restore then
- Save;
- end;
- procedure TCodeExplorerOptions.Clear;
- begin
- IncreaseChangeStep;
- FMode:=cemCategory;
- FRefresh:=cerDefault;
- FFollowCursor:=true;
- FPage:=DefaultCodeExplorerPage;
- FCategories:=DefaultCodeExplorerCategories;
- FObserverCategories:=DefaultCodeObserverCategories;
- FLongProcLineCount:=DefaultCOLongProcLineCount;
- FLongParamListCount:=DefaultCOLongParamListCount;
- FNestedProcCount:=DefaultCONestedProcCount;
- FObserveCharConst:=DefaultCOureCharConst;
- Clear_COIgnoreConstants;
- Clear_COIgnoreConstInFuncs;
- end;
- procedure TCodeExplorerOptions.Assign(Source: TPersistent);
- var
- Src: TCodeExplorerOptions;
- List: TStrings;
- begin
- if Source is TCodeExplorerOptions then begin
- IncreaseChangeStep;
- Src:=TCodeExplorerOptions(Source);
- FRefresh:=Src.Refresh;
- FMode:=Src.Mode;
- FFollowCursor:=Src.FollowCursor;
- FPage:=Src.Page;
- FCategories:=Src.Categories;
- FObserverCategories:=Src.ObserverCategories;
- FLongProcLineCount:=Src.LongProcLineCount;
- FLongParamListCount:=Src.LongParamListCount;
- FNestedProcCount:=Src.NestedProcCount;
- FObserveCharConst:=Src.ObserveCharConst;
- List:=Src.CreateListOfCOIgnoreConstants;
- try
- SetListOf_COIgnoreConstants(List,false);
- finally
- List.Free;
- end;
- List:=Src.CreateListOfCOIgnoreConstInFuncs;
- try
- SetListOf_COIgnoreConstInFuncs(List,false);
- finally
- List.Free;
- end;
- end else
- inherited Assign(Source);
- end;
- procedure TCodeExplorerOptions.Load;
- var
- XMLConfig: TXMLConfig;
- //FileVersion: integer;
- begin
- if not FileExistsUTF8(FOptionsFilename) then
- begin
- Clear;
- LoadDefaults_COIgnoreConstants;
- LoadDefaults_COIgnoreConstInFuncs;
- Exit;
- end;
- try
- XMLConfig:=TXMLConfig.Create(FOptionsFilename);
- //FileVersion:=XMLConfig.GetValue('CodeExplorer/Version/Value',0);
- LoadFromXMLConfig(XMLConfig,'CodeExplorer/');
- XMLConfig.Free;
- except
- on E: Exception do begin
- DebugLn('[TCodeExplorerOptions.Load] error reading "',FOptionsFilename,'" ',E.Message);
- end;
- end;
- end;
- procedure TCodeExplorerOptions.Save;
- var
- XMLConfig: TXMLConfig;
- begin
- if FileExistsCached(FOptionsFilename) and not Modified then exit;
- try
- InvalidateFileStateCache;
- XMLConfig:=TXMLConfig.CreateClean(FOptionsFilename);
- XMLConfig.SetDeleteValue('CodeExplorer/Version/Value',
- CodeExplorerVersion,0);
- SaveToXMLConfig(XMLConfig,'CodeExplorer/');
- XMLConfig.Flush;
- XMLConfig.Free;
- Modified:=false;
- except
- on E: Exception do begin
- DebugLn('[TCodeExplorerOptions.Save] error writing "',FOptionsFilename,'" ',E.Message);
- end;
- end;
- end;
- procedure TCodeExplorerOptions.LoadFromXMLConfig(XMLConfig: TXMLConfig;
- const Path: string);
- var
- c: TCodeExplorerCategory;
- f: TCEObserverCategory;
- CurPath: String;
- List: TStringList;
- begin
- IncreaseChangeStep;
- Clear;
- FRefresh:=CodeExplorerRefreshNameToEnum(
- XMLConfig.GetValue(Path+'Refresh/Value',''));
- FMode:=CodeExplorerModeNameToEnum(
- XMLConfig.GetValue(Path+'Mode/Value',''));
- FFollowCursor:=XMLConfig.GetValue(Path+'FollowCursor',true);
- FPage:=CodeExplorerPageNameToEnum(XMLConfig.GetValue(Path+'Page/Value',''));
- FCategories:=[];
- for c:=FirstCodeExplorerCategory to high(TCodeExplorerCategory) do
- if XMLConfig.GetValue(Path+'Categories/'+CodeExplorerCategoryNames[c],
- c in DefaultCodeExplorerCategories) then
- Include(FCategories,c);
- FObserverCategories:=[];
- for f:=low(TCEObserverCategory) to high(TCEObserverCategory) do
- begin
- CurPath:=Path+'CodeObserver/'+CodeObserverCategoryNames[f]+'/';
- if XMLConfig.GetValue(CurPath+'Show',f in DefaultCodeObserverCategories)
- then
- Include(FObserverCategories,f);
- case f of
- cefcLongProcs:
- FLongProcLineCount:=XMLConfig.GetValue(CurPath+'LineCount/Value',
- DefaultCOLongProcLineCount);
- cefcLongParamLists:
- FLongParamListCount:=XMLConfig.GetValue(CurPath+'Count/Value',
- DefaultCOLongParamListCount);
- cefcNestedProcs:
- FNestedProcCount:=XMLConfig.GetValue(CurPath+'Count/Value',
- DefaultCONestedProcCount);
- cefcUnnamedConsts:
- begin
- FObserveCharConst:=XMLConfig.GetValue(CurPath+'CharConsts/Value',
- DefaultCOureCharConst);
- // load standard ObserverIgnoreConstants
- if XMLConfig.GetValue(CurPath+'Ignore/ContainsDefaults',true) then
- LoadDefaults_COIgnoreConstants;
- // load custom ObserverIgnoreConstants
- List:=TStringList.Create;
- try
- LoadStringList(XMLConfig,List,CurPath+'Ignore/');
- SetListOf_COIgnoreConstants(List,true);
- finally
- List.Free;
- end;
- // load standard COIgnoreConstInFuncs
- if XMLConfig.GetValue(CurPath+'IgnoreInFuncs/ContainsDefaults',true) then
- LoadDefaults_COIgnoreConstInFuncs;
- // load custom COIgnoreConstInFuncs
- List:=TStringList.Create;
- try
- LoadStringList(XMLConfig,List,CurPath+'IgnoreFuncs/');
- SetListOf_COIgnoreConstInFuncs(List,true);
- finally
- List.Free;
- end;
- end;
- end;
- end;
- end;
- procedure TCodeExplorerOptions.SaveToXMLConfig(XMLConfig: TXMLConfig;
- const Path: string);
- var
- c: TCodeExplorerCategory;
- f: TCEObserverCategory;
- CurPath: String;
- List: TStrings;
- ContainsDefaults: Boolean;
- i: Integer;
- begin
- XMLConfig.SetDeleteValue(Path+'Refresh/Value',
- CodeExplorerRefreshNames[FRefresh],
- CodeExplorerRefreshNames[cerDefault]);
- XMLConfig.SetDeleteValue(Path+'Mode/Value',
- CodeExplorerModeNames[FMode],
- CodeExplorerModeNames[cemCategory]);
- XMLConfig.SetDeleteValue(Path+'FollowCursor',FFollowCursor,true);
- XMLConfig.SetDeleteValue(Path+'Page/Value',CodeExplorerPageNames[FPage],
- CodeExplorerPageNames[DefaultCodeExplorerPage]);
- for c:=FirstCodeExplorerCategory to high(TCodeExplorerCategory) do
- XMLConfig.SetDeleteValue(Path+'Categories/'+CodeExplorerCategoryNames[c],
- c in FCategories,c in DefaultCodeExplorerCategories);
- for f:=low(TCEObserverCategory) to high(TCEObserverCategory) do
- begin
- CurPath:=Path+'CodeObserver/'+CodeObserverCategoryNames[f]+'/';
- XMLConfig.SetDeleteValue(CurPath+'Show',
- f in FObserverCategories,f in DefaultCodeObserverCategories);
- case f of
- cefcLongProcs:
- XMLConfig.SetDeleteValue(CurPath+'LineCount/Value',
- FLongProcLineCount,DefaultCOLongProcLineCount);
- cefcLongParamLists:
- XMLConfig.SetDeleteValue(CurPath+'Count/Value',
- FLongParamListCount,DefaultCOLongParamListCount);
- cefcNestedProcs:
- XMLConfig.SetDeleteValue(CurPath+'Count/Value',
- FNestedProcCount,DefaultCONestedProcCount);
- cefcUnnamedConsts:
- begin
- XMLConfig.SetDeleteValue(CurPath+'CharConsts/Value',
- FObserveCharConst,DefaultCOureCharConst);
- // save standard ObserverIgnoreConstants
- ContainsDefaults:=COIgnoreConstants_AreDefault(false);
- XMLConfig.SetDeleteValue(CurPath+'Ignore/ContainsDefaults',
- ContainsDefaults,true);
- // save ObserverIgnoreConstants
- List:=CreateListOfCOIgnoreConstants;
- try
- for i:=List.Count-1 downto 0 do
- if COIgnoreConstant_IsDefault(List[i]) then
- List.Delete(i);
- SaveStringList(XMLConfig,List,CurPath+'Ignore/');
- finally
- List.Free;
- end;
- // save standard COIgnoreConstInFuncs
- ContainsDefaults:=COIgnoreConstInFuncs_AreDefault(false);
- XMLConfig.SetDeleteValue(CurPath+'IgnoreInFuncs/ContainsDefaults',
- ContainsDefaults,true);
- // save COIgnoreConstInFuncs
- List:=CreateListOfCOIgnoreConstInFuncs;
- try
- for i:=List.Count-1 downto 0 do
- if COIgnoreConstInFuncs_IsDefault(List[i]) then
- List.Delete(i);
- SaveStringList(XMLConfig,List,CurPath+'IgnoreInFuncs/');
- finally
- List.Free;
- end;
- end;
- end;
- end;
- end;
- procedure TCodeExplorerOptions.IncreaseChangeStep;
- begin
- if FChangeStep=high(integer) then
- FChangeStep:=low(integer)
- else
- inc(FChangeStep);
- end;
- function TCodeExplorerOptions.CreateListOfCOIgnoreConstants: TStrings;
- var
- AVLNode: TAvgLvlTreeNode;
- s: String;
- begin
- Result:=TStringList.Create;
- AVLNode:=ObserverIgnoreConstants.FindLowest;
- while AVLNode<>nil do begin
- s:=GetAtomString(PChar(AVLNode.Data),false);
- if s<>'' then
- Result.Add(s);
- AVLNode:=ObserverIgnoreConstants.FindSuccessor(AVLNode);
- end;
- end;
- procedure TCodeExplorerOptions.Clear_COIgnoreConstants;
- var
- AVLNode: TAvgLvlTreeNode;
- s: String;
- begin
- if FObserverIgnoreConstants.Count=0 then exit;
- IncreaseChangeStep;
- s:='';
- AVLNode:=FObserverIgnoreConstants.FindLowest;
- while AVLNode<>nil do begin
- // decrease reference counter
- Pointer(s):=AVLNode.Data;
- s:='';
- AVLNode:=FObserverIgnoreConstants.FindSuccessor(AVLNode);
- end;
- if s='' then ; // omit fpc note
- FObserverIgnoreConstants.Clear;
- end;
- procedure TCodeExplorerOptions.SetListOf_COIgnoreConstants(List: TStrings;
- Add: boolean);
- var
- i: Integer;
- begin
- IncreaseChangeStep;
- if not Add then
- Clear_COIgnoreConstants;
- for i:=0 to List.Count-1 do
- Add_COIgnoreConstant(List[i]);
- end;
- procedure TCodeExplorerOptions.LoadDefaults_COIgnoreConstants;
- var
- i: Integer;
- begin
- if COIgnoreConstants_AreDefault(true) then exit;
- IncreaseChangeStep;
- Clear_COIgnoreConstants;
- for i:=low(DefaultCOIgnoreConstants) to high(DefaultCOIgnoreConstants) do
- Add_COIgnoreConstant(DefaultCOIgnoreConstants[i]);
- end;
- function TCodeExplorerOptions.CreateListOfCOIgnoreConstInFuncs: TStrings;
- var
- AVLNode: TAvgLvlTreeNode;
- s: String;
- begin
- Result:=TStringList.Create;
- AVLNode:=COIgnoreConstInFuncs.Tree.FindLowest;
- while AVLNode<>nil do begin
- s:=PStringToStringItem(AVLNode.Data)^.Name;
- if s<>'' then
- Result.Add(s);
- AVLNode:=COIgnoreConstInFuncs.Tree.FindSuccessor(AVLNode);
- end;
- end;
- procedure TCodeExplorerOptions.SetListOf_COIgnoreConstInFuncs(List: TStrings;
- Add: boolean);
- var
- i: Integer;
- begin
- IncreaseChangeStep;
- if not Add then
- Clear_COIgnoreConstInFuncs;
- for i:=0 to List.Count-1 do
- Add_COIgnoreConstInFuncs(List[i]);
- end;
- function TCodeExplorerOptions.COIgnoreConstInFunc(const Func: string): boolean;
- begin
- Result:=FCOIgnoreConstInFuncs.Contains(Func);
- end;
- function TCodeExplorerOptions.COIgnoreConstInFuncs_AreDefault(Exactly: boolean
- ): boolean;
- const
- DefCount = high(DefaultCOIgnoreConstInFuncs)-Low(DefaultCOIgnoreConstInFuncs)+1;
- var
- i: Integer;
- begin
- if Exactly and (FCOIgnoreConstInFuncs.Count=DefCount) then
- exit(false);
- if FCOIgnoreConstInFuncs.Count<DefCount then exit(false);
- for i:=low(DefaultCOIgnoreConstInFuncs) to high(DefaultCOIgnoreConstInFuncs) do
- if not COIgnoreConstInFunc(DefaultCOIgnoreConstInFuncs[i]) then
- exit(false);
- Result:=true;
- end;
- function TCodeExplorerOptions.COIgnoreConstInFuncs_IsDefault(const Func: string
- ): boolean;
- var
- i: Integer;
- begin
- for i:=low(DefaultCOIgnoreConstants) to high(DefaultCOIgnoreConstants) do
- if SysUtils.CompareText(Func,DefaultCOIgnoreConstants[i])=0 then
- exit(true);
- Result:=false;
- end;
- procedure TCodeExplorerOptions.Add_COIgnoreConstInFuncs(const Func: string);
- begin
- if Func='' then exit;
- if COIgnoreConstInFunc(Func) then exit;
- IncreaseChangeStep;
- FCOIgnoreConstInFuncs.Values[Func]:='';
- end;
- procedure TCodeExplorerOptions.Clear_COIgnoreConstInFuncs;
- begin
- if FCOIgnoreConstInFuncs.Count=0 then exit;
- IncreaseChangeStep;
- FCOIgnoreConstInFuncs.Clear;
- end;
- procedure TCodeExplorerOptions.LoadDefaults_COIgnoreConstInFuncs;
- var
- i: Integer;
- begin
- if COIgnoreConstInFuncs_AreDefault(true) then exit;
- IncreaseChangeStep;
- Clear_COIgnoreConstInFuncs;
- for i:=low(DefaultCOIgnoreConstInFuncs) to high(DefaultCOIgnoreConstInFuncs) do
- Add_COIgnoreConstInFuncs(DefaultCOIgnoreConstInFuncs[i]);
- end;
- function TCodeExplorerOptions.COIgnoreConstant(p: PChar): boolean;
- begin
- Result:=FObserverIgnoreConstants.Find(p)<>nil;
- end;
- procedure TCodeExplorerOptions.Add_COIgnoreConstant(const Atom: string);
- var
- s: String;
- begin
- if Atom='' then exit;
- if COIgnoreConstant(PChar(Atom)) then exit;
- IncreaseChangeStep;
- s:=Atom;
- FObserverIgnoreConstants.Add(Pointer(s));
- Pointer(s):=nil;
- end;
- function TCodeExplorerOptions.COIgnoreConstants_AreDefault(Exactly: boolean
- ): boolean;
- const
- DefCount = high(DefaultCOIgnoreConstants)-Low(DefaultCOIgnoreConstants)+1;
- var
- i: Integer;
- begin
- if Exactly and (FObserverIgnoreConstants.Count=DefCount) then
- exit(false);
- if FObserverIgnoreConstants.Count<DefCount then exit(false);
- for i:=low(DefaultCOIgnoreConstants) to high(DefaultCOIgnoreConstants) do
- if not COIgnoreConstant(PChar(DefaultCOIgnoreConstants[i])) then
- exit(false);
- Result:=true;
- end;
- function TCodeExplorerOptions.COIgnoreConstant_IsDefault(const Atom: string
- ): boolean;
- var
- i: Integer;
- begin
- for i:=low(DefaultCOIgnoreConstants) to high(DefaultCOIgnoreConstants) do
- if CompareAtom(PChar(Atom),PChar(DefaultCOIgnoreConstants[i]),false)=0 then
- exit(true);
- Result:=false;
- end;
- initialization
- RegisterIDEOptionsGroup(GroupCodeExplorer, TCodeExplorerOptions);
- end.