mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-06 11:58:24 +02:00
926 lines
30 KiB
ObjectPascal
926 lines
30 KiB
ObjectPascal
{
|
|
/***************************************************************************
|
|
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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA. *
|
|
* *
|
|
***************************************************************************
|
|
|
|
Abstract:
|
|
Dialog for the options of the code explorer.
|
|
}
|
|
unit CodeExplOpts;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
// RTL + FCL
|
|
Classes, SysUtils, AVL_Tree,
|
|
// LCL
|
|
Forms, Controls, Graphics, Dialogs, Buttons,
|
|
// CodeTools
|
|
BasicCodeTools,
|
|
// LazUtils
|
|
AvgLvlTree, Laz2_XMLCfg, LazFileUtils, LazFileCache, LazLoggerBase,
|
|
// BuildIntf
|
|
IDEOptionsIntf,
|
|
// IDEIntf
|
|
IDEOptEditorIntf,
|
|
// IdeConfig
|
|
LazConf, IdeXmlConfigProcs,
|
|
// IDE
|
|
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: TAvlTree;// 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: TAvlTree 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:=TAvlTree.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: TAvlTreeNode;
|
|
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: TAvlTreeNode;
|
|
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: TAvlTreeNode;
|
|
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.
|
|
|