mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-14 12:59:12 +02:00
Converter: implemented fully the coordinate offsets. GUI improvements.
git-svn-id: trunk@27346 -
This commit is contained in:
parent
f3fec16c04
commit
e1ba658ec6
@ -66,7 +66,7 @@ type
|
||||
function FixMainClassAncestor(const AClassName: string;
|
||||
AReplaceTypes: TStringToStringTree): boolean;
|
||||
function CheckTopOffsets(LFMBuf: TCodeBuffer; LFMTree: TLFMTree;
|
||||
ParentOffsets: TStringToStringTree; ValueNodes: TObjectList): boolean;
|
||||
VisOffsets: TVisualOffsets; ValueNodes: TObjectList): boolean;
|
||||
public
|
||||
property Ask: Boolean read fAsk write fAsk;
|
||||
property HasFormFile: boolean read fHasFormFile write fHasFormFile;
|
||||
@ -856,11 +856,11 @@ begin
|
||||
end;
|
||||
|
||||
function TConvDelphiCodeTool.CheckTopOffsets(LFMBuf: TCodeBuffer; LFMTree: TLFMTree;
|
||||
ParentOffsets: TStringToStringTree; ValueNodes: TObjectList): boolean;
|
||||
VisOffsets: TVisualOffsets; ValueNodes: TObjectList): boolean;
|
||||
// Collect a list of Top attributes for components that are inside
|
||||
// a visual container component. An offset will be added to those attributes.
|
||||
// Parameters: ParentOffsets has names of parent visual container types.
|
||||
// ValueNodes - the found Top attributes are added here as TTopOffset objects.
|
||||
// ValueNodes - the found Top attributes are added here as TSrcPropOffset objects.
|
||||
// Based on function CheckLFM.
|
||||
var
|
||||
RootContext: TFindContext;
|
||||
@ -1077,21 +1077,22 @@ var
|
||||
// ParentContext is the context, where properties are searched.
|
||||
// This can be a class or a property.
|
||||
var
|
||||
i: Integer;
|
||||
i, ind: Integer;
|
||||
ValNode: TLFMValueNode;
|
||||
CurName, GrandName: string;
|
||||
CurName, GrandName, Prop: string;
|
||||
CurPropertyContext: TFindContext;
|
||||
SearchContext: TFindContext;
|
||||
begin
|
||||
// find complete property name
|
||||
if LFMProperty.CompleteName='' then exit;
|
||||
if LFMProperty.CompleteName='Top' then begin
|
||||
Prop:=LFMProperty.CompleteName;
|
||||
if Prop='' then exit;
|
||||
if (Prop='Top') or (Prop='Left') then begin
|
||||
CurName:=ParentContext.Tool.ExtractClassName(ParentContext.Node, False);
|
||||
GrandName:=GrandParentContext.Tool.ExtractClassName(GrandParentContext.Node, False);
|
||||
if ParentOffsets[GrandName]<>'' then begin
|
||||
if VisOffsets.Find(GrandName, ind) then begin
|
||||
if LFMProperty.FirstChild is TLFMValueNode then begin
|
||||
ValNode:=LFMProperty.FirstChild as TLFMValueNode;
|
||||
ValueNodes.Add(TTopOffset.Create(GrandName, CurName, ValNode.StartPos));
|
||||
ValueNodes.Add(TSrcPropOffset.Create(GrandName,CurName,Prop,ValNode.StartPos));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
@ -800,8 +800,7 @@ begin
|
||||
end;
|
||||
if not fSettings.AutoReplaceUnits then begin
|
||||
// Edit, then remove or replace units.
|
||||
Result:=EditMap(MapToEdit, 'Units to replace in '+ExtractFileName(fOrigUnitFilename),
|
||||
lisConvDelphiName, lisConvNewName);
|
||||
Result:=EditMap(MapToEdit, 'Units to replace in '+ExtractFileName(fOrigUnitFilename));
|
||||
if Result<>mrOK then exit;
|
||||
// Iterate the map and rename / remove.
|
||||
Node:=MapToEdit.Tree.FindLowest;
|
||||
|
@ -5,26 +5,61 @@ unit ConverterTypes;
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils;
|
||||
Classes, SysUtils, contnrs;
|
||||
|
||||
type
|
||||
|
||||
{ TopOffset }
|
||||
|
||||
// Used when fixing top coordinates of controls inside a visual container.
|
||||
TTopOffset = class
|
||||
TSrcPropOffset = class
|
||||
private
|
||||
fParentType: string;
|
||||
fChildType: string;
|
||||
fPropName: string;
|
||||
fStartPos: integer;
|
||||
public
|
||||
constructor Create(aParentType, aChildType: string; aStartPos: integer);
|
||||
constructor Create(aParentType, aChildType, aPropName: string; aStartPos: integer);
|
||||
destructor Destroy; override;
|
||||
property ParentType: string read fParentType;
|
||||
property ChildType: string read fChildType;
|
||||
property PropName: string read fPropName;
|
||||
property StartPos: integer read fStartPos;
|
||||
end;
|
||||
|
||||
{ TVisualOffset }
|
||||
|
||||
// User defined settings.
|
||||
TVisualOffset = class
|
||||
private
|
||||
fParentType: string;
|
||||
fTop: Integer;
|
||||
fLeft: Integer;
|
||||
public
|
||||
constructor Create(const aParentType: string; aTop, aLeft: Integer);
|
||||
destructor Destroy; override;
|
||||
function ByProperty(aPropName: string): Integer;
|
||||
public
|
||||
property ParentType: string read fParentType;
|
||||
property Top: Integer read fTop;
|
||||
property Left: Integer read fLeft;
|
||||
end;
|
||||
|
||||
{ TVisualOffsets }
|
||||
|
||||
TVisualOffsets = class(TObjectList)
|
||||
private
|
||||
function GetVisualOffset(Index: Integer): TVisualOffset;
|
||||
procedure SetVisualOffset(Index: Integer; const AValue: TVisualOffset);
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
function Find(aParentType: string; var Index: Integer): Boolean;
|
||||
function AddVisualOffset(const aParentType: string; aTop, aLeft: Integer): integer;
|
||||
property Items[Index: Integer]: TVisualOffset read GetVisualOffset
|
||||
write SetVisualOffset; default;
|
||||
end;
|
||||
|
||||
// types for errors
|
||||
|
||||
{ EConverterError }
|
||||
@ -46,18 +81,94 @@ end;
|
||||
|
||||
{ TopOffset }
|
||||
|
||||
constructor TTopOffset.Create(aParentType, aChildType: string; aStartPos: integer);
|
||||
constructor TSrcPropOffset.Create(aParentType, aChildType, aPropName: string; aStartPos: integer);
|
||||
begin
|
||||
fParentType:=aParentType;
|
||||
fChildType:=aChildType;
|
||||
fPropName:=aPropName;
|
||||
fStartPos:=aStartPos;
|
||||
end;
|
||||
|
||||
destructor TTopOffset.Destroy;
|
||||
destructor TSrcPropOffset.Destroy;
|
||||
begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
|
||||
{ TVisualOffset }
|
||||
|
||||
constructor TVisualOffset.Create(const aParentType: string; aTop, aLeft: Integer);
|
||||
begin
|
||||
fParentType:=aParentType;
|
||||
fTop:=aTop;
|
||||
fLeft:=aLeft;
|
||||
end;
|
||||
|
||||
destructor TVisualOffset.Destroy;
|
||||
begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
function TVisualOffset.ByProperty(aPropName: string): Integer;
|
||||
begin
|
||||
if aPropName='Top' then
|
||||
Result:=Top
|
||||
else if aPropName='Left' then
|
||||
Result:=Left
|
||||
else
|
||||
Result:=0
|
||||
end;
|
||||
|
||||
|
||||
{ TVisualOffsets }
|
||||
|
||||
constructor TVisualOffsets.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
end;
|
||||
|
||||
destructor TVisualOffsets.Destroy;
|
||||
begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
function TVisualOffsets.Find(aParentType: string; var Index: Integer): Boolean;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
Result:=False;
|
||||
Index:=-1;
|
||||
for i:=0 to Count-1 do
|
||||
if Items[i].fParentType = aParentType then begin
|
||||
Result:=True;
|
||||
Index:=i;
|
||||
Break;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TVisualOffsets.AddVisualOffset(const aParentType: string; aTop, aLeft: Integer): integer;
|
||||
// This is called when settings are read or when user made changes in GUI.
|
||||
// Returns index for the added object, or -1 if not added (duplicate).
|
||||
var
|
||||
x: integer;
|
||||
begin
|
||||
Result:=-1;
|
||||
if (aParentType<>'') and not Find(aParentType, x) then
|
||||
Result:=Add(TVisualOffset.Create(aParentType, aTop, aLeft));
|
||||
end;
|
||||
|
||||
// Getter / Setter :
|
||||
|
||||
function TVisualOffsets.GetVisualOffset(Index: Integer): TVisualOffset;
|
||||
begin
|
||||
Result:=Inherited Items[Index] as TVisualOffset;
|
||||
end;
|
||||
|
||||
procedure TVisualOffsets.SetVisualOffset(Index: Integer; const AValue: TVisualOffset);
|
||||
begin
|
||||
Inherited Items[Index]:=AValue;
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
|
||||
|
@ -3,6 +3,7 @@ object ConvertSettingsForm: TConvertSettingsForm
|
||||
Height = 483
|
||||
Top = 298
|
||||
Width = 637
|
||||
ActiveControl = ProjectPathEdit
|
||||
Caption = 'Convert Delphi unit, project or package '
|
||||
ClientHeight = 483
|
||||
ClientWidth = 637
|
||||
@ -78,7 +79,7 @@ object ConvertSettingsForm: TConvertSettingsForm
|
||||
Hint = 'Some Delphi functions can be replaced with a LCL function'
|
||||
Top = 156
|
||||
Width = 272
|
||||
Caption = 'Top Coordinate Offsets'
|
||||
Caption = 'Coordinate Offsets'
|
||||
OnClick = VisualOffsButtonClick
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
|
@ -31,9 +31,9 @@ interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, IDEProcs,
|
||||
StdCtrls, EditBtn, Buttons, ExtCtrls, DialogProcs, LazarusIDEStrConsts,
|
||||
CodeToolsStructs, AVL_Tree, BaseIDEIntf, LazConfigStorage,
|
||||
ButtonPanel, ReplaceNamesUnit, ReplaceFuncsUnit;
|
||||
StdCtrls, EditBtn, Buttons, ExtCtrls, DialogProcs, ButtonPanel,
|
||||
LazarusIDEStrConsts, CodeToolsStructs, AVL_Tree, BaseIDEIntf, LazConfigStorage,
|
||||
ConverterTypes, ReplaceNamesUnit, ReplaceFuncsUnit;
|
||||
|
||||
type
|
||||
|
||||
@ -61,10 +61,10 @@ type
|
||||
fReplaceUnits: TStringToStringTree;
|
||||
// Delphi types mapped to Lazarus types, will be replaced.
|
||||
fReplaceTypes: TStringToStringTree;
|
||||
// Top coordinate shift of components in a visual container.
|
||||
fVisualOffsets: TStringToStringTree;
|
||||
// Delphi global function names mapped to FCL/LCL functions.
|
||||
fReplaceFuncs: TFuncsAndCategories;
|
||||
// Coordinate offsets of components in a visual container.
|
||||
fVisualOffsets: TVisualOffsets;
|
||||
// Getter / setter:
|
||||
function GetBackupPath: String;
|
||||
procedure SetMainFilename(const AValue: String);
|
||||
@ -102,8 +102,8 @@ type
|
||||
property EnableVisualOffs: boolean read fEnableVisualOffs;
|
||||
property ReplaceUnits: TStringToStringTree read fReplaceUnits;
|
||||
property ReplaceTypes: TStringToStringTree read fReplaceTypes;
|
||||
property VisualOffsets: TStringToStringTree read fVisualOffsets;
|
||||
property ReplaceFuncs: TFuncsAndCategories read fReplaceFuncs;
|
||||
property VisualOffsets: TVisualOffsets read fVisualOffsets;
|
||||
end;
|
||||
|
||||
|
||||
@ -127,9 +127,9 @@ type
|
||||
UnitReplaceButton: TBitBtn;
|
||||
SettingsGroupBox: TGroupBox;
|
||||
MissingStuffGroupBox: TGroupBox;
|
||||
procedure FuncReplaceButtonClick(Sender: TObject);
|
||||
procedure SameDFMCheckBoxChange(Sender: TObject);
|
||||
procedure TypeReplaceButtonClick(Sender: TObject);
|
||||
procedure FuncReplaceButtonClick(Sender: TObject);
|
||||
procedure VisualOffsButtonClick(Sender: TObject);
|
||||
procedure UnitReplaceButtonClick(Sender: TObject);
|
||||
procedure FormCreate(Sender: TObject);
|
||||
@ -268,6 +268,47 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
// Load and store configuration in VisualOffsets :
|
||||
|
||||
procedure LoadVisualOffsets(Config: TConfigStorage; const Path: string;
|
||||
aVisualOffsets: TVisualOffsets);
|
||||
var
|
||||
ParentType, SubPath: String;
|
||||
xTop, xLeft: Integer;
|
||||
Cnt, i: Integer;
|
||||
begin
|
||||
aVisualOffsets.Clear;
|
||||
Cnt:=Config.GetValue(Path+'Count', 0);
|
||||
for i:=0 to Cnt-1 do begin
|
||||
SubPath:=Path+'Item'+IntToStr(i)+'/';
|
||||
ParentType:=Config.GetValue(SubPath+'ParentType','');
|
||||
xTop :=Config.GetValue(SubPath+'Top',0);
|
||||
xLeft:=Config.GetValue(SubPath+'Left',0);
|
||||
aVisualOffsets.Add(TVisualOffset.Create(ParentType, xTop, xLeft));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure SaveVisualOffsets(Config: TConfigStorage; const Path: string;
|
||||
aVisualOffsets: TVisualOffsets);
|
||||
var
|
||||
offs: TVisualOffset;
|
||||
SubPath: String;
|
||||
i: Integer;
|
||||
begin
|
||||
Config.SetDeleteValue(Path+'Count', aVisualOffsets.Count, 0);
|
||||
for i:=0 to aVisualOffsets.Count-1 do begin
|
||||
offs:=aVisualOffsets[i];
|
||||
SubPath:=Path+'Item'+IntToStr(i)+'/';
|
||||
Config.SetDeleteValue(SubPath+'ParentType',offs.ParentType,'');
|
||||
Config.SetDeleteValue(SubPath+'Top' ,offs.Top,0);
|
||||
Config.SetDeleteValue(SubPath+'Left' ,offs.Left,0);
|
||||
end;
|
||||
// Remove leftover items in case the list has become shorter.
|
||||
for i:=aVisualOffsets.Count to aVisualOffsets.Count+10 do begin
|
||||
SubPath:=Path+'Item'+IntToStr(i)+'/';
|
||||
Config.DeletePath(SubPath);
|
||||
end;
|
||||
end;
|
||||
|
||||
{ TConvertSettings }
|
||||
|
||||
@ -297,8 +338,8 @@ begin
|
||||
fMainPath:='';
|
||||
fReplaceUnits:=TStringToStringTree.Create(false);
|
||||
fReplaceTypes:=TStringToStringTree.Create(false);
|
||||
fVisualOffsets:=TStringToStringTree.Create(true);
|
||||
fReplaceFuncs:=TFuncsAndCategories.Create;
|
||||
fVisualOffsets:=TVisualOffsets.Create;
|
||||
// Load settings from ConfigStorage.
|
||||
fConfigStorage:=GetIDEConfigStorage('delphiconverter.xml', true);
|
||||
fBackupFiles :=fConfigStorage.GetValue('BackupFiles', true);
|
||||
@ -310,8 +351,8 @@ begin
|
||||
fEnableVisualOffs :=fConfigStorage.GetValue('EnableVisualOffs', true);
|
||||
LoadStringToStringTree(fConfigStorage, 'UnitReplacements/', fReplaceUnits);
|
||||
LoadStringToStringTree(fConfigStorage, 'TypeReplacements/', fReplaceTypes);
|
||||
LoadStringToStringTree(fConfigStorage, 'VisualTopOffsets/', fVisualOffsets);
|
||||
LoadFuncReplacements (fConfigStorage, 'FuncReplacements/', 'Categories/', fReplaceFuncs);
|
||||
LoadFuncReplacements(fConfigStorage, 'FuncReplacements/', 'Categories/', fReplaceFuncs);
|
||||
LoadVisualOffsets(fConfigStorage, 'VisualOffsets/', fVisualOffsets);
|
||||
|
||||
// Add default values for configuration if ConfigStorage doesn't have them.
|
||||
|
||||
@ -354,10 +395,13 @@ begin
|
||||
MapReplacement('^TTnt(.+)LX$', 'T$1');
|
||||
MapReplacement('^TTnt(.+[^L][^X])$','T$1');
|
||||
|
||||
// Top coordinate offsets for some visual containers.
|
||||
TheMap:=fVisualOffsets;
|
||||
MapReplacement('TGroupBox', '10');
|
||||
MapReplacement('TPanel', '2');
|
||||
// Coordinate offsets for some visual containers.
|
||||
with fVisualOffsets do begin
|
||||
AddVisualOffset('TGroupBox' , 10,2);
|
||||
AddVisualOffset('TPanel', 2,2);
|
||||
AddVisualOffset('RadioGroup', 10,2);
|
||||
AddVisualOffset('CheckGroup', 10,2);
|
||||
end;
|
||||
|
||||
// Map Delphi function names to FCL/LCL functions.
|
||||
with fReplaceFuncs do begin
|
||||
@ -412,15 +456,15 @@ begin
|
||||
fConfigStorage.SetDeleteValue('EnableVisualOffs', fEnableVisualOffs, true);
|
||||
SaveStringToStringTree(fConfigStorage, 'UnitReplacements/', fReplaceUnits);
|
||||
SaveStringToStringTree(fConfigStorage, 'TypeReplacements/', fReplaceTypes);
|
||||
SaveStringToStringTree(fConfigStorage, 'VisualTopOffsets/', fVisualOffsets);
|
||||
SaveFuncReplacements (fConfigStorage, 'FuncReplacements/', 'Categories/', fReplaceFuncs);
|
||||
SaveFuncReplacements(fConfigStorage, 'FuncReplacements/', 'Categories/', fReplaceFuncs);
|
||||
SaveVisualOffsets(fConfigStorage, 'VisualOffsets/', fVisualOffsets);
|
||||
// Free stuff
|
||||
fConfigStorage.Free;
|
||||
fReplaceFuncs.Clear;
|
||||
fReplaceFuncs.Free;
|
||||
fReplaceTypes.Free;
|
||||
fVisualOffsets.Free;
|
||||
fReplaceUnits.Free;
|
||||
fVisualOffsets.Free;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
@ -590,8 +634,8 @@ begin
|
||||
FuncReplaceButton.Hint:=lisConvFuncReplHint;
|
||||
FuncReplaceEnableCheckBox.Caption:=lisEnable;
|
||||
|
||||
VisualOffsButton.Caption:=lisConvTopCoordOffs;
|
||||
VisualOffsButton.Hint:=lisConvTopCoordHint;
|
||||
VisualOffsButton.Caption:=lisConvCoordOffs;
|
||||
VisualOffsButton.Hint:=lisConvCoordHint;
|
||||
VisualOffsEnableCheckBox.Caption:=lisEnable;
|
||||
|
||||
TargetRadioGroup.Items.Clear;
|
||||
@ -630,17 +674,12 @@ end;
|
||||
|
||||
procedure TConvertSettingsForm.UnitReplaceButtonClick(Sender: TObject);
|
||||
begin
|
||||
EditMap(fSettings.ReplaceUnits, lisConvUnitsToReplace, lisConvDelphiName, lisConvNewName);
|
||||
EditMap(fSettings.ReplaceUnits, lisConvUnitsToReplace);
|
||||
end;
|
||||
|
||||
procedure TConvertSettingsForm.TypeReplaceButtonClick(Sender: TObject);
|
||||
begin
|
||||
EditMap(fSettings.ReplaceTypes, lisConvTypesToReplace, lisConvDelphiName, lisConvNewName);
|
||||
end;
|
||||
|
||||
procedure TConvertSettingsForm.VisualOffsButtonClick(Sender: TObject);
|
||||
begin
|
||||
EditMap(fSettings.VisualOffsets, lisConvTopCoordOffs, lisConvParentContainer, lisConvTopCoordOff);
|
||||
EditMap(fSettings.ReplaceTypes, lisConvTypesToReplace);
|
||||
end;
|
||||
|
||||
procedure TConvertSettingsForm.FuncReplaceButtonClick(Sender: TObject);
|
||||
@ -648,6 +687,11 @@ begin
|
||||
EditFuncReplacements(fSettings.ReplaceFuncs, lisConvFuncsToReplace);
|
||||
end;
|
||||
|
||||
procedure TConvertSettingsForm.VisualOffsButtonClick(Sender: TObject);
|
||||
begin
|
||||
EditVisualOffsets(fSettings.VisualOffsets, lisConvCoordOffs);
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
|
||||
|
@ -75,7 +75,7 @@ type
|
||||
fPropReplaceGrid: TStringGrid;
|
||||
fTypeReplaceGrid: TStringGrid;
|
||||
function ReplaceAndRemoveAll: TModalResult;
|
||||
function ReplaceTopOffsets(aOffsetList: TList): TModalResult;
|
||||
function ReplaceTopOffsets(aSrcOffsets: TList): TModalResult;
|
||||
// Fill StringGrids with missing properties and types from fLFMTree.
|
||||
procedure FillReplaceGrids;
|
||||
protected
|
||||
@ -328,30 +328,35 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function TLFMFixer.ReplaceTopOffsets(aOffsetList: TList): TModalResult;
|
||||
function TLFMFixer.ReplaceTopOffsets(aSrcOffsets: TList): TModalResult;
|
||||
// Replace top coordinates of controls in visual containers.
|
||||
// Returns mrOK if no types were changed, and mrCancel if there was an error.
|
||||
var
|
||||
TopOffset: TTopOffset;
|
||||
Len, Offs, OldNun, i: integer;
|
||||
OffsStr, OldText, NewText: string;
|
||||
TopOffs: TSrcPropOffset;
|
||||
VisOffs: TVisualOffset;
|
||||
OldNum, Ofs, NewNum, Len, ind, i: integer;
|
||||
begin
|
||||
Result:=mrOK;
|
||||
// Add offset to top coordinates.
|
||||
for i := aOffsetList.Count-1 downto 0 do begin
|
||||
TopOffset:=TTopOffset(aOffsetList[i]);
|
||||
OffsStr:=fSettings.VisualOffsets[TopOffset.ParentType];
|
||||
if OffsStr<>'' then begin
|
||||
for i := aSrcOffsets.Count-1 downto 0 do begin
|
||||
TopOffs:=TSrcPropOffset(aSrcOffsets[i]);
|
||||
if fSettings.VisualOffsets.Find(TopOffs.ParentType, ind) then begin
|
||||
VisOffs:=fSettings.VisualOffsets[ind];
|
||||
Len:=0;
|
||||
while fLFMBuffer.Source[TopOffset.StartPos+Len] in ['-', '0'..'9'] do
|
||||
while fLFMBuffer.Source[TopOffs.StartPos+Len] in ['-', '0'..'9'] do
|
||||
Inc(Len);
|
||||
OldText:=Copy(fLFMBuffer.Source, TopOffset.StartPos, Len);
|
||||
OldNun:=StrToInt(OldText);
|
||||
Offs:=StrToInt(OffsStr);
|
||||
NewText:=IntToStr(OldNun+Offs);
|
||||
fLFMBuffer.Replace(TopOffset.StartPos, Len, NewText);
|
||||
IDEMessagesWindow.AddMsg(Format('Changed Top coord of %s from "%s" to "%s" inside %s.',
|
||||
[TopOffset.ChildType, OldText, NewText, TopOffset.ParentType]),'',-1);
|
||||
try
|
||||
OldNum:=StrToInt(Copy(fLFMBuffer.Source, TopOffs.StartPos, Len));
|
||||
except on EConvertError do
|
||||
OldNum:=0;
|
||||
end;
|
||||
Ofs:=VisOffs.ByProperty(TopOffs.PropName);
|
||||
NewNum:=OldNum-Ofs;
|
||||
if NewNum<0 then
|
||||
NewNum:=0;
|
||||
fLFMBuffer.Replace(TopOffs.StartPos, Len, IntToStr(NewNum));
|
||||
IDEMessagesWindow.AddMsg(Format('Changed %s coord of %s from "%d" to "%d" inside %s.',
|
||||
[TopOffs.PropName, TopOffs.ChildType, OldNum, NewNum, TopOffs.ParentType]),'',-1);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
@ -95,9 +95,6 @@ type
|
||||
function FromUIToFuncList(aFuncsAndCateg: TFuncsAndCategories): boolean;
|
||||
end;
|
||||
|
||||
var
|
||||
ReplaceFuncsForm: TReplaceFuncsForm;
|
||||
|
||||
|
||||
function EditFuncReplacements(aFuncsAndCateg: TFuncsAndCategories;
|
||||
aTitle: string): TModalResult;
|
||||
|
@ -1,5 +1,5 @@
|
||||
object ReplaceNamesForm: TReplaceNamesForm
|
||||
Left = 314
|
||||
object ReplaceForm: TReplaceForm
|
||||
Height = 472
|
||||
Top = 438
|
||||
Width = 433
|
||||
|
@ -36,9 +36,9 @@ type
|
||||
function AddUnique(AOldIdent: string): string;
|
||||
end;
|
||||
|
||||
{ TReplaceNamesForm }
|
||||
{ TReplaceForm }
|
||||
|
||||
TReplaceNamesForm = class(TForm)
|
||||
TReplaceForm = class(TForm)
|
||||
ButtonPanel: TButtonPanel;
|
||||
InsertRow1: TMenuItem;
|
||||
DeleteRow1: TMenuItem;
|
||||
@ -58,15 +58,12 @@ type
|
||||
|
||||
end;
|
||||
|
||||
//var
|
||||
// ReplaceNamesForm: TReplaceNamesForm;
|
||||
|
||||
|
||||
function FromMapToGrid(AMap: TStringToStringTree; AGrid: TStringGrid): boolean;
|
||||
function FromGridToMap(AMap: TStringToStringTree; AGrid: TStringGrid;
|
||||
AllowEmptyValues: boolean = true): boolean;
|
||||
function EditMap(AMap: TStringToStringTree;
|
||||
AFormTitle, ACol1Title, ACol2Title: string): TModalResult;
|
||||
function EditMap(AMap: TStringToStringTree; AFormTitle: string): TModalResult;
|
||||
function EditVisualOffsets(AOffs: TVisualOffsets; aTitle: string): TModalResult;
|
||||
|
||||
implementation
|
||||
|
||||
@ -117,16 +114,15 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function EditMap(AMap: TStringToStringTree;
|
||||
AFormTitle, ACol1Title, ACol2Title: string): TModalResult;
|
||||
function EditMap(AMap: TStringToStringTree; AFormTitle: string): TModalResult;
|
||||
var
|
||||
RNForm: TReplaceNamesForm;
|
||||
RNForm: TReplaceForm;
|
||||
begin
|
||||
RNForm:=TReplaceNamesForm.Create(nil);
|
||||
RNForm:=TReplaceForm.Create(nil);
|
||||
try
|
||||
RNForm.Caption:=AFormTitle;
|
||||
RNForm.Grid.Columns[0].Title.Caption:=ACol1Title;
|
||||
RNForm.Grid.Columns[1].Title.Caption:=ACol2Title;
|
||||
RNForm.Grid.Columns[0].Title.Caption:=lisConvDelphiName;
|
||||
RNForm.Grid.Columns[1].Title.Caption:=lisConvNewName;
|
||||
FromMapToGrid(AMap, RNForm.Grid);
|
||||
Result:=RNForm.ShowModal;
|
||||
if Result=mrOK then
|
||||
@ -136,6 +132,72 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
// Functions for visual offsets values:
|
||||
|
||||
function FromListToGrid(AOffs: TVisualOffsets; AGrid: TStringGrid): boolean;
|
||||
// Copy strings from coordinale list to grid.
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
Result:=true;
|
||||
AGrid.BeginUpdate;
|
||||
for i:=1 to AOffs.Count do begin // Skip the fixed row in grid.
|
||||
if AGrid.RowCount<i+2 then
|
||||
AGrid.RowCount:=i+2; // Leave one empty row to the end.
|
||||
AGrid.Cells[0,i]:=AOffs[i-1].ParentType;
|
||||
AGrid.Cells[1,i]:=IntToStr(AOffs[i-1].Top);
|
||||
AGrid.Cells[2,i]:=IntToStr(AOffs[i-1].Left);
|
||||
end;
|
||||
AGrid.EndUpdate;
|
||||
end;
|
||||
|
||||
function FromGridToList(AOffs: TVisualOffsets; AGrid: TStringGrid): boolean;
|
||||
var
|
||||
ParentType: string;
|
||||
i, xTop, xLeft: Integer;
|
||||
begin
|
||||
Result:=true;
|
||||
AOffs.Clear;
|
||||
// Collect (maybe edited) properties from StringGrid to fStringMap.
|
||||
for i:=1 to AGrid.RowCount-1 do begin // Skip the fixed row.
|
||||
ParentType:=AGrid.Cells[0,i];
|
||||
if ParentType<>'' then begin
|
||||
xTop:=0;
|
||||
try
|
||||
xTop:=StrToInt(AGrid.Cells[1,i]);
|
||||
except on EConvertError do
|
||||
ShowMessage('Top value must be a number. Now: '+AGrid.Cells[1,i]);
|
||||
end;
|
||||
xLeft:=0;
|
||||
try
|
||||
xLeft:=StrToInt(AGrid.Cells[2,i]);
|
||||
except on EConvertError do
|
||||
ShowMessage('Left value must be a number. Now: '+AGrid.Cells[2,i]);
|
||||
end;
|
||||
AOffs.Add(TVisualOffset.Create(ParentType, xTop, xLeft));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function EditVisualOffsets(AOffs: TVisualOffsets; aTitle: string): TModalResult;
|
||||
var
|
||||
xForm: TReplaceForm;
|
||||
begin
|
||||
xForm:=TReplaceForm.Create(nil);
|
||||
try
|
||||
xForm.Caption:=aTitle;
|
||||
xForm.Grid.Columns[0].Title.Caption:=lisConvParentContainer;
|
||||
xForm.Grid.Columns[1].Title.Caption:=lisConvTopOff;
|
||||
xForm.Grid.Columns.Add.Title.Caption:=lisConvLeftOff;
|
||||
FromListToGrid(AOffs, xForm.Grid);
|
||||
Result:=xForm.ShowModal;
|
||||
if Result=mrOK then
|
||||
FromGridToList(AOffs, xForm.Grid);
|
||||
finally
|
||||
xForm.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
{ TStringMapUpdater }
|
||||
|
||||
@ -221,9 +283,9 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
{ TReplaceNamesForm }
|
||||
{ TReplaceForm }
|
||||
|
||||
procedure TReplaceNamesForm.FormCreate(Sender: TObject);
|
||||
procedure TReplaceForm.FormCreate(Sender: TObject);
|
||||
begin
|
||||
Caption:=lisReplacements;
|
||||
ButtonPanel.OKButton.Caption := lisOk;
|
||||
@ -232,7 +294,7 @@ begin
|
||||
IsLasRow:=false;
|
||||
end;
|
||||
|
||||
procedure TReplaceNamesForm.PopupMenu1Popup(Sender: TObject);
|
||||
procedure TReplaceForm.PopupMenu1Popup(Sender: TObject);
|
||||
var
|
||||
ControlCoord, NewCell: TPoint;
|
||||
begin
|
||||
@ -242,19 +304,19 @@ begin
|
||||
Grid.Row:=NewCell.Y;
|
||||
end;
|
||||
|
||||
procedure TReplaceNamesForm.InsertRow1Click(Sender: TObject);
|
||||
procedure TReplaceForm.InsertRow1Click(Sender: TObject);
|
||||
begin
|
||||
Grid.InsertColRow(False, Grid.Row);
|
||||
end;
|
||||
|
||||
procedure TReplaceNamesForm.DeleteRow1Click(Sender: TObject);
|
||||
procedure TReplaceForm.DeleteRow1Click(Sender: TObject);
|
||||
begin
|
||||
Grid.DeleteColRow(False, Grid.Row);
|
||||
end;
|
||||
|
||||
// Add rows automatically to the end of the grid
|
||||
// using OnSetEditText and OnEditingDone handlers and IsLasRow flag.
|
||||
procedure TReplaceNamesForm.GridEditingDone(Sender: TObject);
|
||||
procedure TReplaceForm.GridEditingDone(Sender: TObject);
|
||||
var
|
||||
sg: TStringGrid;
|
||||
begin
|
||||
@ -265,14 +327,14 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TReplaceNamesForm.GridSetEditText(Sender: TObject; ACol,
|
||||
procedure TReplaceForm.GridSetEditText(Sender: TObject; ACol,
|
||||
ARow: Integer; const Value: string);
|
||||
begin
|
||||
if ARow = (Sender as TStringGrid).RowCount-1 then
|
||||
IsLasRow:=Value<>'';
|
||||
end;
|
||||
|
||||
procedure TReplaceNamesForm.btnOKClick(Sender: TObject);
|
||||
procedure TReplaceForm.btnOKClick(Sender: TObject);
|
||||
begin
|
||||
ModalResult:=mrOK;
|
||||
end;
|
||||
|
@ -468,21 +468,22 @@ resourcestring
|
||||
lisConvAutoReplace = 'Replace automatically';
|
||||
lisConvAutoRemove = 'Remove automatically';
|
||||
lisConvAutoHint = 'If unchecked, there will be interactive dialogs for editing / accepting changes';
|
||||
lisConvUnitsToReplace = 'Units to replace';
|
||||
lisConvTypesToReplace = 'Types to replace';
|
||||
lisConvTopCoordOff = 'Top coordinate offset';
|
||||
lisConvTopCoordOffs = 'Top coordinate offsets';
|
||||
lisConvFuncsToReplace = 'Functions / procedures to replace';
|
||||
lisConvTypeReplacements = 'Type Replacements';
|
||||
lisConvUnitsToReplace = 'Units to replace';
|
||||
lisConvUnitReplacements = 'Unit Replacements';
|
||||
lisConvUnitReplHint = 'Unit names in uses section of a source unit';
|
||||
lisConvTypeReplacements = 'Type Replacements';
|
||||
lisConvTypeReplHint = 'Unknown types in form file (DFM/LFM)';
|
||||
lisConvTopCoordHint = 'An offset is added to Top coordinate of controls inside visual containers';
|
||||
lisConvCoordOffs = 'Coordinate offsets';
|
||||
lisConvCoordHint = 'An offset is added to Top coordinate of controls inside visual containers';
|
||||
lisConvFuncsToReplace = 'Functions / procedures to replace';
|
||||
lisConvFuncReplacements = 'Function Replacements';
|
||||
lisConvFuncReplHint = 'Some Delphi functions can be replaced with LCL function';
|
||||
lisConvDelphiName = 'Delphi Name';
|
||||
lisConvNewName = 'New Name';
|
||||
lisConvParentContainer = 'Parent Container';
|
||||
lisConvTopOff = 'Top offset';
|
||||
lisConvLeftOff = 'Left offset';
|
||||
lisConvDelphiFunc = 'Delphi Function';
|
||||
lisReplacement = 'Replacement';
|
||||
lisReplacements = 'Replacements';
|
||||
|
Loading…
Reference in New Issue
Block a user