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_projspec_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/define_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/defineall_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/definerecurse_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/directory_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/else_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/elseif_22x22.xpm -text svneol=native#image/x-xpixmap
@ -216,6 +216,8 @@ images/codetoolsdefines/if_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/ifdef_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/ifndef_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/undefine_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/undefineall_22x22.xpm -text svneol=native#image/x-xpixmap
images/codetoolsdefines/undefinerecurse_22x22.xpm -text svneol=native#image/x-xpixmap
images/color.ico -text svneol=unset#image/x-icon
images/color.xpm -text svneol=native#image/x-xpixmap
images/components/default.ico -text svneol=unset#image/x-icon

View File

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

View File

@ -247,7 +247,7 @@
+'. . . . . . . . . . . . . . . . . . . . ",'#10'". . . . . . . . . . . . '
+'. . . . . . . . . . "};'#10
);
LazarusResources.Add('defineall_22x22','XPM',
LazarusResources.Add('definerecurse_22x22','XPM',
'/* XPM */'#10'static char * defineall_22x22_xpm[] = {'#10'"22 22 144 2",'
+#10'" '#9'c None",'#10'". '#9'c #FFFFFF",'#10'"+ '#9'c #FFF9F9",'#10'"@ '
+#9'c #FFD9D9",'#10'"# '#9'c #F5F5F5",'#10'"$ '#9'c #C7C7C7",'#10'"% '#9'c'
@ -658,3 +658,142 @@
+'. . . . . . . . . . . . . . ",'#10'". . . . . . . . . . . . . . . . . . '
+'. . . . "};'#10
);
LazarusResources.Add('undefineall_22x22','XPM',
'/* XPM */'#10'static char * undefineall_22x22_xpm[] = {'#10'"22 22 132 2"'
+','#10'" '#9'c None",'#10'". '#9'c #FFFFFF",'#10'"+ '#9'c #EBE5E5",'#10
+'"@ '#9'c #FEB0B0",'#10'"# '#9'c #FFBCBC",'#10'"$ '#9'c #FFFDFD",'#10'"% '
+#9'c #A3A3A3",'#10'"& '#9'c #665555",'#10'"* '#9'c #F24343",'#10'"= '#9'c'
+' #FF1F1F",'#10'"- '#9'c #FF4343",'#10'"; '#9'c #FF6B6B",'#10'"> '#9'c #F'
+'FABAB",'#10'", '#9'c #FFE4E4",'#10'"'' '#9'c #E2E7FE",'#10'") '#9'c #153'
+'BF7",'#10'"! '#9'c #BEBEBE",'#10'"~ '#9'c #493535",'#10'"{ '#9'c #763096'
+'",'#10'"] '#9'c #BD174C",'#10'"^ '#9'c #FF1919",'#10'"/ '#9'c #FF2424",'
+#10'"( '#9'c #FF2323",'#10'"_ '#9'c #FF4040",'#10'": '#9'c #FF9292",'#10
+'"< '#9'c #4563F9",'#10'"[ '#9'c #0A32F7",'#10'"} '#9'c #D2D2D2",'#10'"| '
+#9'c #473535",'#10'"1 '#9'c #2F31D4",'#10'"2 '#9'c #0A31F6",'#10'"3 '#9'c'
+' #1830EA",'#10'"4 '#9'c #E22239",'#10'"5 '#9'c #FF2222",'#10'"6 '#9'c #F'
+'F1A1A",'#10'"7 '#9'c #FF4444",'#10'"8 '#9'c #FFE8E8",'#10'"9 '#9'c #1233'
+'F2",'#10'"0 '#9'c #213DF0",'#10'"a '#9'c #403A3A",'#10'"b '#9'c #E06767"'
+','#10'"c '#9'c #BD1D52",'#10'"d '#9'c #0F30F1",'#10'"e '#9'c #70299C",'
+#10'"f '#9'c #FF5959",'#10'"g '#9'c #EA2F2F",'#10'"h '#9'c #FF0E0E",'#10
+'"i '#9'c #93247B",'#10'"j '#9'c #0931F7",'#10'"k '#9'c #BD275C",'#10'"l '
+#9'c #D3D3D3",'#10'"m '#9'c #404040",'#10'"n '#9'c #DED6D6",'#10'"o '#9'c'
+' #FFD2D2",'#10'"p '#9'c #F99CA1",'#10'"q '#9'c #3638DA",'#10'"r '#9'c #1'
+'F2DE1",'#10'"s '#9'c #F93D41",'#10'"t '#9'c #FFEAEA",'#10'"u '#9'c #E62F'
+'2F",'#10'"v '#9'c #F90E13",'#10'"w '#9'c #0E31F3",'#10'"x '#9'c #2B2FD9"'
+','#10'"y '#9'c #C1C1C1",'#10'"z '#9'c #3E3E3E",'#10'"A '#9'c #E0E0E0",'
+#10'"B '#9'c #858CED",'#10'"C '#9'c #0E33F5",'#10'"D '#9'c #1336F4",'#10
+'"E '#9'c #D1D8FD",'#10'"F '#9'c #2D2DD6",'#10'"G '#9'c #0B31F5",'#10'"H '
+#9'c #E2142B",'#10'"I '#9'c #B3B3B3",'#10'"J '#9'c #414141",'#10'"K '#9'c'
+' #E3E3E3",'#10'"L '#9'c #0F36F7",'#10'"M '#9'c #ADB5DA",'#10'"N '#9'c #6'
+'276E9",'#10'"O '#9'c #9F74C2",'#10'"P '#9'c #FF0606",'#10'"Q '#9'c #FF3D'
+'3D",'#10'"R '#9'c #424242",'#10'"S '#9'c #FFFBFB",'#10'"T '#9'c #1339F7"'
+','#10'"U '#9'c #1634C8",'#10'"V '#9'c #405FF9",'#10'"W '#9'c #FFA8A8",'
+#10'"X '#9'c #FFA9A9",'#10'"Y '#9'c #B8B8B8",'#10'"Z '#9'c #494949",'#10
+'"` '#9'c #E5E5E5",'#10'" .'#9'c #F9A8AD",'#10'"..'#9'c #2646F5",'#10'"+.'
+#9'c #193EF5",'#10'"@.'#9'c #E7E7E7",'#10'"#.'#9'c #0C32F6",'#10'"$.'#9'c'
+' #7087FA",'#10'"%.'#9'c #FF0D0D",'#10'"&.'#9'c #D12348",'#10'"*.'#9'c #0'
+'D31F4",'#10'"=.'#9'c #1230EF",'#10'"-.'#9'c #F94448",'#10'";.'#9'c #405A'
+'F4",'#10'">.'#9'c #FF1616",'#10'",.'#9'c #1830E9",'#10'"''.'#9'c #F91B1F'
+'",'#10'").'#9'c #5873FA",'#10'"!.'#9'c #9F93E1",'#10'"~.'#9'c #0D33F6",'
+#10'"{.'#9'c #0F32F3",'#10'"].'#9'c #F92328",'#10'"^.'#9'c #FFE9E9",'#10
+'"/.'#9'c #6981FA",'#10'"(.'#9'c #B8BFE4",'#10'"_.'#9'c #0E35F7",'#10'":.'
+#9'c #F9FAFF",'#10'"<.'#9'c #3657F8",'#10'"[.'#9'c #363E63",'#10'"}.'#9'c'
+' #0C34F7",'#10'"|.'#9'c #1238F7",'#10'"1.'#9'c #5C76FA",'#10'"2.'#9'c #8'
+'690C5",'#10'"3.'#9'c #0A31F4",'#10'"4.'#9'c #1037F6",'#10'"5.'#9'c #4D6A'
+'F9",'#10'"6.'#9'c #5A75FA",'#10'"7.'#9'c #1339F3",'#10'"8.'#9'c #0B32F2"'
+','#10'"9.'#9'c #CBD0E7",'#10'"0.'#9'c #C2C8EA",'#10'"a.'#9'c #AFB0B5",'
+#10'". . . . . . . . . . . . . . . . . . . . . . ",'#10'". . + @ # $ . . '
+'. . . . . . . . . . . . . . ",'#10'". % & * = - ; > , . . . . . . . '' )'
+' . . . . ",'#10'". ! ~ { ] ^ / ( _ : . . + @ # $ < [ . . . . ",'#10'". }'
+' | 1 2 3 4 5 6 7 8 % & * = - 9 0 , . . . ",'#10'". } a b c d 2 e 6 f . !'
+' ~ g h i j k _ : . . ",'#10'". l m n o p q j r s t } | u v w x 5 6 7 8 .'
+' ",'#10'". y z A . . . B C D E } a b F G H = 6 f . . ",'#10'". I J K . .'
+' . . E L L M m N j O f ( P Q t . ",'#10'". I R K . + @ # S E T [ U [ V .'
+' . , W X . . ",'#10'". Y Z ` % & * = - ; ...j +.. . . . . . . . ",'#10
+'". @.I . ! ~ g h ^ / k w #.[ $.. . . . . . . ",'#10'". . . . } | u %./ &'
+'.*.=.-.;.j $.. . . . . . ",'#10'". . . . } a b >.v G ,.''.f . V j ).. . '
+'. . . ",'#10'". . . . l m n !.~.{.].P Q ^.. ).j /.. . . . ",'#10'". . . '
+'. y z (._.) :., W X . . . /.j <.. . . ",'#10'". . . . I [.}.|.:.. . . . '
+'. . . . $.j 1.. . ",'#10'". . . . 2.3.4.'' . . . . . . . . . . 5.6.. . "'
+','#10'". . . . 7.8.9.. . . . . . . . . . . . . . . ",'#10'". . . . 0.a..'
+' . . . . . . . . . . . . . . . ",'#10'". . . . . . . . . . . . . . . . .'
+' . . . . . ",'#10'". . . . . . . . . . . . . . . . . . . . . . "};'#10
);
LazarusResources.Add('undefinerecurse_22x22','XPM',
'/* XPM */'#10'static char * undefinerecurse_22x22_xpm[] = {'#10'"22 22 18'
+'4 2",'#10'" '#9'c None",'#10'". '#9'c #FFFFFF",'#10'"+ '#9'c #FFF9F9",'
+#10'"@ '#9'c #FFD9D9",'#10'"# '#9'c #F5F5F5",'#10'"$ '#9'c #C7C7C7",'#10
+'"% '#9'c #F6CDCD",'#10'"& '#9'c #FF5656",'#10'"* '#9'c #FF4949",'#10'"= '
+#9'c #FF9B9B",'#10'"- '#9'c #FFC5C5",'#10'"; '#9'c #FFEDED",'#10'"> '#9'c'
+' #FFFDFD",'#10'", '#9'c #6D7FF2",'#10'"'' '#9'c #0423EA",'#10'") '#9'c #'
+'A0A6CF",'#10'"! '#9'c #22308B",'#10'"~ '#9'c #373737",'#10'"{ '#9'c #D49'
+'595",'#10'"] '#9'c #FF2828",'#10'"^ '#9'c #FF0E0E",'#10'"/ '#9'c #FF1D1D'
+'",'#10'"( '#9'c #FF3232",'#10'"_ '#9'c #FF6767",'#10'": '#9'c #FF8484",'
+#10'"< '#9'c #FFA6A6",'#10'"[ '#9'c #7671DE",'#10'"} '#9'c #3C54EE",'#10
+'"| '#9'c #D4D9FB",'#10'"1 '#9'c #0925E7",'#10'"2 '#9'c #3323C4",'#10'"3 '
+#9'c #E11229",'#10'"4 '#9'c #FF0D0D",'#10'"5 '#9'c #FF0F0F",'#10'"6 '#9'c'
+' #FF0707",'#10'"7 '#9'c #FF0000",'#10'"8 '#9'c #BC184D",'#10'"9 '#9'c #0'
+'423E9",'#10'"0 '#9'c #2430DD",'#10'"a '#9'c #FFAEAE",'#10'"b '#9'c #FFE5'
+'E5",'#10'"c '#9'c #FFFCFC",'#10'"d '#9'c #F9F9FE",'#10'"e '#9'c #EFEFEF"'
+','#10'"f '#9'c #6C6C6C",'#10'"g '#9'c #060F44",'#10'"h '#9'c #182BD9",'
+#10'"i '#9'c #0922E5",'#10'"j '#9'c #0422E9",'#10'"k '#9'c #1C1FD3",'#10
+'"l '#9'c #CF1137",'#10'"m '#9'c #FF2424",'#10'"n '#9'c #F93C41",'#10'"o '
+#9'c #0923E5",'#10'"p '#9'c #1321DB",'#10'"q '#9'c #FF1414",'#10'"r '#9'c'
+' #FF1A1A",'#10'"s '#9'c #FF5B5B",'#10'"t '#9'c #FFF1F1",'#10'"u '#9'c #F'
+'DFDFD",'#10'"v '#9'c #7E7E7E",'#10'"w '#9'c #000000",'#10'"x '#9'c #A75C'
+'5C",'#10'"y '#9'c #751C89",'#10'"z '#9'c #0B23E3",'#10'"A '#9'c #581DA1"'
+','#10'"B '#9'c #3C1FB9",'#10'"C '#9'c #E12940",'#10'"D '#9'c #FF3F3F",'
+#10'"E '#9'c #FF1616",'#10'"F '#9'c #FF1212",'#10'"G '#9'c #FF1E1E",'#10
+'"H '#9'c #FFB3B3",'#10'"I '#9'c #868686",'#10'"J '#9'c #060606",'#10'"K '
+#9'c #A46464",'#10'"L '#9'c #FF2222",'#10'"M '#9'c #FF0303",'#10'"N '#9'c'
+' #FF0404",'#10'"O '#9'c #3C24BE",'#10'"P '#9'c #581FA3",'#10'"Q '#9'c #F'
+'F1515",'#10'"R '#9'c #FF1111",'#10'"S '#9'c #FF2E2E",'#10'"T '#9'c #FF30'
+'30",'#10'"U '#9'c #FFBFBF",'#10'"V '#9'c #9D6C6C",'#10'"W '#9'c #FF2929"'
+','#10'"X '#9'c #FF0101",'#10'"Y '#9'c #FF0202",'#10'"Z '#9'c #1120DD",'
+#10'"` '#9'c #1923D9",'#10'" .'#9'c #F94145",'#10'"..'#9'c #FF4444",'#10
+'"+.'#9'c #FF0909",'#10'"@.'#9'c #FF3E3E",'#10'"#.'#9'c #FFD2D2",'#10'"$.'
+#9'c #818181",'#10'"%.'#9'c #867C7C",'#10'"&.'#9'c #FF9696",'#10'"*.'#9'c'
+' #821577",'#10'"=.'#9'c #431BB0",'#10'"-.'#9'c #0722E6",'#10'";.'#9'c #1'
+'A20D5",'#10'">.'#9'c #FF2020",'#10'",.'#9'c #FF2626",'#10'"''.'#9'c #FF5'
+'E5E",'#10'").'#9'c #FFDBDB",'#10'"!.'#9'c #FFF4F4",'#10'"~.'#9'c #FFC0C0'
+'",'#10'"{.'#9'c #F9888D",'#10'"].'#9'c #0A25E6",'#10'"^.'#9'c #1F24D5",'
+#10'"/.'#9'c #FF1313",'#10'"(.'#9'c #9C105E",'#10'"_.'#9'c #241FCD",'#10
+'":.'#9'c #FF0A0A",'#10'"<.'#9'c #FF3333",'#10'"[.'#9'c #FFCACA",'#10'"}.'
+#9'c #858585",'#10'"|.'#9'c #1A36EB",'#10'"1.'#9'c #E1B8CF",'#10'"2.'#9'c'
+' #FFA9A9",'#10'"3.'#9'c #FF8383",'#10'"4.'#9'c #76339F",'#10'"5.'#9'c #3'
+'C1BB5",'#10'"6.'#9'c #FF0606",'#10'"7.'#9'c #FF2323",'#10'"8.'#9'c #FFBC'
+'BC",'#10'"9.'#9'c #F8F8F8",'#10'"0.'#9'c #767676",'#10'"a.'#9'c #1935EB"'
+','#10'"b.'#9'c #9CA8F6",'#10'"c.'#9'c #FFFAFA",'#10'"d.'#9'c #FFDDDD",'
+#10'"e.'#9'c #6D5CCF",'#10'"f.'#9'c #823395",'#10'"g.'#9'c #FF6E6E",'#10
+'"h.'#9'c #FFE0E0",'#10'"i.'#9'c #E6E6E6",'#10'"j.'#9'c #5F5F5F",'#10'"k.'
+#9'c #0F0F0F",'#10'"l.'#9'c #949599",'#10'"m.'#9'c #0C2AEA",'#10'"n.'#9'c'
+' #0625EA",'#10'"o.'#9'c #2942EB",'#10'"p.'#9'c #0524E9",'#10'"q.'#9'c #E'
+'1CDE4",'#10'"r.'#9'c #FFFBFB",'#10'"s.'#9'c #E3E3E3",'#10'"t.'#9'c #5858'
+'58",'#10'"u.'#9'c #0C154A",'#10'"v.'#9'c #0625E8",'#10'"w.'#9'c #0928EA"'
+','#10'"x.'#9'c #BCC4F9",'#10'"y.'#9'c #0827EA",'#10'"z.'#9'c #E1E1E1",'
+#10'"A.'#9'c #2A3BA7",'#10'"B.'#9'c #0D2AE4",'#10'"C.'#9'c #E1E5FC",'#10
+'"D.'#9'c #FFCF0F",'#10'"E.'#9'c #8292F4",'#10'"F.'#9'c #1935E9",'#10'"G.'
+#9'c #0520CD",'#10'"H.'#9'c #9A9A9A",'#10'"I.'#9'c #122FEB",'#10'"J.'#9'c'
+' #1532EB",'#10'"K.'#9'c #0E2CEA",'#10'"L.'#9'c #0625E9",'#10'"M.'#9'c #2'
+'D3CA2",'#10'"N.'#9'c #101010",'#10'"O.'#9'c #CFD5FB",'#10'"P.'#9'c #8B9A'
+'F5",'#10'"Q.'#9'c #475EEF",'#10'"R.'#9'c #B9BEE4",'#10'"S.'#9'c #5D5D5D"'
+','#10'"T.'#9'c #0C0C0C",'#10'"U.'#9'c #9B9B9B",'#10'"V.'#9'c #888888",'
+#10'"W.'#9'c #2F2F2F",'#10'"X.'#9'c #BCBCBC",'#10'"Y.'#9'c #FCFCFC",'#10
+'"Z.'#9'c #E8E8E8",'#10'"`.'#9'c #C9C9C9",'#10'". . . . . + @ @ + . . . .'
+' . . . . . . . . . ",'#10'". . # $ $ % & * = - ; > . . , '' . . . . . . '
+'",'#10'". . ) ! ~ { ] ^ / ( _ : < [ '' } . . . . . . ",'#10'"| '' '' '' '
+''' 1 2 3 4 5 6 7 8 9 0 a b c . . . . ",'#10'"d | e f g h i j k l m n o p'
+' q r s < t . . . ",'#10'". . u v w x / y z 9 A B j C D E F G H . . . ",'
+#10'". . . I J K L M N O 9 9 P 4 Q R S T U . . . ",'#10'". . . I J V W X '
+'Y 6 Z j ` ...4 +.@.#.. . . ",'#10'". . . $.w %.&.r N *.'' =.-.;.r >.,.'
+'''.).. . . ",'#10'". . . I J I !.~.{.].^./.(.j _.N :.<.[.. . . ",'#10'".'
+' . . }.J I . . |.'' 1.2.3.4.j 5.6.7.8.. . . ",'#10'". . 9.0.w }.d a.'' b'
+'.. . c.d.e.'' f.g.h.. . . ",'#10'". . i.j.k.l.m.n.b.. . . . . . o.p.q.r.'
+'. . . ",'#10'". . s.t.u.v.w.x.. . . . w . . . y.a.. . . . ",'#10'". . z.'
+'A.j B.C.. . . . . w . . D.E.'' E.. . . ",'#10'". C.F.9 G.H.. . . . . . w'
+' w w D.D.I.J.. . . ",'#10'". K.L.M.N.H.. . . . . . w . . D.D.O.P.. . . "'
+','#10'". Q.R.S.T.U.. . . . . . w . . . . . . . . . ",'#10'". . e V.W.X..'
+' . . . . . w . . . . . . . . . ",'#10'". . Y.Z.`.# . . . . . . w . . D.D'
+'.D.D.. . . ",'#10'". . . . . . . . . . . . w w w D.D.D.D.. . . ",'#10'".'
+' . . . . . . . . . . . . . . D.D.D.D.. . . "};'#10
);

View File

@ -16,7 +16,16 @@
Author: Mattias Gaertner
Abstract:
- TCodeToolsDefinesEditor
- TCodeToolsDefinesEditor is an editor for the CodeTools DefineTree used by
the IDE. The DefineTree defines all values, that are not in the sources,
but are provided by for example Makefiles, compiler command lines and
compiler config files.
There are three types of nodes:
- auto generated: These are created by the IDE.
- project specific: These nodes are saved in the project info file (.lpi)
- the rest are global nodes, saved in the codetoolsoptions.xml file.
}
unit CodeToolsDefines;
@ -47,8 +56,10 @@ type
MoveNodeLvlDownMenuItem: TMenuItem;
InsertBehindMenuItem: TMenuItem;
InsertBehindDefineMenuItem: TMenuItem;
InsertBehindDefineAllMenuItem: TMenuItem;
InsertBehindDefineRecurseMenuItem: TMenuItem;
InsertBehindUndefineMenuItem: TMenuItem;
InsertBehindUndefineRecurseMenuItem: TMenuItem;
InsertBehindUndefineAllMenuItem: TMenuItem;
InsertBehindBlockMenuItem: TMenuItem;
InsertBehindDirectoryMenuItem: TMenuItem;
InsertBehindIfMenuItem: TMenuItem;
@ -58,8 +69,10 @@ type
InsertBehindElseMenuItem: TMenuItem;
InsertAsChildMenuItem: TMenuItem;
InsertAsChildDefineMenuItem: TMenuItem;
InsertAsChildDefineAllMenuItem: TMenuItem;
InsertAsChildDefineRecurseMenuItem: TMenuItem;
InsertAsChildUndefineMenuItem: TMenuItem;
InsertAsChildUndefineRecurseMenuItem: TMenuItem;
InsertAsChildUndefineAllMenuItem: TMenuItem;
InsertAsChildBlockMenuItem: TMenuItem;
InsertAsChildDirectoryMenuItem: TMenuItem;
InsertAsChildIfMenuItem: TMenuItem;
@ -100,18 +113,30 @@ type
DeleteFilePathBitBtn: TBitBtn;
InsertFilePathBitBtn: TBitBtn;
procedure SaveAndExitMenuItemClick(Sender: TObject);
procedure DontSaveAndExitMenuItemClick(Sender: TObject);
// misc
procedure FormResize(Sender: TObject);
procedure DefineTreeViewMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: integer);
procedure ProjectSpecificCheckBoxClick(Sender: TObject);
// exit menu
procedure SaveAndExitMenuItemClick(Sender: TObject);
procedure DontSaveAndExitMenuItemClick(Sender: TObject);
// value notebook
procedure ValueNoteBookPageChanged(Sender: TObject);
procedure MoveFilePathUpBitBtnClick(Sender: TObject);
procedure MoveFilePathDownBitBtnClick(Sender: TObject);
procedure DeleteFilePathBitBtnClick(Sender: TObject);
procedure InsertFilePathBitBtnClick(Sender: TObject);
// edit menu
procedure InsertNodeMenuItemClick(Sender: TObject);
procedure ProjectSpecificCheckBoxClick(Sender: TObject);
procedure MoveNodeUpMenuItemClick(Sender: TObject);
procedure MoveNodeDownMenuItemClick(Sender: TObject);
procedure MoveNodeLvlUpMenuItemClick(Sender: TObject);
procedure MoveNodeLvlDownMenuItemClick(Sender: TObject);
procedure DeleteNodeMenuItemClick(Sender: TObject);
private
FDefineTree: TDefineTree;
FLastSelectedNode: TTreeNode;
@ -127,6 +152,9 @@ type
procedure SetTypeLabel;
function ValueToFilePathText(const AValue: string): string;
procedure InsertNewNode(Behind: boolean; Action: TDefineAction);
function FindUniqueName: string;
function ConsistencyCheck: integer;
procedure SetValuesEditable(AValue: boolean);
public
procedure Assign(ACodeToolBoss: TCodeToolManager;
Options: TCodeToolsOptions);
@ -141,12 +169,6 @@ function ShowCodeToolsDefinesEditor(ACodeToolBoss: TCodeToolManager;
implementation
const
DefineActionNames: array[TDefineAction] of string = (
'None', 'Block', 'Define', 'Undefine', 'DefineAll',
'If', 'IfDef', 'IfNDef', 'ElseIf', 'Else', 'Directory'
);
type
TWinControlClass = class of TWinControl;
@ -288,7 +310,10 @@ end;
procedure TCodeToolsDefinesEditor.ValueNoteBookPageChanged(Sender: TObject);
begin
if ValueNoteBook.PageIndex=0 then ValueAsPathToValueAsText;
if ValueNoteBook.PageIndex=0 then
ValueAsPathToValueAsText
else
ValueAsFilePathsSynEdit.Text:=ValueToFilePathText(ValueAsTextSynEdit.Text);
end;
procedure TCodeToolsDefinesEditor.MoveFilePathUpBitBtnClick(Sender: TObject);
@ -333,8 +358,10 @@ var Behind: boolean;
begin
Behind:=(TMenuItem(Sender).Parent=InsertBehindMenuItem);
if Sender=InsertBehindDefineMenuItem then Action:=da_Define
else if Sender=InsertBehindDefineAllMenuItem then Action:=da_DefineAll
else if Sender=InsertBehindDefineRecurseMenuItem then Action:=da_DefineRecurse
else if Sender=InsertBehindUndefineMenuItem then Action:=da_Undefine
else if Sender=InsertBehindUndefineRecurseMenuItem then Action:=da_UndefineRecurse
else if Sender=InsertBehindUndefineAllMenuItem then Action:=da_UndefineAll
else if Sender=InsertBehindBlockMenuItem then Action:=da_Block
else if Sender=InsertBehindDirectoryMenuItem then Action:=da_Directory
else if Sender=InsertBehindIfMenuItem then Action:=da_If
@ -343,8 +370,10 @@ begin
else if Sender=InsertBehindElseIfMenuItem then Action:=da_ElseIf
else if Sender=InsertBehindElseMenuItem then Action:=da_Else
else if Sender=InsertAsChildDefineMenuItem then Action:=da_Define
else if Sender=InsertAsChildDefineAllMenuItem then Action:=da_DefineAll
else if Sender=InsertAsChildDefineRecurseMenuItem then Action:=da_DefineRecurse
else if Sender=InsertAsChildUndefineMenuItem then Action:=da_Undefine
else if Sender=InsertAsChildUndefineRecurseMenuItem then Action:=da_UndefineRecurse
else if Sender=InsertAsChildUndefineAllMenuItem then Action:=da_UndefineAll
else if Sender=InsertAsChildBlockMenuItem then Action:=da_Block
else if Sender=InsertAsChildDirectoryMenuItem then Action:=da_Directory
else if Sender=InsertAsChildIfMenuItem then Action:=da_If
@ -355,17 +384,136 @@ begin
InsertNewNode(Behind,Action);
end;
procedure TCodeToolsDefinesEditor.MoveNodeUpMenuItemClick(Sender: TObject);
var
SelTreeNode: TTreeNode;
SelDefNode, PrevDefNode: TDefineTemplate;
begin
SelTreeNode:=DefineTreeView.Selected;
if (SelTreeNode=nil) or (SelTreeNode.GetPrevSibling=nil) then exit;
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
PrevDefNode:=SelDefNode.Prior;
// move node up in TreeView
SelTreeNode.MoveTo(SelTreeNode.GetPrevSibling,naInsert);
// move node up in DefineTree
SelDefNode.Unbind;
SelDefNode.InsertInFront(PrevDefNode);
SelTreeNode.MakeVisible;
end;
procedure TCodeToolsDefinesEditor.MoveNodeDownMenuItemClick(Sender: TObject);
var
SelTreeNode: TTreeNode;
SelDefNode, NextDefNode: TDefineTemplate;
begin
SelTreeNode:=DefineTreeView.Selected;
if (SelTreeNode=nil) or (SelTreeNode.GetNextSibling=nil) then exit;
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
NextDefNode:=SelDefNode.Next;
// move node down in TreeView
if SelTreeNode.GetNextSibling.GetNextSibling<>nil then
SelTreeNode.MoveTo(SelTreeNode.GetNextSibling.GetNextSibling,naInsert)
else
SelTreeNode.MoveTo(SelTreeNode.GetNextSibling,naAdd);
// move node down in DefineTree
SelDefNode.Unbind;
SelDefNode.InsertBehind(NextDefNode);
SelTreeNode.MakeVisible;
end;
procedure TCodeToolsDefinesEditor.MoveNodeLvlUpMenuItemClick(Sender: TObject);
var
SelTreeNode: TTreeNode;
SelDefNode, PrevDefNode: TDefineTemplate;
begin
SelTreeNode:=DefineTreeView.Selected;
if (SelTreeNode=nil) or (SelTreeNode.Parent=nil) then exit;
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
if SelDefNode.IsAutoGenerated then begin
MessageDlg('Node is readonly','Auto generated nodes can not be edited.',
mtInformation,[mbCancel],0);
exit;
end;
// move node one lvl up in TreeView
if SelTreeNode.Parent.GetNextSibling<>nil then
SelTreeNode.MoveTo(SelTreeNode.Parent.GetNextSibling,naInsert)
else
SelTreeNode.MoveTo(SelTreeNode.Parent,naAdd);
// move node one lvl up in DefineTree
PrevDefNode:=SelDefNode.Parent;
SelDefNode.Unbind;
SelDefNode.InsertBehind(PrevDefNode);
SetNodeImages(SelTreeNode,true);
SelTreeNode.MakeVisible;
end;
procedure TCodeToolsDefinesEditor.MoveNodeLvlDownMenuItemClick(Sender: TObject);
var
SelTreeNode: TTreeNode;
SelDefNode, PrevDefNode: TDefineTemplate;
begin
SelTreeNode:=DefineTreeView.Selected;
if (SelTreeNode=nil) or (SelTreeNode.GetPrevSibling=nil) then exit;
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
PrevDefNode:=SelDefNode.Prior;
if (SelDefNode.IsAutoGenerated) or (PrevDefNode.IsAutoGenerated) then begin
MessageDlg('Node is readonly','Auto generated nodes can not be edited.',
mtInformation,[mbCancel],0);
exit;
end;
if (not (PrevDefNode.Action in DefineActionBlocks)) then begin
MessageDlg('Invalid previous node',
'Previous node can not contain child nodes.',
mtInformation,[mbCancel],0);
exit;
end;
// move node one lvl down in TreeView
SelTreeNode.MoveTo(SelTreeNode.GetPrevSibling,naAddChild);
// move node one lvl up in DefineTree
SelDefNode.Unbind;
PrevDefNode.AddChild(SelDefNode);
SetNodeImages(SelTreeNode.Parent,true);
SelTreeNode.MakeVisible;
end;
procedure TCodeToolsDefinesEditor.DeleteNodeMenuItemClick(Sender: TObject);
var
SelTreeNode: TTreeNode;
SelDefNode: TDefineTemplate;
begin
SelTreeNode:=DefineTreeView.Selected;
if (SelTreeNode=nil) then exit;
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
if (SelDefNode.IsAutoGenerated) then begin
MessageDlg('Node is readonly','Auto generated nodes can not be edited.',
mtInformation,[mbCancel],0);
exit;
end;
if FLastSelectedNode=SelTreeNode then FLastSelectedNode:=nil;
writeln(' AAA1 ',ConsistencyCheck);
// delete node in TreeView
SelTreeNode.Free;
// delete node in DefineTree
SelDefNode.Unbind;
SelDefNode.Free;
writeln(' AAA2 ',ConsistencyCheck);
end;
procedure TCodeToolsDefinesEditor.ProjectSpecificCheckBoxClick(Sender: TObject);
var
SelTreeNode: TTreeNode;
SelDefNode: TDefineTemplate;
begin
if not SelectedItemGroupBox.Enabled then exit;
SelTreeNode:=DefineTreeView.Selected;
if SelTreeNode=nil then exit;
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
if ProjectSpecificCheckBox.Checked=(dtfProjectSpecific in SelDefNode.Flags)
then exit;
if SelDefNode.IsAutoGenerated then begin
MessageDlg('Node is readonly','Auto generated nodes can not be edited.',
mtInformation,[mbCancel],0);
exit;
end;
if ProjectSpecificCheckBox.Checked then
Include(SelDefNode.Flags,dtfProjectSpecific)
else
@ -417,8 +565,10 @@ begin
Height:=22;
Name:='TheImageList';
AddResImg('define_22x22');
AddResImg('defineall_22x22');
AddResImg('definerecurse_22x22');
AddResImg('undefine_22x22');
AddResImg('undefinerecurse_22x22');
AddResImg('undefineall_22x22');
AddResImg('block_22x22');
AddResImg('directory_22x22');
AddResImg('if_22x22');
@ -451,37 +601,56 @@ begin
AddMenuItem(EditMenuItem,'EditMenuItem','Edit',nil);
AddMenuItem(MoveNodeUpMenuItem,'MoveNodeUpMenuItem','Move node up',
EditMenuItem);
MoveNodeUpMenuItem.OnClick:=@MoveNodeUpMenuItemClick;
AddMenuItem(MoveNodeDownMenuItem,'MoveNodeDownMenuItem','Move node down',
EditMenuItem);
MoveNodeDownMenuItem.OnClick:=@MoveNodeDownMenuItemClick;
AddMenuItem(MoveNodeLvlUpMenuItem,'MoveNodeLvlUpMenuItem','Move node one level up',
EditMenuItem);
MoveNodeLvlUpMenuItem.OnClick:=@MoveNodeLvlUpMenuItemClick;
AddMenuItem(MoveNodeLvlDownMenuItem,'MoveNodeLvlDownMenuItem','Move node one level down',
EditMenuItem);
MoveNodeLvlDownMenuItem.OnClick:=@MoveNodeLvlDownMenuItemClick;
EditMenuItem.Add(CreateSeperator);
AddMenuItem(InsertBehindMenuItem,'InsertBehindMenuItem','Insert node behind',
AddMenuItem(InsertBehindMenuItem,'InsertBehindMenuItem','Insert node below',
EditMenuItem);
AddMenuItem(InsertAsChildMenuItem,'InsertAsChildMenuItem','Insert node as child',
EditMenuItem);
EditMenuItem.Add(CreateSeperator);
AddMenuItem(DeleteNodeMenuItem,'DeleteNodeMenuItem','Delete node',
EditMenuItem);
EditMenuItem.Add(CreateSeperator);
DeleteNodeMenuItem.OnClick:=@DeleteNodeMenuItemClick;
{ EditMenuItem.Add(CreateSeperator);
AddMenuItem(CopyToClipbrdMenuItem,'CopyToClipbrdMenuItem','Copy to clipboard',
EditMenuItem);
AddMenuItem(PasteFromClipbrdMenuItem,'PasteFromClipbrdMenuItem',
'Paste from clipboard',EditMenuItem);
'Paste from clipboard',EditMenuItem);}
// insert node behind submenu
AddMenuItem(InsertBehindDefineMenuItem,'InsertBehindDefineMenuItem','Define',
InsertBehindMenuItem);
AddMenuItem(InsertBehindDefineAllMenuItem,'InsertBehindDefineAllMenuItem','Define All',
AddMenuItem(InsertBehindDefineRecurseMenuItem,
'InsertBehindDefineRecurseMenuItem','Define Recurse',
InsertBehindMenuItem);
AddMenuItem(InsertBehindUndefineMenuItem,'InsertBehindUndefineMenuItem','Undefine',
AddMenuItem(InsertBehindUndefineMenuItem,
'InsertBehindUndefineMenuItem','Undefine',
InsertBehindMenuItem);
AddMenuItem(InsertBehindUndefineRecurseMenuItem,
'InsertBehindUndefineRecurseMenuItem','Undefine Recurse',
InsertBehindMenuItem);
AddMenuItem(InsertBehindUndefineAllMenuItem,
'InsertBehindUndefineAllMenuItem','Undefine All',
InsertBehindMenuItem);
InsertBehindMenuItem.Add(CreateSeperator);
AddMenuItem(InsertBehindBlockMenuItem,'InsertBehindBlockMenuItem','Block',
InsertBehindMenuItem);
AddMenuItem(InsertBehindDirectoryMenuItem,'InsertBehindDirectoryMenuItem','Directory',
AddMenuItem(InsertBehindDirectoryMenuItem,
'InsertBehindDirectoryMenuItem','Directory',
InsertBehindMenuItem);
InsertBehindMenuItem.Add(CreateSeperator);
AddMenuItem(InsertBehindIfMenuItem,'InsertBehindIfMenuItem','If',
@ -501,14 +670,23 @@ begin
// insert node as child submenu
AddMenuItem(InsertAsChildDefineMenuItem,'InsertAsChildDefineMenuItem','Define',
InsertAsChildMenuItem);
AddMenuItem(InsertAsChildDefineAllMenuItem,'InsertAsChildDefineAllMenuItem','Define All',
AddMenuItem(InsertAsChildDefineRecurseMenuItem,
'InsertAsChildDefineRecurseMenuItem','Define Recurse',
InsertAsChildMenuItem);
AddMenuItem(InsertAsChildUndefineMenuItem,'InsertAsChildUndefineMenuItem','Undefine',
AddMenuItem(InsertAsChildUndefineMenuItem,
'InsertAsChildUndefineMenuItem','Undefine',
InsertAsChildMenuItem);
AddMenuItem(InsertAsChildUndefineRecurseMenuItem,
'InsertAsChildUndefineRecurseMenuItem','Undefine Recurse',
InsertAsChildMenuItem);
AddMenuItem(InsertAsChildUndefineAllMenuItem,
'InsertAsChildUndefineAllMenuItem','Undefine All',
InsertAsChildMenuItem);
InsertAsChildMenuItem.Add(CreateSeperator);
AddMenuItem(InsertAsChildBlockMenuItem,'InsertAsChildBlockMenuItem','Block',
InsertAsChildMenuItem);
AddMenuItem(InsertAsChildDirectoryMenuItem,'InsertAsChildDirectoryMenuItem','Directory',
AddMenuItem(InsertAsChildDirectoryMenuItem,
'InsertAsChildDirectoryMenuItem','Directory',
InsertAsChildMenuItem);
InsertAsChildMenuItem.Add(CreateSeperator);
AddMenuItem(InsertAsChildIfMenuItem,'InsertAsChildIfMenuItem','If',
@ -526,11 +704,11 @@ begin
InsertAsChildMenuItem[i].OnClick:=@InsertNodeMenuItemClick;
// tools
AddMenuItem(ToolsMenuItem,'ToolsMenuItem','Tools',nil);
{ AddMenuItem(ToolsMenuItem,'ToolsMenuItem','Tools',nil);
AddMenuItem(OpenPreviewMenuItem,'OpenPreviewMenuItem','Open Preview',
ToolsMenuItem);
AddMenuItem(ShowMacroListMenuItem,'ShowMacroListMenuItem','Show Macros',
ToolsMenuItem);
ToolsMenuItem);}
// templates
AddMenuItem(InsertTemplateMenuItem,'InsertTemplateMenuItem',
@ -658,29 +836,31 @@ begin
ADefineTemplate:=TDefineTemplate(ANode.Data);
case ADefineTemplate.Action of
da_Define: ANode.ImageIndex:=0;
da_DefineAll: ANode.ImageIndex:=1;
da_DefineRecurse: ANode.ImageIndex:=1;
da_Undefine: ANode.ImageIndex:=2;
da_Block: ANode.ImageIndex:=3;
da_Directory: ANode.ImageIndex:=4;
da_If: ANode.ImageIndex:=5;
da_IfDef: ANode.ImageIndex:=6;
da_IfNDef: ANode.ImageIndex:=7;
da_ElseIf: ANode.ImageIndex:=8;
da_Else: ANode.ImageIndex:=9;
da_UndefineRecurse: ANode.ImageIndex:=3;
da_UndefineAll: ANode.ImageIndex:=4;
da_Block: ANode.ImageIndex:=5;
da_Directory: ANode.ImageIndex:=6;
da_If: ANode.ImageIndex:=7;
da_IfDef: ANode.ImageIndex:=8;
da_IfNDef: ANode.ImageIndex:=9;
da_ElseIf: ANode.ImageIndex:=10;
da_Else: ANode.ImageIndex:=11;
else
ANode.ImageIndex:=-1;
end;
ANode.SelectedIndex:=ANode.ImageIndex;
if ADefineTemplate.IsAutoGenerated then begin
if ADefineTemplate.IsProjectSpecific then
ANode.StateIndex:=13
ANode.StateIndex:=15
else
ANode.StateIndex:=11;
ANode.StateIndex:=13;
end else begin
if ADefineTemplate.IsProjectSpecific then
ANode.StateIndex:=12
ANode.StateIndex:=14
else
ANode.StateIndex:=10;
ANode.StateIndex:=12;
end;
if WithSubNodes then begin
ANode:=ANode.GetFirstChild;
@ -697,21 +877,15 @@ var s: string;
begin
s:=ValueAsFilePathsSynEdit.Text;
l:=length(s);
if (l>0) and (s[l] in [#13,#10]) then begin
// remove line end at end of Text, that was added automatically
dec(l);
if (l>0) and (s[l] in [#13,#10]) and (s[l]<>s[l+1]) then
dec(l);
SetLength(s,l);
end;
// replace line ends with semicolon
i:=1;
j:=1;
while i<=l do begin
if s[i] in [#10,#13] then begin
inc(i);
if (i<l) and (s[i] in [#10,#13]) and (s[i]<>s[i+1]) then
if (i<l) and (s[i] in [#10,#13]) and (s[i-1]<>s[i]) then begin
inc(i);
end;
s[j]:=';';
inc(j);
end else begin
@ -720,7 +894,9 @@ begin
inc(j);
end;
end;
SetLength(s,j-1);
dec(j);
while (j>=1) and (s[j]=';') do dec(j);
SetLength(s,j);
ValueAsTextSynEdit.Text:=s;
end;
@ -764,7 +940,7 @@ begin
end;
if SelTreeNode<>nil then begin
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
SelectedItemGroupBox.Enabled:=true;
SetValuesEditable(not SelDefNode.IsAutoGenerated);
ProjectSpecificCheckBox.Checked:=dtfProjectSpecific in SelDefNode.Flags;
NameEdit.Text:=SelDefNode.Name;
DescriptionEdit.Text:=SelDefNode.Description;
@ -781,7 +957,7 @@ begin
ValueAsFilePathsSynEdit.Options:=ValueAsTextSynEdit.Options;
ValueAsFilePathsSynEdit.ReadOnly:=ValueAsTextSynEdit.ReadOnly;
end else begin
SelectedItemGroupBox.Enabled:=false;
SetValuesEditable(false);
NameEdit.Text:='';
DescriptionEdit.Text:='';
VariableEdit.Text:='';
@ -823,11 +999,10 @@ end;
procedure TCodeToolsDefinesEditor.InsertNewNode(Behind: boolean;
Action: TDefineAction);
var SelTreeNode, NodeInFront, ParentNode, ANode, FirstNode,
var SelTreeNode, NodeInFront, ParentNode,
NewTreeNode: TTreeNode;
NewDefNode: TDefineTemplate;
NewName, NewDescription, NewVariable, NewValue: string;
i: integer;
begin
SelTreeNode:=DefineTreeView.Selected;
NodeInFront:=nil;
@ -853,31 +1028,20 @@ begin
end;
if (ParentNode<>nil) and (TDefineTemplate(ParentNode.Data).IsAutoGenerated)
then begin
MessageDlg('Invalid Parent','Auto created nodes can not be edited,'#13
MessageDlg('Invalid parent','Auto created nodes can not be edited,'#13
+'nor can they have non auto created child nodes.',mtInformation,[mbCancel]
,0);
exit;
end;
// find an unique name
if ParentNode<>nil then
FirstNode:=ParentNode.GetFirstChild
else
FirstNode:=nil;
if FirstNode=nil then FirstNode:=NodeInFront;
if FirstNode<>nil then begin
while FirstNode.GetPrevSibling<>nil do
FirstNode:=FirstNode.GetPrevSibling;
if (ParentNode<>nil)
and (not (TDefineTemplate(ParentNode.Data).Action in DefineActionBlocks)) then
begin
MessageDlg('Invalid parent node',
'Parent node can not contain child nodes.',
mtInformation,[mbCancel],0);
exit;
end;
i:=0;
repeat
inc(i);
ANode:=FirstNode;
while ANode<>nil do begin
if TDefineTemplate(ANode.Data).Name='NewNode'+IntToStr(i) then break;
ANode:=ANode.GetNextSibling;
end;
until ANode=nil;
NewName:='NewNode'+IntToStr(i);
NewName:=FindUniqueName;
NewDescription:=NewName;
NewVariable:='';
NewValue:='';
@ -895,7 +1059,7 @@ begin
// add node to define tree
if NodeInFront<>nil then
NewDefNode.InsertAfter(TDefineTemplate(NodeInFront.Data))
NewDefNode.InsertBehind(TDefineTemplate(NodeInFront.Data))
else if ParentNode<>nil then
TDefineTemplate(ParentNode.Data).AddChild(NewDefNode)
else
@ -903,6 +1067,99 @@ begin
SetNodeImages(NewTreeNode,true);
DefineTreeView.Selected:=NewTreeNode;
ShowSelectedValues;
end;
function TCodeToolsDefinesEditor.FindUniqueName: string;
var i: integer;
begin
i:=1;
while (DefineTree.FindDefineTemplateByName('NewNode'+IntToStr(i),false)<>nil)
do inc(i);
Result:='NewNode'+IntToStr(i);
end;
function TCodeToolsDefinesEditor.ConsistencyCheck: integer;
function CheckNode(ATreeNode: TTreeNode): integer;
var ADefNode, DummyDefNode: TDefineTemplate;
begin
if ATreeNode=nil then exit;
ADefNode:=TDefineTemplate(ATreeNode.Data);
//writeln(' CheckNode "',ATreeNode.Text,'" "',ADefNode.Name,'"');
if ADefNode=nil then begin
Result:=-1; exit;
end;
if (ATreeNode.GetPrevSibling<>nil)
and (TDefineTemplate(ATreeNode.GetPrevSibling.Data)<>ADefNode.Prior) then
begin
Result:=-2; exit;
end;
if (ATreeNode.GetNextSibling<>nil)
and (TDefineTemplate(ATreeNode.GetNextSibling.Data)<>ADefNode.Next) then
begin
write(' ERROR: ',ATreeNode.GetNextSibling.Text,' ');
if ADefNode.Next<>nil then write('ADefNode.Next=',ADefNode.Next.Name,' ')
else write('ADefNode.Next=nil ');
DummyDefNode:=TDefineTemplate(ATreeNode.GetNextSibling.Data);
if DummyDefNode<>nil then
writeln('ATreeNode.GetNextSibling.Next=',DummyDefNode.Name)
else
writeln('ATreeNode.GetNextSibling.Next=nil');
writeln('=============================================');
DefineTreeView.WriteDebugReport('TV ',true);
writeln('=============================================');
DefineTree.WriteDebugReport;
writeln('=============================================');
Result:=-3; exit;
end;
if (ATreeNode.GetFirstChild<>nil)
and (TDefineTemplate(ATreeNode.GetFirstChild.Data)<>ADefNode.FirstChild)
then begin
Result:=-4; exit;
end;
Result:=CheckNode(ATreeNode.GetFirstChild);
if Result<0 then exit;
Result:=CheckNode(ATreeNode.GetNextSibling);
if Result<0 then exit;
end;
begin
Result:=DefineTreeView.ConsistencyCheck;
if Result<0 then begin
dec(Result,100000);
exit;
end;
Result:=DefineTree.ConsistencyCheck;
if Result<0 then begin
dec(Result,200000);
exit;
end;
Result:=CheckNode(DefineTreeView.Items.GetFirstNode);
if Result<0 then begin
dec(Result,300000);
exit;
end;
Result:=0;
end;
procedure TCodeToolsDefinesEditor.SetValuesEditable(AValue: boolean);
begin
SelectedItemGroupBox.Enabled:=true;
TypeLabel.Enabled:=AValue;
ProjectSpecificCheckBox.Enabled:=AValue;
NameLabel.Enabled:=AValue;
NameEdit.Enabled:=AValue;
DescriptionLabel.Enabled:=AValue;
DescriptionEdit.Enabled:=AValue;
VariableLabel.Enabled:=AValue;
VariableEdit.Enabled:=AValue;
ValueAsTextSynEdit.ReadOnly:=not AValue;
ValueAsFilePathsSynEdit.ReadOnly:=not AValue;
MoveFilePathUpBitBtn.Enabled:=AValue;
MoveFilePathDownBitBtn.Enabled:=AValue;
DeleteFilePathBitBtn.Enabled:=AValue;
InsertFilePathBitBtn.Enabled:=AValue;
end;
procedure TCodeToolsDefinesEditor.Assign(ACodeToolBoss: TCodeToolManager;

View File

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

View File

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

View File

@ -1304,6 +1304,9 @@ end.
{
$Log$
Revision 1.51 2002/03/05 08:14:59 lazarus
MG: updates for codetools defines editor
Revision 1.50 2002/02/25 23:18:54 lazarus
MG: jump history will now try to save relative filenames

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

View File

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