MG: updates for codetools defines editor

git-svn-id: trunk@1478 -
This commit is contained in:
lazarus 2002-03-05 08:15:00 +00:00
parent 64825ceb38
commit 43f4a972db
12 changed files with 1089 additions and 258 deletions

4
.gitattributes vendored
View File

@ -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_none_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/ctdefinestate_projspec_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/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/directory_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/else_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 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/ifdef_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/ifndef_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/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.ico -text svneol=unset#image/x-icon
images/color.xpm -text svneol=native#image/x-xpixmap images/color.xpm -text svneol=native#image/x-xpixmap
images/components/default.ico -text svneol=unset#image/x-icon images/components/default.ico -text svneol=unset#image/x-icon

View File

@ -29,7 +29,7 @@
The information is stored in a TDefineTree, which contains nodes of type The information is stored in a TDefineTree, which contains nodes of type
TDefineTemplate. Each TDefineTemplate is a tree of defines, undefines, 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 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 variables for that directory. These values can be used to parse a unit in
@ -54,9 +54,9 @@ uses
KeywordFuncLists, FileProcs; KeywordFuncLists, FileProcs;
const const
ExternalMacroStart: char = '#'; // !!! it is hardcoded in linkscanner.pas ExternalMacroStart: char = '#'; // !!! this is hardcoded in linkscanner.pas
{$ifdef win32} {$ifdef win32}
SpecialChar: char = '/'; SpecialChar: char = '/'; // used to use PathDelim, e.g. /\
{$else} {$else}
SpecialChar: char = '\'; SpecialChar: char = '\';
{$endif} {$endif}
@ -89,9 +89,20 @@ type
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// TDefineTemplate is a list of TDefineEntry // TDefineTemplate is a list of TDefineEntry
// TDefineEntry stores a define action, the variablename and the value // TDefineEntry stores a define action, the variablename and the value
TDefineAction = (da_None, da_Block, da_Define, da_Undefine, da_DefineAll, TDefineAction = (da_None, da_Block, da_Define, da_DefineRecurse, da_Undefine,
da_If, da_IfDef, da_IfNDef, da_ElseIf, da_Else, da_Directory); 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); TDefineTemplateFlag = (dtfAutoGenerated, dtfProjectSpecific);
TDefineTemplateFlags = set of TDefineTemplateFlag; TDefineTemplateFlags = set of TDefineTemplateFlag;
@ -117,12 +128,15 @@ type
property FirstChild: TDefineTemplate read FFirstChild; property FirstChild: TDefineTemplate read FFirstChild;
property LastChild: TDefineTemplate read FLastChild; property LastChild: TDefineTemplate read FLastChild;
procedure AddChild(ADefineTemplate: TDefineTemplate); procedure AddChild(ADefineTemplate: TDefineTemplate);
procedure InsertAfter(APrior: TDefineTemplate); procedure InsertBehind(APrior: TDefineTemplate);
procedure InsertInFront(ANext: TDefineTemplate);
procedure Assign(ADefineTemplate: TDefineTemplate; procedure Assign(ADefineTemplate: TDefineTemplate;
WithSubNodes, WithNextSiblings: boolean); virtual; WithSubNodes, WithNextSiblings: boolean); virtual;
function IsEqual(ADefineTemplate: TDefineTemplate; function IsEqual(ADefineTemplate: TDefineTemplate;
CheckSubNodes, CheckNextSiblings: boolean): boolean; CheckSubNodes, CheckNextSiblings: boolean): boolean;
function FindChildByName(const AName: string): TDefineTemplate; function FindChildByName(const AName: string): TDefineTemplate;
function FindByName(const AName: string;
WithSubChilds, WithNextSiblings: boolean): TDefineTemplate;
function LoadFromXMLConfig(XMLConfig: TXMLConfig; function LoadFromXMLConfig(XMLConfig: TXMLConfig;
const Path: string): boolean; const Path: string): boolean;
procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string); procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string);
@ -173,13 +187,15 @@ type
read FFirstDefineTemplate write FFirstDefineTemplate; read FFirstDefineTemplate write FFirstDefineTemplate;
procedure AddFirst(ADefineTemplate: TDefineTemplate); procedure AddFirst(ADefineTemplate: TDefineTemplate);
procedure Add(ADefineTemplate: TDefineTemplate); procedure Add(ADefineTemplate: TDefineTemplate);
function FindDefineTemplateByName(const AName: string): TDefineTemplate; function FindDefineTemplateByName(const AName: string;
procedure ReplaceSameName(ADefineTemplate: TDefineTemplate); OnlyRoots: boolean): TDefineTemplate;
procedure ReplaceSameNameAddFirst(ADefineTemplate: TDefineTemplate); procedure ReplaceRootSameName(ADefineTemplate: TDefineTemplate);
procedure RemoveDefineTemplateByName(const AName: string); procedure ReplaceRootSameNameAddFirst(ADefineTemplate: TDefineTemplate);
procedure RemoveRootDefineTemplateByName(const AName: string);
property OnReadValue: TOnReadValue read FOnReadValue write FOnReadValue; property OnReadValue: TOnReadValue read FOnReadValue write FOnReadValue;
property ErrorTemplate: TDefineTemplate read FErrorTemplate; property ErrorTemplate: TDefineTemplate read FErrorTemplate;
property ErrorDescription: string read FErrorDescription; property ErrorDescription: string read FErrorDescription;
function ExtractDefineTree(ProjectSpecific: boolean): TDefineTree;
function LoadFromXMLConfig(XMLConfig: TXMLConfig; function LoadFromXMLConfig(XMLConfig: TXMLConfig;
const Path: string): boolean; const Path: string): boolean;
function SaveToXMLConfig(XMLConfig: TXMLConfig; function SaveToXMLConfig(XMLConfig: TXMLConfig;
@ -226,6 +242,8 @@ const
'AutoGenerated', 'ProjectSpecific' 'AutoGenerated', 'ProjectSpecific'
); );
function DefineActionNameToAction(const s: string): TDefineAction;
implementation implementation
@ -240,6 +258,13 @@ type
// some useful functions // 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; function CompareFilenames(const FileName1, Filename2: string): integer;
begin begin
{$ifdef CaseInsensitiveFilenames} {$ifdef CaseInsensitiveFilenames}
@ -393,38 +418,75 @@ begin
ADefineTemplate:=ADefineTemplate.Next; ADefineTemplate:=ADefineTemplate.Next;
end; end;
end else begin end else begin
ADefineTemplate.InsertAfter(LastChild); ADefineTemplate.InsertBehind(LastChild);
end; end;
end; end;
procedure TDefineTemplate.InsertAfter(APrior: TDefineTemplate); procedure TDefineTemplate.InsertBehind(APrior: TDefineTemplate);
var ANode, LastSibling: TDefineTemplate; // insert this and all next siblings behind APrior
var ANode, LastSibling, NewParent: TDefineTemplate;
begin begin
if APrior=nil then exit; if APrior=nil then exit;
NewParent:=APrior.Parent;
if FParent<>nil then begin if FParent<>nil then begin
ANode:=Self; ANode:=Self;
while ANode<>nil do begin 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.FParent:=nil;
ANode:=ANode.Next; ANode:=ANode.Next;
end; end;
end; end;
LastSibling:=Self; LastSibling:=Self;
while LastSibling.Next<>nil do LastSibling:=LastSibling.Next; while LastSibling.Next<>nil do LastSibling:=LastSibling.Next;
FPrior:=APrior; FParent:=NewParent;
LastSibling.FNext:=APrior.Next;
APrior.FNext:=Self;
if LastSibling.Next<>nil then LastSibling.Next.FPrior:=LastSibling;
FParent:=APrior.Parent;
if Parent<>nil then begin if Parent<>nil then begin
ANode:=Self; ANode:=Self;
while ANode<>nil do begin while (ANode<>nil) do begin
ANode.FParent:=Parent; ANode.FParent:=Parent;
inc(ANode.Parent.FChildCount); inc(Parent.FChildCount);
ANode:=ANode.Next; ANode:=ANode.Next;
end; end;
if Parent.LastChild=APrior then Parent.FLastChild:=LastSibling; if Parent.LastChild=APrior then Parent.FLastChild:=LastSibling;
end; 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; end;
procedure TDefineTemplate.Assign(ADefineTemplate: TDefineTemplate; procedure TDefineTemplate.Assign(ADefineTemplate: TDefineTemplate;
@ -452,7 +514,7 @@ begin
NextTemplate:=ADefineTemplate.Next; NextTemplate:=ADefineTemplate.Next;
if NextTemplate<>nil then begin if NextTemplate<>nil then begin
CopyTemplate:=TDefineTemplate.Create; CopyTemplate:=TDefineTemplate.Create;
CopyTemplate.InsertAfter(Self); CopyTemplate.InsertBehind(Self);
CopyTemplate.Assign(NextTemplate,WithSubNodes,true); CopyTemplate.Assign(NextTemplate,WithSubNodes,true);
end; end;
end; end;
@ -516,13 +578,13 @@ end;
function TDefineTemplate.LoadFromXMLConfig(XMLConfig: TXMLConfig; function TDefineTemplate.LoadFromXMLConfig(XMLConfig: TXMLConfig;
const Path: string): boolean; const Path: string): boolean;
var ActionStr, IndexedPath: string; var IndexedPath: string;
i, LvlCount: integer; i, LvlCount: integer;
DefTempl, LastDefTempl: TDefineTemplate; DefTempl, LastDefTempl: TDefineTemplate;
f: TDefineTemplateFlag; f: TDefineTemplateFlag;
begin begin
Clear; Clear;
LvlCount:=XMLConfig.GetValue(Path+'/Count/Value',0); LvlCount:=XMLConfig.GetValue(Path+'Count/Value',0);
DefTempl:=nil; DefTempl:=nil;
for i:=0 to LvlCount-1 do begin for i:=0 to LvlCount-1 do begin
if i=0 then begin if i=0 then begin
@ -538,43 +600,22 @@ begin
inc(DefTempl.FParent.FChildCount); inc(DefTempl.FParent.FChildCount);
end; end;
end; end;
IndexedPath:=Path+'/'+IntToStr(i); IndexedPath:=Path+IntToStr(i)+'/';
DefTempl.Name:=XMLConfig.GetValue(IndexedPath+'/Name/Value','no name'); DefTempl.Name:=XMLConfig.GetValue(IndexedPath+'Name/Value','no name');
DefTempl.Description:=XMLConfig.GetValue(IndexedPath+'/Description/Value',''); DefTempl.Description:=XMLConfig.GetValue(IndexedPath+'Description/Value','');
DefTempl.Value:=XMLConfig.GetValue(IndexedPath+'/Value/Value',''); DefTempl.Value:=XMLConfig.GetValue(IndexedPath+'Value/Value','');
DefTempl.Variable:=XMLConfig.GetValue(IndexedPath+'/Variable/Value',''); DefTempl.Variable:=XMLConfig.GetValue(IndexedPath+'Variable/Value','');
ActionStr:=UpperCaseStr(XMLConfig.GetValue(IndexedPath+'/Action/Value','')); DefTempl.Action:=DefineActionNameToAction(
if ActionStr='BLOCK' then XMLConfig.GetValue(IndexedPath+'Action/Value',''));
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;
Flags:=[]; Flags:=[];
for f:=Low(TDefineTemplateFlag) to High(TDefineTemplateFlag) do begin 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) +'/Value',false)
then then
Include(Flags,f); Include(Flags,f);
end; end;
// load childs // 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; FFirstChild:=TDefineTemplate.Create;
if not FFirstChild.LoadFromXMLConfig(XMLConfig,IndexedPath) then begin if not FFirstChild.LoadFromXMLConfig(XMLConfig,IndexedPath) then begin
Result:=false; exit; Result:=false; exit;
@ -586,7 +627,7 @@ end;
procedure TDefineTemplate.SaveToXMLConfig(XMLConfig: TXMLConfig; procedure TDefineTemplate.SaveToXMLConfig(XMLConfig: TXMLConfig;
const Path: string); const Path: string);
var ActionStr, IndexedPath: string; var IndexedPath: string;
Index, LvlCount: integer; Index, LvlCount: integer;
DefTempl: TDefineTemplate; DefTempl: TDefineTemplate;
f: TDefineTemplateFlag; f: TDefineTemplateFlag;
@ -601,28 +642,15 @@ begin
DefTempl:=Self; DefTempl:=Self;
Index:=1; Index:=1;
repeat repeat
IndexedPath:=Path+'/'+IntToStr(Index); IndexedPath:=Path+IntToStr(Index)+'/';
XMLConfig.SetValue(IndexedPath+'/Name/Value',DefTempl.Name); XMLConfig.SetValue(IndexedPath+'Name/Value',DefTempl.Name);
XMLConfig.SetValue(IndexedPath+'/Description/Value',DefTempl.Description); XMLConfig.SetValue(IndexedPath+'Description/Value',DefTempl.Description);
XMLConfig.SetValue(IndexedPath+'/Value/Value',DefTempl.Value); XMLConfig.SetValue(IndexedPath+'Value/Value',DefTempl.Value);
XMLConfig.SetValue(IndexedPath+'/Variable/Value',DefTempl.Variable); XMLConfig.SetValue(IndexedPath+'Variable/Value',DefTempl.Variable);
case DefTempl.Action of XMLConfig.SetValue(IndexedPath+'Action/Value',
da_Block : ActionStr:='Block'; DefineActionNames[DefTempl.Action]);
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);
for f:=Low(TDefineTemplateFlag) to High(TDefineTemplateFlag) do begin 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); +'/Value',f in Flags);
end; end;
// save childs // save childs
@ -683,20 +711,7 @@ procedure TDefineTemplate.WriteDebugReport;
var ActionStr: string; var ActionStr: string;
begin begin
if ANode=nil then exit; if ANode=nil then exit;
case ANode.Action of ActionStr:=DefineActionNames[ANode.Action];
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;
writeln(Prefix,'Self=',HexStr(Cardinal(ANode),8), writeln(Prefix,'Self=',HexStr(Cardinal(ANode),8),
' Consistency=',ANode.ConsistencyCheck, ' Consistency=',ANode.ConsistencyCheck,
' Next=',HexStr(Cardinal(ANode.Next),8), ' Next=',HexStr(Cardinal(ANode.Next),8),
@ -778,10 +793,31 @@ end;
function TDefineTemplate.FindChildByName(const AName: string): TDefineTemplate; function TDefineTemplate.FindChildByName(const AName: string): TDefineTemplate;
begin begin
Result:=FirstChild; if FirstChild<>nil then begin
while Result<>nil do begin Result:=FirstChild.FindByName(AName,false,true)
if AnsiCompareText(Result.Name,AName)=0 then exit; end else
Result:=Result.Next; 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;
end; end;
@ -1042,30 +1078,36 @@ var
case DefTempl.Action of case DefTempl.Action of
da_Block: da_Block:
// calculate children // calculate children
begin CalculateTemplate(DefTempl.FirstChild,CurPath);
CalculateTemplate(DefTempl.FirstChild,CurPath);
end;
da_Define: da_Define:
// Define for a single Directory (not SubDirs) // Define for a single Directory (not SubDirs)
begin if FilenameIsMatching(CurPath,ExpandedDirectory,true) then 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
DirDef.Values.Variables[DefTempl.Variable]:= DirDef.Values.Variables[DefTempl.Variable]:=
ReadValue(DefTempl.Value); ReadValue(DefTempl.Value);
end; 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: da_If, da_ElseIf:
begin begin
// test expression in value // test expression in value
@ -1080,22 +1122,19 @@ var
end; end;
end; end;
da_IfDef: da_IfDef:
begin // test if variable is defined
// test if variable is defined if DirDef.Values.IsDefined(DefTempl.Variable) then
if DirDef.Values.IsDefined(DefTempl.Variable) then CalculateIfChilds;
CalculateIfChilds;
end;
da_IfNDef: da_IfNDef:
begin // test if variable is not defined
// test if variable is not defined if not DirDef.Values.IsDefined(DefTempl.Variable) then
if not DirDef.Values.IsDefined(DefTempl.Variable) then CalculateIfChilds;
CalculateIfChilds;
end;
da_Else: da_Else:
begin // execute childs
// execute childs CalculateTemplate(DefTempl.FirstChild,CurPath);
CalculateTemplate(DefTempl.FirstChild,CurPath);
end;
da_Directory: da_Directory:
begin begin
// template for a sub directory // template for a sub directory
@ -1164,7 +1203,7 @@ begin
LastDefTempl:=RootTemplate; LastDefTempl:=RootTemplate;
while LastDefTempl.Next<>nil do while LastDefTempl.Next<>nil do
LastDefTempl:=LastDefTempl.Next; LastDefTempl:=LastDefTempl.Next;
ADefineTemplate.InsertAfter(LastDefTempl); ADefineTemplate.InsertBehind(LastDefTempl);
end; end;
end; end;
@ -1175,23 +1214,25 @@ begin
if RootTemplate=nil then if RootTemplate=nil then
RootTemplate:=ADefineTemplate RootTemplate:=ADefineTemplate
else begin else begin
RootTemplate.InsertAfter(ADefineTemplate); RootTemplate.InsertBehind(ADefineTemplate);
RootTemplate:=ADefineTemplate; RootTemplate:=ADefineTemplate;
end; end;
end; end;
function TDefineTree.FindDefineTemplateByName( function TDefineTree.FindDefineTemplateByName(
const AName: string): TDefineTemplate; const AName: string; OnlyRoots: boolean): TDefineTemplate;
begin begin
Result:=RootTemplate; Result:=RootTemplate;
while (Result<>nil) and (AnsiCompareText(Result.Name,AName)<>0) do if RootTemplate<>nil then
Result:=Result.Next; Result:=RootTemplate.FindByName(AName,not OnlyRoots,true)
else
Result:=nil;
end; end;
procedure TDefineTree.RemoveDefineTemplateByName(const AName: string); procedure TDefineTree.RemoveRootDefineTemplateByName(const AName: string);
var ADefTempl: TDefineTemplate; var ADefTempl: TDefineTemplate;
begin begin
ADefTempl:=FindDefineTemplateByName(AName); ADefTempl:=FindDefineTemplateByName(AName,true);
if ADefTempl<>nil then begin if ADefTempl<>nil then begin
if ADefTempl=FFirstDefineTemplate then if ADefTempl=FFirstDefineTemplate then
FFirstDefineTemplate:=FFirstDefineTemplate.Next; FFirstDefineTemplate:=FFirstDefineTemplate.Next;
@ -1200,18 +1241,32 @@ begin
end; end;
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 // if there is a DefineTemplate with the same name then replace it
// else add as last // else add as last
var OldDefineTemplate: TDefineTemplate; var OldDefineTemplate: TDefineTemplate;
begin begin
if (ADefineTemplate=nil) then exit; if (ADefineTemplate=nil) then exit;
OldDefineTemplate:=FindDefineTemplateByName(ADefineTemplate.Name); OldDefineTemplate:=FindDefineTemplateByName(ADefineTemplate.Name,true);
if OldDefineTemplate<>nil then begin if OldDefineTemplate<>nil then begin
if not OldDefineTemplate.IsEqual(ADefineTemplate,true,false) then begin if not OldDefineTemplate.IsEqual(ADefineTemplate,true,false) then begin
ClearCache; ClearCache;
end; end;
ADefineTemplate.InsertAfter(OldDefineTemplate); ADefineTemplate.InsertBehind(OldDefineTemplate);
if OldDefineTemplate=FFirstDefineTemplate then if OldDefineTemplate=FFirstDefineTemplate then
FFirstDefineTemplate:=FFirstDefineTemplate.Next; FFirstDefineTemplate:=FFirstDefineTemplate.Next;
OldDefineTemplate.Unbind; OldDefineTemplate.Unbind;
@ -1220,16 +1275,17 @@ begin
Add(ADefineTemplate); Add(ADefineTemplate);
end; end;
procedure TDefineTree.ReplaceSameNameAddFirst(ADefineTemplate: TDefineTemplate); procedure TDefineTree.ReplaceRootSameNameAddFirst(
ADefineTemplate: TDefineTemplate);
var OldDefineTemplate: TDefineTemplate; var OldDefineTemplate: TDefineTemplate;
begin begin
if ADefineTemplate=nil then exit; if ADefineTemplate=nil then exit;
OldDefineTemplate:=FindDefineTemplateByName(ADefineTemplate.Name); OldDefineTemplate:=FindDefineTemplateByName(ADefineTemplate.Name,true);
if OldDefineTemplate<>nil then begin if OldDefineTemplate<>nil then begin
if not OldDefineTemplate.IsEqual(ADefineTemplate,true,false) then begin if not OldDefineTemplate.IsEqual(ADefineTemplate,true,false) then begin
ClearCache; ClearCache;
end; end;
ADefineTemplate.InsertAfter(OldDefineTemplate); ADefineTemplate.InsertBehind(OldDefineTemplate);
if OldDefineTemplate=FFirstDefineTemplate then if OldDefineTemplate=FFirstDefineTemplate then
FFirstDefineTemplate:=FFirstDefineTemplate.Next; FFirstDefineTemplate:=FFirstDefineTemplate.Next;
OldDefineTemplate.Unbind; OldDefineTemplate.Unbind;
@ -1334,7 +1390,7 @@ function TDefinePool.CreateFPCTemplate(
if copy(UpLine,1,15)='MACRO DEFINED: ' then begin if copy(UpLine,1,15)='MACRO DEFINED: ' then begin
MacroName:=copy(UpLine,16,length(Line)-15); MacroName:=copy(UpLine,16,length(Line)-15);
NewDefTempl:=TDefineTemplate.Create('Define '+MacroName, 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 end else if copy(UpLine,1,6)='MACRO ' then begin
Line:=copy(Line,7,length(Line)-6); Line:=copy(Line,7,length(Line)-6);
i:=1; i:=1;
@ -1345,14 +1401,14 @@ function TDefinePool.CreateFPCTemplate(
if copy(Line,1,7)='set to ' then begin if copy(Line,1,7)='set to ' then begin
MacroValue:=copy(Line,8,length(Line)-7); MacroValue:=copy(Line,8,length(Line)-7);
NewDefTempl:=TDefineTemplate.Create('Define '+MacroName, NewDefTempl:=TDefineTemplate.Create('Define '+MacroName,
'Default ppc386 macro',MacroName,MacroValue,da_DefineAll); 'Default ppc386 macro',MacroName,MacroValue,da_DefineRecurse);
end; end;
end else if copy(UpLine,1,17)='USING UNIT PATH: ' then begin end else if copy(UpLine,1,17)='USING UNIT PATH: ' then begin
UnitSearchPath:=UnitSearchPath+copy(Line,18,length(Line)-17)+#13; UnitSearchPath:=UnitSearchPath+copy(Line,18,length(Line)-17)+#13;
end; end;
if NewDefTempl<>nil then begin if NewDefTempl<>nil then begin
if LastDefTempl<>nil then if LastDefTempl<>nil then
NewDefTempl.InsertAfter(LastDefTempl); NewDefTempl.InsertBehind(LastDefTempl);
LastDefTempl:=NewDefTempl; LastDefTempl:=NewDefTempl;
end; end;
end; end;
@ -1432,9 +1488,9 @@ begin
TargetOS:=copy(Buf,1,i-1); TargetOS:=copy(Buf,1,i-1);
NewDefTempl:=TDefineTemplate.Create('Define TargetOS', NewDefTempl:=TDefineTemplate.Create('Define TargetOS',
'Default ppc386 target Operating System', 'Default ppc386 target Operating System',
ExternalMacroStart+'TargetOS',TargetOS,da_DefineAll); ExternalMacroStart+'TargetOS',TargetOS,da_DefineRecurse);
if DefTempl<>nil then if DefTempl<>nil then
NewDefTempl.InsertAfter(DefTempl); NewDefTempl.InsertBehind(DefTempl);
DefTempl:=NewDefTempl; DefTempl:=NewDefTempl;
if TargetOS='linux' then if TargetOS='linux' then
SrcOS:='unix' SrcOS:='unix'
@ -1442,9 +1498,9 @@ begin
SrcOS:=TargetOS; SrcOS:=TargetOS;
NewDefTempl:=TDefineTemplate.Create('Define SrcOS', NewDefTempl:=TDefineTemplate.Create('Define SrcOS',
'Default ppc386 source Operating System', 'Default ppc386 source Operating System',
ExternalMacroStart+'SrcOS',SrcOS,da_DefineAll); ExternalMacroStart+'SrcOS',SrcOS,da_DefineRecurse);
if DefTempl<>nil then if DefTempl<>nil then
NewDefTempl.InsertAfter(DefTempl); NewDefTempl.InsertBehind(DefTempl);
DefTempl:=NewDefTempl; DefTempl:=NewDefTempl;
break; break;
end; end;
@ -1472,9 +1528,9 @@ begin
TargetProcessor:=copy(Buf,1,i-1); TargetProcessor:=copy(Buf,1,i-1);
NewDefTempl:=TDefineTemplate.Create('Define TargetProcessor', NewDefTempl:=TDefineTemplate.Create('Define TargetProcessor',
'Default ppc386 target Operating System', 'Default ppc386 target Operating System',
ExternalMacroStart+'TargetProcessor',TargetProcessor,da_DefineAll); ExternalMacroStart+'TargetProcessor',TargetProcessor,da_DefineRecurse);
if DefTempl<>nil then if DefTempl<>nil then
NewDefTempl.InsertAfter(DefTempl); NewDefTempl.InsertBehind(DefTempl);
DefTempl:=NewDefTempl; DefTempl:=NewDefTempl;
break; break;
end; end;
@ -1770,7 +1826,7 @@ begin
FindStandardPPUSources; FindStandardPPUSources;
DefTempl:=TDefineTemplate.Create('FPC Unit Links', DefTempl:=TDefineTemplate.Create('FPC Unit Links',
'Source filenames for the standard fpc units', 'Source filenames for the standard fpc units',
UnitLinks,UnitLinkList,da_DefineAll); UnitLinks,UnitLinkList,da_DefineRecurse);
Result.AddChild(DefTempl); Result.AddChild(DefTempl);
// The free pascal sources build a world of their own, // The free pascal sources build a world of their own,
@ -1781,7 +1837,7 @@ begin
Result.AddChild(MainDir); Result.AddChild(MainDir);
DefTempl:=TDefineTemplate.Create('Reset SrcPath', DefTempl:=TDefineTemplate.Create('Reset SrcPath',
'SrcPath Init', 'SrcPath Init',
ExternalMacroStart+'SrcPath','',da_DefineAll); ExternalMacroStart+'SrcPath','',da_DefineRecurse);
MainDir.AddChild(DefTempl); MainDir.AddChild(DefTempl);
// compiler // compiler
@ -1801,7 +1857,7 @@ begin
s:=s+';'+Dir+'rtl'+DS+TargetOS+DS; s:=s+';'+Dir+'rtl'+DS+TargetOS+DS;
RTLDir.AddChild(TDefineTemplate.Create('Include Path', RTLDir.AddChild(TDefineTemplate.Create('Include Path',
'include directory objpas, inc, processor specific', 'include directory objpas, inc, processor specific',
ExternalMacroStart+'IncPath',s,da_DefineAll)); ExternalMacroStart+'IncPath',s,da_DefineRecurse));
// fcl // fcl
FCLDir:=TDefineTemplate.Create('FCL','Free Pascal Component Library','','fcl', FCLDir:=TDefineTemplate.Create('FCL','Free Pascal Component Library','','fcl',
@ -1812,7 +1868,7 @@ begin
ExternalMacroStart+'IncPath', ExternalMacroStart+'IncPath',
IncPathMacro IncPathMacro
+';'+Dir+'fcl/inc/' +';'+Dir+'fcl/inc/'
,da_DefineAll)); ,da_DefineRecurse));
// packages // packages
PackagesDir:=TDefineTemplate.Create('Packages','Package directories','', PackagesDir:=TDefineTemplate.Create('Packages','Package directories','',
@ -1883,7 +1939,7 @@ begin
'','interfaces',da_Directory); '','interfaces',da_Directory);
SubDirTempl.AddChild(TDefineTemplate.Create('LCL Path', SubDirTempl.AddChild(TDefineTemplate.Create('LCL Path',
'adds lcl to SrcPath',ExternalMacroStart+'SrcPath', 'adds lcl to SrcPath',ExternalMacroStart+'SrcPath',
LazarusSrcDir+ds+'lcl;'+SrcPath,da_DefineAll)); LazarusSrcDir+ds+'lcl;'+SrcPath,da_DefineRecurse));
DirTempl.AddChild(SubDirTempl); DirTempl.AddChild(SubDirTempl);
// components // components
@ -1894,7 +1950,7 @@ begin
LazarusSrcDir+ds+'lcl' LazarusSrcDir+ds+'lcl'
+';'+LazarusSrcDir+ds+'lcl'+ds+'interfaces'+ds+WidgetType +';'+LazarusSrcDir+ds+'lcl'+ds+'interfaces'+ds+WidgetType
+';'+SrcPath +';'+SrcPath
,da_DefineAll)); ,da_DefineRecurse));
MainDir.AddChild(DirTempl); MainDir.AddChild(DirTempl);
// tools // tools
@ -1947,7 +2003,7 @@ begin
'..'+ds+'lcl' '..'+ds+'lcl'
+';..'+ds+'lcl'+ds+'interfaces'+ds+WidgetType +';..'+ds+'lcl'+ds+'interfaces'+ds+WidgetType
+';'+SrcPath +';'+SrcPath
,da_DefineAll)); ,da_DefineRecurse));
if MainDir<>nil then begin if MainDir<>nil then begin
Result:=TDefineTemplate.Create(StdDefTemplLazarusSources, Result:=TDefineTemplate.Create(StdDefTemplLazarusSources,
@ -1971,7 +2027,7 @@ begin
+LazarusSrcDir+PathDelim+'lcl'+PathDelim+'interfaces' +LazarusSrcDir+PathDelim+'lcl'+PathDelim+'interfaces'
+PathDelim+WidgetType +PathDelim+WidgetType
+';$('+ExternalMacroStart+'SrcPath)' +';$('+ExternalMacroStart+'SrcPath)'
,da_DefineAll)); ,da_DefineRecurse));
Result:=TDefineTemplate.Create(StdDefTemplLCLProject, Result:=TDefineTemplate.Create(StdDefTemplLCLProject,
'LCL Project','','',da_Block); 'LCL Project','','',da_Block);
Result.Flags:=[dtfAutoGenerated]; Result.Flags:=[dtfAutoGenerated];

View File

@ -247,7 +247,7 @@
+'. . . . . . . . . . . . . . . . . . . . ",'#10'". . . . . . . . . . . . ' +'. . . . . . . . . . . . . . . . . . . . ",'#10'". . . . . . . . . . . . '
+'. . . . . . . . . . "};'#10 +'. . . . . . . . . . "};'#10
); );
LazarusResources.Add('defineall_22x22','XPM', LazarusResources.Add('definerecurse_22x22','XPM',
'/* XPM */'#10'static char * defineall_22x22_xpm[] = {'#10'"22 22 144 2",' '/* 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'"@ ' +#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' +#9'c #FFD9D9",'#10'"# '#9'c #F5F5F5",'#10'"$ '#9'c #C7C7C7",'#10'"% '#9'c'
@ -658,3 +658,142 @@
+'. . . . . . . . . . . . . . ",'#10'". . . . . . . . . . . . . . . . . . ' +'. . . . . . . . . . . . . . ",'#10'". . . . . . . . . . . . . . . . . . '
+'. . . . "};'#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
);

View File

@ -16,7 +16,16 @@
Author: Mattias Gaertner Author: Mattias Gaertner
Abstract: 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; unit CodeToolsDefines;
@ -47,8 +56,10 @@ type
MoveNodeLvlDownMenuItem: TMenuItem; MoveNodeLvlDownMenuItem: TMenuItem;
InsertBehindMenuItem: TMenuItem; InsertBehindMenuItem: TMenuItem;
InsertBehindDefineMenuItem: TMenuItem; InsertBehindDefineMenuItem: TMenuItem;
InsertBehindDefineAllMenuItem: TMenuItem; InsertBehindDefineRecurseMenuItem: TMenuItem;
InsertBehindUndefineMenuItem: TMenuItem; InsertBehindUndefineMenuItem: TMenuItem;
InsertBehindUndefineRecurseMenuItem: TMenuItem;
InsertBehindUndefineAllMenuItem: TMenuItem;
InsertBehindBlockMenuItem: TMenuItem; InsertBehindBlockMenuItem: TMenuItem;
InsertBehindDirectoryMenuItem: TMenuItem; InsertBehindDirectoryMenuItem: TMenuItem;
InsertBehindIfMenuItem: TMenuItem; InsertBehindIfMenuItem: TMenuItem;
@ -58,8 +69,10 @@ type
InsertBehindElseMenuItem: TMenuItem; InsertBehindElseMenuItem: TMenuItem;
InsertAsChildMenuItem: TMenuItem; InsertAsChildMenuItem: TMenuItem;
InsertAsChildDefineMenuItem: TMenuItem; InsertAsChildDefineMenuItem: TMenuItem;
InsertAsChildDefineAllMenuItem: TMenuItem; InsertAsChildDefineRecurseMenuItem: TMenuItem;
InsertAsChildUndefineMenuItem: TMenuItem; InsertAsChildUndefineMenuItem: TMenuItem;
InsertAsChildUndefineRecurseMenuItem: TMenuItem;
InsertAsChildUndefineAllMenuItem: TMenuItem;
InsertAsChildBlockMenuItem: TMenuItem; InsertAsChildBlockMenuItem: TMenuItem;
InsertAsChildDirectoryMenuItem: TMenuItem; InsertAsChildDirectoryMenuItem: TMenuItem;
InsertAsChildIfMenuItem: TMenuItem; InsertAsChildIfMenuItem: TMenuItem;
@ -100,18 +113,30 @@ type
DeleteFilePathBitBtn: TBitBtn; DeleteFilePathBitBtn: TBitBtn;
InsertFilePathBitBtn: TBitBtn; InsertFilePathBitBtn: TBitBtn;
procedure SaveAndExitMenuItemClick(Sender: TObject); // misc
procedure DontSaveAndExitMenuItemClick(Sender: TObject);
procedure FormResize(Sender: TObject); procedure FormResize(Sender: TObject);
procedure DefineTreeViewMouseUp(Sender: TObject; Button: TMouseButton; procedure DefineTreeViewMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: integer); 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 ValueNoteBookPageChanged(Sender: TObject);
procedure MoveFilePathUpBitBtnClick(Sender: TObject); procedure MoveFilePathUpBitBtnClick(Sender: TObject);
procedure MoveFilePathDownBitBtnClick(Sender: TObject); procedure MoveFilePathDownBitBtnClick(Sender: TObject);
procedure DeleteFilePathBitBtnClick(Sender: TObject); procedure DeleteFilePathBitBtnClick(Sender: TObject);
procedure InsertFilePathBitBtnClick(Sender: TObject); procedure InsertFilePathBitBtnClick(Sender: TObject);
// edit menu
procedure InsertNodeMenuItemClick(Sender: TObject); 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 private
FDefineTree: TDefineTree; FDefineTree: TDefineTree;
FLastSelectedNode: TTreeNode; FLastSelectedNode: TTreeNode;
@ -127,6 +152,9 @@ type
procedure SetTypeLabel; procedure SetTypeLabel;
function ValueToFilePathText(const AValue: string): string; function ValueToFilePathText(const AValue: string): string;
procedure InsertNewNode(Behind: boolean; Action: TDefineAction); procedure InsertNewNode(Behind: boolean; Action: TDefineAction);
function FindUniqueName: string;
function ConsistencyCheck: integer;
procedure SetValuesEditable(AValue: boolean);
public public
procedure Assign(ACodeToolBoss: TCodeToolManager; procedure Assign(ACodeToolBoss: TCodeToolManager;
Options: TCodeToolsOptions); Options: TCodeToolsOptions);
@ -141,12 +169,6 @@ function ShowCodeToolsDefinesEditor(ACodeToolBoss: TCodeToolManager;
implementation implementation
const
DefineActionNames: array[TDefineAction] of string = (
'None', 'Block', 'Define', 'Undefine', 'DefineAll',
'If', 'IfDef', 'IfNDef', 'ElseIf', 'Else', 'Directory'
);
type type
TWinControlClass = class of TWinControl; TWinControlClass = class of TWinControl;
@ -288,7 +310,10 @@ end;
procedure TCodeToolsDefinesEditor.ValueNoteBookPageChanged(Sender: TObject); procedure TCodeToolsDefinesEditor.ValueNoteBookPageChanged(Sender: TObject);
begin begin
if ValueNoteBook.PageIndex=0 then ValueAsPathToValueAsText; if ValueNoteBook.PageIndex=0 then
ValueAsPathToValueAsText
else
ValueAsFilePathsSynEdit.Text:=ValueToFilePathText(ValueAsTextSynEdit.Text);
end; end;
procedure TCodeToolsDefinesEditor.MoveFilePathUpBitBtnClick(Sender: TObject); procedure TCodeToolsDefinesEditor.MoveFilePathUpBitBtnClick(Sender: TObject);
@ -333,8 +358,10 @@ var Behind: boolean;
begin begin
Behind:=(TMenuItem(Sender).Parent=InsertBehindMenuItem); Behind:=(TMenuItem(Sender).Parent=InsertBehindMenuItem);
if Sender=InsertBehindDefineMenuItem then Action:=da_Define 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=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=InsertBehindBlockMenuItem then Action:=da_Block
else if Sender=InsertBehindDirectoryMenuItem then Action:=da_Directory else if Sender=InsertBehindDirectoryMenuItem then Action:=da_Directory
else if Sender=InsertBehindIfMenuItem then Action:=da_If else if Sender=InsertBehindIfMenuItem then Action:=da_If
@ -343,8 +370,10 @@ begin
else if Sender=InsertBehindElseIfMenuItem then Action:=da_ElseIf else if Sender=InsertBehindElseIfMenuItem then Action:=da_ElseIf
else if Sender=InsertBehindElseMenuItem then Action:=da_Else else if Sender=InsertBehindElseMenuItem then Action:=da_Else
else if Sender=InsertAsChildDefineMenuItem then Action:=da_Define 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=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=InsertAsChildBlockMenuItem then Action:=da_Block
else if Sender=InsertAsChildDirectoryMenuItem then Action:=da_Directory else if Sender=InsertAsChildDirectoryMenuItem then Action:=da_Directory
else if Sender=InsertAsChildIfMenuItem then Action:=da_If else if Sender=InsertAsChildIfMenuItem then Action:=da_If
@ -355,17 +384,136 @@ begin
InsertNewNode(Behind,Action); InsertNewNode(Behind,Action);
end; 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); procedure TCodeToolsDefinesEditor.ProjectSpecificCheckBoxClick(Sender: TObject);
var var
SelTreeNode: TTreeNode; SelTreeNode: TTreeNode;
SelDefNode: TDefineTemplate; SelDefNode: TDefineTemplate;
begin begin
if not SelectedItemGroupBox.Enabled then exit;
SelTreeNode:=DefineTreeView.Selected; SelTreeNode:=DefineTreeView.Selected;
if SelTreeNode=nil then exit; if SelTreeNode=nil then exit;
SelDefNode:=TDefineTemplate(SelTreeNode.Data); SelDefNode:=TDefineTemplate(SelTreeNode.Data);
if ProjectSpecificCheckBox.Checked=(dtfProjectSpecific in SelDefNode.Flags) if ProjectSpecificCheckBox.Checked=(dtfProjectSpecific in SelDefNode.Flags)
then exit; 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 if ProjectSpecificCheckBox.Checked then
Include(SelDefNode.Flags,dtfProjectSpecific) Include(SelDefNode.Flags,dtfProjectSpecific)
else else
@ -417,8 +565,10 @@ begin
Height:=22; Height:=22;
Name:='TheImageList'; Name:='TheImageList';
AddResImg('define_22x22'); AddResImg('define_22x22');
AddResImg('defineall_22x22'); AddResImg('definerecurse_22x22');
AddResImg('undefine_22x22'); AddResImg('undefine_22x22');
AddResImg('undefinerecurse_22x22');
AddResImg('undefineall_22x22');
AddResImg('block_22x22'); AddResImg('block_22x22');
AddResImg('directory_22x22'); AddResImg('directory_22x22');
AddResImg('if_22x22'); AddResImg('if_22x22');
@ -451,37 +601,56 @@ begin
AddMenuItem(EditMenuItem,'EditMenuItem','Edit',nil); AddMenuItem(EditMenuItem,'EditMenuItem','Edit',nil);
AddMenuItem(MoveNodeUpMenuItem,'MoveNodeUpMenuItem','Move node up', AddMenuItem(MoveNodeUpMenuItem,'MoveNodeUpMenuItem','Move node up',
EditMenuItem); EditMenuItem);
MoveNodeUpMenuItem.OnClick:=@MoveNodeUpMenuItemClick;
AddMenuItem(MoveNodeDownMenuItem,'MoveNodeDownMenuItem','Move node down', AddMenuItem(MoveNodeDownMenuItem,'MoveNodeDownMenuItem','Move node down',
EditMenuItem); EditMenuItem);
MoveNodeDownMenuItem.OnClick:=@MoveNodeDownMenuItemClick;
AddMenuItem(MoveNodeLvlUpMenuItem,'MoveNodeLvlUpMenuItem','Move node one level up', AddMenuItem(MoveNodeLvlUpMenuItem,'MoveNodeLvlUpMenuItem','Move node one level up',
EditMenuItem); EditMenuItem);
MoveNodeLvlUpMenuItem.OnClick:=@MoveNodeLvlUpMenuItemClick;
AddMenuItem(MoveNodeLvlDownMenuItem,'MoveNodeLvlDownMenuItem','Move node one level down', AddMenuItem(MoveNodeLvlDownMenuItem,'MoveNodeLvlDownMenuItem','Move node one level down',
EditMenuItem); EditMenuItem);
MoveNodeLvlDownMenuItem.OnClick:=@MoveNodeLvlDownMenuItemClick;
EditMenuItem.Add(CreateSeperator); EditMenuItem.Add(CreateSeperator);
AddMenuItem(InsertBehindMenuItem,'InsertBehindMenuItem','Insert node behind', AddMenuItem(InsertBehindMenuItem,'InsertBehindMenuItem','Insert node below',
EditMenuItem); EditMenuItem);
AddMenuItem(InsertAsChildMenuItem,'InsertAsChildMenuItem','Insert node as child', AddMenuItem(InsertAsChildMenuItem,'InsertAsChildMenuItem','Insert node as child',
EditMenuItem); EditMenuItem);
EditMenuItem.Add(CreateSeperator); EditMenuItem.Add(CreateSeperator);
AddMenuItem(DeleteNodeMenuItem,'DeleteNodeMenuItem','Delete node', AddMenuItem(DeleteNodeMenuItem,'DeleteNodeMenuItem','Delete node',
EditMenuItem); EditMenuItem);
EditMenuItem.Add(CreateSeperator); DeleteNodeMenuItem.OnClick:=@DeleteNodeMenuItemClick;
{ EditMenuItem.Add(CreateSeperator);
AddMenuItem(CopyToClipbrdMenuItem,'CopyToClipbrdMenuItem','Copy to clipboard', AddMenuItem(CopyToClipbrdMenuItem,'CopyToClipbrdMenuItem','Copy to clipboard',
EditMenuItem); EditMenuItem);
AddMenuItem(PasteFromClipbrdMenuItem,'PasteFromClipbrdMenuItem', AddMenuItem(PasteFromClipbrdMenuItem,'PasteFromClipbrdMenuItem',
'Paste from clipboard',EditMenuItem); 'Paste from clipboard',EditMenuItem);}
// insert node behind submenu // insert node behind submenu
AddMenuItem(InsertBehindDefineMenuItem,'InsertBehindDefineMenuItem','Define', AddMenuItem(InsertBehindDefineMenuItem,'InsertBehindDefineMenuItem','Define',
InsertBehindMenuItem); InsertBehindMenuItem);
AddMenuItem(InsertBehindDefineAllMenuItem,'InsertBehindDefineAllMenuItem','Define All', AddMenuItem(InsertBehindDefineRecurseMenuItem,
'InsertBehindDefineRecurseMenuItem','Define Recurse',
InsertBehindMenuItem); InsertBehindMenuItem);
AddMenuItem(InsertBehindUndefineMenuItem,'InsertBehindUndefineMenuItem','Undefine', AddMenuItem(InsertBehindUndefineMenuItem,
'InsertBehindUndefineMenuItem','Undefine',
InsertBehindMenuItem);
AddMenuItem(InsertBehindUndefineRecurseMenuItem,
'InsertBehindUndefineRecurseMenuItem','Undefine Recurse',
InsertBehindMenuItem);
AddMenuItem(InsertBehindUndefineAllMenuItem,
'InsertBehindUndefineAllMenuItem','Undefine All',
InsertBehindMenuItem); InsertBehindMenuItem);
InsertBehindMenuItem.Add(CreateSeperator); InsertBehindMenuItem.Add(CreateSeperator);
AddMenuItem(InsertBehindBlockMenuItem,'InsertBehindBlockMenuItem','Block', AddMenuItem(InsertBehindBlockMenuItem,'InsertBehindBlockMenuItem','Block',
InsertBehindMenuItem); InsertBehindMenuItem);
AddMenuItem(InsertBehindDirectoryMenuItem,'InsertBehindDirectoryMenuItem','Directory', AddMenuItem(InsertBehindDirectoryMenuItem,
'InsertBehindDirectoryMenuItem','Directory',
InsertBehindMenuItem); InsertBehindMenuItem);
InsertBehindMenuItem.Add(CreateSeperator); InsertBehindMenuItem.Add(CreateSeperator);
AddMenuItem(InsertBehindIfMenuItem,'InsertBehindIfMenuItem','If', AddMenuItem(InsertBehindIfMenuItem,'InsertBehindIfMenuItem','If',
@ -501,14 +670,23 @@ begin
// insert node as child submenu // insert node as child submenu
AddMenuItem(InsertAsChildDefineMenuItem,'InsertAsChildDefineMenuItem','Define', AddMenuItem(InsertAsChildDefineMenuItem,'InsertAsChildDefineMenuItem','Define',
InsertAsChildMenuItem); InsertAsChildMenuItem);
AddMenuItem(InsertAsChildDefineAllMenuItem,'InsertAsChildDefineAllMenuItem','Define All', AddMenuItem(InsertAsChildDefineRecurseMenuItem,
'InsertAsChildDefineRecurseMenuItem','Define Recurse',
InsertAsChildMenuItem); InsertAsChildMenuItem);
AddMenuItem(InsertAsChildUndefineMenuItem,'InsertAsChildUndefineMenuItem','Undefine', AddMenuItem(InsertAsChildUndefineMenuItem,
'InsertAsChildUndefineMenuItem','Undefine',
InsertAsChildMenuItem);
AddMenuItem(InsertAsChildUndefineRecurseMenuItem,
'InsertAsChildUndefineRecurseMenuItem','Undefine Recurse',
InsertAsChildMenuItem);
AddMenuItem(InsertAsChildUndefineAllMenuItem,
'InsertAsChildUndefineAllMenuItem','Undefine All',
InsertAsChildMenuItem); InsertAsChildMenuItem);
InsertAsChildMenuItem.Add(CreateSeperator); InsertAsChildMenuItem.Add(CreateSeperator);
AddMenuItem(InsertAsChildBlockMenuItem,'InsertAsChildBlockMenuItem','Block', AddMenuItem(InsertAsChildBlockMenuItem,'InsertAsChildBlockMenuItem','Block',
InsertAsChildMenuItem); InsertAsChildMenuItem);
AddMenuItem(InsertAsChildDirectoryMenuItem,'InsertAsChildDirectoryMenuItem','Directory', AddMenuItem(InsertAsChildDirectoryMenuItem,
'InsertAsChildDirectoryMenuItem','Directory',
InsertAsChildMenuItem); InsertAsChildMenuItem);
InsertAsChildMenuItem.Add(CreateSeperator); InsertAsChildMenuItem.Add(CreateSeperator);
AddMenuItem(InsertAsChildIfMenuItem,'InsertAsChildIfMenuItem','If', AddMenuItem(InsertAsChildIfMenuItem,'InsertAsChildIfMenuItem','If',
@ -526,11 +704,11 @@ begin
InsertAsChildMenuItem[i].OnClick:=@InsertNodeMenuItemClick; InsertAsChildMenuItem[i].OnClick:=@InsertNodeMenuItemClick;
// tools // tools
AddMenuItem(ToolsMenuItem,'ToolsMenuItem','Tools',nil); { AddMenuItem(ToolsMenuItem,'ToolsMenuItem','Tools',nil);
AddMenuItem(OpenPreviewMenuItem,'OpenPreviewMenuItem','Open Preview', AddMenuItem(OpenPreviewMenuItem,'OpenPreviewMenuItem','Open Preview',
ToolsMenuItem); ToolsMenuItem);
AddMenuItem(ShowMacroListMenuItem,'ShowMacroListMenuItem','Show Macros', AddMenuItem(ShowMacroListMenuItem,'ShowMacroListMenuItem','Show Macros',
ToolsMenuItem); ToolsMenuItem);}
// templates // templates
AddMenuItem(InsertTemplateMenuItem,'InsertTemplateMenuItem', AddMenuItem(InsertTemplateMenuItem,'InsertTemplateMenuItem',
@ -658,29 +836,31 @@ begin
ADefineTemplate:=TDefineTemplate(ANode.Data); ADefineTemplate:=TDefineTemplate(ANode.Data);
case ADefineTemplate.Action of case ADefineTemplate.Action of
da_Define: ANode.ImageIndex:=0; da_Define: ANode.ImageIndex:=0;
da_DefineAll: ANode.ImageIndex:=1; da_DefineRecurse: ANode.ImageIndex:=1;
da_Undefine: ANode.ImageIndex:=2; da_Undefine: ANode.ImageIndex:=2;
da_Block: ANode.ImageIndex:=3; da_UndefineRecurse: ANode.ImageIndex:=3;
da_Directory: ANode.ImageIndex:=4; da_UndefineAll: ANode.ImageIndex:=4;
da_If: ANode.ImageIndex:=5; da_Block: ANode.ImageIndex:=5;
da_IfDef: ANode.ImageIndex:=6; da_Directory: ANode.ImageIndex:=6;
da_IfNDef: ANode.ImageIndex:=7; da_If: ANode.ImageIndex:=7;
da_ElseIf: ANode.ImageIndex:=8; da_IfDef: ANode.ImageIndex:=8;
da_Else: ANode.ImageIndex:=9; da_IfNDef: ANode.ImageIndex:=9;
da_ElseIf: ANode.ImageIndex:=10;
da_Else: ANode.ImageIndex:=11;
else else
ANode.ImageIndex:=-1; ANode.ImageIndex:=-1;
end; end;
ANode.SelectedIndex:=ANode.ImageIndex; ANode.SelectedIndex:=ANode.ImageIndex;
if ADefineTemplate.IsAutoGenerated then begin if ADefineTemplate.IsAutoGenerated then begin
if ADefineTemplate.IsProjectSpecific then if ADefineTemplate.IsProjectSpecific then
ANode.StateIndex:=13 ANode.StateIndex:=15
else else
ANode.StateIndex:=11; ANode.StateIndex:=13;
end else begin end else begin
if ADefineTemplate.IsProjectSpecific then if ADefineTemplate.IsProjectSpecific then
ANode.StateIndex:=12 ANode.StateIndex:=14
else else
ANode.StateIndex:=10; ANode.StateIndex:=12;
end; end;
if WithSubNodes then begin if WithSubNodes then begin
ANode:=ANode.GetFirstChild; ANode:=ANode.GetFirstChild;
@ -697,21 +877,15 @@ var s: string;
begin begin
s:=ValueAsFilePathsSynEdit.Text; s:=ValueAsFilePathsSynEdit.Text;
l:=length(s); 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 // replace line ends with semicolon
i:=1; i:=1;
j:=1; j:=1;
while i<=l do begin while i<=l do begin
if s[i] in [#10,#13] then begin if s[i] in [#10,#13] then begin
inc(i); 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); inc(i);
end;
s[j]:=';'; s[j]:=';';
inc(j); inc(j);
end else begin end else begin
@ -720,7 +894,9 @@ begin
inc(j); inc(j);
end; end;
end; end;
SetLength(s,j-1); dec(j);
while (j>=1) and (s[j]=';') do dec(j);
SetLength(s,j);
ValueAsTextSynEdit.Text:=s; ValueAsTextSynEdit.Text:=s;
end; end;
@ -764,7 +940,7 @@ begin
end; end;
if SelTreeNode<>nil then begin if SelTreeNode<>nil then begin
SelDefNode:=TDefineTemplate(SelTreeNode.Data); SelDefNode:=TDefineTemplate(SelTreeNode.Data);
SelectedItemGroupBox.Enabled:=true; SetValuesEditable(not SelDefNode.IsAutoGenerated);
ProjectSpecificCheckBox.Checked:=dtfProjectSpecific in SelDefNode.Flags; ProjectSpecificCheckBox.Checked:=dtfProjectSpecific in SelDefNode.Flags;
NameEdit.Text:=SelDefNode.Name; NameEdit.Text:=SelDefNode.Name;
DescriptionEdit.Text:=SelDefNode.Description; DescriptionEdit.Text:=SelDefNode.Description;
@ -781,7 +957,7 @@ begin
ValueAsFilePathsSynEdit.Options:=ValueAsTextSynEdit.Options; ValueAsFilePathsSynEdit.Options:=ValueAsTextSynEdit.Options;
ValueAsFilePathsSynEdit.ReadOnly:=ValueAsTextSynEdit.ReadOnly; ValueAsFilePathsSynEdit.ReadOnly:=ValueAsTextSynEdit.ReadOnly;
end else begin end else begin
SelectedItemGroupBox.Enabled:=false; SetValuesEditable(false);
NameEdit.Text:=''; NameEdit.Text:='';
DescriptionEdit.Text:=''; DescriptionEdit.Text:='';
VariableEdit.Text:=''; VariableEdit.Text:='';
@ -823,11 +999,10 @@ end;
procedure TCodeToolsDefinesEditor.InsertNewNode(Behind: boolean; procedure TCodeToolsDefinesEditor.InsertNewNode(Behind: boolean;
Action: TDefineAction); Action: TDefineAction);
var SelTreeNode, NodeInFront, ParentNode, ANode, FirstNode, var SelTreeNode, NodeInFront, ParentNode,
NewTreeNode: TTreeNode; NewTreeNode: TTreeNode;
NewDefNode: TDefineTemplate; NewDefNode: TDefineTemplate;
NewName, NewDescription, NewVariable, NewValue: string; NewName, NewDescription, NewVariable, NewValue: string;
i: integer;
begin begin
SelTreeNode:=DefineTreeView.Selected; SelTreeNode:=DefineTreeView.Selected;
NodeInFront:=nil; NodeInFront:=nil;
@ -853,31 +1028,20 @@ begin
end; end;
if (ParentNode<>nil) and (TDefineTemplate(ParentNode.Data).IsAutoGenerated) if (ParentNode<>nil) and (TDefineTemplate(ParentNode.Data).IsAutoGenerated)
then begin 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] +'nor can they have non auto created child nodes.',mtInformation,[mbCancel]
,0); ,0);
exit; exit;
end; end;
// find an unique name if (ParentNode<>nil)
if ParentNode<>nil then and (not (TDefineTemplate(ParentNode.Data).Action in DefineActionBlocks)) then
FirstNode:=ParentNode.GetFirstChild begin
else MessageDlg('Invalid parent node',
FirstNode:=nil; 'Parent node can not contain child nodes.',
if FirstNode=nil then FirstNode:=NodeInFront; mtInformation,[mbCancel],0);
if FirstNode<>nil then begin exit;
while FirstNode.GetPrevSibling<>nil do
FirstNode:=FirstNode.GetPrevSibling;
end; end;
i:=0; NewName:=FindUniqueName;
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);
NewDescription:=NewName; NewDescription:=NewName;
NewVariable:=''; NewVariable:='';
NewValue:=''; NewValue:='';
@ -895,7 +1059,7 @@ begin
// add node to define tree // add node to define tree
if NodeInFront<>nil then if NodeInFront<>nil then
NewDefNode.InsertAfter(TDefineTemplate(NodeInFront.Data)) NewDefNode.InsertBehind(TDefineTemplate(NodeInFront.Data))
else if ParentNode<>nil then else if ParentNode<>nil then
TDefineTemplate(ParentNode.Data).AddChild(NewDefNode) TDefineTemplate(ParentNode.Data).AddChild(NewDefNode)
else else
@ -903,6 +1067,99 @@ begin
SetNodeImages(NewTreeNode,true); SetNodeImages(NewTreeNode,true);
DefineTreeView.Selected:=NewTreeNode; 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; end;
procedure TCodeToolsDefinesEditor.Assign(ACodeToolBoss: TCodeToolManager; procedure TCodeToolsDefinesEditor.Assign(ACodeToolBoss: TCodeToolManager;

View File

@ -41,7 +41,7 @@ implementation
function FindCurrentProjectDirTemplate: TDefineTemplate; function FindCurrentProjectDirTemplate: TDefineTemplate;
begin begin
Result:=CodeToolBoss.DefineTree.FindDefineTemplateByName( Result:=CodeToolBoss.DefineTree.FindDefineTemplateByName(
ProjectDirDefTemplName); ProjectDirDefTemplName,true);
end; end;
function FindCurrentProjectDirSrcPathTemplate: TDefineTemplate; function FindCurrentProjectDirSrcPathTemplate: TDefineTemplate;
@ -95,7 +95,6 @@ begin
DontUseConfigFile DontUseConfigFile
AdditionalConfigFile AdditionalConfigFile
} }
// define macros for project directory // define macros for project directory
ProjectDir:='$('+ExternalMacroStart+'ProjectDir)'; ProjectDir:='$('+ExternalMacroStart+'ProjectDir)';
@ -108,44 +107,44 @@ begin
if CompOpts.DelphiCompat then begin if CompOpts.DelphiCompat then begin
// set mode DELPHI // set mode DELPHI
ProjTempl.AddChild(TDefineTemplate.Create('MODE', 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 end else if CompOpts.TPCompatible then begin
// set mode TP // set mode TP
ProjTempl.AddChild(TDefineTemplate.Create('MODE', 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 end else if CompOpts.GPCCompat then begin
// set mode GPC // set mode GPC
ProjTempl.AddChild(TDefineTemplate.Create('MODE', 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; end;
// Checks ------------------------------------------------------------------- // Checks -------------------------------------------------------------------
if CompOpts.IOChecks then begin if CompOpts.IOChecks then begin
// set IO checking on // set IO checking on
ProjTempl.AddChild(TDefineTemplate.Create('IOCHECKS on', ProjTempl.AddChild(TDefineTemplate.Create('IOCHECKS on',
'set IOCHECKS on','IOCHECKS','1',da_DefineAll)); 'set IOCHECKS on','IOCHECKS','1',da_DefineRecurse));
end; end;
if CompOpts.RangeChecks then begin if CompOpts.RangeChecks then begin
// set Range checking on // set Range checking on
ProjTempl.AddChild(TDefineTemplate.Create('RANGECHECKS on', ProjTempl.AddChild(TDefineTemplate.Create('RANGECHECKS on',
'set RANGECHECKS on','RANGECHECKS','1',da_DefineAll)); 'set RANGECHECKS on','RANGECHECKS','1',da_DefineRecurse));
end; end;
if CompOpts.OverflowChecks then begin if CompOpts.OverflowChecks then begin
// set Overflow checking on // set Overflow checking on
ProjTempl.AddChild(TDefineTemplate.Create('OVERFLOWCHECKS on', ProjTempl.AddChild(TDefineTemplate.Create('OVERFLOWCHECKS on',
'set OVERFLOWCHECKS on','OVERFLOWCHECKS','1',da_DefineAll)); 'set OVERFLOWCHECKS on','OVERFLOWCHECKS','1',da_DefineRecurse));
end; end;
// Hidden used units -------------------------------------------------------- // Hidden used units --------------------------------------------------------
if CompOpts.UseLineInfoUnit then begin if CompOpts.UseLineInfoUnit then begin
// use lineinfo unit // use lineinfo unit
ProjTempl.AddChild(TDefineTemplate.Create('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; end;
if CompOpts.UseHeaptrc then begin if CompOpts.UseHeaptrc then begin
// use heaptrc unit // use heaptrc unit
ProjTempl.AddChild(TDefineTemplate.Create('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; end;
// Paths -------------------------------------------------------------------- // Paths --------------------------------------------------------------------
@ -157,7 +156,7 @@ begin
'include path addition',ExternalMacroStart+'INCPATH', 'include path addition',ExternalMacroStart+'INCPATH',
ConvertTransferMacrosToExternalMacros(CompOpts.IncludeFiles)+';' ConvertTransferMacrosToExternalMacros(CompOpts.IncludeFiles)+';'
+'$('+ExternalMacroStart+'INCPATH)', +'$('+ExternalMacroStart+'INCPATH)',
da_DefineAll)); da_DefineRecurse));
end; end;
// compiled unit path (ppu/ppw/dcu files) // compiled unit path (ppu/ppw/dcu files)
s:=CompOpts.OtherUnitFiles; s:=CompOpts.OtherUnitFiles;
@ -173,7 +172,7 @@ begin
'unit path addition',ExternalMacroStart+'UnitPath', 'unit path addition',ExternalMacroStart+'UnitPath',
ConvertTransferMacrosToExternalMacros(s)+';' ConvertTransferMacrosToExternalMacros(s)+';'
+'$('+ExternalMacroStart+'UnitPath)', +'$('+ExternalMacroStart+'UnitPath)',
da_DefineAll)); da_DefineRecurse));
end; end;
// source path (unitpath + sources for the CodeTools, hidden to the compiler) // source path (unitpath + sources for the CodeTools, hidden to the compiler)
if s<>'' then begin if s<>'' then begin
@ -182,7 +181,7 @@ begin
'source path addition',ExternalMacroStart+'SrcPath', 'source path addition',ExternalMacroStart+'SrcPath',
ConvertTransferMacrosToExternalMacros(s+';'+SrcPath)+';' ConvertTransferMacrosToExternalMacros(s+';'+SrcPath)+';'
+'$('+ExternalMacroStart+'SrcPath)', +'$('+ExternalMacroStart+'SrcPath)',
da_DefineAll)); da_DefineRecurse));
end; end;
// LCL Widget Type ---------------------------------------------------------- // LCL Widget Type ----------------------------------------------------------
@ -197,7 +196,7 @@ begin
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// replace project defines in DefineTree // replace project defines in DefineTree
CodeToolBoss.DefineTree.ReplaceSameName(ProjTempl); CodeToolBoss.DefineTree.ReplaceRootSameName(ProjTempl);
end; end;
procedure SetAdditionalGlobalSrcPathToCodeToolBoss(const SrcPath: string); procedure SetAdditionalGlobalSrcPathToCodeToolBoss(const SrcPath: string);
@ -208,11 +207,11 @@ begin
'Global Source Path addition',ExternalMacroStart+'SRCPATH', 'Global Source Path addition',ExternalMacroStart+'SRCPATH',
ConvertTransferMacrosToExternalMacros(SrcPath)+';' ConvertTransferMacrosToExternalMacros(SrcPath)+';'
+'$('+ExternalMacroStart+'SRCPATH)', +'$('+ExternalMacroStart+'SRCPATH)',
da_DefineAll); da_DefineRecurse);
DefTempl.Flags:=[dtfAutoGenerated]; DefTempl.Flags:=[dtfAutoGenerated];
CodeToolBoss.DefineTree.ReplaceSameName(DefTempl); CodeToolBoss.DefineTree.ReplaceRootSameName(DefTempl);
end else begin end else begin
CodeToolBoss.DefineTree.RemoveDefineTemplateByName('GlobalSrcPathAdd'); CodeToolBoss.DefineTree.RemoveRootDefineTemplateByName('GlobalSrcPathAdd');
end; end;
end; end;

View File

@ -2308,15 +2308,15 @@ Begin
CompilerTemplate:=CodeToolBoss.DefinePool.CreateFPCTemplate( CompilerTemplate:=CodeToolBoss.DefinePool.CreateFPCTemplate(
EnvironmentOptions.CompilerFilename,CompilerUnitSearchPath); EnvironmentOptions.CompilerFilename,CompilerUnitSearchPath);
if CompilerTemplate<>nil then begin if CompilerTemplate<>nil then begin
CodeToolBoss.DefineTree.ReplaceSameNameAddFirst(CompilerTemplate); CodeToolBoss.DefineTree.ReplaceRootSameNameAddFirst(CompilerTemplate);
// create compiler macros to simulate the Makefiles of the FPC sources // create compiler macros to simulate the Makefiles of the FPC sources
FPCSrcTemplate:=CodeToolBoss.DefinePool.CreateFPCSrcTemplate( FPCSrcTemplate:=CodeToolBoss.DefinePool.CreateFPCSrcTemplate(
CodeToolBoss.GlobalValues.Variables[ExternalMacroStart+'FPCSrcDir'], CodeToolBoss.GlobalValues.Variables[ExternalMacroStart+'FPCSrcDir'],
CompilerUnitSearchPath); CompilerUnitSearchPath);
if FPCSrcTemplate<>nil then begin if FPCSrcTemplate<>nil then begin
CodeToolBoss.DefineTree.RemoveDefineTemplateByName( CodeToolBoss.DefineTree.RemoveRootDefineTemplateByName(
FPCSrcTemplate.Name); FPCSrcTemplate.Name);
FPCSrcTemplate.InsertAfter(CompilerTemplate); FPCSrcTemplate.InsertBehind(CompilerTemplate);
end else begin end else begin
MessageDlg('FPC Source Directory error', MessageDlg('FPC Source Directory error',
'Please check the freepascal source directory', 'Please check the freepascal source directory',
@ -4894,6 +4894,7 @@ begin
with SrcEdit.EditorComponent do begin with SrcEdit.EditorComponent do begin
BlockBegin:=CaretXY; BlockBegin:=CaretXY;
BlockEnd:=CaretXY; BlockEnd:=CaretXY;
LeftChar:=Max(CaretXY.X-CharsInWindow,1);
end; end;
SrcEdit.ErrorLine:=CaretXY.Y; SrcEdit.ErrorLine:=CaretXY.Y;
end; end;
@ -5146,7 +5147,6 @@ begin
FOpenEditorsOnCodeToolChange:=false; FOpenEditorsOnCodeToolChange:=false;
CodeToolsOpts.AssignTo(CodeToolBoss); CodeToolsOpts.AssignTo(CodeToolBoss);
if (not FileExists(EnvironmentOptions.CompilerFilename)) then begin if (not FileExists(EnvironmentOptions.CompilerFilename)) then begin
writeln(''); writeln('');
writeln('NOTE: Compiler Filename not set! (see Environment Options)'); writeln('NOTE: Compiler Filename not set! (see Environment Options)');
@ -6216,6 +6216,9 @@ end.
{ ============================================================================= { =============================================================================
$Log$ $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 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 MG: fixed method search diff proc, fixed synedit insert in empty line, small fixes, started define editor

View File

@ -1304,6 +1304,9 @@ end.
{ {
$Log$ $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 Revision 1.50 2002/02/25 23:18:54 lazarus
MG: jump history will now try to save relative filenames MG: jump history will now try to save relative filenames

View 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.. . . . . . . . . . . . . . . . ",
". . . . . . . . . . . . . . . . . . . . . . ",
". . . . . . . . . . . . . . . . . . . . . . "};

View 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.. . . "};

View File

@ -450,8 +450,11 @@ begin
if AValue=GetSelected then exit; if AValue=GetSelected then exit;
if AValue then if AValue then
Include(FStates,nsSelected) Include(FStates,nsSelected)
else else begin
Exclude(FStates,nsSelected); Exclude(FStates,nsSelected);
if (TreeView<>nil) and (TreeView.Selected=Self) then
TreeView.Selected:=nil;
end;
Update; Update;
{ ToDo: { ToDo:
if Value then if Value then
@ -816,13 +819,15 @@ begin
{$IFDEF TREEVIEW_DEBUG} {$IFDEF TREEVIEW_DEBUG}
writeln('[TTreeNode.Unbind] Self=',HexStr(Cardinal(Self),8),' Self.Text=',Text); writeln('[TTreeNode.Unbind] Self=',HexStr(Cardinal(Self),8),' Self.Text=',Text);
{$ENDIF} {$ENDIF}
Selected:=false;
if Owner<>nil then begin if Owner<>nil then begin
Owner.ClearCache; Owner.ClearCache;
if FParent=nil then if FParent=nil then
Owner.MoveTopLvlNode(Owner.IndexOfTopLvlItem(Self),-1,Self); 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, Owner.Owner.FStates:=Owner.Owner.FStates+[tvsMaxRightNeedsUpdate,
tvsTopsNeedsUpdate,tvsTopItemNeedsUpdate,tvsBottomItemNeedsUpdate]; tvsTopsNeedsUpdate,tvsTopItemNeedsUpdate,tvsBottomItemNeedsUpdate];
end;
end; end;
if FPrevBrother<>nil then FPrevBrother.FNextBrother:=FNextBrother; if FPrevBrother<>nil then FPrevBrother.FNextBrother:=FNextBrother;
if FNextBrother<>nil then FNextBrother.FPrevBrother:=FPrevBrother; if FNextBrother<>nil then FNextBrother.FPrevBrother:=FPrevBrother;
@ -847,6 +852,7 @@ writeln('[TTreeNode.Unbind] Self=',HexStr(Cardinal(Self),8),' Self.Text=',Text);
end; end;
if FParent.Count=0 then begin if FParent.Count=0 then begin
FParent.Expanded:=false; FParent.Expanded:=false;
FParent.HasChildren:=false;
end; end;
FParent:=nil; FParent:=nil;
end; end;

View File

@ -16,7 +16,7 @@
ToDo: ToDo:
} }
unit lresources; unit LResources;
{$mode objfpc}{$H+} {$mode objfpc}{$H+}