mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-22 12:59:26 +02:00
MG: updates for codetools defines editor
git-svn-id: trunk@1478 -
This commit is contained in:
parent
64825ceb38
commit
43f4a972db
4
.gitattributes
vendored
4
.gitattributes
vendored
@ -208,7 +208,7 @@ images/codetoolsdefines/ctdefinestate_autoproj_22x22.xpm -text svneol=native#ima
|
||||
images/codetoolsdefines/ctdefinestate_none_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/codetoolsdefines/ctdefinestate_projspec_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/codetoolsdefines/define_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/codetoolsdefines/defineall_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/codetoolsdefines/definerecurse_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/codetoolsdefines/directory_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/codetoolsdefines/else_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/codetoolsdefines/elseif_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
@ -216,6 +216,8 @@ images/codetoolsdefines/if_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/codetoolsdefines/ifdef_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/codetoolsdefines/ifndef_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/codetoolsdefines/undefine_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/codetoolsdefines/undefineall_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/codetoolsdefines/undefinerecurse_22x22.xpm -text svneol=native#image/x-xpixmap
|
||||
images/color.ico -text svneol=unset#image/x-icon
|
||||
images/color.xpm -text svneol=native#image/x-xpixmap
|
||||
images/components/default.ico -text svneol=unset#image/x-icon
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
The information is stored in a TDefineTree, which contains nodes of type
|
||||
TDefineTemplate. Each TDefineTemplate is a tree of defines, undefines,
|
||||
definealls, ifdefs, ifndefs, elses, elseifs and directories.
|
||||
definerecurses, ifdefs, ifndefs, elses, elseifs and directories.
|
||||
|
||||
Simply give a TDefineTree a directory and it will return all predefined
|
||||
variables for that directory. These values can be used to parse a unit in
|
||||
@ -54,9 +54,9 @@ uses
|
||||
KeywordFuncLists, FileProcs;
|
||||
|
||||
const
|
||||
ExternalMacroStart: char = '#'; // !!! it is hardcoded in linkscanner.pas
|
||||
ExternalMacroStart: char = '#'; // !!! this is hardcoded in linkscanner.pas
|
||||
{$ifdef win32}
|
||||
SpecialChar: char = '/';
|
||||
SpecialChar: char = '/'; // used to use PathDelim, e.g. /\
|
||||
{$else}
|
||||
SpecialChar: char = '\';
|
||||
{$endif}
|
||||
@ -89,9 +89,20 @@ type
|
||||
//---------------------------------------------------------------------------
|
||||
// TDefineTemplate is a list of TDefineEntry
|
||||
// TDefineEntry stores a define action, the variablename and the value
|
||||
TDefineAction = (da_None, da_Block, da_Define, da_Undefine, da_DefineAll,
|
||||
da_If, da_IfDef, da_IfNDef, da_ElseIf, da_Else, da_Directory);
|
||||
|
||||
TDefineAction = (da_None, da_Block, da_Define, da_DefineRecurse, da_Undefine,
|
||||
da_UndefineRecurse, da_UndefineAll, da_If, da_IfDef, da_IfNDef, da_ElseIf,
|
||||
da_Else, da_Directory);
|
||||
|
||||
const
|
||||
DefineActionBlocks = [da_Block, da_Directory, da_If, da_IfDef, da_IfNDef,
|
||||
da_ElseIf, da_Else];
|
||||
DefineActionNames: array[TDefineAction] of string = (
|
||||
'None', 'Block', 'Define', 'DefineRecurse', 'Undefine', 'UndefineRecurse',
|
||||
'UndefineAll', 'If', 'IfDef', 'IfNDef', 'ElseIf', 'Else', 'Directory'
|
||||
);
|
||||
|
||||
|
||||
type
|
||||
TDefineTemplateFlag = (dtfAutoGenerated, dtfProjectSpecific);
|
||||
TDefineTemplateFlags = set of TDefineTemplateFlag;
|
||||
|
||||
@ -117,12 +128,15 @@ type
|
||||
property FirstChild: TDefineTemplate read FFirstChild;
|
||||
property LastChild: TDefineTemplate read FLastChild;
|
||||
procedure AddChild(ADefineTemplate: TDefineTemplate);
|
||||
procedure InsertAfter(APrior: TDefineTemplate);
|
||||
procedure InsertBehind(APrior: TDefineTemplate);
|
||||
procedure InsertInFront(ANext: TDefineTemplate);
|
||||
procedure Assign(ADefineTemplate: TDefineTemplate;
|
||||
WithSubNodes, WithNextSiblings: boolean); virtual;
|
||||
function IsEqual(ADefineTemplate: TDefineTemplate;
|
||||
CheckSubNodes, CheckNextSiblings: boolean): boolean;
|
||||
function FindChildByName(const AName: string): TDefineTemplate;
|
||||
function FindByName(const AName: string;
|
||||
WithSubChilds, WithNextSiblings: boolean): TDefineTemplate;
|
||||
function LoadFromXMLConfig(XMLConfig: TXMLConfig;
|
||||
const Path: string): boolean;
|
||||
procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string);
|
||||
@ -173,13 +187,15 @@ type
|
||||
read FFirstDefineTemplate write FFirstDefineTemplate;
|
||||
procedure AddFirst(ADefineTemplate: TDefineTemplate);
|
||||
procedure Add(ADefineTemplate: TDefineTemplate);
|
||||
function FindDefineTemplateByName(const AName: string): TDefineTemplate;
|
||||
procedure ReplaceSameName(ADefineTemplate: TDefineTemplate);
|
||||
procedure ReplaceSameNameAddFirst(ADefineTemplate: TDefineTemplate);
|
||||
procedure RemoveDefineTemplateByName(const AName: string);
|
||||
function FindDefineTemplateByName(const AName: string;
|
||||
OnlyRoots: boolean): TDefineTemplate;
|
||||
procedure ReplaceRootSameName(ADefineTemplate: TDefineTemplate);
|
||||
procedure ReplaceRootSameNameAddFirst(ADefineTemplate: TDefineTemplate);
|
||||
procedure RemoveRootDefineTemplateByName(const AName: string);
|
||||
property OnReadValue: TOnReadValue read FOnReadValue write FOnReadValue;
|
||||
property ErrorTemplate: TDefineTemplate read FErrorTemplate;
|
||||
property ErrorDescription: string read FErrorDescription;
|
||||
function ExtractDefineTree(ProjectSpecific: boolean): TDefineTree;
|
||||
function LoadFromXMLConfig(XMLConfig: TXMLConfig;
|
||||
const Path: string): boolean;
|
||||
function SaveToXMLConfig(XMLConfig: TXMLConfig;
|
||||
@ -226,6 +242,8 @@ const
|
||||
'AutoGenerated', 'ProjectSpecific'
|
||||
);
|
||||
|
||||
function DefineActionNameToAction(const s: string): TDefineAction;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
@ -240,6 +258,13 @@ type
|
||||
|
||||
// some useful functions
|
||||
|
||||
function DefineActionNameToAction(const s: string): TDefineAction;
|
||||
begin
|
||||
for Result:=Low(TDefineAction) to High(TDefineAction) do
|
||||
if AnsiCompareText(s,DefineActionNames[Result])=0 then exit;
|
||||
Result:=da_None;
|
||||
end;
|
||||
|
||||
function CompareFilenames(const FileName1, Filename2: string): integer;
|
||||
begin
|
||||
{$ifdef CaseInsensitiveFilenames}
|
||||
@ -393,38 +418,75 @@ begin
|
||||
ADefineTemplate:=ADefineTemplate.Next;
|
||||
end;
|
||||
end else begin
|
||||
ADefineTemplate.InsertAfter(LastChild);
|
||||
ADefineTemplate.InsertBehind(LastChild);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TDefineTemplate.InsertAfter(APrior: TDefineTemplate);
|
||||
var ANode, LastSibling: TDefineTemplate;
|
||||
procedure TDefineTemplate.InsertBehind(APrior: TDefineTemplate);
|
||||
// insert this and all next siblings behind APrior
|
||||
var ANode, LastSibling, NewParent: TDefineTemplate;
|
||||
begin
|
||||
if APrior=nil then exit;
|
||||
NewParent:=APrior.Parent;
|
||||
if FParent<>nil then begin
|
||||
ANode:=Self;
|
||||
while ANode<>nil do begin
|
||||
dec(ANode.Parent.FChildCount);
|
||||
if ANode=APrior then raise Exception.Create('internal error: '
|
||||
+'TDefineTemplate.InsertBehind: APrior=ANode');
|
||||
dec(FParent.FChildCount);
|
||||
ANode.FParent:=nil;
|
||||
ANode:=ANode.Next;
|
||||
end;
|
||||
end;
|
||||
LastSibling:=Self;
|
||||
while LastSibling.Next<>nil do LastSibling:=LastSibling.Next;
|
||||
FPrior:=APrior;
|
||||
LastSibling.FNext:=APrior.Next;
|
||||
APrior.FNext:=Self;
|
||||
if LastSibling.Next<>nil then LastSibling.Next.FPrior:=LastSibling;
|
||||
FParent:=APrior.Parent;
|
||||
FParent:=NewParent;
|
||||
if Parent<>nil then begin
|
||||
ANode:=Self;
|
||||
while ANode<>nil do begin
|
||||
while (ANode<>nil) do begin
|
||||
ANode.FParent:=Parent;
|
||||
inc(ANode.Parent.FChildCount);
|
||||
inc(Parent.FChildCount);
|
||||
ANode:=ANode.Next;
|
||||
end;
|
||||
if Parent.LastChild=APrior then Parent.FLastChild:=LastSibling;
|
||||
end;
|
||||
FPrior:=APrior;
|
||||
LastSibling.FNext:=APrior.Next;
|
||||
APrior.FNext:=Self;
|
||||
if LastSibling.Next<>nil then LastSibling.Next.FPrior:=LastSibling;
|
||||
end;
|
||||
|
||||
procedure TDefineTemplate.InsertInFront(ANext: TDefineTemplate);
|
||||
// insert this and all next siblings in front of ANext
|
||||
var ANode, LastSibling: TDefineTemplate;
|
||||
begin
|
||||
if ANext=nil then exit;
|
||||
if FParent<>nil then begin
|
||||
ANode:=Self;
|
||||
while ANode<>nil do begin
|
||||
if ANode=ANext then raise Exception.Create('internal error: '
|
||||
+'TDefineTemplate.InsertInFront: ANext=ANode');
|
||||
dec(FParent.FChildCount);
|
||||
ANode.FParent:=nil;
|
||||
ANode:=ANode.Next;
|
||||
end;
|
||||
end;
|
||||
LastSibling:=Self;
|
||||
while LastSibling.Next<>nil do LastSibling:=LastSibling.Next;
|
||||
FParent:=ANext.Parent;
|
||||
if Parent<>nil then begin
|
||||
ANode:=Self;
|
||||
while ANode<>nil do begin
|
||||
ANode.FParent:=Parent;
|
||||
inc(Parent.FChildCount);
|
||||
ANode:=ANode.Next;
|
||||
end;
|
||||
if Parent.FirstChild=ANext then Parent.FFirstChild:=Self;
|
||||
end;
|
||||
FPrior:=ANext.Prior;
|
||||
if Prior<>nil then Prior.FNext:=Self;
|
||||
LastSibling.FNext:=ANext;
|
||||
ANext.FPrior:=LastSibling;
|
||||
end;
|
||||
|
||||
procedure TDefineTemplate.Assign(ADefineTemplate: TDefineTemplate;
|
||||
@ -452,7 +514,7 @@ begin
|
||||
NextTemplate:=ADefineTemplate.Next;
|
||||
if NextTemplate<>nil then begin
|
||||
CopyTemplate:=TDefineTemplate.Create;
|
||||
CopyTemplate.InsertAfter(Self);
|
||||
CopyTemplate.InsertBehind(Self);
|
||||
CopyTemplate.Assign(NextTemplate,WithSubNodes,true);
|
||||
end;
|
||||
end;
|
||||
@ -516,13 +578,13 @@ end;
|
||||
|
||||
function TDefineTemplate.LoadFromXMLConfig(XMLConfig: TXMLConfig;
|
||||
const Path: string): boolean;
|
||||
var ActionStr, IndexedPath: string;
|
||||
var IndexedPath: string;
|
||||
i, LvlCount: integer;
|
||||
DefTempl, LastDefTempl: TDefineTemplate;
|
||||
f: TDefineTemplateFlag;
|
||||
begin
|
||||
Clear;
|
||||
LvlCount:=XMLConfig.GetValue(Path+'/Count/Value',0);
|
||||
LvlCount:=XMLConfig.GetValue(Path+'Count/Value',0);
|
||||
DefTempl:=nil;
|
||||
for i:=0 to LvlCount-1 do begin
|
||||
if i=0 then begin
|
||||
@ -538,43 +600,22 @@ begin
|
||||
inc(DefTempl.FParent.FChildCount);
|
||||
end;
|
||||
end;
|
||||
IndexedPath:=Path+'/'+IntToStr(i);
|
||||
DefTempl.Name:=XMLConfig.GetValue(IndexedPath+'/Name/Value','no name');
|
||||
DefTempl.Description:=XMLConfig.GetValue(IndexedPath+'/Description/Value','');
|
||||
DefTempl.Value:=XMLConfig.GetValue(IndexedPath+'/Value/Value','');
|
||||
DefTempl.Variable:=XMLConfig.GetValue(IndexedPath+'/Variable/Value','');
|
||||
ActionStr:=UpperCaseStr(XMLConfig.GetValue(IndexedPath+'/Action/Value',''));
|
||||
if ActionStr='BLOCK' then
|
||||
Action:=da_Block
|
||||
else if ActionStr='DEFINE' then
|
||||
Action:=da_Define
|
||||
else if ActionStr='UNDEFINE' then
|
||||
Action:=da_Undefine
|
||||
else if ActionStr='DEFINEALL' then
|
||||
Action:=da_DefineAll
|
||||
else if ActionStr='IF' then
|
||||
Action:=da_If
|
||||
else if ActionStr='IFDEF' then
|
||||
Action:=da_IfDef
|
||||
else if ActionStr='IFNDEF' then
|
||||
Action:=da_IfNDef
|
||||
else if ActionStr='ELSEIF' then
|
||||
Action:=da_ElseIf
|
||||
else if ActionStr='ELSE' then
|
||||
Action:=da_Else
|
||||
else if ActionStr='DIRECTORY' then
|
||||
Action:=da_Directory
|
||||
else
|
||||
Action:=da_None;
|
||||
IndexedPath:=Path+IntToStr(i)+'/';
|
||||
DefTempl.Name:=XMLConfig.GetValue(IndexedPath+'Name/Value','no name');
|
||||
DefTempl.Description:=XMLConfig.GetValue(IndexedPath+'Description/Value','');
|
||||
DefTempl.Value:=XMLConfig.GetValue(IndexedPath+'Value/Value','');
|
||||
DefTempl.Variable:=XMLConfig.GetValue(IndexedPath+'Variable/Value','');
|
||||
DefTempl.Action:=DefineActionNameToAction(
|
||||
XMLConfig.GetValue(IndexedPath+'Action/Value',''));
|
||||
Flags:=[];
|
||||
for f:=Low(TDefineTemplateFlag) to High(TDefineTemplateFlag) do begin
|
||||
if XMLConfig.GetValue(IndexedPath+'/Flags/'+DefineTemplateFlagNames[f]
|
||||
if XMLConfig.GetValue(IndexedPath+'Flags/'+DefineTemplateFlagNames[f]
|
||||
+'/Value',false)
|
||||
then
|
||||
Include(Flags,f);
|
||||
end;
|
||||
// load childs
|
||||
if XMLConfig.GetValue(IndexedPath+'/Count/Value',0)>0 then begin
|
||||
if XMLConfig.GetValue(IndexedPath+'Count/Value',0)>0 then begin
|
||||
FFirstChild:=TDefineTemplate.Create;
|
||||
if not FFirstChild.LoadFromXMLConfig(XMLConfig,IndexedPath) then begin
|
||||
Result:=false; exit;
|
||||
@ -586,7 +627,7 @@ end;
|
||||
|
||||
procedure TDefineTemplate.SaveToXMLConfig(XMLConfig: TXMLConfig;
|
||||
const Path: string);
|
||||
var ActionStr, IndexedPath: string;
|
||||
var IndexedPath: string;
|
||||
Index, LvlCount: integer;
|
||||
DefTempl: TDefineTemplate;
|
||||
f: TDefineTemplateFlag;
|
||||
@ -601,28 +642,15 @@ begin
|
||||
DefTempl:=Self;
|
||||
Index:=1;
|
||||
repeat
|
||||
IndexedPath:=Path+'/'+IntToStr(Index);
|
||||
XMLConfig.SetValue(IndexedPath+'/Name/Value',DefTempl.Name);
|
||||
XMLConfig.SetValue(IndexedPath+'/Description/Value',DefTempl.Description);
|
||||
XMLConfig.SetValue(IndexedPath+'/Value/Value',DefTempl.Value);
|
||||
XMLConfig.SetValue(IndexedPath+'/Variable/Value',DefTempl.Variable);
|
||||
case DefTempl.Action of
|
||||
da_Block : ActionStr:='Block';
|
||||
da_Define : ActionStr:='Define';
|
||||
da_Undefine : ActionStr:='Undefine';
|
||||
da_DefineAll : ActionStr:='DefineAll';
|
||||
da_If : ActionStr:='If';
|
||||
da_IfDef : ActionStr:='IfDef';
|
||||
da_IfNDef : ActionStr:='IfNDef';
|
||||
da_ElseIf : ActionStr:='ElseIf';
|
||||
da_Else : ActionStr:='Else';
|
||||
da_Directory : ActionStr:='Directory';
|
||||
else
|
||||
ActionStr:='None';
|
||||
end;
|
||||
XMLConfig.SetValue(IndexedPath+'/Action/Value',ActionStr);
|
||||
IndexedPath:=Path+IntToStr(Index)+'/';
|
||||
XMLConfig.SetValue(IndexedPath+'Name/Value',DefTempl.Name);
|
||||
XMLConfig.SetValue(IndexedPath+'Description/Value',DefTempl.Description);
|
||||
XMLConfig.SetValue(IndexedPath+'Value/Value',DefTempl.Value);
|
||||
XMLConfig.SetValue(IndexedPath+'Variable/Value',DefTempl.Variable);
|
||||
XMLConfig.SetValue(IndexedPath+'Action/Value',
|
||||
DefineActionNames[DefTempl.Action]);
|
||||
for f:=Low(TDefineTemplateFlag) to High(TDefineTemplateFlag) do begin
|
||||
XMLConfig.SetValue(IndexedPath+'/Flags/'+DefineTemplateFlagNames[f]
|
||||
XMLConfig.SetValue(IndexedPath+'Flags/'+DefineTemplateFlagNames[f]
|
||||
+'/Value',f in Flags);
|
||||
end;
|
||||
// save childs
|
||||
@ -683,20 +711,7 @@ procedure TDefineTemplate.WriteDebugReport;
|
||||
var ActionStr: string;
|
||||
begin
|
||||
if ANode=nil then exit;
|
||||
case ANode.Action of
|
||||
da_Block : ActionStr:='Block';
|
||||
da_Define : ActionStr:='Define';
|
||||
da_Undefine : ActionStr:='Undefine';
|
||||
da_DefineAll : ActionStr:='DefineAll';
|
||||
da_If : ActionStr:='If';
|
||||
da_IfDef : ActionStr:='IfDef';
|
||||
da_IfNDef : ActionStr:='IfNDef';
|
||||
da_ElseIf : ActionStr:='ElseIf';
|
||||
da_Else : ActionStr:='Else';
|
||||
da_Directory : ActionStr:='Directory';
|
||||
else
|
||||
ActionStr:='None';
|
||||
end;
|
||||
ActionStr:=DefineActionNames[ANode.Action];
|
||||
writeln(Prefix,'Self=',HexStr(Cardinal(ANode),8),
|
||||
' Consistency=',ANode.ConsistencyCheck,
|
||||
' Next=',HexStr(Cardinal(ANode.Next),8),
|
||||
@ -778,10 +793,31 @@ end;
|
||||
|
||||
function TDefineTemplate.FindChildByName(const AName: string): TDefineTemplate;
|
||||
begin
|
||||
Result:=FirstChild;
|
||||
while Result<>nil do begin
|
||||
if AnsiCompareText(Result.Name,AName)=0 then exit;
|
||||
Result:=Result.Next;
|
||||
if FirstChild<>nil then begin
|
||||
Result:=FirstChild.FindByName(AName,false,true)
|
||||
end else
|
||||
Result:=nil;
|
||||
end;
|
||||
|
||||
function TDefineTemplate.FindByName(const AName: string; WithSubChilds,
|
||||
WithNextSiblings: boolean): TDefineTemplate;
|
||||
var ANode: TDefineTemplate;
|
||||
begin
|
||||
if AnsiCompareText(AName,Name)=0 then begin
|
||||
Result:=Self;
|
||||
end else begin
|
||||
if WithSubChilds and (FirstChild<>nil) then
|
||||
Result:=FirstChild.FindByName(AName,true,true)
|
||||
else
|
||||
Result:=nil;
|
||||
if (Result=nil) and WithNextSiblings then begin
|
||||
ANode:=Next;
|
||||
while (ANode<>nil) do begin
|
||||
Result:=ANode.FindByName(AName,WithSubChilds,false);
|
||||
if Result<>nil then break;
|
||||
ANode:=ANode.Next;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -1042,30 +1078,36 @@ var
|
||||
case DefTempl.Action of
|
||||
da_Block:
|
||||
// calculate children
|
||||
begin
|
||||
CalculateTemplate(DefTempl.FirstChild,CurPath);
|
||||
end;
|
||||
CalculateTemplate(DefTempl.FirstChild,CurPath);
|
||||
|
||||
da_Define:
|
||||
// Define for a single Directory (not SubDirs)
|
||||
begin
|
||||
if FilenameIsMatching(CurPath,ExpandedDirectory,true) then begin
|
||||
DirDef.Values.Variables[DefTempl.Variable]:=
|
||||
ReadValue(DefTempl.Value);
|
||||
end;
|
||||
end;
|
||||
da_Undefine:
|
||||
// Undefine for a single Directory (not SubDirs)
|
||||
begin
|
||||
if FilenameIsMatching(CurPath,ExpandedDirectory,true) then begin
|
||||
DirDef.Values.Undefine(DefTempl.Variable);
|
||||
end;
|
||||
end;
|
||||
da_DefineAll:
|
||||
begin
|
||||
// Define for current and sub directories
|
||||
if FilenameIsMatching(CurPath,ExpandedDirectory,true) then begin
|
||||
DirDef.Values.Variables[DefTempl.Variable]:=
|
||||
ReadValue(DefTempl.Value);
|
||||
end;
|
||||
|
||||
da_DefineRecurse:
|
||||
// Define for current and sub directories
|
||||
DirDef.Values.Variables[DefTempl.Variable]:=
|
||||
ReadValue(DefTempl.Value);
|
||||
|
||||
da_Undefine:
|
||||
// Undefine for a single Directory (not SubDirs)
|
||||
if FilenameIsMatching(CurPath,ExpandedDirectory,true) then begin
|
||||
DirDef.Values.Undefine(DefTempl.Variable);
|
||||
end;
|
||||
|
||||
da_UndefineRecurse:
|
||||
// Undefine for current and sub directories
|
||||
DirDef.Values.Undefine(DefTempl.Variable);
|
||||
|
||||
da_UndefineAll:
|
||||
// Undefine every value for current and sub directories
|
||||
begin
|
||||
DirDef.Values.Clear;
|
||||
end;
|
||||
|
||||
da_If, da_ElseIf:
|
||||
begin
|
||||
// test expression in value
|
||||
@ -1080,22 +1122,19 @@ var
|
||||
end;
|
||||
end;
|
||||
da_IfDef:
|
||||
begin
|
||||
// test if variable is defined
|
||||
if DirDef.Values.IsDefined(DefTempl.Variable) then
|
||||
CalculateIfChilds;
|
||||
end;
|
||||
// test if variable is defined
|
||||
if DirDef.Values.IsDefined(DefTempl.Variable) then
|
||||
CalculateIfChilds;
|
||||
|
||||
da_IfNDef:
|
||||
begin
|
||||
// test if variable is not defined
|
||||
if not DirDef.Values.IsDefined(DefTempl.Variable) then
|
||||
CalculateIfChilds;
|
||||
end;
|
||||
// test if variable is not defined
|
||||
if not DirDef.Values.IsDefined(DefTempl.Variable) then
|
||||
CalculateIfChilds;
|
||||
|
||||
da_Else:
|
||||
begin
|
||||
// execute childs
|
||||
CalculateTemplate(DefTempl.FirstChild,CurPath);
|
||||
end;
|
||||
// execute childs
|
||||
CalculateTemplate(DefTempl.FirstChild,CurPath);
|
||||
|
||||
da_Directory:
|
||||
begin
|
||||
// template for a sub directory
|
||||
@ -1164,7 +1203,7 @@ begin
|
||||
LastDefTempl:=RootTemplate;
|
||||
while LastDefTempl.Next<>nil do
|
||||
LastDefTempl:=LastDefTempl.Next;
|
||||
ADefineTemplate.InsertAfter(LastDefTempl);
|
||||
ADefineTemplate.InsertBehind(LastDefTempl);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -1175,23 +1214,25 @@ begin
|
||||
if RootTemplate=nil then
|
||||
RootTemplate:=ADefineTemplate
|
||||
else begin
|
||||
RootTemplate.InsertAfter(ADefineTemplate);
|
||||
RootTemplate.InsertBehind(ADefineTemplate);
|
||||
RootTemplate:=ADefineTemplate;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TDefineTree.FindDefineTemplateByName(
|
||||
const AName: string): TDefineTemplate;
|
||||
const AName: string; OnlyRoots: boolean): TDefineTemplate;
|
||||
begin
|
||||
Result:=RootTemplate;
|
||||
while (Result<>nil) and (AnsiCompareText(Result.Name,AName)<>0) do
|
||||
Result:=Result.Next;
|
||||
if RootTemplate<>nil then
|
||||
Result:=RootTemplate.FindByName(AName,not OnlyRoots,true)
|
||||
else
|
||||
Result:=nil;
|
||||
end;
|
||||
|
||||
procedure TDefineTree.RemoveDefineTemplateByName(const AName: string);
|
||||
procedure TDefineTree.RemoveRootDefineTemplateByName(const AName: string);
|
||||
var ADefTempl: TDefineTemplate;
|
||||
begin
|
||||
ADefTempl:=FindDefineTemplateByName(AName);
|
||||
ADefTempl:=FindDefineTemplateByName(AName,true);
|
||||
if ADefTempl<>nil then begin
|
||||
if ADefTempl=FFirstDefineTemplate then
|
||||
FFirstDefineTemplate:=FFirstDefineTemplate.Next;
|
||||
@ -1200,18 +1241,32 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TDefineTree.ReplaceSameName(ADefineTemplate: TDefineTemplate);
|
||||
function TDefineTree.ExtractDefineTree(ProjectSpecific: boolean): TDefineTree;
|
||||
var ARootNode, NewRootNode: TDefineTemplate;
|
||||
begin
|
||||
Result:=TDefineTree.Create;
|
||||
ARootNode:=RootTemplate;
|
||||
while ARootNode<>nil do begin
|
||||
if (not ARootNode.IsAutoGenerated) then begin
|
||||
//NewRootNode:=ARootNode.ExtractCopy(ProjectSpecific);
|
||||
|
||||
end;
|
||||
ARootNode:=ARootNode.Next;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TDefineTree.ReplaceRootSameName(ADefineTemplate: TDefineTemplate);
|
||||
// if there is a DefineTemplate with the same name then replace it
|
||||
// else add as last
|
||||
var OldDefineTemplate: TDefineTemplate;
|
||||
begin
|
||||
if (ADefineTemplate=nil) then exit;
|
||||
OldDefineTemplate:=FindDefineTemplateByName(ADefineTemplate.Name);
|
||||
OldDefineTemplate:=FindDefineTemplateByName(ADefineTemplate.Name,true);
|
||||
if OldDefineTemplate<>nil then begin
|
||||
if not OldDefineTemplate.IsEqual(ADefineTemplate,true,false) then begin
|
||||
ClearCache;
|
||||
end;
|
||||
ADefineTemplate.InsertAfter(OldDefineTemplate);
|
||||
ADefineTemplate.InsertBehind(OldDefineTemplate);
|
||||
if OldDefineTemplate=FFirstDefineTemplate then
|
||||
FFirstDefineTemplate:=FFirstDefineTemplate.Next;
|
||||
OldDefineTemplate.Unbind;
|
||||
@ -1220,16 +1275,17 @@ begin
|
||||
Add(ADefineTemplate);
|
||||
end;
|
||||
|
||||
procedure TDefineTree.ReplaceSameNameAddFirst(ADefineTemplate: TDefineTemplate);
|
||||
procedure TDefineTree.ReplaceRootSameNameAddFirst(
|
||||
ADefineTemplate: TDefineTemplate);
|
||||
var OldDefineTemplate: TDefineTemplate;
|
||||
begin
|
||||
if ADefineTemplate=nil then exit;
|
||||
OldDefineTemplate:=FindDefineTemplateByName(ADefineTemplate.Name);
|
||||
OldDefineTemplate:=FindDefineTemplateByName(ADefineTemplate.Name,true);
|
||||
if OldDefineTemplate<>nil then begin
|
||||
if not OldDefineTemplate.IsEqual(ADefineTemplate,true,false) then begin
|
||||
ClearCache;
|
||||
end;
|
||||
ADefineTemplate.InsertAfter(OldDefineTemplate);
|
||||
ADefineTemplate.InsertBehind(OldDefineTemplate);
|
||||
if OldDefineTemplate=FFirstDefineTemplate then
|
||||
FFirstDefineTemplate:=FFirstDefineTemplate.Next;
|
||||
OldDefineTemplate.Unbind;
|
||||
@ -1334,7 +1390,7 @@ function TDefinePool.CreateFPCTemplate(
|
||||
if copy(UpLine,1,15)='MACRO DEFINED: ' then begin
|
||||
MacroName:=copy(UpLine,16,length(Line)-15);
|
||||
NewDefTempl:=TDefineTemplate.Create('Define '+MacroName,
|
||||
'Default ppc386 macro',MacroName,'',da_DefineAll);
|
||||
'Default ppc386 macro',MacroName,'',da_DefineRecurse);
|
||||
end else if copy(UpLine,1,6)='MACRO ' then begin
|
||||
Line:=copy(Line,7,length(Line)-6);
|
||||
i:=1;
|
||||
@ -1345,14 +1401,14 @@ function TDefinePool.CreateFPCTemplate(
|
||||
if copy(Line,1,7)='set to ' then begin
|
||||
MacroValue:=copy(Line,8,length(Line)-7);
|
||||
NewDefTempl:=TDefineTemplate.Create('Define '+MacroName,
|
||||
'Default ppc386 macro',MacroName,MacroValue,da_DefineAll);
|
||||
'Default ppc386 macro',MacroName,MacroValue,da_DefineRecurse);
|
||||
end;
|
||||
end else if copy(UpLine,1,17)='USING UNIT PATH: ' then begin
|
||||
UnitSearchPath:=UnitSearchPath+copy(Line,18,length(Line)-17)+#13;
|
||||
end;
|
||||
if NewDefTempl<>nil then begin
|
||||
if LastDefTempl<>nil then
|
||||
NewDefTempl.InsertAfter(LastDefTempl);
|
||||
NewDefTempl.InsertBehind(LastDefTempl);
|
||||
LastDefTempl:=NewDefTempl;
|
||||
end;
|
||||
end;
|
||||
@ -1432,9 +1488,9 @@ begin
|
||||
TargetOS:=copy(Buf,1,i-1);
|
||||
NewDefTempl:=TDefineTemplate.Create('Define TargetOS',
|
||||
'Default ppc386 target Operating System',
|
||||
ExternalMacroStart+'TargetOS',TargetOS,da_DefineAll);
|
||||
ExternalMacroStart+'TargetOS',TargetOS,da_DefineRecurse);
|
||||
if DefTempl<>nil then
|
||||
NewDefTempl.InsertAfter(DefTempl);
|
||||
NewDefTempl.InsertBehind(DefTempl);
|
||||
DefTempl:=NewDefTempl;
|
||||
if TargetOS='linux' then
|
||||
SrcOS:='unix'
|
||||
@ -1442,9 +1498,9 @@ begin
|
||||
SrcOS:=TargetOS;
|
||||
NewDefTempl:=TDefineTemplate.Create('Define SrcOS',
|
||||
'Default ppc386 source Operating System',
|
||||
ExternalMacroStart+'SrcOS',SrcOS,da_DefineAll);
|
||||
ExternalMacroStart+'SrcOS',SrcOS,da_DefineRecurse);
|
||||
if DefTempl<>nil then
|
||||
NewDefTempl.InsertAfter(DefTempl);
|
||||
NewDefTempl.InsertBehind(DefTempl);
|
||||
DefTempl:=NewDefTempl;
|
||||
break;
|
||||
end;
|
||||
@ -1472,9 +1528,9 @@ begin
|
||||
TargetProcessor:=copy(Buf,1,i-1);
|
||||
NewDefTempl:=TDefineTemplate.Create('Define TargetProcessor',
|
||||
'Default ppc386 target Operating System',
|
||||
ExternalMacroStart+'TargetProcessor',TargetProcessor,da_DefineAll);
|
||||
ExternalMacroStart+'TargetProcessor',TargetProcessor,da_DefineRecurse);
|
||||
if DefTempl<>nil then
|
||||
NewDefTempl.InsertAfter(DefTempl);
|
||||
NewDefTempl.InsertBehind(DefTempl);
|
||||
DefTempl:=NewDefTempl;
|
||||
break;
|
||||
end;
|
||||
@ -1770,7 +1826,7 @@ begin
|
||||
FindStandardPPUSources;
|
||||
DefTempl:=TDefineTemplate.Create('FPC Unit Links',
|
||||
'Source filenames for the standard fpc units',
|
||||
UnitLinks,UnitLinkList,da_DefineAll);
|
||||
UnitLinks,UnitLinkList,da_DefineRecurse);
|
||||
Result.AddChild(DefTempl);
|
||||
|
||||
// The free pascal sources build a world of their own,
|
||||
@ -1781,7 +1837,7 @@ begin
|
||||
Result.AddChild(MainDir);
|
||||
DefTempl:=TDefineTemplate.Create('Reset SrcPath',
|
||||
'SrcPath Init',
|
||||
ExternalMacroStart+'SrcPath','',da_DefineAll);
|
||||
ExternalMacroStart+'SrcPath','',da_DefineRecurse);
|
||||
MainDir.AddChild(DefTempl);
|
||||
|
||||
// compiler
|
||||
@ -1801,7 +1857,7 @@ begin
|
||||
s:=s+';'+Dir+'rtl'+DS+TargetOS+DS;
|
||||
RTLDir.AddChild(TDefineTemplate.Create('Include Path',
|
||||
'include directory objpas, inc, processor specific',
|
||||
ExternalMacroStart+'IncPath',s,da_DefineAll));
|
||||
ExternalMacroStart+'IncPath',s,da_DefineRecurse));
|
||||
|
||||
// fcl
|
||||
FCLDir:=TDefineTemplate.Create('FCL','Free Pascal Component Library','','fcl',
|
||||
@ -1812,7 +1868,7 @@ begin
|
||||
ExternalMacroStart+'IncPath',
|
||||
IncPathMacro
|
||||
+';'+Dir+'fcl/inc/'
|
||||
,da_DefineAll));
|
||||
,da_DefineRecurse));
|
||||
|
||||
// packages
|
||||
PackagesDir:=TDefineTemplate.Create('Packages','Package directories','',
|
||||
@ -1883,7 +1939,7 @@ begin
|
||||
'','interfaces',da_Directory);
|
||||
SubDirTempl.AddChild(TDefineTemplate.Create('LCL Path',
|
||||
'adds lcl to SrcPath',ExternalMacroStart+'SrcPath',
|
||||
LazarusSrcDir+ds+'lcl;'+SrcPath,da_DefineAll));
|
||||
LazarusSrcDir+ds+'lcl;'+SrcPath,da_DefineRecurse));
|
||||
DirTempl.AddChild(SubDirTempl);
|
||||
|
||||
// components
|
||||
@ -1894,7 +1950,7 @@ begin
|
||||
LazarusSrcDir+ds+'lcl'
|
||||
+';'+LazarusSrcDir+ds+'lcl'+ds+'interfaces'+ds+WidgetType
|
||||
+';'+SrcPath
|
||||
,da_DefineAll));
|
||||
,da_DefineRecurse));
|
||||
MainDir.AddChild(DirTempl);
|
||||
|
||||
// tools
|
||||
@ -1947,7 +2003,7 @@ begin
|
||||
'..'+ds+'lcl'
|
||||
+';..'+ds+'lcl'+ds+'interfaces'+ds+WidgetType
|
||||
+';'+SrcPath
|
||||
,da_DefineAll));
|
||||
,da_DefineRecurse));
|
||||
|
||||
if MainDir<>nil then begin
|
||||
Result:=TDefineTemplate.Create(StdDefTemplLazarusSources,
|
||||
@ -1971,7 +2027,7 @@ begin
|
||||
+LazarusSrcDir+PathDelim+'lcl'+PathDelim+'interfaces'
|
||||
+PathDelim+WidgetType
|
||||
+';$('+ExternalMacroStart+'SrcPath)'
|
||||
,da_DefineAll));
|
||||
,da_DefineRecurse));
|
||||
Result:=TDefineTemplate.Create(StdDefTemplLCLProject,
|
||||
'LCL Project','','',da_Block);
|
||||
Result.Flags:=[dtfAutoGenerated];
|
||||
|
@ -247,7 +247,7 @@
|
||||
+'. . . . . . . . . . . . . . . . . . . . ",'#10'". . . . . . . . . . . . '
|
||||
+'. . . . . . . . . . "};'#10
|
||||
);
|
||||
LazarusResources.Add('defineall_22x22','XPM',
|
||||
LazarusResources.Add('definerecurse_22x22','XPM',
|
||||
'/* XPM */'#10'static char * defineall_22x22_xpm[] = {'#10'"22 22 144 2",'
|
||||
+#10'" '#9'c None",'#10'". '#9'c #FFFFFF",'#10'"+ '#9'c #FFF9F9",'#10'"@ '
|
||||
+#9'c #FFD9D9",'#10'"# '#9'c #F5F5F5",'#10'"$ '#9'c #C7C7C7",'#10'"% '#9'c'
|
||||
@ -658,3 +658,142 @@
|
||||
+'. . . . . . . . . . . . . . ",'#10'". . . . . . . . . . . . . . . . . . '
|
||||
+'. . . . "};'#10
|
||||
);
|
||||
LazarusResources.Add('undefineall_22x22','XPM',
|
||||
'/* XPM */'#10'static char * undefineall_22x22_xpm[] = {'#10'"22 22 132 2"'
|
||||
+','#10'" '#9'c None",'#10'". '#9'c #FFFFFF",'#10'"+ '#9'c #EBE5E5",'#10
|
||||
+'"@ '#9'c #FEB0B0",'#10'"# '#9'c #FFBCBC",'#10'"$ '#9'c #FFFDFD",'#10'"% '
|
||||
+#9'c #A3A3A3",'#10'"& '#9'c #665555",'#10'"* '#9'c #F24343",'#10'"= '#9'c'
|
||||
+' #FF1F1F",'#10'"- '#9'c #FF4343",'#10'"; '#9'c #FF6B6B",'#10'"> '#9'c #F'
|
||||
+'FABAB",'#10'", '#9'c #FFE4E4",'#10'"'' '#9'c #E2E7FE",'#10'") '#9'c #153'
|
||||
+'BF7",'#10'"! '#9'c #BEBEBE",'#10'"~ '#9'c #493535",'#10'"{ '#9'c #763096'
|
||||
+'",'#10'"] '#9'c #BD174C",'#10'"^ '#9'c #FF1919",'#10'"/ '#9'c #FF2424",'
|
||||
+#10'"( '#9'c #FF2323",'#10'"_ '#9'c #FF4040",'#10'": '#9'c #FF9292",'#10
|
||||
+'"< '#9'c #4563F9",'#10'"[ '#9'c #0A32F7",'#10'"} '#9'c #D2D2D2",'#10'"| '
|
||||
+#9'c #473535",'#10'"1 '#9'c #2F31D4",'#10'"2 '#9'c #0A31F6",'#10'"3 '#9'c'
|
||||
+' #1830EA",'#10'"4 '#9'c #E22239",'#10'"5 '#9'c #FF2222",'#10'"6 '#9'c #F'
|
||||
+'F1A1A",'#10'"7 '#9'c #FF4444",'#10'"8 '#9'c #FFE8E8",'#10'"9 '#9'c #1233'
|
||||
+'F2",'#10'"0 '#9'c #213DF0",'#10'"a '#9'c #403A3A",'#10'"b '#9'c #E06767"'
|
||||
+','#10'"c '#9'c #BD1D52",'#10'"d '#9'c #0F30F1",'#10'"e '#9'c #70299C",'
|
||||
+#10'"f '#9'c #FF5959",'#10'"g '#9'c #EA2F2F",'#10'"h '#9'c #FF0E0E",'#10
|
||||
+'"i '#9'c #93247B",'#10'"j '#9'c #0931F7",'#10'"k '#9'c #BD275C",'#10'"l '
|
||||
+#9'c #D3D3D3",'#10'"m '#9'c #404040",'#10'"n '#9'c #DED6D6",'#10'"o '#9'c'
|
||||
+' #FFD2D2",'#10'"p '#9'c #F99CA1",'#10'"q '#9'c #3638DA",'#10'"r '#9'c #1'
|
||||
+'F2DE1",'#10'"s '#9'c #F93D41",'#10'"t '#9'c #FFEAEA",'#10'"u '#9'c #E62F'
|
||||
+'2F",'#10'"v '#9'c #F90E13",'#10'"w '#9'c #0E31F3",'#10'"x '#9'c #2B2FD9"'
|
||||
+','#10'"y '#9'c #C1C1C1",'#10'"z '#9'c #3E3E3E",'#10'"A '#9'c #E0E0E0",'
|
||||
+#10'"B '#9'c #858CED",'#10'"C '#9'c #0E33F5",'#10'"D '#9'c #1336F4",'#10
|
||||
+'"E '#9'c #D1D8FD",'#10'"F '#9'c #2D2DD6",'#10'"G '#9'c #0B31F5",'#10'"H '
|
||||
+#9'c #E2142B",'#10'"I '#9'c #B3B3B3",'#10'"J '#9'c #414141",'#10'"K '#9'c'
|
||||
+' #E3E3E3",'#10'"L '#9'c #0F36F7",'#10'"M '#9'c #ADB5DA",'#10'"N '#9'c #6'
|
||||
+'276E9",'#10'"O '#9'c #9F74C2",'#10'"P '#9'c #FF0606",'#10'"Q '#9'c #FF3D'
|
||||
+'3D",'#10'"R '#9'c #424242",'#10'"S '#9'c #FFFBFB",'#10'"T '#9'c #1339F7"'
|
||||
+','#10'"U '#9'c #1634C8",'#10'"V '#9'c #405FF9",'#10'"W '#9'c #FFA8A8",'
|
||||
+#10'"X '#9'c #FFA9A9",'#10'"Y '#9'c #B8B8B8",'#10'"Z '#9'c #494949",'#10
|
||||
+'"` '#9'c #E5E5E5",'#10'" .'#9'c #F9A8AD",'#10'"..'#9'c #2646F5",'#10'"+.'
|
||||
+#9'c #193EF5",'#10'"@.'#9'c #E7E7E7",'#10'"#.'#9'c #0C32F6",'#10'"$.'#9'c'
|
||||
+' #7087FA",'#10'"%.'#9'c #FF0D0D",'#10'"&.'#9'c #D12348",'#10'"*.'#9'c #0'
|
||||
+'D31F4",'#10'"=.'#9'c #1230EF",'#10'"-.'#9'c #F94448",'#10'";.'#9'c #405A'
|
||||
+'F4",'#10'">.'#9'c #FF1616",'#10'",.'#9'c #1830E9",'#10'"''.'#9'c #F91B1F'
|
||||
+'",'#10'").'#9'c #5873FA",'#10'"!.'#9'c #9F93E1",'#10'"~.'#9'c #0D33F6",'
|
||||
+#10'"{.'#9'c #0F32F3",'#10'"].'#9'c #F92328",'#10'"^.'#9'c #FFE9E9",'#10
|
||||
+'"/.'#9'c #6981FA",'#10'"(.'#9'c #B8BFE4",'#10'"_.'#9'c #0E35F7",'#10'":.'
|
||||
+#9'c #F9FAFF",'#10'"<.'#9'c #3657F8",'#10'"[.'#9'c #363E63",'#10'"}.'#9'c'
|
||||
+' #0C34F7",'#10'"|.'#9'c #1238F7",'#10'"1.'#9'c #5C76FA",'#10'"2.'#9'c #8'
|
||||
+'690C5",'#10'"3.'#9'c #0A31F4",'#10'"4.'#9'c #1037F6",'#10'"5.'#9'c #4D6A'
|
||||
+'F9",'#10'"6.'#9'c #5A75FA",'#10'"7.'#9'c #1339F3",'#10'"8.'#9'c #0B32F2"'
|
||||
+','#10'"9.'#9'c #CBD0E7",'#10'"0.'#9'c #C2C8EA",'#10'"a.'#9'c #AFB0B5",'
|
||||
+#10'". . . . . . . . . . . . . . . . . . . . . . ",'#10'". . + @ # $ . . '
|
||||
+'. . . . . . . . . . . . . . ",'#10'". % & * = - ; > , . . . . . . . '' )'
|
||||
+' . . . . ",'#10'". ! ~ { ] ^ / ( _ : . . + @ # $ < [ . . . . ",'#10'". }'
|
||||
+' | 1 2 3 4 5 6 7 8 % & * = - 9 0 , . . . ",'#10'". } a b c d 2 e 6 f . !'
|
||||
+' ~ g h i j k _ : . . ",'#10'". l m n o p q j r s t } | u v w x 5 6 7 8 .'
|
||||
+' ",'#10'". y z A . . . B C D E } a b F G H = 6 f . . ",'#10'". I J K . .'
|
||||
+' . . E L L M m N j O f ( P Q t . ",'#10'". I R K . + @ # S E T [ U [ V .'
|
||||
+' . , W X . . ",'#10'". Y Z ` % & * = - ; ...j +.. . . . . . . . ",'#10
|
||||
+'". @.I . ! ~ g h ^ / k w #.[ $.. . . . . . . ",'#10'". . . . } | u %./ &'
|
||||
+'.*.=.-.;.j $.. . . . . . ",'#10'". . . . } a b >.v G ,.''.f . V j ).. . '
|
||||
+'. . . ",'#10'". . . . l m n !.~.{.].P Q ^.. ).j /.. . . . ",'#10'". . . '
|
||||
+'. y z (._.) :., W X . . . /.j <.. . . ",'#10'". . . . I [.}.|.:.. . . . '
|
||||
+'. . . . $.j 1.. . ",'#10'". . . . 2.3.4.'' . . . . . . . . . . 5.6.. . "'
|
||||
+','#10'". . . . 7.8.9.. . . . . . . . . . . . . . . ",'#10'". . . . 0.a..'
|
||||
+' . . . . . . . . . . . . . . . ",'#10'". . . . . . . . . . . . . . . . .'
|
||||
+' . . . . . ",'#10'". . . . . . . . . . . . . . . . . . . . . . "};'#10
|
||||
);
|
||||
LazarusResources.Add('undefinerecurse_22x22','XPM',
|
||||
'/* XPM */'#10'static char * undefinerecurse_22x22_xpm[] = {'#10'"22 22 18'
|
||||
+'4 2",'#10'" '#9'c None",'#10'". '#9'c #FFFFFF",'#10'"+ '#9'c #FFF9F9",'
|
||||
+#10'"@ '#9'c #FFD9D9",'#10'"# '#9'c #F5F5F5",'#10'"$ '#9'c #C7C7C7",'#10
|
||||
+'"% '#9'c #F6CDCD",'#10'"& '#9'c #FF5656",'#10'"* '#9'c #FF4949",'#10'"= '
|
||||
+#9'c #FF9B9B",'#10'"- '#9'c #FFC5C5",'#10'"; '#9'c #FFEDED",'#10'"> '#9'c'
|
||||
+' #FFFDFD",'#10'", '#9'c #6D7FF2",'#10'"'' '#9'c #0423EA",'#10'") '#9'c #'
|
||||
+'A0A6CF",'#10'"! '#9'c #22308B",'#10'"~ '#9'c #373737",'#10'"{ '#9'c #D49'
|
||||
+'595",'#10'"] '#9'c #FF2828",'#10'"^ '#9'c #FF0E0E",'#10'"/ '#9'c #FF1D1D'
|
||||
+'",'#10'"( '#9'c #FF3232",'#10'"_ '#9'c #FF6767",'#10'": '#9'c #FF8484",'
|
||||
+#10'"< '#9'c #FFA6A6",'#10'"[ '#9'c #7671DE",'#10'"} '#9'c #3C54EE",'#10
|
||||
+'"| '#9'c #D4D9FB",'#10'"1 '#9'c #0925E7",'#10'"2 '#9'c #3323C4",'#10'"3 '
|
||||
+#9'c #E11229",'#10'"4 '#9'c #FF0D0D",'#10'"5 '#9'c #FF0F0F",'#10'"6 '#9'c'
|
||||
+' #FF0707",'#10'"7 '#9'c #FF0000",'#10'"8 '#9'c #BC184D",'#10'"9 '#9'c #0'
|
||||
+'423E9",'#10'"0 '#9'c #2430DD",'#10'"a '#9'c #FFAEAE",'#10'"b '#9'c #FFE5'
|
||||
+'E5",'#10'"c '#9'c #FFFCFC",'#10'"d '#9'c #F9F9FE",'#10'"e '#9'c #EFEFEF"'
|
||||
+','#10'"f '#9'c #6C6C6C",'#10'"g '#9'c #060F44",'#10'"h '#9'c #182BD9",'
|
||||
+#10'"i '#9'c #0922E5",'#10'"j '#9'c #0422E9",'#10'"k '#9'c #1C1FD3",'#10
|
||||
+'"l '#9'c #CF1137",'#10'"m '#9'c #FF2424",'#10'"n '#9'c #F93C41",'#10'"o '
|
||||
+#9'c #0923E5",'#10'"p '#9'c #1321DB",'#10'"q '#9'c #FF1414",'#10'"r '#9'c'
|
||||
+' #FF1A1A",'#10'"s '#9'c #FF5B5B",'#10'"t '#9'c #FFF1F1",'#10'"u '#9'c #F'
|
||||
+'DFDFD",'#10'"v '#9'c #7E7E7E",'#10'"w '#9'c #000000",'#10'"x '#9'c #A75C'
|
||||
+'5C",'#10'"y '#9'c #751C89",'#10'"z '#9'c #0B23E3",'#10'"A '#9'c #581DA1"'
|
||||
+','#10'"B '#9'c #3C1FB9",'#10'"C '#9'c #E12940",'#10'"D '#9'c #FF3F3F",'
|
||||
+#10'"E '#9'c #FF1616",'#10'"F '#9'c #FF1212",'#10'"G '#9'c #FF1E1E",'#10
|
||||
+'"H '#9'c #FFB3B3",'#10'"I '#9'c #868686",'#10'"J '#9'c #060606",'#10'"K '
|
||||
+#9'c #A46464",'#10'"L '#9'c #FF2222",'#10'"M '#9'c #FF0303",'#10'"N '#9'c'
|
||||
+' #FF0404",'#10'"O '#9'c #3C24BE",'#10'"P '#9'c #581FA3",'#10'"Q '#9'c #F'
|
||||
+'F1515",'#10'"R '#9'c #FF1111",'#10'"S '#9'c #FF2E2E",'#10'"T '#9'c #FF30'
|
||||
+'30",'#10'"U '#9'c #FFBFBF",'#10'"V '#9'c #9D6C6C",'#10'"W '#9'c #FF2929"'
|
||||
+','#10'"X '#9'c #FF0101",'#10'"Y '#9'c #FF0202",'#10'"Z '#9'c #1120DD",'
|
||||
+#10'"` '#9'c #1923D9",'#10'" .'#9'c #F94145",'#10'"..'#9'c #FF4444",'#10
|
||||
+'"+.'#9'c #FF0909",'#10'"@.'#9'c #FF3E3E",'#10'"#.'#9'c #FFD2D2",'#10'"$.'
|
||||
+#9'c #818181",'#10'"%.'#9'c #867C7C",'#10'"&.'#9'c #FF9696",'#10'"*.'#9'c'
|
||||
+' #821577",'#10'"=.'#9'c #431BB0",'#10'"-.'#9'c #0722E6",'#10'";.'#9'c #1'
|
||||
+'A20D5",'#10'">.'#9'c #FF2020",'#10'",.'#9'c #FF2626",'#10'"''.'#9'c #FF5'
|
||||
+'E5E",'#10'").'#9'c #FFDBDB",'#10'"!.'#9'c #FFF4F4",'#10'"~.'#9'c #FFC0C0'
|
||||
+'",'#10'"{.'#9'c #F9888D",'#10'"].'#9'c #0A25E6",'#10'"^.'#9'c #1F24D5",'
|
||||
+#10'"/.'#9'c #FF1313",'#10'"(.'#9'c #9C105E",'#10'"_.'#9'c #241FCD",'#10
|
||||
+'":.'#9'c #FF0A0A",'#10'"<.'#9'c #FF3333",'#10'"[.'#9'c #FFCACA",'#10'"}.'
|
||||
+#9'c #858585",'#10'"|.'#9'c #1A36EB",'#10'"1.'#9'c #E1B8CF",'#10'"2.'#9'c'
|
||||
+' #FFA9A9",'#10'"3.'#9'c #FF8383",'#10'"4.'#9'c #76339F",'#10'"5.'#9'c #3'
|
||||
+'C1BB5",'#10'"6.'#9'c #FF0606",'#10'"7.'#9'c #FF2323",'#10'"8.'#9'c #FFBC'
|
||||
+'BC",'#10'"9.'#9'c #F8F8F8",'#10'"0.'#9'c #767676",'#10'"a.'#9'c #1935EB"'
|
||||
+','#10'"b.'#9'c #9CA8F6",'#10'"c.'#9'c #FFFAFA",'#10'"d.'#9'c #FFDDDD",'
|
||||
+#10'"e.'#9'c #6D5CCF",'#10'"f.'#9'c #823395",'#10'"g.'#9'c #FF6E6E",'#10
|
||||
+'"h.'#9'c #FFE0E0",'#10'"i.'#9'c #E6E6E6",'#10'"j.'#9'c #5F5F5F",'#10'"k.'
|
||||
+#9'c #0F0F0F",'#10'"l.'#9'c #949599",'#10'"m.'#9'c #0C2AEA",'#10'"n.'#9'c'
|
||||
+' #0625EA",'#10'"o.'#9'c #2942EB",'#10'"p.'#9'c #0524E9",'#10'"q.'#9'c #E'
|
||||
+'1CDE4",'#10'"r.'#9'c #FFFBFB",'#10'"s.'#9'c #E3E3E3",'#10'"t.'#9'c #5858'
|
||||
+'58",'#10'"u.'#9'c #0C154A",'#10'"v.'#9'c #0625E8",'#10'"w.'#9'c #0928EA"'
|
||||
+','#10'"x.'#9'c #BCC4F9",'#10'"y.'#9'c #0827EA",'#10'"z.'#9'c #E1E1E1",'
|
||||
+#10'"A.'#9'c #2A3BA7",'#10'"B.'#9'c #0D2AE4",'#10'"C.'#9'c #E1E5FC",'#10
|
||||
+'"D.'#9'c #FFCF0F",'#10'"E.'#9'c #8292F4",'#10'"F.'#9'c #1935E9",'#10'"G.'
|
||||
+#9'c #0520CD",'#10'"H.'#9'c #9A9A9A",'#10'"I.'#9'c #122FEB",'#10'"J.'#9'c'
|
||||
+' #1532EB",'#10'"K.'#9'c #0E2CEA",'#10'"L.'#9'c #0625E9",'#10'"M.'#9'c #2'
|
||||
+'D3CA2",'#10'"N.'#9'c #101010",'#10'"O.'#9'c #CFD5FB",'#10'"P.'#9'c #8B9A'
|
||||
+'F5",'#10'"Q.'#9'c #475EEF",'#10'"R.'#9'c #B9BEE4",'#10'"S.'#9'c #5D5D5D"'
|
||||
+','#10'"T.'#9'c #0C0C0C",'#10'"U.'#9'c #9B9B9B",'#10'"V.'#9'c #888888",'
|
||||
+#10'"W.'#9'c #2F2F2F",'#10'"X.'#9'c #BCBCBC",'#10'"Y.'#9'c #FCFCFC",'#10
|
||||
+'"Z.'#9'c #E8E8E8",'#10'"`.'#9'c #C9C9C9",'#10'". . . . . + @ @ + . . . .'
|
||||
+' . . . . . . . . . ",'#10'". . # $ $ % & * = - ; > . . , '' . . . . . . '
|
||||
+'",'#10'". . ) ! ~ { ] ^ / ( _ : < [ '' } . . . . . . ",'#10'"| '' '' '' '
|
||||
+''' 1 2 3 4 5 6 7 8 9 0 a b c . . . . ",'#10'"d | e f g h i j k l m n o p'
|
||||
+' q r s < t . . . ",'#10'". . u v w x / y z 9 A B j C D E F G H . . . ",'
|
||||
+#10'". . . I J K L M N O 9 9 P 4 Q R S T U . . . ",'#10'". . . I J V W X '
|
||||
+'Y 6 Z j ` ...4 +.@.#.. . . ",'#10'". . . $.w %.&.r N *.'' =.-.;.r >.,.'
|
||||
+'''.).. . . ",'#10'". . . I J I !.~.{.].^./.(.j _.N :.<.[.. . . ",'#10'".'
|
||||
+' . . }.J I . . |.'' 1.2.3.4.j 5.6.7.8.. . . ",'#10'". . 9.0.w }.d a.'' b'
|
||||
+'.. . c.d.e.'' f.g.h.. . . ",'#10'". . i.j.k.l.m.n.b.. . . . . . o.p.q.r.'
|
||||
+'. . . ",'#10'". . s.t.u.v.w.x.. . . . w . . . y.a.. . . . ",'#10'". . z.'
|
||||
+'A.j B.C.. . . . . w . . D.E.'' E.. . . ",'#10'". C.F.9 G.H.. . . . . . w'
|
||||
+' w w D.D.I.J.. . . ",'#10'". K.L.M.N.H.. . . . . . w . . D.D.O.P.. . . "'
|
||||
+','#10'". Q.R.S.T.U.. . . . . . w . . . . . . . . . ",'#10'". . e V.W.X..'
|
||||
+' . . . . . w . . . . . . . . . ",'#10'". . Y.Z.`.# . . . . . . w . . D.D'
|
||||
+'.D.D.. . . ",'#10'". . . . . . . . . . . . w w w D.D.D.D.. . . ",'#10'".'
|
||||
+' . . . . . . . . . . . . . . D.D.D.D.. . . "};'#10
|
||||
);
|
||||
|
@ -16,7 +16,16 @@
|
||||
Author: Mattias Gaertner
|
||||
|
||||
Abstract:
|
||||
- TCodeToolsDefinesEditor
|
||||
- TCodeToolsDefinesEditor is an editor for the CodeTools DefineTree used by
|
||||
the IDE. The DefineTree defines all values, that are not in the sources,
|
||||
but are provided by for example Makefiles, compiler command lines and
|
||||
compiler config files.
|
||||
|
||||
There are three types of nodes:
|
||||
- auto generated: These are created by the IDE.
|
||||
- project specific: These nodes are saved in the project info file (.lpi)
|
||||
- the rest are global nodes, saved in the codetoolsoptions.xml file.
|
||||
|
||||
}
|
||||
unit CodeToolsDefines;
|
||||
|
||||
@ -47,8 +56,10 @@ type
|
||||
MoveNodeLvlDownMenuItem: TMenuItem;
|
||||
InsertBehindMenuItem: TMenuItem;
|
||||
InsertBehindDefineMenuItem: TMenuItem;
|
||||
InsertBehindDefineAllMenuItem: TMenuItem;
|
||||
InsertBehindDefineRecurseMenuItem: TMenuItem;
|
||||
InsertBehindUndefineMenuItem: TMenuItem;
|
||||
InsertBehindUndefineRecurseMenuItem: TMenuItem;
|
||||
InsertBehindUndefineAllMenuItem: TMenuItem;
|
||||
InsertBehindBlockMenuItem: TMenuItem;
|
||||
InsertBehindDirectoryMenuItem: TMenuItem;
|
||||
InsertBehindIfMenuItem: TMenuItem;
|
||||
@ -58,8 +69,10 @@ type
|
||||
InsertBehindElseMenuItem: TMenuItem;
|
||||
InsertAsChildMenuItem: TMenuItem;
|
||||
InsertAsChildDefineMenuItem: TMenuItem;
|
||||
InsertAsChildDefineAllMenuItem: TMenuItem;
|
||||
InsertAsChildDefineRecurseMenuItem: TMenuItem;
|
||||
InsertAsChildUndefineMenuItem: TMenuItem;
|
||||
InsertAsChildUndefineRecurseMenuItem: TMenuItem;
|
||||
InsertAsChildUndefineAllMenuItem: TMenuItem;
|
||||
InsertAsChildBlockMenuItem: TMenuItem;
|
||||
InsertAsChildDirectoryMenuItem: TMenuItem;
|
||||
InsertAsChildIfMenuItem: TMenuItem;
|
||||
@ -100,18 +113,30 @@ type
|
||||
DeleteFilePathBitBtn: TBitBtn;
|
||||
InsertFilePathBitBtn: TBitBtn;
|
||||
|
||||
procedure SaveAndExitMenuItemClick(Sender: TObject);
|
||||
procedure DontSaveAndExitMenuItemClick(Sender: TObject);
|
||||
// misc
|
||||
procedure FormResize(Sender: TObject);
|
||||
procedure DefineTreeViewMouseUp(Sender: TObject; Button: TMouseButton;
|
||||
Shift: TShiftState; X,Y: integer);
|
||||
procedure ProjectSpecificCheckBoxClick(Sender: TObject);
|
||||
|
||||
// exit menu
|
||||
procedure SaveAndExitMenuItemClick(Sender: TObject);
|
||||
procedure DontSaveAndExitMenuItemClick(Sender: TObject);
|
||||
|
||||
// value notebook
|
||||
procedure ValueNoteBookPageChanged(Sender: TObject);
|
||||
procedure MoveFilePathUpBitBtnClick(Sender: TObject);
|
||||
procedure MoveFilePathDownBitBtnClick(Sender: TObject);
|
||||
procedure DeleteFilePathBitBtnClick(Sender: TObject);
|
||||
procedure InsertFilePathBitBtnClick(Sender: TObject);
|
||||
|
||||
// edit menu
|
||||
procedure InsertNodeMenuItemClick(Sender: TObject);
|
||||
procedure ProjectSpecificCheckBoxClick(Sender: TObject);
|
||||
procedure MoveNodeUpMenuItemClick(Sender: TObject);
|
||||
procedure MoveNodeDownMenuItemClick(Sender: TObject);
|
||||
procedure MoveNodeLvlUpMenuItemClick(Sender: TObject);
|
||||
procedure MoveNodeLvlDownMenuItemClick(Sender: TObject);
|
||||
procedure DeleteNodeMenuItemClick(Sender: TObject);
|
||||
private
|
||||
FDefineTree: TDefineTree;
|
||||
FLastSelectedNode: TTreeNode;
|
||||
@ -127,6 +152,9 @@ type
|
||||
procedure SetTypeLabel;
|
||||
function ValueToFilePathText(const AValue: string): string;
|
||||
procedure InsertNewNode(Behind: boolean; Action: TDefineAction);
|
||||
function FindUniqueName: string;
|
||||
function ConsistencyCheck: integer;
|
||||
procedure SetValuesEditable(AValue: boolean);
|
||||
public
|
||||
procedure Assign(ACodeToolBoss: TCodeToolManager;
|
||||
Options: TCodeToolsOptions);
|
||||
@ -141,12 +169,6 @@ function ShowCodeToolsDefinesEditor(ACodeToolBoss: TCodeToolManager;
|
||||
|
||||
implementation
|
||||
|
||||
const
|
||||
DefineActionNames: array[TDefineAction] of string = (
|
||||
'None', 'Block', 'Define', 'Undefine', 'DefineAll',
|
||||
'If', 'IfDef', 'IfNDef', 'ElseIf', 'Else', 'Directory'
|
||||
);
|
||||
|
||||
type
|
||||
TWinControlClass = class of TWinControl;
|
||||
|
||||
@ -288,7 +310,10 @@ end;
|
||||
|
||||
procedure TCodeToolsDefinesEditor.ValueNoteBookPageChanged(Sender: TObject);
|
||||
begin
|
||||
if ValueNoteBook.PageIndex=0 then ValueAsPathToValueAsText;
|
||||
if ValueNoteBook.PageIndex=0 then
|
||||
ValueAsPathToValueAsText
|
||||
else
|
||||
ValueAsFilePathsSynEdit.Text:=ValueToFilePathText(ValueAsTextSynEdit.Text);
|
||||
end;
|
||||
|
||||
procedure TCodeToolsDefinesEditor.MoveFilePathUpBitBtnClick(Sender: TObject);
|
||||
@ -333,8 +358,10 @@ var Behind: boolean;
|
||||
begin
|
||||
Behind:=(TMenuItem(Sender).Parent=InsertBehindMenuItem);
|
||||
if Sender=InsertBehindDefineMenuItem then Action:=da_Define
|
||||
else if Sender=InsertBehindDefineAllMenuItem then Action:=da_DefineAll
|
||||
else if Sender=InsertBehindDefineRecurseMenuItem then Action:=da_DefineRecurse
|
||||
else if Sender=InsertBehindUndefineMenuItem then Action:=da_Undefine
|
||||
else if Sender=InsertBehindUndefineRecurseMenuItem then Action:=da_UndefineRecurse
|
||||
else if Sender=InsertBehindUndefineAllMenuItem then Action:=da_UndefineAll
|
||||
else if Sender=InsertBehindBlockMenuItem then Action:=da_Block
|
||||
else if Sender=InsertBehindDirectoryMenuItem then Action:=da_Directory
|
||||
else if Sender=InsertBehindIfMenuItem then Action:=da_If
|
||||
@ -343,8 +370,10 @@ begin
|
||||
else if Sender=InsertBehindElseIfMenuItem then Action:=da_ElseIf
|
||||
else if Sender=InsertBehindElseMenuItem then Action:=da_Else
|
||||
else if Sender=InsertAsChildDefineMenuItem then Action:=da_Define
|
||||
else if Sender=InsertAsChildDefineAllMenuItem then Action:=da_DefineAll
|
||||
else if Sender=InsertAsChildDefineRecurseMenuItem then Action:=da_DefineRecurse
|
||||
else if Sender=InsertAsChildUndefineMenuItem then Action:=da_Undefine
|
||||
else if Sender=InsertAsChildUndefineRecurseMenuItem then Action:=da_UndefineRecurse
|
||||
else if Sender=InsertAsChildUndefineAllMenuItem then Action:=da_UndefineAll
|
||||
else if Sender=InsertAsChildBlockMenuItem then Action:=da_Block
|
||||
else if Sender=InsertAsChildDirectoryMenuItem then Action:=da_Directory
|
||||
else if Sender=InsertAsChildIfMenuItem then Action:=da_If
|
||||
@ -355,17 +384,136 @@ begin
|
||||
InsertNewNode(Behind,Action);
|
||||
end;
|
||||
|
||||
procedure TCodeToolsDefinesEditor.MoveNodeUpMenuItemClick(Sender: TObject);
|
||||
var
|
||||
SelTreeNode: TTreeNode;
|
||||
SelDefNode, PrevDefNode: TDefineTemplate;
|
||||
begin
|
||||
SelTreeNode:=DefineTreeView.Selected;
|
||||
if (SelTreeNode=nil) or (SelTreeNode.GetPrevSibling=nil) then exit;
|
||||
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
||||
PrevDefNode:=SelDefNode.Prior;
|
||||
// move node up in TreeView
|
||||
SelTreeNode.MoveTo(SelTreeNode.GetPrevSibling,naInsert);
|
||||
// move node up in DefineTree
|
||||
SelDefNode.Unbind;
|
||||
SelDefNode.InsertInFront(PrevDefNode);
|
||||
SelTreeNode.MakeVisible;
|
||||
end;
|
||||
|
||||
procedure TCodeToolsDefinesEditor.MoveNodeDownMenuItemClick(Sender: TObject);
|
||||
var
|
||||
SelTreeNode: TTreeNode;
|
||||
SelDefNode, NextDefNode: TDefineTemplate;
|
||||
begin
|
||||
SelTreeNode:=DefineTreeView.Selected;
|
||||
if (SelTreeNode=nil) or (SelTreeNode.GetNextSibling=nil) then exit;
|
||||
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
||||
NextDefNode:=SelDefNode.Next;
|
||||
// move node down in TreeView
|
||||
if SelTreeNode.GetNextSibling.GetNextSibling<>nil then
|
||||
SelTreeNode.MoveTo(SelTreeNode.GetNextSibling.GetNextSibling,naInsert)
|
||||
else
|
||||
SelTreeNode.MoveTo(SelTreeNode.GetNextSibling,naAdd);
|
||||
// move node down in DefineTree
|
||||
SelDefNode.Unbind;
|
||||
SelDefNode.InsertBehind(NextDefNode);
|
||||
SelTreeNode.MakeVisible;
|
||||
end;
|
||||
|
||||
procedure TCodeToolsDefinesEditor.MoveNodeLvlUpMenuItemClick(Sender: TObject);
|
||||
var
|
||||
SelTreeNode: TTreeNode;
|
||||
SelDefNode, PrevDefNode: TDefineTemplate;
|
||||
begin
|
||||
SelTreeNode:=DefineTreeView.Selected;
|
||||
if (SelTreeNode=nil) or (SelTreeNode.Parent=nil) then exit;
|
||||
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
||||
if SelDefNode.IsAutoGenerated then begin
|
||||
MessageDlg('Node is readonly','Auto generated nodes can not be edited.',
|
||||
mtInformation,[mbCancel],0);
|
||||
exit;
|
||||
end;
|
||||
// move node one lvl up in TreeView
|
||||
if SelTreeNode.Parent.GetNextSibling<>nil then
|
||||
SelTreeNode.MoveTo(SelTreeNode.Parent.GetNextSibling,naInsert)
|
||||
else
|
||||
SelTreeNode.MoveTo(SelTreeNode.Parent,naAdd);
|
||||
// move node one lvl up in DefineTree
|
||||
PrevDefNode:=SelDefNode.Parent;
|
||||
SelDefNode.Unbind;
|
||||
SelDefNode.InsertBehind(PrevDefNode);
|
||||
SetNodeImages(SelTreeNode,true);
|
||||
SelTreeNode.MakeVisible;
|
||||
end;
|
||||
|
||||
procedure TCodeToolsDefinesEditor.MoveNodeLvlDownMenuItemClick(Sender: TObject);
|
||||
var
|
||||
SelTreeNode: TTreeNode;
|
||||
SelDefNode, PrevDefNode: TDefineTemplate;
|
||||
begin
|
||||
SelTreeNode:=DefineTreeView.Selected;
|
||||
if (SelTreeNode=nil) or (SelTreeNode.GetPrevSibling=nil) then exit;
|
||||
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
||||
PrevDefNode:=SelDefNode.Prior;
|
||||
if (SelDefNode.IsAutoGenerated) or (PrevDefNode.IsAutoGenerated) then begin
|
||||
MessageDlg('Node is readonly','Auto generated nodes can not be edited.',
|
||||
mtInformation,[mbCancel],0);
|
||||
exit;
|
||||
end;
|
||||
if (not (PrevDefNode.Action in DefineActionBlocks)) then begin
|
||||
MessageDlg('Invalid previous node',
|
||||
'Previous node can not contain child nodes.',
|
||||
mtInformation,[mbCancel],0);
|
||||
exit;
|
||||
end;
|
||||
// move node one lvl down in TreeView
|
||||
SelTreeNode.MoveTo(SelTreeNode.GetPrevSibling,naAddChild);
|
||||
// move node one lvl up in DefineTree
|
||||
SelDefNode.Unbind;
|
||||
PrevDefNode.AddChild(SelDefNode);
|
||||
SetNodeImages(SelTreeNode.Parent,true);
|
||||
SelTreeNode.MakeVisible;
|
||||
end;
|
||||
|
||||
procedure TCodeToolsDefinesEditor.DeleteNodeMenuItemClick(Sender: TObject);
|
||||
var
|
||||
SelTreeNode: TTreeNode;
|
||||
SelDefNode: TDefineTemplate;
|
||||
begin
|
||||
SelTreeNode:=DefineTreeView.Selected;
|
||||
if (SelTreeNode=nil) then exit;
|
||||
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
||||
if (SelDefNode.IsAutoGenerated) then begin
|
||||
MessageDlg('Node is readonly','Auto generated nodes can not be edited.',
|
||||
mtInformation,[mbCancel],0);
|
||||
exit;
|
||||
end;
|
||||
if FLastSelectedNode=SelTreeNode then FLastSelectedNode:=nil;
|
||||
writeln(' AAA1 ',ConsistencyCheck);
|
||||
// delete node in TreeView
|
||||
SelTreeNode.Free;
|
||||
// delete node in DefineTree
|
||||
SelDefNode.Unbind;
|
||||
SelDefNode.Free;
|
||||
writeln(' AAA2 ',ConsistencyCheck);
|
||||
end;
|
||||
|
||||
procedure TCodeToolsDefinesEditor.ProjectSpecificCheckBoxClick(Sender: TObject);
|
||||
var
|
||||
SelTreeNode: TTreeNode;
|
||||
SelDefNode: TDefineTemplate;
|
||||
begin
|
||||
if not SelectedItemGroupBox.Enabled then exit;
|
||||
SelTreeNode:=DefineTreeView.Selected;
|
||||
if SelTreeNode=nil then exit;
|
||||
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
||||
if ProjectSpecificCheckBox.Checked=(dtfProjectSpecific in SelDefNode.Flags)
|
||||
then exit;
|
||||
if SelDefNode.IsAutoGenerated then begin
|
||||
MessageDlg('Node is readonly','Auto generated nodes can not be edited.',
|
||||
mtInformation,[mbCancel],0);
|
||||
exit;
|
||||
end;
|
||||
if ProjectSpecificCheckBox.Checked then
|
||||
Include(SelDefNode.Flags,dtfProjectSpecific)
|
||||
else
|
||||
@ -417,8 +565,10 @@ begin
|
||||
Height:=22;
|
||||
Name:='TheImageList';
|
||||
AddResImg('define_22x22');
|
||||
AddResImg('defineall_22x22');
|
||||
AddResImg('definerecurse_22x22');
|
||||
AddResImg('undefine_22x22');
|
||||
AddResImg('undefinerecurse_22x22');
|
||||
AddResImg('undefineall_22x22');
|
||||
AddResImg('block_22x22');
|
||||
AddResImg('directory_22x22');
|
||||
AddResImg('if_22x22');
|
||||
@ -451,37 +601,56 @@ begin
|
||||
AddMenuItem(EditMenuItem,'EditMenuItem','Edit',nil);
|
||||
AddMenuItem(MoveNodeUpMenuItem,'MoveNodeUpMenuItem','Move node up',
|
||||
EditMenuItem);
|
||||
MoveNodeUpMenuItem.OnClick:=@MoveNodeUpMenuItemClick;
|
||||
|
||||
AddMenuItem(MoveNodeDownMenuItem,'MoveNodeDownMenuItem','Move node down',
|
||||
EditMenuItem);
|
||||
MoveNodeDownMenuItem.OnClick:=@MoveNodeDownMenuItemClick;
|
||||
|
||||
AddMenuItem(MoveNodeLvlUpMenuItem,'MoveNodeLvlUpMenuItem','Move node one level up',
|
||||
EditMenuItem);
|
||||
MoveNodeLvlUpMenuItem.OnClick:=@MoveNodeLvlUpMenuItemClick;
|
||||
|
||||
AddMenuItem(MoveNodeLvlDownMenuItem,'MoveNodeLvlDownMenuItem','Move node one level down',
|
||||
EditMenuItem);
|
||||
MoveNodeLvlDownMenuItem.OnClick:=@MoveNodeLvlDownMenuItemClick;
|
||||
|
||||
EditMenuItem.Add(CreateSeperator);
|
||||
AddMenuItem(InsertBehindMenuItem,'InsertBehindMenuItem','Insert node behind',
|
||||
AddMenuItem(InsertBehindMenuItem,'InsertBehindMenuItem','Insert node below',
|
||||
EditMenuItem);
|
||||
AddMenuItem(InsertAsChildMenuItem,'InsertAsChildMenuItem','Insert node as child',
|
||||
EditMenuItem);
|
||||
EditMenuItem.Add(CreateSeperator);
|
||||
AddMenuItem(DeleteNodeMenuItem,'DeleteNodeMenuItem','Delete node',
|
||||
EditMenuItem);
|
||||
EditMenuItem.Add(CreateSeperator);
|
||||
DeleteNodeMenuItem.OnClick:=@DeleteNodeMenuItemClick;
|
||||
|
||||
{ EditMenuItem.Add(CreateSeperator);
|
||||
AddMenuItem(CopyToClipbrdMenuItem,'CopyToClipbrdMenuItem','Copy to clipboard',
|
||||
EditMenuItem);
|
||||
AddMenuItem(PasteFromClipbrdMenuItem,'PasteFromClipbrdMenuItem',
|
||||
'Paste from clipboard',EditMenuItem);
|
||||
'Paste from clipboard',EditMenuItem);}
|
||||
|
||||
// insert node behind submenu
|
||||
AddMenuItem(InsertBehindDefineMenuItem,'InsertBehindDefineMenuItem','Define',
|
||||
InsertBehindMenuItem);
|
||||
AddMenuItem(InsertBehindDefineAllMenuItem,'InsertBehindDefineAllMenuItem','Define All',
|
||||
AddMenuItem(InsertBehindDefineRecurseMenuItem,
|
||||
'InsertBehindDefineRecurseMenuItem','Define Recurse',
|
||||
InsertBehindMenuItem);
|
||||
AddMenuItem(InsertBehindUndefineMenuItem,'InsertBehindUndefineMenuItem','Undefine',
|
||||
AddMenuItem(InsertBehindUndefineMenuItem,
|
||||
'InsertBehindUndefineMenuItem','Undefine',
|
||||
InsertBehindMenuItem);
|
||||
AddMenuItem(InsertBehindUndefineRecurseMenuItem,
|
||||
'InsertBehindUndefineRecurseMenuItem','Undefine Recurse',
|
||||
InsertBehindMenuItem);
|
||||
AddMenuItem(InsertBehindUndefineAllMenuItem,
|
||||
'InsertBehindUndefineAllMenuItem','Undefine All',
|
||||
InsertBehindMenuItem);
|
||||
InsertBehindMenuItem.Add(CreateSeperator);
|
||||
AddMenuItem(InsertBehindBlockMenuItem,'InsertBehindBlockMenuItem','Block',
|
||||
InsertBehindMenuItem);
|
||||
AddMenuItem(InsertBehindDirectoryMenuItem,'InsertBehindDirectoryMenuItem','Directory',
|
||||
AddMenuItem(InsertBehindDirectoryMenuItem,
|
||||
'InsertBehindDirectoryMenuItem','Directory',
|
||||
InsertBehindMenuItem);
|
||||
InsertBehindMenuItem.Add(CreateSeperator);
|
||||
AddMenuItem(InsertBehindIfMenuItem,'InsertBehindIfMenuItem','If',
|
||||
@ -501,14 +670,23 @@ begin
|
||||
// insert node as child submenu
|
||||
AddMenuItem(InsertAsChildDefineMenuItem,'InsertAsChildDefineMenuItem','Define',
|
||||
InsertAsChildMenuItem);
|
||||
AddMenuItem(InsertAsChildDefineAllMenuItem,'InsertAsChildDefineAllMenuItem','Define All',
|
||||
AddMenuItem(InsertAsChildDefineRecurseMenuItem,
|
||||
'InsertAsChildDefineRecurseMenuItem','Define Recurse',
|
||||
InsertAsChildMenuItem);
|
||||
AddMenuItem(InsertAsChildUndefineMenuItem,'InsertAsChildUndefineMenuItem','Undefine',
|
||||
AddMenuItem(InsertAsChildUndefineMenuItem,
|
||||
'InsertAsChildUndefineMenuItem','Undefine',
|
||||
InsertAsChildMenuItem);
|
||||
AddMenuItem(InsertAsChildUndefineRecurseMenuItem,
|
||||
'InsertAsChildUndefineRecurseMenuItem','Undefine Recurse',
|
||||
InsertAsChildMenuItem);
|
||||
AddMenuItem(InsertAsChildUndefineAllMenuItem,
|
||||
'InsertAsChildUndefineAllMenuItem','Undefine All',
|
||||
InsertAsChildMenuItem);
|
||||
InsertAsChildMenuItem.Add(CreateSeperator);
|
||||
AddMenuItem(InsertAsChildBlockMenuItem,'InsertAsChildBlockMenuItem','Block',
|
||||
InsertAsChildMenuItem);
|
||||
AddMenuItem(InsertAsChildDirectoryMenuItem,'InsertAsChildDirectoryMenuItem','Directory',
|
||||
AddMenuItem(InsertAsChildDirectoryMenuItem,
|
||||
'InsertAsChildDirectoryMenuItem','Directory',
|
||||
InsertAsChildMenuItem);
|
||||
InsertAsChildMenuItem.Add(CreateSeperator);
|
||||
AddMenuItem(InsertAsChildIfMenuItem,'InsertAsChildIfMenuItem','If',
|
||||
@ -526,11 +704,11 @@ begin
|
||||
InsertAsChildMenuItem[i].OnClick:=@InsertNodeMenuItemClick;
|
||||
|
||||
// tools
|
||||
AddMenuItem(ToolsMenuItem,'ToolsMenuItem','Tools',nil);
|
||||
{ AddMenuItem(ToolsMenuItem,'ToolsMenuItem','Tools',nil);
|
||||
AddMenuItem(OpenPreviewMenuItem,'OpenPreviewMenuItem','Open Preview',
|
||||
ToolsMenuItem);
|
||||
AddMenuItem(ShowMacroListMenuItem,'ShowMacroListMenuItem','Show Macros',
|
||||
ToolsMenuItem);
|
||||
ToolsMenuItem);}
|
||||
|
||||
// templates
|
||||
AddMenuItem(InsertTemplateMenuItem,'InsertTemplateMenuItem',
|
||||
@ -658,29 +836,31 @@ begin
|
||||
ADefineTemplate:=TDefineTemplate(ANode.Data);
|
||||
case ADefineTemplate.Action of
|
||||
da_Define: ANode.ImageIndex:=0;
|
||||
da_DefineAll: ANode.ImageIndex:=1;
|
||||
da_DefineRecurse: ANode.ImageIndex:=1;
|
||||
da_Undefine: ANode.ImageIndex:=2;
|
||||
da_Block: ANode.ImageIndex:=3;
|
||||
da_Directory: ANode.ImageIndex:=4;
|
||||
da_If: ANode.ImageIndex:=5;
|
||||
da_IfDef: ANode.ImageIndex:=6;
|
||||
da_IfNDef: ANode.ImageIndex:=7;
|
||||
da_ElseIf: ANode.ImageIndex:=8;
|
||||
da_Else: ANode.ImageIndex:=9;
|
||||
da_UndefineRecurse: ANode.ImageIndex:=3;
|
||||
da_UndefineAll: ANode.ImageIndex:=4;
|
||||
da_Block: ANode.ImageIndex:=5;
|
||||
da_Directory: ANode.ImageIndex:=6;
|
||||
da_If: ANode.ImageIndex:=7;
|
||||
da_IfDef: ANode.ImageIndex:=8;
|
||||
da_IfNDef: ANode.ImageIndex:=9;
|
||||
da_ElseIf: ANode.ImageIndex:=10;
|
||||
da_Else: ANode.ImageIndex:=11;
|
||||
else
|
||||
ANode.ImageIndex:=-1;
|
||||
end;
|
||||
ANode.SelectedIndex:=ANode.ImageIndex;
|
||||
if ADefineTemplate.IsAutoGenerated then begin
|
||||
if ADefineTemplate.IsProjectSpecific then
|
||||
ANode.StateIndex:=13
|
||||
ANode.StateIndex:=15
|
||||
else
|
||||
ANode.StateIndex:=11;
|
||||
ANode.StateIndex:=13;
|
||||
end else begin
|
||||
if ADefineTemplate.IsProjectSpecific then
|
||||
ANode.StateIndex:=12
|
||||
ANode.StateIndex:=14
|
||||
else
|
||||
ANode.StateIndex:=10;
|
||||
ANode.StateIndex:=12;
|
||||
end;
|
||||
if WithSubNodes then begin
|
||||
ANode:=ANode.GetFirstChild;
|
||||
@ -697,21 +877,15 @@ var s: string;
|
||||
begin
|
||||
s:=ValueAsFilePathsSynEdit.Text;
|
||||
l:=length(s);
|
||||
if (l>0) and (s[l] in [#13,#10]) then begin
|
||||
// remove line end at end of Text, that was added automatically
|
||||
dec(l);
|
||||
if (l>0) and (s[l] in [#13,#10]) and (s[l]<>s[l+1]) then
|
||||
dec(l);
|
||||
SetLength(s,l);
|
||||
end;
|
||||
// replace line ends with semicolon
|
||||
i:=1;
|
||||
j:=1;
|
||||
while i<=l do begin
|
||||
if s[i] in [#10,#13] then begin
|
||||
inc(i);
|
||||
if (i<l) and (s[i] in [#10,#13]) and (s[i]<>s[i+1]) then
|
||||
if (i<l) and (s[i] in [#10,#13]) and (s[i-1]<>s[i]) then begin
|
||||
inc(i);
|
||||
end;
|
||||
s[j]:=';';
|
||||
inc(j);
|
||||
end else begin
|
||||
@ -720,7 +894,9 @@ begin
|
||||
inc(j);
|
||||
end;
|
||||
end;
|
||||
SetLength(s,j-1);
|
||||
dec(j);
|
||||
while (j>=1) and (s[j]=';') do dec(j);
|
||||
SetLength(s,j);
|
||||
ValueAsTextSynEdit.Text:=s;
|
||||
end;
|
||||
|
||||
@ -764,7 +940,7 @@ begin
|
||||
end;
|
||||
if SelTreeNode<>nil then begin
|
||||
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
||||
SelectedItemGroupBox.Enabled:=true;
|
||||
SetValuesEditable(not SelDefNode.IsAutoGenerated);
|
||||
ProjectSpecificCheckBox.Checked:=dtfProjectSpecific in SelDefNode.Flags;
|
||||
NameEdit.Text:=SelDefNode.Name;
|
||||
DescriptionEdit.Text:=SelDefNode.Description;
|
||||
@ -781,7 +957,7 @@ begin
|
||||
ValueAsFilePathsSynEdit.Options:=ValueAsTextSynEdit.Options;
|
||||
ValueAsFilePathsSynEdit.ReadOnly:=ValueAsTextSynEdit.ReadOnly;
|
||||
end else begin
|
||||
SelectedItemGroupBox.Enabled:=false;
|
||||
SetValuesEditable(false);
|
||||
NameEdit.Text:='';
|
||||
DescriptionEdit.Text:='';
|
||||
VariableEdit.Text:='';
|
||||
@ -823,11 +999,10 @@ end;
|
||||
|
||||
procedure TCodeToolsDefinesEditor.InsertNewNode(Behind: boolean;
|
||||
Action: TDefineAction);
|
||||
var SelTreeNode, NodeInFront, ParentNode, ANode, FirstNode,
|
||||
var SelTreeNode, NodeInFront, ParentNode,
|
||||
NewTreeNode: TTreeNode;
|
||||
NewDefNode: TDefineTemplate;
|
||||
NewName, NewDescription, NewVariable, NewValue: string;
|
||||
i: integer;
|
||||
begin
|
||||
SelTreeNode:=DefineTreeView.Selected;
|
||||
NodeInFront:=nil;
|
||||
@ -853,31 +1028,20 @@ begin
|
||||
end;
|
||||
if (ParentNode<>nil) and (TDefineTemplate(ParentNode.Data).IsAutoGenerated)
|
||||
then begin
|
||||
MessageDlg('Invalid Parent','Auto created nodes can not be edited,'#13
|
||||
MessageDlg('Invalid parent','Auto created nodes can not be edited,'#13
|
||||
+'nor can they have non auto created child nodes.',mtInformation,[mbCancel]
|
||||
,0);
|
||||
exit;
|
||||
end;
|
||||
// find an unique name
|
||||
if ParentNode<>nil then
|
||||
FirstNode:=ParentNode.GetFirstChild
|
||||
else
|
||||
FirstNode:=nil;
|
||||
if FirstNode=nil then FirstNode:=NodeInFront;
|
||||
if FirstNode<>nil then begin
|
||||
while FirstNode.GetPrevSibling<>nil do
|
||||
FirstNode:=FirstNode.GetPrevSibling;
|
||||
if (ParentNode<>nil)
|
||||
and (not (TDefineTemplate(ParentNode.Data).Action in DefineActionBlocks)) then
|
||||
begin
|
||||
MessageDlg('Invalid parent node',
|
||||
'Parent node can not contain child nodes.',
|
||||
mtInformation,[mbCancel],0);
|
||||
exit;
|
||||
end;
|
||||
i:=0;
|
||||
repeat
|
||||
inc(i);
|
||||
ANode:=FirstNode;
|
||||
while ANode<>nil do begin
|
||||
if TDefineTemplate(ANode.Data).Name='NewNode'+IntToStr(i) then break;
|
||||
ANode:=ANode.GetNextSibling;
|
||||
end;
|
||||
until ANode=nil;
|
||||
NewName:='NewNode'+IntToStr(i);
|
||||
NewName:=FindUniqueName;
|
||||
NewDescription:=NewName;
|
||||
NewVariable:='';
|
||||
NewValue:='';
|
||||
@ -895,7 +1059,7 @@ begin
|
||||
|
||||
// add node to define tree
|
||||
if NodeInFront<>nil then
|
||||
NewDefNode.InsertAfter(TDefineTemplate(NodeInFront.Data))
|
||||
NewDefNode.InsertBehind(TDefineTemplate(NodeInFront.Data))
|
||||
else if ParentNode<>nil then
|
||||
TDefineTemplate(ParentNode.Data).AddChild(NewDefNode)
|
||||
else
|
||||
@ -903,6 +1067,99 @@ begin
|
||||
|
||||
SetNodeImages(NewTreeNode,true);
|
||||
DefineTreeView.Selected:=NewTreeNode;
|
||||
ShowSelectedValues;
|
||||
end;
|
||||
|
||||
function TCodeToolsDefinesEditor.FindUniqueName: string;
|
||||
var i: integer;
|
||||
begin
|
||||
i:=1;
|
||||
while (DefineTree.FindDefineTemplateByName('NewNode'+IntToStr(i),false)<>nil)
|
||||
do inc(i);
|
||||
Result:='NewNode'+IntToStr(i);
|
||||
end;
|
||||
|
||||
function TCodeToolsDefinesEditor.ConsistencyCheck: integer;
|
||||
|
||||
function CheckNode(ATreeNode: TTreeNode): integer;
|
||||
var ADefNode, DummyDefNode: TDefineTemplate;
|
||||
begin
|
||||
if ATreeNode=nil then exit;
|
||||
ADefNode:=TDefineTemplate(ATreeNode.Data);
|
||||
//writeln(' CheckNode "',ATreeNode.Text,'" "',ADefNode.Name,'"');
|
||||
if ADefNode=nil then begin
|
||||
Result:=-1; exit;
|
||||
end;
|
||||
if (ATreeNode.GetPrevSibling<>nil)
|
||||
and (TDefineTemplate(ATreeNode.GetPrevSibling.Data)<>ADefNode.Prior) then
|
||||
begin
|
||||
Result:=-2; exit;
|
||||
end;
|
||||
if (ATreeNode.GetNextSibling<>nil)
|
||||
and (TDefineTemplate(ATreeNode.GetNextSibling.Data)<>ADefNode.Next) then
|
||||
begin
|
||||
write(' ERROR: ',ATreeNode.GetNextSibling.Text,' ');
|
||||
if ADefNode.Next<>nil then write('ADefNode.Next=',ADefNode.Next.Name,' ')
|
||||
else write('ADefNode.Next=nil ');
|
||||
DummyDefNode:=TDefineTemplate(ATreeNode.GetNextSibling.Data);
|
||||
if DummyDefNode<>nil then
|
||||
writeln('ATreeNode.GetNextSibling.Next=',DummyDefNode.Name)
|
||||
else
|
||||
writeln('ATreeNode.GetNextSibling.Next=nil');
|
||||
writeln('=============================================');
|
||||
DefineTreeView.WriteDebugReport('TV ',true);
|
||||
writeln('=============================================');
|
||||
DefineTree.WriteDebugReport;
|
||||
writeln('=============================================');
|
||||
Result:=-3; exit;
|
||||
end;
|
||||
if (ATreeNode.GetFirstChild<>nil)
|
||||
and (TDefineTemplate(ATreeNode.GetFirstChild.Data)<>ADefNode.FirstChild)
|
||||
then begin
|
||||
Result:=-4; exit;
|
||||
end;
|
||||
Result:=CheckNode(ATreeNode.GetFirstChild);
|
||||
if Result<0 then exit;
|
||||
Result:=CheckNode(ATreeNode.GetNextSibling);
|
||||
if Result<0 then exit;
|
||||
end;
|
||||
|
||||
begin
|
||||
Result:=DefineTreeView.ConsistencyCheck;
|
||||
if Result<0 then begin
|
||||
dec(Result,100000);
|
||||
exit;
|
||||
end;
|
||||
Result:=DefineTree.ConsistencyCheck;
|
||||
if Result<0 then begin
|
||||
dec(Result,200000);
|
||||
exit;
|
||||
end;
|
||||
Result:=CheckNode(DefineTreeView.Items.GetFirstNode);
|
||||
if Result<0 then begin
|
||||
dec(Result,300000);
|
||||
exit;
|
||||
end;
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
procedure TCodeToolsDefinesEditor.SetValuesEditable(AValue: boolean);
|
||||
begin
|
||||
SelectedItemGroupBox.Enabled:=true;
|
||||
TypeLabel.Enabled:=AValue;
|
||||
ProjectSpecificCheckBox.Enabled:=AValue;
|
||||
NameLabel.Enabled:=AValue;
|
||||
NameEdit.Enabled:=AValue;
|
||||
DescriptionLabel.Enabled:=AValue;
|
||||
DescriptionEdit.Enabled:=AValue;
|
||||
VariableLabel.Enabled:=AValue;
|
||||
VariableEdit.Enabled:=AValue;
|
||||
ValueAsTextSynEdit.ReadOnly:=not AValue;
|
||||
ValueAsFilePathsSynEdit.ReadOnly:=not AValue;
|
||||
MoveFilePathUpBitBtn.Enabled:=AValue;
|
||||
MoveFilePathDownBitBtn.Enabled:=AValue;
|
||||
DeleteFilePathBitBtn.Enabled:=AValue;
|
||||
InsertFilePathBitBtn.Enabled:=AValue;
|
||||
end;
|
||||
|
||||
procedure TCodeToolsDefinesEditor.Assign(ACodeToolBoss: TCodeToolManager;
|
||||
|
@ -41,7 +41,7 @@ implementation
|
||||
function FindCurrentProjectDirTemplate: TDefineTemplate;
|
||||
begin
|
||||
Result:=CodeToolBoss.DefineTree.FindDefineTemplateByName(
|
||||
ProjectDirDefTemplName);
|
||||
ProjectDirDefTemplName,true);
|
||||
end;
|
||||
|
||||
function FindCurrentProjectDirSrcPathTemplate: TDefineTemplate;
|
||||
@ -95,7 +95,6 @@ begin
|
||||
DontUseConfigFile
|
||||
AdditionalConfigFile
|
||||
}
|
||||
|
||||
// define macros for project directory
|
||||
ProjectDir:='$('+ExternalMacroStart+'ProjectDir)';
|
||||
|
||||
@ -108,44 +107,44 @@ begin
|
||||
if CompOpts.DelphiCompat then begin
|
||||
// set mode DELPHI
|
||||
ProjTempl.AddChild(TDefineTemplate.Create('MODE',
|
||||
'set FPC mode to DELPHI',CompilerModeVars[cmDELPHI],'1',da_DefineAll));
|
||||
'set FPC mode to DELPHI',CompilerModeVars[cmDELPHI],'1',da_DefineRecurse));
|
||||
end else if CompOpts.TPCompatible then begin
|
||||
// set mode TP
|
||||
ProjTempl.AddChild(TDefineTemplate.Create('MODE',
|
||||
'set FPC mode to TP',CompilerModeVars[cmTP],'1',da_DefineAll));
|
||||
'set FPC mode to TP',CompilerModeVars[cmTP],'1',da_DefineRecurse));
|
||||
end else if CompOpts.GPCCompat then begin
|
||||
// set mode GPC
|
||||
ProjTempl.AddChild(TDefineTemplate.Create('MODE',
|
||||
'set FPC mode to GPC',CompilerModeVars[cmGPC],'1',da_DefineAll));
|
||||
'set FPC mode to GPC',CompilerModeVars[cmGPC],'1',da_DefineRecurse));
|
||||
end;
|
||||
|
||||
// Checks -------------------------------------------------------------------
|
||||
if CompOpts.IOChecks then begin
|
||||
// set IO checking on
|
||||
ProjTempl.AddChild(TDefineTemplate.Create('IOCHECKS on',
|
||||
'set IOCHECKS on','IOCHECKS','1',da_DefineAll));
|
||||
'set IOCHECKS on','IOCHECKS','1',da_DefineRecurse));
|
||||
end;
|
||||
if CompOpts.RangeChecks then begin
|
||||
// set Range checking on
|
||||
ProjTempl.AddChild(TDefineTemplate.Create('RANGECHECKS on',
|
||||
'set RANGECHECKS on','RANGECHECKS','1',da_DefineAll));
|
||||
'set RANGECHECKS on','RANGECHECKS','1',da_DefineRecurse));
|
||||
end;
|
||||
if CompOpts.OverflowChecks then begin
|
||||
// set Overflow checking on
|
||||
ProjTempl.AddChild(TDefineTemplate.Create('OVERFLOWCHECKS on',
|
||||
'set OVERFLOWCHECKS on','OVERFLOWCHECKS','1',da_DefineAll));
|
||||
'set OVERFLOWCHECKS on','OVERFLOWCHECKS','1',da_DefineRecurse));
|
||||
end;
|
||||
|
||||
// Hidden used units --------------------------------------------------------
|
||||
if CompOpts.UseLineInfoUnit then begin
|
||||
// use lineinfo unit
|
||||
ProjTempl.AddChild(TDefineTemplate.Create('Use LINEINFO unit',
|
||||
'use LineInfo unit',ExternalMacroStart+'UseLineInfo','1',da_DefineAll));
|
||||
'use LineInfo unit',ExternalMacroStart+'UseLineInfo','1',da_DefineRecurse));
|
||||
end;
|
||||
if CompOpts.UseHeaptrc then begin
|
||||
// use heaptrc unit
|
||||
ProjTempl.AddChild(TDefineTemplate.Create('Use HEAPTRC unit',
|
||||
'use HeapTrc unit',ExternalMacroStart+'UseHeapTrcUnit','1',da_DefineAll));
|
||||
'use HeapTrc unit',ExternalMacroStart+'UseHeapTrcUnit','1',da_DefineRecurse));
|
||||
end;
|
||||
|
||||
// Paths --------------------------------------------------------------------
|
||||
@ -157,7 +156,7 @@ begin
|
||||
'include path addition',ExternalMacroStart+'INCPATH',
|
||||
ConvertTransferMacrosToExternalMacros(CompOpts.IncludeFiles)+';'
|
||||
+'$('+ExternalMacroStart+'INCPATH)',
|
||||
da_DefineAll));
|
||||
da_DefineRecurse));
|
||||
end;
|
||||
// compiled unit path (ppu/ppw/dcu files)
|
||||
s:=CompOpts.OtherUnitFiles;
|
||||
@ -173,7 +172,7 @@ begin
|
||||
'unit path addition',ExternalMacroStart+'UnitPath',
|
||||
ConvertTransferMacrosToExternalMacros(s)+';'
|
||||
+'$('+ExternalMacroStart+'UnitPath)',
|
||||
da_DefineAll));
|
||||
da_DefineRecurse));
|
||||
end;
|
||||
// source path (unitpath + sources for the CodeTools, hidden to the compiler)
|
||||
if s<>'' then begin
|
||||
@ -182,7 +181,7 @@ begin
|
||||
'source path addition',ExternalMacroStart+'SrcPath',
|
||||
ConvertTransferMacrosToExternalMacros(s+';'+SrcPath)+';'
|
||||
+'$('+ExternalMacroStart+'SrcPath)',
|
||||
da_DefineAll));
|
||||
da_DefineRecurse));
|
||||
end;
|
||||
|
||||
// LCL Widget Type ----------------------------------------------------------
|
||||
@ -197,7 +196,7 @@ begin
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// replace project defines in DefineTree
|
||||
CodeToolBoss.DefineTree.ReplaceSameName(ProjTempl);
|
||||
CodeToolBoss.DefineTree.ReplaceRootSameName(ProjTempl);
|
||||
end;
|
||||
|
||||
procedure SetAdditionalGlobalSrcPathToCodeToolBoss(const SrcPath: string);
|
||||
@ -208,11 +207,11 @@ begin
|
||||
'Global Source Path addition',ExternalMacroStart+'SRCPATH',
|
||||
ConvertTransferMacrosToExternalMacros(SrcPath)+';'
|
||||
+'$('+ExternalMacroStart+'SRCPATH)',
|
||||
da_DefineAll);
|
||||
da_DefineRecurse);
|
||||
DefTempl.Flags:=[dtfAutoGenerated];
|
||||
CodeToolBoss.DefineTree.ReplaceSameName(DefTempl);
|
||||
CodeToolBoss.DefineTree.ReplaceRootSameName(DefTempl);
|
||||
end else begin
|
||||
CodeToolBoss.DefineTree.RemoveDefineTemplateByName('GlobalSrcPathAdd');
|
||||
CodeToolBoss.DefineTree.RemoveRootDefineTemplateByName('GlobalSrcPathAdd');
|
||||
end;
|
||||
end;
|
||||
|
||||
|
11
ide/main.pp
11
ide/main.pp
@ -2308,15 +2308,15 @@ Begin
|
||||
CompilerTemplate:=CodeToolBoss.DefinePool.CreateFPCTemplate(
|
||||
EnvironmentOptions.CompilerFilename,CompilerUnitSearchPath);
|
||||
if CompilerTemplate<>nil then begin
|
||||
CodeToolBoss.DefineTree.ReplaceSameNameAddFirst(CompilerTemplate);
|
||||
CodeToolBoss.DefineTree.ReplaceRootSameNameAddFirst(CompilerTemplate);
|
||||
// create compiler macros to simulate the Makefiles of the FPC sources
|
||||
FPCSrcTemplate:=CodeToolBoss.DefinePool.CreateFPCSrcTemplate(
|
||||
CodeToolBoss.GlobalValues.Variables[ExternalMacroStart+'FPCSrcDir'],
|
||||
CompilerUnitSearchPath);
|
||||
if FPCSrcTemplate<>nil then begin
|
||||
CodeToolBoss.DefineTree.RemoveDefineTemplateByName(
|
||||
CodeToolBoss.DefineTree.RemoveRootDefineTemplateByName(
|
||||
FPCSrcTemplate.Name);
|
||||
FPCSrcTemplate.InsertAfter(CompilerTemplate);
|
||||
FPCSrcTemplate.InsertBehind(CompilerTemplate);
|
||||
end else begin
|
||||
MessageDlg('FPC Source Directory error',
|
||||
'Please check the freepascal source directory',
|
||||
@ -4894,6 +4894,7 @@ begin
|
||||
with SrcEdit.EditorComponent do begin
|
||||
BlockBegin:=CaretXY;
|
||||
BlockEnd:=CaretXY;
|
||||
LeftChar:=Max(CaretXY.X-CharsInWindow,1);
|
||||
end;
|
||||
SrcEdit.ErrorLine:=CaretXY.Y;
|
||||
end;
|
||||
@ -5146,7 +5147,6 @@ begin
|
||||
FOpenEditorsOnCodeToolChange:=false;
|
||||
|
||||
CodeToolsOpts.AssignTo(CodeToolBoss);
|
||||
|
||||
if (not FileExists(EnvironmentOptions.CompilerFilename)) then begin
|
||||
writeln('');
|
||||
writeln('NOTE: Compiler Filename not set! (see Environment Options)');
|
||||
@ -6216,6 +6216,9 @@ end.
|
||||
|
||||
{ =============================================================================
|
||||
$Log$
|
||||
Revision 1.239 2002/03/05 08:14:58 lazarus
|
||||
MG: updates for codetools defines editor
|
||||
|
||||
Revision 1.238 2002/03/02 11:08:36 lazarus
|
||||
MG: fixed method search diff proc, fixed synedit insert in empty line, small fixes, started define editor
|
||||
|
||||
|
@ -1304,6 +1304,9 @@ end.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.51 2002/03/05 08:14:59 lazarus
|
||||
MG: updates for codetools defines editor
|
||||
|
||||
Revision 1.50 2002/02/25 23:18:54 lazarus
|
||||
MG: jump history will now try to save relative filenames
|
||||
|
||||
|
157
images/codetoolsdefines/undefineall_22x22.xpm
Normal file
157
images/codetoolsdefines/undefineall_22x22.xpm
Normal file
@ -0,0 +1,157 @@
|
||||
/* XPM */
|
||||
static char * undefineall_22x22_xpm[] = {
|
||||
"22 22 132 2",
|
||||
" c None",
|
||||
". c #FFFFFF",
|
||||
"+ c #EBE5E5",
|
||||
"@ c #FEB0B0",
|
||||
"# c #FFBCBC",
|
||||
"$ c #FFFDFD",
|
||||
"% c #A3A3A3",
|
||||
"& c #665555",
|
||||
"* c #F24343",
|
||||
"= c #FF1F1F",
|
||||
"- c #FF4343",
|
||||
"; c #FF6B6B",
|
||||
"> c #FFABAB",
|
||||
", c #FFE4E4",
|
||||
"' c #E2E7FE",
|
||||
") c #153BF7",
|
||||
"! c #BEBEBE",
|
||||
"~ c #493535",
|
||||
"{ c #763096",
|
||||
"] c #BD174C",
|
||||
"^ c #FF1919",
|
||||
"/ c #FF2424",
|
||||
"( c #FF2323",
|
||||
"_ c #FF4040",
|
||||
": c #FF9292",
|
||||
"< c #4563F9",
|
||||
"[ c #0A32F7",
|
||||
"} c #D2D2D2",
|
||||
"| c #473535",
|
||||
"1 c #2F31D4",
|
||||
"2 c #0A31F6",
|
||||
"3 c #1830EA",
|
||||
"4 c #E22239",
|
||||
"5 c #FF2222",
|
||||
"6 c #FF1A1A",
|
||||
"7 c #FF4444",
|
||||
"8 c #FFE8E8",
|
||||
"9 c #1233F2",
|
||||
"0 c #213DF0",
|
||||
"a c #403A3A",
|
||||
"b c #E06767",
|
||||
"c c #BD1D52",
|
||||
"d c #0F30F1",
|
||||
"e c #70299C",
|
||||
"f c #FF5959",
|
||||
"g c #EA2F2F",
|
||||
"h c #FF0E0E",
|
||||
"i c #93247B",
|
||||
"j c #0931F7",
|
||||
"k c #BD275C",
|
||||
"l c #D3D3D3",
|
||||
"m c #404040",
|
||||
"n c #DED6D6",
|
||||
"o c #FFD2D2",
|
||||
"p c #F99CA1",
|
||||
"q c #3638DA",
|
||||
"r c #1F2DE1",
|
||||
"s c #F93D41",
|
||||
"t c #FFEAEA",
|
||||
"u c #E62F2F",
|
||||
"v c #F90E13",
|
||||
"w c #0E31F3",
|
||||
"x c #2B2FD9",
|
||||
"y c #C1C1C1",
|
||||
"z c #3E3E3E",
|
||||
"A c #E0E0E0",
|
||||
"B c #858CED",
|
||||
"C c #0E33F5",
|
||||
"D c #1336F4",
|
||||
"E c #D1D8FD",
|
||||
"F c #2D2DD6",
|
||||
"G c #0B31F5",
|
||||
"H c #E2142B",
|
||||
"I c #B3B3B3",
|
||||
"J c #414141",
|
||||
"K c #E3E3E3",
|
||||
"L c #0F36F7",
|
||||
"M c #ADB5DA",
|
||||
"N c #6276E9",
|
||||
"O c #9F74C2",
|
||||
"P c #FF0606",
|
||||
"Q c #FF3D3D",
|
||||
"R c #424242",
|
||||
"S c #FFFBFB",
|
||||
"T c #1339F7",
|
||||
"U c #1634C8",
|
||||
"V c #405FF9",
|
||||
"W c #FFA8A8",
|
||||
"X c #FFA9A9",
|
||||
"Y c #B8B8B8",
|
||||
"Z c #494949",
|
||||
"` c #E5E5E5",
|
||||
" . c #F9A8AD",
|
||||
".. c #2646F5",
|
||||
"+. c #193EF5",
|
||||
"@. c #E7E7E7",
|
||||
"#. c #0C32F6",
|
||||
"$. c #7087FA",
|
||||
"%. c #FF0D0D",
|
||||
"&. c #D12348",
|
||||
"*. c #0D31F4",
|
||||
"=. c #1230EF",
|
||||
"-. c #F94448",
|
||||
";. c #405AF4",
|
||||
">. c #FF1616",
|
||||
",. c #1830E9",
|
||||
"'. c #F91B1F",
|
||||
"). c #5873FA",
|
||||
"!. c #9F93E1",
|
||||
"~. c #0D33F6",
|
||||
"{. c #0F32F3",
|
||||
"]. c #F92328",
|
||||
"^. c #FFE9E9",
|
||||
"/. c #6981FA",
|
||||
"(. c #B8BFE4",
|
||||
"_. c #0E35F7",
|
||||
":. c #F9FAFF",
|
||||
"<. c #3657F8",
|
||||
"[. c #363E63",
|
||||
"}. c #0C34F7",
|
||||
"|. c #1238F7",
|
||||
"1. c #5C76FA",
|
||||
"2. c #8690C5",
|
||||
"3. c #0A31F4",
|
||||
"4. c #1037F6",
|
||||
"5. c #4D6AF9",
|
||||
"6. c #5A75FA",
|
||||
"7. c #1339F3",
|
||||
"8. c #0B32F2",
|
||||
"9. c #CBD0E7",
|
||||
"0. c #C2C8EA",
|
||||
"a. c #AFB0B5",
|
||||
". . . . . . . . . . . . . . . . . . . . . . ",
|
||||
". . + @ # $ . . . . . . . . . . . . . . . . ",
|
||||
". % & * = - ; > , . . . . . . . ' ) . . . . ",
|
||||
". ! ~ { ] ^ / ( _ : . . + @ # $ < [ . . . . ",
|
||||
". } | 1 2 3 4 5 6 7 8 % & * = - 9 0 , . . . ",
|
||||
". } a b c d 2 e 6 f . ! ~ g h i j k _ : . . ",
|
||||
". l m n o p q j r s t } | u v w x 5 6 7 8 . ",
|
||||
". y z A . . . B C D E } a b F G H = 6 f . . ",
|
||||
". I J K . . . . E L L M m N j O f ( P Q t . ",
|
||||
". I R K . + @ # S E T [ U [ V . . , W X . . ",
|
||||
". Y Z ` % & * = - ; ...j +.. . . . . . . . ",
|
||||
". @.I . ! ~ g h ^ / k w #.[ $.. . . . . . . ",
|
||||
". . . . } | u %./ &.*.=.-.;.j $.. . . . . . ",
|
||||
". . . . } a b >.v G ,.'.f . V j ).. . . . . ",
|
||||
". . . . l m n !.~.{.].P Q ^.. ).j /.. . . . ",
|
||||
". . . . y z (._.) :., W X . . . /.j <.. . . ",
|
||||
". . . . I [.}.|.:.. . . . . . . . $.j 1.. . ",
|
||||
". . . . 2.3.4.' . . . . . . . . . . 5.6.. . ",
|
||||
". . . . 7.8.9.. . . . . . . . . . . . . . . ",
|
||||
". . . . 0.a.. . . . . . . . . . . . . . . . ",
|
||||
". . . . . . . . . . . . . . . . . . . . . . ",
|
||||
". . . . . . . . . . . . . . . . . . . . . . "};
|
209
images/codetoolsdefines/undefinerecurse_22x22.xpm
Normal file
209
images/codetoolsdefines/undefinerecurse_22x22.xpm
Normal file
@ -0,0 +1,209 @@
|
||||
/* XPM */
|
||||
static char * undefinerecurse_22x22_xpm[] = {
|
||||
"22 22 184 2",
|
||||
" c None",
|
||||
". c #FFFFFF",
|
||||
"+ c #FFF9F9",
|
||||
"@ c #FFD9D9",
|
||||
"# c #F5F5F5",
|
||||
"$ c #C7C7C7",
|
||||
"% c #F6CDCD",
|
||||
"& c #FF5656",
|
||||
"* c #FF4949",
|
||||
"= c #FF9B9B",
|
||||
"- c #FFC5C5",
|
||||
"; c #FFEDED",
|
||||
"> c #FFFDFD",
|
||||
", c #6D7FF2",
|
||||
"' c #0423EA",
|
||||
") c #A0A6CF",
|
||||
"! c #22308B",
|
||||
"~ c #373737",
|
||||
"{ c #D49595",
|
||||
"] c #FF2828",
|
||||
"^ c #FF0E0E",
|
||||
"/ c #FF1D1D",
|
||||
"( c #FF3232",
|
||||
"_ c #FF6767",
|
||||
": c #FF8484",
|
||||
"< c #FFA6A6",
|
||||
"[ c #7671DE",
|
||||
"} c #3C54EE",
|
||||
"| c #D4D9FB",
|
||||
"1 c #0925E7",
|
||||
"2 c #3323C4",
|
||||
"3 c #E11229",
|
||||
"4 c #FF0D0D",
|
||||
"5 c #FF0F0F",
|
||||
"6 c #FF0707",
|
||||
"7 c #FF0000",
|
||||
"8 c #BC184D",
|
||||
"9 c #0423E9",
|
||||
"0 c #2430DD",
|
||||
"a c #FFAEAE",
|
||||
"b c #FFE5E5",
|
||||
"c c #FFFCFC",
|
||||
"d c #F9F9FE",
|
||||
"e c #EFEFEF",
|
||||
"f c #6C6C6C",
|
||||
"g c #060F44",
|
||||
"h c #182BD9",
|
||||
"i c #0922E5",
|
||||
"j c #0422E9",
|
||||
"k c #1C1FD3",
|
||||
"l c #CF1137",
|
||||
"m c #FF2424",
|
||||
"n c #F93C41",
|
||||
"o c #0923E5",
|
||||
"p c #1321DB",
|
||||
"q c #FF1414",
|
||||
"r c #FF1A1A",
|
||||
"s c #FF5B5B",
|
||||
"t c #FFF1F1",
|
||||
"u c #FDFDFD",
|
||||
"v c #7E7E7E",
|
||||
"w c #000000",
|
||||
"x c #A75C5C",
|
||||
"y c #751C89",
|
||||
"z c #0B23E3",
|
||||
"A c #581DA1",
|
||||
"B c #3C1FB9",
|
||||
"C c #E12940",
|
||||
"D c #FF3F3F",
|
||||
"E c #FF1616",
|
||||
"F c #FF1212",
|
||||
"G c #FF1E1E",
|
||||
"H c #FFB3B3",
|
||||
"I c #868686",
|
||||
"J c #060606",
|
||||
"K c #A46464",
|
||||
"L c #FF2222",
|
||||
"M c #FF0303",
|
||||
"N c #FF0404",
|
||||
"O c #3C24BE",
|
||||
"P c #581FA3",
|
||||
"Q c #FF1515",
|
||||
"R c #FF1111",
|
||||
"S c #FF2E2E",
|
||||
"T c #FF3030",
|
||||
"U c #FFBFBF",
|
||||
"V c #9D6C6C",
|
||||
"W c #FF2929",
|
||||
"X c #FF0101",
|
||||
"Y c #FF0202",
|
||||
"Z c #1120DD",
|
||||
"` c #1923D9",
|
||||
" . c #F94145",
|
||||
".. c #FF4444",
|
||||
"+. c #FF0909",
|
||||
"@. c #FF3E3E",
|
||||
"#. c #FFD2D2",
|
||||
"$. c #818181",
|
||||
"%. c #867C7C",
|
||||
"&. c #FF9696",
|
||||
"*. c #821577",
|
||||
"=. c #431BB0",
|
||||
"-. c #0722E6",
|
||||
";. c #1A20D5",
|
||||
">. c #FF2020",
|
||||
",. c #FF2626",
|
||||
"'. c #FF5E5E",
|
||||
"). c #FFDBDB",
|
||||
"!. c #FFF4F4",
|
||||
"~. c #FFC0C0",
|
||||
"{. c #F9888D",
|
||||
"]. c #0A25E6",
|
||||
"^. c #1F24D5",
|
||||
"/. c #FF1313",
|
||||
"(. c #9C105E",
|
||||
"_. c #241FCD",
|
||||
":. c #FF0A0A",
|
||||
"<. c #FF3333",
|
||||
"[. c #FFCACA",
|
||||
"}. c #858585",
|
||||
"|. c #1A36EB",
|
||||
"1. c #E1B8CF",
|
||||
"2. c #FFA9A9",
|
||||
"3. c #FF8383",
|
||||
"4. c #76339F",
|
||||
"5. c #3C1BB5",
|
||||
"6. c #FF0606",
|
||||
"7. c #FF2323",
|
||||
"8. c #FFBCBC",
|
||||
"9. c #F8F8F8",
|
||||
"0. c #767676",
|
||||
"a. c #1935EB",
|
||||
"b. c #9CA8F6",
|
||||
"c. c #FFFAFA",
|
||||
"d. c #FFDDDD",
|
||||
"e. c #6D5CCF",
|
||||
"f. c #823395",
|
||||
"g. c #FF6E6E",
|
||||
"h. c #FFE0E0",
|
||||
"i. c #E6E6E6",
|
||||
"j. c #5F5F5F",
|
||||
"k. c #0F0F0F",
|
||||
"l. c #949599",
|
||||
"m. c #0C2AEA",
|
||||
"n. c #0625EA",
|
||||
"o. c #2942EB",
|
||||
"p. c #0524E9",
|
||||
"q. c #E1CDE4",
|
||||
"r. c #FFFBFB",
|
||||
"s. c #E3E3E3",
|
||||
"t. c #585858",
|
||||
"u. c #0C154A",
|
||||
"v. c #0625E8",
|
||||
"w. c #0928EA",
|
||||
"x. c #BCC4F9",
|
||||
"y. c #0827EA",
|
||||
"z. c #E1E1E1",
|
||||
"A. c #2A3BA7",
|
||||
"B. c #0D2AE4",
|
||||
"C. c #E1E5FC",
|
||||
"D. c #FFCF0F",
|
||||
"E. c #8292F4",
|
||||
"F. c #1935E9",
|
||||
"G. c #0520CD",
|
||||
"H. c #9A9A9A",
|
||||
"I. c #122FEB",
|
||||
"J. c #1532EB",
|
||||
"K. c #0E2CEA",
|
||||
"L. c #0625E9",
|
||||
"M. c #2D3CA2",
|
||||
"N. c #101010",
|
||||
"O. c #CFD5FB",
|
||||
"P. c #8B9AF5",
|
||||
"Q. c #475EEF",
|
||||
"R. c #B9BEE4",
|
||||
"S. c #5D5D5D",
|
||||
"T. c #0C0C0C",
|
||||
"U. c #9B9B9B",
|
||||
"V. c #888888",
|
||||
"W. c #2F2F2F",
|
||||
"X. c #BCBCBC",
|
||||
"Y. c #FCFCFC",
|
||||
"Z. c #E8E8E8",
|
||||
"`. c #C9C9C9",
|
||||
". . . . . + @ @ + . . . . . . . . . . . . . ",
|
||||
". . # $ $ % & * = - ; > . . , ' . . . . . . ",
|
||||
". . ) ! ~ { ] ^ / ( _ : < [ ' } . . . . . . ",
|
||||
"| ' ' ' ' 1 2 3 4 5 6 7 8 9 0 a b c . . . . ",
|
||||
"d | e f g h i j k l m n o p q r s < t . . . ",
|
||||
". . u v w x / y z 9 A B j C D E F G H . . . ",
|
||||
". . . I J K L M N O 9 9 P 4 Q R S T U . . . ",
|
||||
". . . I J V W X Y 6 Z j ` ...4 +.@.#.. . . ",
|
||||
". . . $.w %.&.r N *.' =.-.;.r >.,.'.).. . . ",
|
||||
". . . I J I !.~.{.].^./.(.j _.N :.<.[.. . . ",
|
||||
". . . }.J I . . |.' 1.2.3.4.j 5.6.7.8.. . . ",
|
||||
". . 9.0.w }.d a.' b.. . c.d.e.' f.g.h.. . . ",
|
||||
". . i.j.k.l.m.n.b.. . . . . . o.p.q.r.. . . ",
|
||||
". . s.t.u.v.w.x.. . . . w . . . y.a.. . . . ",
|
||||
". . z.A.j B.C.. . . . . w . . D.E.' E.. . . ",
|
||||
". C.F.9 G.H.. . . . . . w w w D.D.I.J.. . . ",
|
||||
". K.L.M.N.H.. . . . . . w . . D.D.O.P.. . . ",
|
||||
". Q.R.S.T.U.. . . . . . w . . . . . . . . . ",
|
||||
". . e V.W.X.. . . . . . w . . . . . . . . . ",
|
||||
". . Y.Z.`.# . . . . . . w . . D.D.D.D.. . . ",
|
||||
". . . . . . . . . . . . w w w D.D.D.D.. . . ",
|
||||
". . . . . . . . . . . . . . . D.D.D.D.. . . "};
|
@ -450,8 +450,11 @@ begin
|
||||
if AValue=GetSelected then exit;
|
||||
if AValue then
|
||||
Include(FStates,nsSelected)
|
||||
else
|
||||
else begin
|
||||
Exclude(FStates,nsSelected);
|
||||
if (TreeView<>nil) and (TreeView.Selected=Self) then
|
||||
TreeView.Selected:=nil;
|
||||
end;
|
||||
Update;
|
||||
{ ToDo:
|
||||
if Value then
|
||||
@ -816,13 +819,15 @@ begin
|
||||
{$IFDEF TREEVIEW_DEBUG}
|
||||
writeln('[TTreeNode.Unbind] Self=',HexStr(Cardinal(Self),8),' Self.Text=',Text);
|
||||
{$ENDIF}
|
||||
Selected:=false;
|
||||
if Owner<>nil then begin
|
||||
Owner.ClearCache;
|
||||
if FParent=nil then
|
||||
Owner.MoveTopLvlNode(Owner.IndexOfTopLvlItem(Self),-1,Self);
|
||||
if Owner.Owner<>nil then
|
||||
if Owner.Owner<>nil then begin
|
||||
Owner.Owner.FStates:=Owner.Owner.FStates+[tvsMaxRightNeedsUpdate,
|
||||
tvsTopsNeedsUpdate,tvsTopItemNeedsUpdate,tvsBottomItemNeedsUpdate];
|
||||
end;
|
||||
end;
|
||||
if FPrevBrother<>nil then FPrevBrother.FNextBrother:=FNextBrother;
|
||||
if FNextBrother<>nil then FNextBrother.FPrevBrother:=FPrevBrother;
|
||||
@ -847,6 +852,7 @@ writeln('[TTreeNode.Unbind] Self=',HexStr(Cardinal(Self),8),' Self.Text=',Text);
|
||||
end;
|
||||
if FParent.Count=0 then begin
|
||||
FParent.Expanded:=false;
|
||||
FParent.HasChildren:=false;
|
||||
end;
|
||||
FParent:=nil;
|
||||
end;
|
||||
|
@ -16,7 +16,7 @@
|
||||
ToDo:
|
||||
|
||||
}
|
||||
unit lresources;
|
||||
unit LResources;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user