mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-07-23 17:46:05 +02:00
IDE: improved updating resource directives for windows manifest and version info
git-svn-id: trunk@13040 -
This commit is contained in:
parent
5c30e13681
commit
d815ea8ea2
@ -323,6 +323,8 @@ type
|
|||||||
const Filename: string = ''; SearchInCleanSrc: boolean = true): boolean;
|
const Filename: string = ''; SearchInCleanSrc: boolean = true): boolean;
|
||||||
function AddResourceDirective(Code: TCodeBuffer; const Filename: string;
|
function AddResourceDirective(Code: TCodeBuffer; const Filename: string;
|
||||||
SearchInCleanSrc: boolean = true; const NewSrc: string = ''): boolean;
|
SearchInCleanSrc: boolean = true; const NewSrc: string = ''): boolean;
|
||||||
|
function RemoveDirective(Code: TCodeBuffer; NewX, NewY: integer;
|
||||||
|
RemoveEmptyIFs: boolean): boolean;
|
||||||
function FixIncludeFilenames(Code: TCodeBuffer; Recursive: boolean;
|
function FixIncludeFilenames(Code: TCodeBuffer; Recursive: boolean;
|
||||||
out MissingIncludeFilesCodeXYPos: TFPList): boolean;
|
out MissingIncludeFilesCodeXYPos: TFPList): boolean;
|
||||||
function FixMissingH2PasDirectives(Code: TCodeBuffer;
|
function FixMissingH2PasDirectives(Code: TCodeBuffer;
|
||||||
@ -2442,6 +2444,41 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TCodeToolManager.RemoveDirective(Code: TCodeBuffer; NewX,
|
||||||
|
NewY: integer; RemoveEmptyIFs: boolean): boolean;
|
||||||
|
var
|
||||||
|
Tree: TCompilerDirectivesTree;
|
||||||
|
p: integer;
|
||||||
|
Node: TCodeTreeNode;
|
||||||
|
Changed: boolean;
|
||||||
|
ParentNode: TCodeTreeNode;
|
||||||
|
begin
|
||||||
|
Result:=false;
|
||||||
|
{$IFDEF CTDEBUG}
|
||||||
|
DebugLn('TCodeToolManager.RemoveDirective A ',Code.Filename);
|
||||||
|
{$ENDIF}
|
||||||
|
try
|
||||||
|
Code.LineColToPosition(NewY,NewX,p);
|
||||||
|
if (p<1) or (p>Code.SourceLength) then exit;
|
||||||
|
Tree:=TCompilerDirectivesTree.Create;
|
||||||
|
try
|
||||||
|
Tree.Parse(Code,GetNestedCommentsFlagForFile(Code.Filename));
|
||||||
|
Node:=Tree.FindNodeAtPos(p);
|
||||||
|
if Node=nil then exit;
|
||||||
|
ParentNode:=Node.Parent;
|
||||||
|
Changed:=false;
|
||||||
|
Tree.DisableNode(Node,Changed,true);
|
||||||
|
if RemoveEmptyIFs and (ParentNode<>nil) and Tree.NodeIsEmpty(ParentNode) then
|
||||||
|
Tree.DisableNode(ParentNode,Changed,true);
|
||||||
|
Result:=Changed;
|
||||||
|
finally
|
||||||
|
Tree.Free;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
on e: Exception do Result:=HandleException(e);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TCodeToolManager.FixIncludeFilenames(Code: TCodeBuffer;
|
function TCodeToolManager.FixIncludeFilenames(Code: TCodeBuffer;
|
||||||
Recursive: boolean; out MissingIncludeFilesCodeXYPos: TFPList): boolean;
|
Recursive: boolean; out MissingIncludeFilesCodeXYPos: TFPList): boolean;
|
||||||
|
|
||||||
|
@ -140,21 +140,7 @@ type
|
|||||||
procedure EndChildNode;
|
procedure EndChildNode;
|
||||||
procedure EndIFNode(const ErrorMsg: string);
|
procedure EndIFNode(const ErrorMsg: string);
|
||||||
|
|
||||||
procedure CheckAndImproveExpr_Brackets(Node: TCodeTreeNode;
|
procedure InternalRemoveNode(Node: TCodeTreeNode);
|
||||||
var Changed: boolean);
|
|
||||||
procedure CheckAndImproveExpr_IfDefinedMacro(Node: TCodeTreeNode;
|
|
||||||
var Changed: boolean);
|
|
||||||
procedure DisableAllUnusedDefines(var Changed: boolean);
|
|
||||||
procedure MoveIfNotThenDefsUp(var Changed: boolean);
|
|
||||||
procedure DisableUnreachableBlocks(Undefines, Defines: TStrings;
|
|
||||||
var Changed: boolean);
|
|
||||||
procedure DisableDefineNode(Node: TCodeTreeNode; var Changed: boolean);
|
|
||||||
procedure DisableIfNode(Node: TCodeTreeNode; WithContent: boolean;
|
|
||||||
var Changed: boolean);
|
|
||||||
procedure RemoveNode(Node: TCodeTreeNode);
|
|
||||||
procedure RemoveEmptyNodes(var Changed: boolean);
|
|
||||||
function InsertDefine(Position: integer; const NewSrc: string;
|
|
||||||
SubDesc: TCompilerDirectiveNodeDesc): TCodeTreeNode;
|
|
||||||
public
|
public
|
||||||
Code: TCodeBuffer;
|
Code: TCodeBuffer;
|
||||||
Src: string;
|
Src: string;
|
||||||
@ -180,12 +166,11 @@ type
|
|||||||
FindDefNodes: boolean);
|
FindDefNodes: boolean);
|
||||||
procedure FixMissingH2PasDirectives(var Changed: boolean);
|
procedure FixMissingH2PasDirectives(var Changed: boolean);
|
||||||
|
|
||||||
function NodeStartToCodePos(Node: TCodeTreeNode;
|
|
||||||
out CodePos: TCodeXYPosition): boolean;
|
|
||||||
function FindResourceDirective(const Filename: string = '';
|
function FindResourceDirective(const Filename: string = '';
|
||||||
StartPos: integer = 1): TCodeTreeNode;
|
StartPos: integer = 1): TCodeTreeNode;
|
||||||
function IsResourceDirective(Node: TCodeTreeNode;
|
function IsResourceDirective(Node: TCodeTreeNode;
|
||||||
const Filename: string = ''): boolean;
|
const Filename: string = ''): boolean;
|
||||||
|
|
||||||
function GetDirectiveName(Node: TCodeTreeNode): string;
|
function GetDirectiveName(Node: TCodeTreeNode): string;
|
||||||
function GetDirective(Node: TCodeTreeNode): string;
|
function GetDirective(Node: TCodeTreeNode): string;
|
||||||
function GetIfExpression(Node: TCodeTreeNode;
|
function GetIfExpression(Node: TCodeTreeNode;
|
||||||
@ -200,7 +185,28 @@ type
|
|||||||
): boolean;
|
): boolean;
|
||||||
function DefineUsesName(DefineNode: TCodeTreeNode;
|
function DefineUsesName(DefineNode: TCodeTreeNode;
|
||||||
Identifier: PChar): boolean;
|
Identifier: PChar): boolean;
|
||||||
|
function NodeIsEmpty(Node: TCodeTreeNode; IgnoreComments: boolean = true): boolean;
|
||||||
function FindNodeAtPos(p: integer): TCodeTreeNode;
|
function FindNodeAtPos(p: integer): TCodeTreeNode;
|
||||||
|
function NodeStartToCodePos(Node: TCodeTreeNode;
|
||||||
|
out CodePos: TCodeXYPosition): boolean;
|
||||||
|
|
||||||
|
procedure CheckAndImproveExpr_Brackets(Node: TCodeTreeNode;
|
||||||
|
var Changed: boolean);
|
||||||
|
procedure CheckAndImproveExpr_IfDefinedMacro(Node: TCodeTreeNode;
|
||||||
|
var Changed: boolean);
|
||||||
|
procedure DisableAllUnusedDefines(var Changed: boolean);
|
||||||
|
procedure MoveIfNotThenDefsUp(var Changed: boolean);
|
||||||
|
procedure DisableUnreachableBlocks(Undefines, Defines: TStrings;
|
||||||
|
var Changed: boolean);
|
||||||
|
procedure DisableNode(Node: TCodeTreeNode; var Changed: boolean;
|
||||||
|
WithContent: boolean);
|
||||||
|
procedure DisableDefineNode(Node: TCodeTreeNode; var Changed: boolean);
|
||||||
|
procedure DisableIfNode(Node: TCodeTreeNode; WithContent: boolean;
|
||||||
|
var Changed: boolean);
|
||||||
|
function InsertDefine(Position: integer; const NewSrc: string;
|
||||||
|
SubDesc: TCompilerDirectiveNodeDesc): TCodeTreeNode;
|
||||||
|
procedure RemoveEmptyNodes(var Changed: boolean);
|
||||||
|
|
||||||
procedure MoveCursorToPos(p: integer);
|
procedure MoveCursorToPos(p: integer);
|
||||||
procedure ReadNextAtom;
|
procedure ReadNextAtom;
|
||||||
function ReadTilBracketClose(CloseBracket: char): boolean;
|
function ReadTilBracketClose(CloseBracket: char): boolean;
|
||||||
@ -208,7 +214,9 @@ type
|
|||||||
function UpAtomIs(const s: shortstring): boolean;
|
function UpAtomIs(const s: shortstring): boolean;
|
||||||
function AtomIsIdentifier: boolean;
|
function AtomIsIdentifier: boolean;
|
||||||
function GetAtom: string;
|
function GetAtom: string;
|
||||||
|
|
||||||
procedure Replace(FromPos, ToPos: integer; const NewSrc: string);
|
procedure Replace(FromPos, ToPos: integer; const NewSrc: string);
|
||||||
|
|
||||||
procedure IncreaseChangeStep;
|
procedure IncreaseChangeStep;
|
||||||
procedure ResetMacros;
|
procedure ResetMacros;
|
||||||
procedure ClearMacros;
|
procedure ClearMacros;
|
||||||
@ -1317,6 +1325,16 @@ begin
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCompilerDirectivesTree.DisableNode(Node: TCodeTreeNode;
|
||||||
|
var Changed: boolean; WithContent: boolean);
|
||||||
|
begin
|
||||||
|
if Node=nil then exit;
|
||||||
|
case Node.Desc of
|
||||||
|
cdnDefine: DisableDefineNode(Node,Changed);
|
||||||
|
cdnIf, cdnElseIf, cdnElse: DisableIfNode(Node,WithContent,Changed);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCompilerDirectivesTree.DisableDefineNode(Node: TCodeTreeNode;
|
procedure TCompilerDirectivesTree.DisableDefineNode(Node: TCodeTreeNode;
|
||||||
var Changed: boolean);
|
var Changed: boolean);
|
||||||
var
|
var
|
||||||
@ -1341,11 +1359,11 @@ begin
|
|||||||
end;
|
end;
|
||||||
Replace(FromPos,ToPos,NewSrc);
|
Replace(FromPos,ToPos,NewSrc);
|
||||||
end else begin
|
end else begin
|
||||||
// disable directive -> {$off Define MacroName}
|
// disable directive -> {off $Define MacroName}
|
||||||
Replace(Node.StartPos+1,Node.StartPos+1,'off ');
|
Replace(Node.StartPos+1,Node.StartPos+1,'off ');
|
||||||
end;
|
end;
|
||||||
Changed:=true;
|
Changed:=true;
|
||||||
RemoveNode(Node);
|
InternalRemoveNode(Node);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCompilerDirectivesTree.DisableIfNode(Node: TCodeTreeNode;
|
procedure TCompilerDirectivesTree.DisableIfNode(Node: TCodeTreeNode;
|
||||||
@ -1430,7 +1448,7 @@ procedure TCompilerDirectivesTree.DisableIfNode(Node: TCodeTreeNode;
|
|||||||
end else begin
|
end else begin
|
||||||
// free nodes and delete code
|
// free nodes and delete code
|
||||||
while Node.FirstChild<>nil do
|
while Node.FirstChild<>nil do
|
||||||
RemoveNode(Node.FirstChild);
|
InternalRemoveNode(Node.FirstChild);
|
||||||
FromPos:=FindCommentEnd(Src,Node.StartPos,NestedComments);
|
FromPos:=FindCommentEnd(Src,Node.StartPos,NestedComments);
|
||||||
ToPos:=Node.NextBrother.StartPos;
|
ToPos:=Node.NextBrother.StartPos;
|
||||||
if RemoveDisabledDirectives then begin
|
if RemoveDisabledDirectives then begin
|
||||||
@ -1457,6 +1475,7 @@ var
|
|||||||
Simplified: Boolean;
|
Simplified: Boolean;
|
||||||
ExprNegated: boolean;
|
ExprNegated: boolean;
|
||||||
Expr2Negated: boolean;
|
Expr2Negated: boolean;
|
||||||
|
p: LongInt;
|
||||||
begin
|
begin
|
||||||
if (Node.NextBrother=nil) then
|
if (Node.NextBrother=nil) then
|
||||||
RaiseImpossible;
|
RaiseImpossible;
|
||||||
@ -1520,6 +1539,29 @@ begin
|
|||||||
ToPos:=Node.NextBrother.StartPos;
|
ToPos:=Node.NextBrother.StartPos;
|
||||||
if WithContent then begin
|
if WithContent then begin
|
||||||
// remove node source with content
|
// remove node source with content
|
||||||
|
if (FromPos>1) and (Src[FromPos-1] in [#10,#13])
|
||||||
|
and (ToPos<=SrcLen) and (Src[ToPos] in [#10,#13]) then begin
|
||||||
|
// the directive has a complete line
|
||||||
|
// remove the line end too
|
||||||
|
inc(ToPos);
|
||||||
|
if (ToPos<=SrcLen) and (Src[ToPos] in [#10,#13]) and (Src[ToPos]<>Src[ToPos-1])
|
||||||
|
then inc(ToPos);
|
||||||
|
if (ToPos<=SrcLen) and (Src[ToPos] in [#10,#13]) then begin
|
||||||
|
// there is an empty line behind the directive
|
||||||
|
// check if there is an empty line in front of the directive
|
||||||
|
p:=FromPos;
|
||||||
|
if (p>1) and (Src[p-1] in [#10,#13]) then begin
|
||||||
|
dec(p);
|
||||||
|
if (p>1) and (Src[p-1] in [#10,#13]) and (Src[p]<>Src[p-1]) then
|
||||||
|
dec(p);
|
||||||
|
if (p>1) and (Src[p-1] in [#10,#13]) then begin
|
||||||
|
// there is an empty line in front of the directive too
|
||||||
|
// => remove one empty line
|
||||||
|
FromPos:=p;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
Replace(FromPos,ToPos,'');
|
Replace(FromPos,ToPos,'');
|
||||||
end else begin
|
end else begin
|
||||||
// remove node source keeping content (child node source)
|
// remove node source keeping content (child node source)
|
||||||
@ -1538,24 +1580,26 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
if Node.NextBrother.Desc=cdnEnd then
|
if Node.NextBrother.Desc=cdnEnd then
|
||||||
RemoveNode(Node.NextBrother);
|
InternalRemoveNode(Node.NextBrother);
|
||||||
RemoveNode(Node);
|
InternalRemoveNode(Node);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCompilerDirectivesTree.RemoveNode(Node: TCodeTreeNode);
|
procedure TCompilerDirectivesTree.InternalRemoveNode(Node: TCodeTreeNode);
|
||||||
var
|
var
|
||||||
AVLNode: TAVLTreeNode;
|
AVLNode: TAVLTreeNode;
|
||||||
MacroNode: TCompilerMacroStats;
|
MacroNode: TCompilerMacroStats;
|
||||||
begin
|
begin
|
||||||
// clear references
|
// clear references
|
||||||
AVLNode:=Macros.FindLowest;
|
if Macros<>nil then begin
|
||||||
while AVLNode<>nil do begin
|
AVLNode:=Macros.FindLowest;
|
||||||
MacroNode:=TCompilerMacroStats(AVLNode.Data);
|
while AVLNode<>nil do begin
|
||||||
if MacroNode.LastDefineNode=Node then
|
MacroNode:=TCompilerMacroStats(AVLNode.Data);
|
||||||
MacroNode.LastDefineNode:=nil;
|
if MacroNode.LastDefineNode=Node then
|
||||||
if MacroNode.LastReadNode=Node then
|
MacroNode.LastDefineNode:=nil;
|
||||||
MacroNode.LastReadNode:=nil;
|
if MacroNode.LastReadNode=Node then
|
||||||
AVLNode:=Macros.FindSuccessor(AVLNode);
|
MacroNode.LastReadNode:=nil;
|
||||||
|
AVLNode:=Macros.FindSuccessor(AVLNode);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// free node
|
// free node
|
||||||
@ -2415,6 +2459,41 @@ begin
|
|||||||
Result:=CompareIdentifierPtrs(@Src[p],Identifier)=0;
|
Result:=CompareIdentifierPtrs(@Src[p],Identifier)=0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TCompilerDirectivesTree.NodeIsEmpty(Node: TCodeTreeNode;
|
||||||
|
IgnoreComments: boolean): boolean;
|
||||||
|
var
|
||||||
|
DirectiveEndPos: LongInt;
|
||||||
|
begin
|
||||||
|
if (Node=nil) then exit(true);
|
||||||
|
if Node.FirstChild<>nil then exit(false);
|
||||||
|
case Node.Desc of
|
||||||
|
cdnNone: exit(true);
|
||||||
|
cdnRoot: exit(false); // root is never empty, can not be deleted
|
||||||
|
cdnDefine: exit(true);
|
||||||
|
cdnIf,
|
||||||
|
cdnElseIf,
|
||||||
|
cdnElse:
|
||||||
|
begin
|
||||||
|
if Node.NextBrother=nil then exit(false); // maybe continued in another file
|
||||||
|
MoveCursorToPos(Node.StartPos);
|
||||||
|
// skip directive
|
||||||
|
ReadNextAtom;
|
||||||
|
DirectiveEndPos:=SrcPos;
|
||||||
|
// read the following atom (token or directive)
|
||||||
|
ReadNextAtom;
|
||||||
|
if AtomStart=Node.NextBrother.StartPos then begin
|
||||||
|
if IgnoreComments then
|
||||||
|
exit(true)
|
||||||
|
else if FindNextNonSpace(Src,DirectiveEndPos)<AtomStart then
|
||||||
|
exit(false)
|
||||||
|
else
|
||||||
|
exit(true);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
cdnEnd: exit(false);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TCompilerDirectivesTree.FindNodeAtPos(p: integer): TCodeTreeNode;
|
function TCompilerDirectivesTree.FindNodeAtPos(p: integer): TCodeTreeNode;
|
||||||
begin
|
begin
|
||||||
Result:=Tree.Root;
|
Result:=Tree.Root;
|
||||||
|
@ -27,10 +27,10 @@
|
|||||||
</RunParams>
|
</RunParams>
|
||||||
<RequiredPackages Count="2">
|
<RequiredPackages Count="2">
|
||||||
<Item1>
|
<Item1>
|
||||||
<PackageName Value="LCL"/>
|
<PackageName Value="CodeTools"/>
|
||||||
</Item1>
|
</Item1>
|
||||||
<Item2>
|
<Item2>
|
||||||
<PackageName Value="CodeTools"/>
|
<PackageName Value="LCL"/>
|
||||||
</Item2>
|
</Item2>
|
||||||
</RequiredPackages>
|
</RequiredPackages>
|
||||||
<Units Count="1">
|
<Units Count="1">
|
||||||
|
@ -58,16 +58,28 @@ begin
|
|||||||
if not CodeToolBoss.FindResourceDirective(Code,1,1,
|
if not CodeToolBoss.FindResourceDirective(Code,1,1,
|
||||||
NewCode,NewX,NewY,NewTopLine,'',false) then
|
NewCode,NewX,NewY,NewTopLine,'',false) then
|
||||||
begin
|
begin
|
||||||
writeln('FAILED: did not find the resource');
|
writeln('FAILED: did not find any resource directive');
|
||||||
if CodeToolBoss.ErrorMessage<>'' then
|
if CodeToolBoss.ErrorMessage<>'' then
|
||||||
writeln('CodeToolBoss.ErrorMessage=',CodeToolBoss.ErrorMessage);
|
writeln('CodeToolBoss.ErrorMessage=',CodeToolBoss.ErrorMessage);
|
||||||
halt;
|
halt;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// write the new source:
|
||||||
|
writeln('---------BEFORE REMOVE-------------');
|
||||||
|
writeln(Code.Source);
|
||||||
|
writeln('-----------------------------------');
|
||||||
|
|
||||||
writeln(NewCode.Filename,' X=',NewX,' Y=',NewY);
|
writeln(NewCode.Filename,' X=',NewX,' Y=',NewY);
|
||||||
|
|
||||||
|
if not CodeToolBoss.RemoveDirective(NewCode,NewX,NewY,true) then begin
|
||||||
|
writeln('FAILED to remove resource directive');
|
||||||
|
if CodeToolBoss.ErrorMessage<>'' then
|
||||||
|
writeln('CodeToolBoss.ErrorMessage=',CodeToolBoss.ErrorMessage);
|
||||||
|
halt;
|
||||||
|
end;
|
||||||
|
|
||||||
// write the new source:
|
// write the new source:
|
||||||
writeln('-----------------------------------');
|
writeln('---------AFTER REMOVE---------------');
|
||||||
writeln(Code.Source);
|
writeln(Code.Source);
|
||||||
writeln('-----------------------------------');
|
writeln('-----------------------------------');
|
||||||
end.
|
end.
|
||||||
|
@ -7,13 +7,13 @@ unit lazdaemon;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
reglazdaemon, daemonapp, lazdaemonapp, LazarusPackageIntf;
|
RegLazDaemon, daemonapp, lazdaemonapp, LazarusPackageIntf;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
procedure Register;
|
procedure Register;
|
||||||
begin
|
begin
|
||||||
RegisterUnit('reglazdaemon', @reglazdaemon.Register);
|
RegisterUnit('RegLazDaemon', @RegLazDaemon.Register);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
|
@ -10,20 +10,18 @@
|
|||||||
* *
|
* *
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
}
|
}
|
||||||
unit reglazdaemon;
|
unit RegLazDaemon;
|
||||||
|
|
||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, FormEditingIntf, projectintf,newitemintf, lazideintf,
|
Classes, SysUtils, FormEditingIntf, ProjectIntf, NewItemIntf, LazIDEIntf,
|
||||||
controls, forms;
|
Controls, Forms;
|
||||||
|
|
||||||
Type
|
Type
|
||||||
|
|
||||||
{ TDaemonFileDescriptor }
|
|
||||||
|
|
||||||
{ TDaemonMapperDescriptor }
|
{ TDaemonMapperDescriptor }
|
||||||
|
|
||||||
TDaemonMapperDescriptor = Class(TFileDescPascalUnitWithResource)
|
TDaemonMapperDescriptor = Class(TFileDescPascalUnitWithResource)
|
||||||
@ -35,6 +33,8 @@ Type
|
|||||||
function GetImplementationSource(const Filename, SourceName, ResourceName: string): string; override;
|
function GetImplementationSource(const Filename, SourceName, ResourceName: string): string; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TDaemonFileDescriptor }
|
||||||
|
|
||||||
TDaemonFileDescriptor = Class(TFileDescPascalUnitWithResource)
|
TDaemonFileDescriptor = Class(TFileDescPascalUnitWithResource)
|
||||||
Public
|
Public
|
||||||
Constructor Create; override;
|
Constructor Create; override;
|
||||||
|
@ -461,7 +461,7 @@ begin
|
|||||||
TargetFilename := TargetFileEdit.Text;
|
TargetFilename := TargetFileEdit.Text;
|
||||||
UseAppBundle := UseAppBundleCheckBox.Checked;
|
UseAppBundle := UseAppBundleCheckBox.Checked;
|
||||||
XPManifest.UseManifest := UseXPManifestCheckBox.Checked;
|
XPManifest.UseManifest := UseXPManifestCheckBox.Checked;
|
||||||
Project.XPManifest.UpdateMainSourceFile(Project.MainFilename);
|
XPManifest.UpdateMainSourceFile(Project.MainFilename);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// flags
|
// flags
|
||||||
@ -511,7 +511,7 @@ begin
|
|||||||
Project.VersionInfo.CopyrightString:=CopyrightEdit.Text;
|
Project.VersionInfo.CopyrightString:=CopyrightEdit.Text;
|
||||||
Project.VersionInfo.HexLang:=MSLanguageToHex(LanguageSelectionComboBox.Text);
|
Project.VersionInfo.HexLang:=MSLanguageToHex(LanguageSelectionComboBox.Text);
|
||||||
Project.VersionInfo.HexCharSet:=MSCharacterSetToHex(CharacterSetComboBox.Text);
|
Project.VersionInfo.HexCharSet:=MSCharacterSetToHex(CharacterSetComboBox.Text);
|
||||||
if Project.VersionInfo.UseVersionInfo and Project.VersionInfo.Modified then
|
if Project.VersionInfo.Modified then
|
||||||
Project.VersionInfo.UpdateMainSourceFile(Project.MainFilename);
|
Project.VersionInfo.UpdateMainSourceFile(Project.MainFilename);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -515,7 +515,7 @@ begin
|
|||||||
Project.VersionInfo.CopyrightString:=CopyrightEdit.Text;
|
Project.VersionInfo.CopyrightString:=CopyrightEdit.Text;
|
||||||
Project.VersionInfo.HexLang:=MSLanguageToHex(LanguageSelectionComboBox.Text);
|
Project.VersionInfo.HexLang:=MSLanguageToHex(LanguageSelectionComboBox.Text);
|
||||||
Project.VersionInfo.HexCharSet:=MSCharacterSetToHex(CharacterSetComboBox.Text);
|
Project.VersionInfo.HexCharSet:=MSCharacterSetToHex(CharacterSetComboBox.Text);
|
||||||
if Project.VersionInfo.UseVersionInfo and Project.VersionInfo.Modified then
|
if Project.VersionInfo.Modified then
|
||||||
Project.VersionInfo.UpdateMainSourceFile(Project.MainFilename);
|
Project.VersionInfo.UpdateMainSourceFile(Project.MainFilename);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -1425,7 +1425,7 @@ begin
|
|||||||
inc(SourceCompletionCaretXY.x,length(AChar));
|
inc(SourceCompletionCaretXY.x,length(AChar));
|
||||||
SourceCompletionTimer.AutoEnabled:=true;
|
SourceCompletionTimer.AutoEnabled:=true;
|
||||||
end;
|
end;
|
||||||
//DebugLn(['TSourceEditor.ProcessCommand AddCHar=',AddCHar]);
|
//DebugLn(['TSourceEditor.ProcessCommand ecChar AddChar=',AddChar]);
|
||||||
if not AddChar then Command:=ecNone;
|
if not AddChar then Command:=ecNone;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1433,6 +1433,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
AddChar:=true;
|
AddChar:=true;
|
||||||
if AutoCompleteChar(aChar,AddChar,acoLineBreak) then ;
|
if AutoCompleteChar(aChar,AddChar,acoLineBreak) then ;
|
||||||
|
//DebugLn(['TSourceEditor.ProcessCommand ecLineBreak AddChar=',AddChar]);
|
||||||
if not AddChar then Command:=ecNone;
|
if not AddChar then Command:=ecNone;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -2145,6 +2146,7 @@ begin
|
|||||||
and (FCodeTemplates.CompletionAttributes[i].IndexOfName(CatName)>=0)
|
and (FCodeTemplates.CompletionAttributes[i].IndexOfName(CatName)>=0)
|
||||||
then begin
|
then begin
|
||||||
Result:=true;
|
Result:=true;
|
||||||
|
DebugLn(['TSourceEditor.AutoCompleteChar ',AToken,' SrcToken=',SrcToken,' CatName=',CatName,' Index=',FCodeTemplates.CompletionAttributes[i].IndexOfName(CatName)]);
|
||||||
FCodeTemplates.ExecuteCompletion(AToken,FEditor);
|
FCodeTemplates.ExecuteCompletion(AToken,FEditor);
|
||||||
AddChar:=not FCodeTemplates.CompletionAttributes[i].IndexOfName(
|
AddChar:=not FCodeTemplates.CompletionAttributes[i].IndexOfName(
|
||||||
AutoCompleteOptionNames[acoRemoveChar])>=0;
|
AutoCompleteOptionNames[acoRemoveChar])>=0;
|
||||||
|
@ -118,45 +118,39 @@ end;
|
|||||||
function TProjectXPManifest.UpdateMainSourceFile(const AFilename: string): TModalResult;
|
function TProjectXPManifest.UpdateMainSourceFile(const AFilename: string): TModalResult;
|
||||||
var
|
var
|
||||||
NewX, NewY, NewTopLine: integer;
|
NewX, NewY, NewTopLine: integer;
|
||||||
ManifestCodeBuf: TCodeBuffer;
|
ManifestCodeBuf, NewCode: TCodeBuffer;
|
||||||
CodePos: TCodeXYPosition;
|
Filename: String;
|
||||||
begin
|
begin
|
||||||
Result := mrCancel;
|
Result := mrCancel;
|
||||||
ManifestCodeBuf := CodeToolBoss.LoadFile(AFilename,false,false);
|
ManifestCodeBuf := CodeToolBoss.LoadFile(AFilename,false,false);
|
||||||
if ManifestCodeBuf <> nil then
|
if ManifestCodeBuf <> nil then
|
||||||
begin
|
begin
|
||||||
SetFileNames(AFilename);
|
SetFileNames(AFilename);
|
||||||
if not CodeToolBoss.FindResourceDirective(ManifestCodeBuf, 1, 1,
|
Filename:=ExtractFileName(resFileName);
|
||||||
ManifestCodeBuf, NewX, NewY,
|
DebugLn(['TProjectXPManifest.UpdateMainSourceFile ',Filename]);
|
||||||
NewTopLine, ExtractFileName(resFileName)) then
|
if CodeToolBoss.FindResourceDirective(ManifestCodeBuf, 1, 1,
|
||||||
|
NewCode, NewX, NewY,
|
||||||
|
NewTopLine, Filename, false) then
|
||||||
begin
|
begin
|
||||||
if UseManifest then
|
// there is a resource directive in the source
|
||||||
begin
|
if not UseManifest then begin
|
||||||
if not CodeToolBoss.AddResourceDirective(ManifestCodeBuf, ExtractFileName(resFileName)) then
|
if not CodeToolBoss.RemoveDirective(NewCode, NewX,NewY,true) then
|
||||||
begin
|
begin
|
||||||
Messages.Add('Could not add "{$R'+ ExtractFileName(resFileName) +'"} to main source!');
|
Messages.Add('Could not remove "{$R'+ Filename +'"} from main source!');
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end else
|
end else if UseManifest then
|
||||||
if not UseManifest then
|
|
||||||
begin
|
begin
|
||||||
with CodeToolBoss.CurCodeTool do
|
if not CodeToolBoss.AddResourceDirective(ManifestCodeBuf,
|
||||||
|
Filename,false,'{$IFDEF WINDOWS}{$R '+Filename+'}{$ENDIF}') then
|
||||||
begin
|
begin
|
||||||
CodeToolBoss.SourceChangeCache.MainScanner := Scanner;
|
Messages.Add('Could not add "{$R'+ Filename +'"} to main source!');
|
||||||
CodePos.Code := ManifestCodeBuf;
|
exit;
|
||||||
CodePos.X := NewX;
|
|
||||||
CodePos.Y := NewY;
|
|
||||||
CaretToCleanPos(CodePos, NewX);
|
|
||||||
if CodeToolBoss.SourceChangeCache.Replace(gtNone, gtNone, NewX, NewX + Length(ExtractFileName(resFileName)) + 5, '') then
|
|
||||||
begin
|
|
||||||
if not CodeToolBoss.SourceChangeCache.Apply then
|
|
||||||
exit;
|
|
||||||
end else
|
|
||||||
exit;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
DebugLn(['TProjectXPManifest.UpdateMainSourceFile END ',ManifestCodeBuf.Source]);
|
||||||
Result := mrOk;
|
Result := mrOk;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -796,28 +796,46 @@ end;
|
|||||||
TProjectVersionInfo UpdateMainSourceFile
|
TProjectVersionInfo UpdateMainSourceFile
|
||||||
-----------------------------------------------------------------------------}
|
-----------------------------------------------------------------------------}
|
||||||
function TProjectVersionInfo.UpdateMainSourceFile(const AFilename: string
|
function TProjectVersionInfo.UpdateMainSourceFile(const AFilename: string
|
||||||
): TModalResult;
|
): TModalResult;
|
||||||
var
|
var
|
||||||
NewX, NewY, NewTopLine: integer;
|
NewX, NewY, NewTopLine: integer;
|
||||||
VersionInfoCodeBuf: TCodeBuffer;
|
VersionInfoCodeBuf: TCodeBuffer;
|
||||||
|
Filename: String;
|
||||||
|
NewCode: TCodeBuffer;
|
||||||
begin
|
begin
|
||||||
Result := mrCancel;
|
Result := mrCancel;
|
||||||
VersionInfoCodeBuf:=CodeToolBoss.LoadFile(AFilename,false,false);
|
VersionInfoCodeBuf:=CodeToolBoss.LoadFile(AFilename,false,false);
|
||||||
if VersionInfoCodeBuf=nil then exit;
|
if VersionInfoCodeBuf=nil then exit;
|
||||||
SetFileNames(AFilename);
|
SetFileNames(AFilename);
|
||||||
if not CodeToolBoss.FindResourceDirective(VersionInfoCodeBuf,1,1,
|
Filename:=ExtractFileName(resFilename);
|
||||||
VersionInfoCodeBuf,NewX,NewY,
|
//DebugLn(['TProjectVersionInfo.UpdateMainSourceFile ',Filename,' UseVersionInfo=',UseVersionInfo]);
|
||||||
NewTopLine,ExtractFileName(resFilename)) then
|
if CodeToolBoss.FindResourceDirective(VersionInfoCodeBuf,1,1,
|
||||||
begin
|
NewCode,NewX,NewY,
|
||||||
if not CodeToolBoss.AddResourceDirective(VersionInfoCodeBuf,
|
NewTopLine,Filename,false) then
|
||||||
ExtractFileName(resFilename)) then
|
begin
|
||||||
begin
|
if not UseVersionInfo then begin
|
||||||
VersionInfoMessages.Add('Could not add "{$R '
|
//DebugLn(['TProjectVersionInfo.UpdateMainSourceFile removing ',NewCode.Filename,' X=',NewX,' Y=',NewY]);
|
||||||
+ ExtractFileName(resFilename)+'}" to main source!');
|
if not CodeToolBoss.RemoveDirective(NewCode,NewX,NewY,true) then
|
||||||
exit;
|
begin
|
||||||
end
|
DebugLn(['TProjectVersionInfo.UpdateMainSourceFile FAILED removing']);
|
||||||
end;
|
VersionInfoMessages.Add('Could not emove "{$R '
|
||||||
Result:=mrOk;
|
+ Filename+'}" from main source!');
|
||||||
|
exit;
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
end else if UseVersionInfo then begin
|
||||||
|
//DebugLn(['TProjectVersionInfo.UpdateMainSourceFile adding ',AFilename]);
|
||||||
|
if not CodeToolBoss.AddResourceDirective(VersionInfoCodeBuf,
|
||||||
|
Filename,false,'{$IFDEF WINDOWS}{$R '+Filename+'}{$ENDIF}') then
|
||||||
|
begin
|
||||||
|
DebugLn(['TProjectVersionInfo.UpdateMainSourceFile FAILED adding']);
|
||||||
|
VersionInfoMessages.Add('Could not add "{$R '
|
||||||
|
+ Filename+'}" to main source!');
|
||||||
|
exit;
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
//DebugLn(['TProjectVersionInfo.UpdateMainSourceFile ',VersionInfoCodeBuf.Source]);
|
||||||
|
Result:=mrOk;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{-----------------------------------------------------------------------------
|
{-----------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user