Converter: for Delphi compat, copy .dfm to .lfm and add IFDEF for compilation.

git-svn-id: trunk@24222 -
This commit is contained in:
juha 2010-03-26 14:34:25 +00:00
parent 7e820e2a53
commit afdba5afae
4 changed files with 59 additions and 25 deletions

View File

@ -18,6 +18,9 @@ uses
type
// For future, when .dfm form file can be used for both Delphi and Lazarus.
{ TFormFileAction = (faUseDfm, faRenameToLfm, faUseBothDfmAndLfm); }
{ TConvDelphiCodeTool }
TConvDelphiCodeTool = class // (TStandardCodeTool)
@ -27,8 +30,10 @@ type
fSrcCache: TSourceChangeCache;
fAsk: Boolean;
fHasFormFile: boolean;
fFormFileRename: boolean;
fUseBothDfmAndLfm: boolean;
fLowerCaseRes: boolean;
fDfmDirectiveStart: integer;
fDfmDirectiveEnd: integer;
fTarget: TConvertTarget;
// List of units to remove.
fUnitsToRemove: TStringList;
@ -52,7 +57,7 @@ type
function Convert: TModalResult;
public
property Ask: Boolean read fAsk write fAsk;
property FormFileRename: boolean read fFormFileRename write fFormFileRename;
property UseBothDfmAndLfm: boolean read fUseBothDfmAndLfm write fUseBothDfmAndLfm;
property HasFormFile: boolean read fHasFormFile write fHasFormFile;
property LowerCaseRes: boolean read fLowerCaseRes write fLowerCaseRes;
property Target: TConvertTarget read fTarget write fTarget;
@ -72,7 +77,7 @@ begin
// Default values for vars.
fAsk:=true;
fLowerCaseRes:=false;
fFormFileRename:=false;
fUseBothDfmAndLfm:=false;
fTarget:=ctLazarus;
fUnitsToComment:=nil;
fUnitsToRename:=nil;
@ -236,7 +241,7 @@ function TConvDelphiCodeTool.AddModeDelphiDirective: boolean;
var
ModeDirectivePos: integer;
InsertPos: Integer;
nl: String;
s, nl: String;
begin
Result:=false;
with fCodeTool do begin
@ -251,11 +256,10 @@ begin
InsertPos:=CurPos.EndPos;
nl:=fSrcCache.BeautifyCodeOptions.LineEnd;
if fTarget=ctLazarusAndDelphi then
fSrcCache.Replace(gtEmptyLine,gtEmptyLine,InsertPos,InsertPos,
'{$IFDEF LCL}'+nl+' {$MODE Delphi}'+nl+'{$ENDIF}')
s:='{$IFDEF LCL}'+nl+' {$MODE Delphi}'+nl+'{$ENDIF}'
else
fSrcCache.Replace(gtEmptyLine,gtEmptyLine,InsertPos,InsertPos,
'{$MODE Delphi}');
s:='{$MODE Delphi}';
fSrcCache.Replace(gtEmptyLine,gtEmptyLine,InsertPos,InsertPos,s);
end;
// changing mode requires rescan
BuildTree(false);
@ -270,10 +274,15 @@ var
ParamPos: Integer;
ACleanPos: Integer;
Key, LowKey, NewKey: String;
s, nl: string;
AlreadyIsLfm: Boolean;
begin
Result:=false;
// find $R directive
AlreadyIsLfm:=false;
fDfmDirectiveStart:=-1;
fDfmDirectiveEnd:=-1;
ACleanPos:=1;
// find $R directive
with fCodeTool do
repeat
ACleanPos:=FindNextCompilerDirectiveWithName(Src,ACleanPos,'R',
@ -289,10 +298,20 @@ begin
// Form file resource rename or lowercase:
if (LowKey='dfm') or (LowKey='xfm') then begin
if fFormFileRename then
NewKey:='lfm'
else if Key<>LowKey then
NewKey:=LowKey;
// Lowercase existing key. (Future, when the same dfm file can be used)
// faUseDfm: if Key<>LowKey then NewKey:=LowKey;
if fUseBothDfmAndLfm then begin
// Later IFDEF will be added so that Delphi can still use .dfm.
fDfmDirectiveStart:=ACleanPos;
fDfmDirectiveEnd:=ParamPos+6;
end
else // Change .dfm to .lfm.
NewKey:='lfm';
end
// If there already is .lfm, prevent adding IFDEF for .dfm / .lfm.
else if LowKey='lfm' then begin
AlreadyIsLfm:=true;
end
// lowercase {$R *.RES} to {$R *.res}
@ -305,6 +324,18 @@ begin
end;
ACleanPos:=FindCommentEnd(Src,ACleanPos,fCodeTool.Scanner.NestedComments);
until false;
// if there is already .lfm file, don't add IFDEF later for .dfm / .lfm.
if fUseBothDfmAndLfm and (fDfmDirectiveStart<>-1) and not AlreadyIsLfm then
begin
// Add IFDEF for .lfm and .dfm allowing Delphi to use .dfm.
nl:=fSrcCache.BeautifyCodeOptions.LineEnd;
s:='{$IFDEF LCL}'+nl+
' {$R *.lfm}'+nl+
'{$ELSE}'+nl+
' {$R *.dfm}'+nl+
'{$ENDIF}'; // gtEmptyLine,gtNewLine,
Result:=fSrcCache.Replace(gtNone,gtNone,fDfmDirectiveStart,fDfmDirectiveEnd,s);
end;
Result:=true;
end;

View File

@ -567,7 +567,7 @@ begin
Result:=LazarusIDE.DoCloseEditorFile(DfmFilename,[cfSaveFirst]);
if Result<>mrOk then exit;
end;
if fSettings.FormFileRename then begin
// if fSettings.FormFileRename then begin
// rename files (.pas,.dfm) lowercase. TODO: rename files in project
LfmFilename:=fSettings.DelphiToLazFilename(fOrigUnitFilename, '.lfm',
cdtlufRenameLowercase in fFlags);
@ -577,13 +577,16 @@ begin
DeleteFileUTF8(LfmFilename); // .lfm is older than .dfm -> remove .lfm
if not FileExistsUTF8(LfmFilename) then begin
// TODO: update project
Result:=fSettings.RenameFile(DfmFilename,LfmFilename);
if fSettings.Target=ctLazarusAndDelphi then
Result:=CopyFileWithErrorDialogs(DfmFilename,LfmFilename,[mbAbort])
else
Result:=fSettings.RenameFile(DfmFilename,LfmFilename);
if Result<>mrOK then exit;
end;
end;
end
{ end
else
LfmFilename:=DfmFilename;
LfmFilename:=DfmFilename; }
// convert .dfm file to .lfm file (without context type checking)
if FileExistsUTF8(LfmFilename) then begin
IDEMessagesWindow.AddMsg('Converting DFM to LFM file '+LfmFilename,'',-1);
@ -612,8 +615,8 @@ begin
ConvTool.Ask:=Assigned(fOwnerConverter);
ConvTool.LowerCaseRes:=FileExistsUTF8(ChangeFileExt(fLazUnitFilename, '.res'));
ConvTool.HasFormFile:=DfmFilename<>'';
ConvTool.FormFileRename:=fSettings.FormFileRename and (DfmFilename<>'');
ConvTool.Target:=fSettings.Target;
ConvTool.UseBothDfmAndLfm:=fSettings.Target=ctLazarusAndDelphi; {and (DfmFilename<>'')}
ConvTool.UnitsToRemove:=fUnitsToRemove;
ConvTool.UnitsToRename:=fUnitsToRename;
ConvTool.UnitsToAdd:=fUnitsToAdd;

View File

@ -91,6 +91,7 @@ object ConvertSettingsForm: TConvertSettingsForm
Checked = True
State = cbChecked
TabOrder = 1
Visible = False
end
object TargetRadioGroup: TRadioGroup
Left = 3

View File

@ -48,7 +48,7 @@ type
// Actual user settings.
fBackupFiles: boolean;
fTarget: TConvertTarget;
fFormFileRename: boolean;
// fFormFileRename: boolean;
fAutoMissingProperties: boolean;
fAutoMissingComponents: boolean;
// Replacement properties for Delphi properties.
@ -83,7 +83,7 @@ type
property BackupFiles: boolean read fBackupFiles;
property Target: TConvertTarget read fTarget;
property FormFileRename: boolean read fFormFileRename;
// property FormFileRename: boolean read fFormFileRename;
property AutoMissingProperties: boolean read fAutoMissingProperties;
property AutoMissingComponents: boolean read fAutoMissingComponents;
property ReplaceProps: TStringToStringTree read fReplaceProps;
@ -175,7 +175,7 @@ begin
// UI --> Settings.
fBackupFiles :=BackupCheckBox.Checked;
fTarget :=TConvertTarget(TargetRadioGroup.ItemIndex);
fFormFileRename :=FormFileRenameCheckBox.Checked;
// fFormFileRename :=FormFileRenameCheckBox.Checked;
fAutoMissingProperties:=MissingPropertyCheckBox.Checked;
fAutoMissingComponents:=MissingComponentCheckBox.Checked;
// ToDo: Save to XML.
@ -237,8 +237,7 @@ end;
function TConvertSettings.RenameFile(const SrcFilename, DestFilename: string): TModalResult;
begin
Result:=mrOK;
// Convert in place.
// Result:=mrOK;
if fBackupFiles then
BackupFile(SrcFilename); // Save before rename.
Result:=RenameFileWithErrorDialogs(SrcFilename,DestFilename,[mbAbort]);
@ -302,9 +301,9 @@ var
Trg: TConvertTarget;
begin
Trg:=TConvertTarget((Sender as TRadioGroup).ItemIndex);
if Trg=ctLazarusAndDelphi then
{ if Trg=ctLazarusAndDelphi then
FormFileRenameCheckBox.Checked:=false;
FormFileRenameCheckBox.Enabled:=Trg<>ctLazarusAndDelphi;
FormFileRenameCheckBox.Enabled:=Trg<>ctLazarusAndDelphi; }
end;
procedure TConvertSettingsForm.ReplacementCompsButtonClick(Sender: TObject);