Skip to content

Commit cbd7f76

Browse files
committed
fix(importList): missing path conversion (relative to absolute and vice versa) based of imported file list #95
1 parent 69e0009 commit cbd7f76

File tree

4 files changed

+77
-10
lines changed

4 files changed

+77
-10
lines changed

Forms/Forms.ImportList.pas

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ interface
2929
Kernel.Enumerations, EditBtn;
3030

3131
type
32+
33+
{ TfrmImportList }
34+
3235
TfrmImportList = class(TForm)
3336
bvl1: TBevel;
3437
bvl2: TBevel;
@@ -64,6 +67,10 @@ TfrmImportList = class(TForm)
6467
procedure CheckAllItems(State: TCheckState);
6568
procedure PopulateTree(Tree: TVirtualStringTree; FilePath: String);
6669
function TreeImpToTree(TreeImp, Tree: TVirtualStringTree): Boolean;
70+
procedure MassRelativeToAbsolutePath(Sender: TBaseVirtualTree;
71+
Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
72+
procedure MassAbsoluteToRelativePath(Sender: TBaseVirtualTree;
73+
Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
6774
public
6875
{ Public declarations }
6976
class procedure Execute(AOwner: TComponent);
@@ -77,10 +84,10 @@ implementation
7784
{$R *.lfm}
7885

7986
uses
80-
AppConfig.Main, VirtualTree.Methods,
87+
AppConfig.Main, VirtualTree.Methods, NodeDataTypes.Files,
8188
Utility.FileFolder, Utility.XML, Database.Manager, NodeDataTypes.Base,
8289
Kernel.Logger, Kernel.ResourceStrings, Utility.Misc, Kernel.Instance,
83-
mormot.core.log;
90+
mormot.core.log, AppConfig.Paths;
8491

8592
procedure TfrmImportList.btnBackClick(Sender: TObject);
8693
begin
@@ -118,16 +125,27 @@ procedure TfrmImportList.FormCreate(Sender: TObject);
118125
end;
119126

120127
procedure TfrmImportList.FormClose(Sender: TObject; var Action: TCloseAction);
128+
var
129+
ImportPaths: TConfigPaths;
121130
begin
122131
Config.ASuiteState := lsNormal;
123132
if (ModalResult = mrOk) and (vstListImp.HasChildren[vstListImp.RootNode]) then
124133
begin
125134
try
135+
136+
ImportPaths := TConfigPaths.Create(edtPathList.Text);
137+
try
138+
vstListImp.IterateSubtree(nil, MassAbsoluteToRelativePath, @ImportPaths, [], True);
139+
finally
140+
ImportPaths.Free;
141+
end;
142+
126143
if TreeImpToTree(vstListImp, ASuiteInstance.MainTree) then
127144
begin
128145
ShowMessageFmtEx(msgItemsImported, [GetNumberNodeImp(vstListImp)]);
129146
TASuiteLogger.Info(msgItemsImported, [GetNumberNodeImp(vstListImp)]);
130147
end;
148+
131149
TVirtualTreeMethods.GetAllIcons(ASuiteInstance.MainTree, nil);
132150
except
133151
on E : Exception do
@@ -169,13 +187,24 @@ class procedure TfrmImportList.Execute(AOwner: TComponent);
169187
end;
170188

171189
procedure TfrmImportList.tsListShow(Sender: TObject);
190+
var
191+
AsuiteSqlPath: String;
192+
ImportPaths: TConfigPaths;
172193
begin
173194
lblTitle.Caption := msgImportTitle3;
174195
btnNext.Caption := msgImport;
175196
btnNext.Enabled := vstListImp.CheckedCount > 0;
197+
AsuiteSqlPath := edtPathList.Text;
176198
//Import list in temporary vst
177199
try
178-
PopulateTree(vstListImp, edtPathList.Text);
200+
PopulateTree(vstListImp, AsuiteSqlPath);
201+
202+
ImportPaths := TConfigPaths.Create(AsuiteSqlPath);
203+
try
204+
vstListImp.IterateSubtree(nil, MassRelativeToAbsolutePath, @ImportPaths, [], True);
205+
finally
206+
ImportPaths.Free;
207+
end;
179208
finally
180209
TVirtualTreeMethods.GetAllIcons(vstListImp, nil);
181210
end;
@@ -307,4 +336,42 @@ function TfrmImportList.TreeImpToTree(TreeImp,
307336
Tree.EndUpdate;
308337
end;
309338

339+
procedure TfrmImportList.MassRelativeToAbsolutePath(Sender: TBaseVirtualTree;
340+
Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
341+
var
342+
ImportPath: TConfigPaths;
343+
NodeData: TvBaseNodeData;
344+
begin
345+
ImportPath := TConfigPaths(Data^);
346+
NodeData := TVirtualTreeMethods.GetNodeItemData(Node, Sender);
347+
if not(NodeData.IsSeparatorItem) then
348+
begin
349+
TvFileNodeData(NodeData).PathIcon := ImportPath.RelativeToAbsolute(TvFileNodeData(NodeData).PathIcon);
350+
if NodeData.IsFileItem then
351+
begin
352+
TvFileNodeData(NodeData).PathFile := ImportPath.RelativeToAbsolute(TvFileNodeData(NodeData).PathFile);
353+
TvFileNodeData(NodeData).WorkingDir := ImportPath.RelativeToAbsolute(TvFileNodeData(NodeData).WorkingDir);
354+
end;
355+
end;
356+
end;
357+
358+
procedure TfrmImportList.MassAbsoluteToRelativePath(Sender: TBaseVirtualTree;
359+
Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
360+
var
361+
ImportPath: TConfigPaths;
362+
NodeData: TvBaseNodeData;
363+
begin
364+
ImportPath := TConfigPaths(Data^);
365+
NodeData := TVirtualTreeMethods.GetNodeItemData(Node, Sender);
366+
if not(NodeData.IsSeparatorItem) then
367+
begin
368+
TvFileNodeData(NodeData).PathIcon := ImportPath.AbsoluteToRelative(TvFileNodeData(NodeData).PathIcon);
369+
if NodeData.IsFileItem then
370+
begin
371+
TvFileNodeData(NodeData).PathFile := ImportPath.AbsoluteToRelative(TvFileNodeData(NodeData).PathFile);
372+
TvFileNodeData(NodeData).WorkingDir := ImportPath.AbsoluteToRelative(TvFileNodeData(NodeData).WorkingDir);
373+
end;
374+
end;
375+
end;
376+
310377
end.

Library/AppConfig.Paths.pas

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ TConfigPaths = class
5151
procedure UpdateEnvironmentVars;
5252
procedure UpdateASuiteVars;
5353
public
54-
constructor Create;
54+
constructor Create(APathExecutable: string);
5555
destructor Destroy; override;
5656

5757
function AbsoluteToRelative(const APath: String): string;
@@ -195,12 +195,12 @@ procedure TConfigPaths.UpdateASuiteVars;
195195
FASuiteVars.Add(DeQuotedStr(CONST_PATH_URLICON), strFolderIcon + FILEICON_Url + EXT_ICO);
196196
end;
197197

198-
constructor TConfigPaths.Create;
198+
constructor TConfigPaths.Create(APathExecutable: string);
199199
var
200200
strPathExe, strFileListSql, strFileListXml: String;
201201
begin
202202
//Default paths
203-
strPathExe := Application.ExeName;
203+
strPathExe := APathExecutable;
204204
FSuitePathWorking := ExtractFilePath(strPathExe);
205205

206206
strFileListSql := ExtractFileNameOnly(strPathExe) + EXT_SQL;
@@ -285,7 +285,7 @@ function TConfigPaths.RelativeToAbsolute(const APath: String;
285285
//Note: Unfortunately old asuite vars is not quoted, but in format $var.
286286
// So these two vars are deprecated. This code remain for only backwards compatibility
287287
//CONST_PATH_ASuite_old = Launcher's path
288-
Result := StringReplace(Result, CONST_PATH_ASuite_old, SuitePathWorking, [rfIgnoreCase,rfReplaceAll]);
288+
Result := StringReplace(Result, CONST_PATH_ASuite_old, ExcludeTrailingPathDelimiter(SuitePathWorking), [rfIgnoreCase,rfReplaceAll]);
289289
//CONST_PATH_DRIVE_old = Launcher's Drive (ex. ASuite in H:\Software\ASuite.exe, CONST_PATH_DRIVE is H: )
290290
Result := StringReplace(Result, CONST_PATH_DRIVE_old, SUITEDRIVE, [rfIgnoreCase,rfReplaceAll]);
291291

Library/Icons.Thread.pas

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ implementation
4242

4343
uses
4444
VirtualTree.Methods, NodeDataTypes.Base, AppConfig.Main, Kernel.Enumerations,
45-
Kernel.Logger, mormot.core.log;
45+
Kernel.Logger, mormot.core.log, Kernel.Instance;
4646

4747
{ TTreeIconsThread }
4848

@@ -70,7 +70,7 @@ procedure TTreeIconsThread.GetImageIndex(Sender: TBaseVirtualTree;
7070
var
7171
NodeData: TvBaseNodeData;
7272
begin
73-
if Config.ASuiteState = lsNormal then
73+
if (Config.ASuiteState = lsNormal) or ((Config.ASuiteState = lsImporting) and (Sender = ASuiteInstance.ImportTree)) then
7474
begin
7575
NodeData := TVirtualTreeMethods.GetNodeItemData(Node, Sender);
7676
if Assigned(NodeData) then

Library/Kernel.Instance.pas

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ constructor TASuiteInstance.Create;
114114
HandleParam(ParamStr(I));
115115

116116
//Create some classes
117-
FPaths := TConfigPaths.Create;
117+
FPaths := TConfigPaths.Create(Application.ExeName);
118118

119119
//Setup logger
120120
with TSynLog.Family do

0 commit comments

Comments
 (0)