mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-25 18:40:33 +02:00
Converter: for Delphi compat, copy .dfm to .lfm and add IFDEF for compilation.
git-svn-id: trunk@24222 -
This commit is contained in:
parent
7e820e2a53
commit
afdba5afae
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -91,6 +91,7 @@ object ConvertSettingsForm: TConvertSettingsForm
|
||||
Checked = True
|
||||
State = cbChecked
|
||||
TabOrder = 1
|
||||
Visible = False
|
||||
end
|
||||
object TargetRadioGroup: TRadioGroup
|
||||
Left = 3
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user