FIX: Bug [0001966] Wrong file is renamed if the original file was deleted after the start of rename

This commit is contained in:
Alexander Koblov 2019-02-03 08:58:03 +00:00
commit b53e5866d6
4 changed files with 52 additions and 30 deletions

View file

@ -42,7 +42,7 @@ type
protected
procedure CreateDefault(AOwner: TWinControl); override;
function GetFileViewGridClass: TFileViewGridClass; override;
procedure ShowRenameFileEdit(aFile: TFile); override;
procedure ShowRenameFileEdit(var aFile: TFile); override;
procedure UpdateRenameFileEditPosition; override;
function GetVisibleFilesIndexes: TRange; override;
function GetIconRect(FileIndex: PtrInt): TRect; override;
@ -524,7 +524,7 @@ begin
Result:= TBriefDrawGrid;
end;
procedure TBriefFileView.ShowRenameFileEdit(aFile: TFile);
procedure TBriefFileView.ShowRenameFileEdit(var aFile: TFile);
begin
if not edtRename.Visible then
begin
@ -544,6 +544,8 @@ procedure TBriefFileView.UpdateRenameFileEditPosition;
var
ARect: TRect;
begin
inherited UpdateRenameFileEditPosition;
ARect := dgPanel.CellRect(dgPanel.Col, dgPanel.Row);
Dec(ARect.Top, 2);
Inc(ARect.Bottom, 2);

View file

@ -171,7 +171,7 @@ type
procedure RedrawFiles; override;
procedure SetActiveFile(FileIndex: PtrInt; ScrollTo: Boolean; aLastTopRowIndex: PtrInt = -1); override;
procedure SetSorting(const NewSortings: TFileSortings); override;
procedure ShowRenameFileEdit(aFile: TFile); override;
procedure ShowRenameFileEdit(var aFile: TFile); override;
procedure UpdateRenameFileEditPosition; override;
procedure MouseScrollTimer(Sender: TObject); override;
@ -463,7 +463,7 @@ begin
dgPanel.ColumnsOwnDim:=ExternalDimFunction;
end;
procedure TColumnsFileView.ShowRenameFileEdit(aFile: TFile);
procedure TColumnsFileView.ShowRenameFileEdit(var aFile: TFile);
begin
if FFileNameColumn <> -1 then
begin
@ -484,6 +484,8 @@ procedure TColumnsFileView.UpdateRenameFileEditPosition;
var
ARect: TRect;
begin
inherited UpdateRenameFileEditPosition;
ARect := dgPanel.CellRect(FFileNameColumn, dgPanel.Row);
Dec(ARect.Top, 2);
Inc(ARect.Bottom, 2);

View file

@ -82,6 +82,7 @@ type
protected
edtRename: TEdit;
FRenameFile: TFile;
FRenFile:TRenameFileEditInfo;
FRenTags:string; // rename separators
@ -166,8 +167,8 @@ type
procedure WorkerStarting(const Worker: TFileViewWorker); override;
procedure WorkerFinished(const Worker: TFileViewWorker); override;
procedure ShowRenameFileEdit(AFile: TFile); virtual;
procedure UpdateRenameFileEditPosition; virtual;abstract;
procedure ShowRenameFileEdit(var AFile: TFile); virtual;
procedure UpdateRenameFileEditPosition; virtual;
procedure RenameSelectPart(AActionType:TRenameFileActionType); virtual;
property MainControl: TWinControl read FMainControl write SetMainControl;
@ -208,7 +209,7 @@ uses
Gtk2Proc, // for ReleaseMouseCapture
GTK2Globals, // for DblClickTime
{$ENDIF}
LCLIntf, LCLProc, LazUTF8, Forms, Dialogs,
LCLIntf, LCLProc, LazUTF8, Forms, Dialogs, DCOSUtils,
fMain, uShowMsg, uLng, uFileProperty, uFileSource, uFileSourceOperationTypes,
uGlobs, uInfoToolTip, uDisplayFile, uFileSystemFileSource, uFileSourceUtil,
uArchiveFileSourceUtil, uFormCommands, uKeyboard, uFileSourceSetFilePropertyOperation;
@ -1306,6 +1307,7 @@ begin
end;
FRenameFileIndex := -1;
end;
procedure TFileViewWithMainCtrl.TransformDraggingToExternal(ScreenPoint: TPoint);
begin
// Set flag temporarily before stopping internal dragging,
@ -1345,6 +1347,7 @@ end;
procedure TFileViewWithMainCtrl.edtRenameExit(Sender: TObject);
begin
FreeAndNil(FRenameFile);
edtRename.Visible := False;
MainControl.WindowProc:= FWindowProc;
@ -1358,7 +1361,6 @@ procedure TFileViewWithMainCtrl.edtRenameKeyDown(Sender: TObject;
var
NewFileName: String;
OldFileNameAbsolute: String;
aFile: TFile = nil;
begin
case Key of
@ -1377,26 +1379,21 @@ begin
NewFileName := edtRename.Text;
OldFileNameAbsolute := edtRename.Hint;
aFile := CloneActiveFile;
try
try
case RenameFile(FileSource, aFile, NewFileName, True) of
sfprSuccess:
begin
edtRename.Visible:=False;
SetActiveFile(CurrentPath + NewFileName);
SetFocus;
end;
sfprError:
msgError(Format(rsMsgErrRename, [ExtractFileName(OldFileNameAbsolute), NewFileName]));
end;
except
on e: EInvalidFileProperty do
msgError(Format(rsMsgErrRename + ':' + LineEnding + '%s (%s)', [ExtractFileName(OldFileNameAbsolute), NewFileName, rsMsgInvalidFileName, e.Message]));
case RenameFile(FileSource, FRenameFile, NewFileName, True) of
sfprSuccess:
begin
edtRename.Visible:=False;
SetActiveFile(CurrentPath + NewFileName);
SetFocus;
end;
sfprError:
msgError(Format(rsMsgErrRename, [ExtractFileName(OldFileNameAbsolute), NewFileName]));
end;
finally
FreeAndNil(aFile);
except
on e: EInvalidFileProperty do
msgError(Format(rsMsgErrRename + ':' + LineEnding + '%s (%s)', [ExtractFileName(OldFileNameAbsolute), NewFileName, rsMsgInvalidFileName, e.Message]));
end;
end;
@ -1459,7 +1456,7 @@ begin
if not (csDestroying in ComponentState) then UpdateInfoPanel;
end;
procedure TFileViewWithMainCtrl.ShowRenameFileEdit(AFile: TFile);
procedure TFileViewWithMainCtrl.ShowRenameFileEdit(var AFile: TFile);
var
S: String;
begin
@ -1521,8 +1518,27 @@ begin
if gRenameSelOnlyName and not (AFile.IsDirectory or AFile.IsLinkToDirectory) then
RenameSelectPart(rfatName)
else
else begin
RenameSelectPart(rfatFull);
end;
FRenameFile:= aFile;
aFile:= nil;
end;
end;
procedure TFileViewWithMainCtrl.UpdateRenameFileEditPosition;
var
AFile: TDisplayFile;
begin
if edtRename.Visible then
begin
AFile:= GetActiveDisplayFile;
// Cannot find original file, cancel rename
if (AFile = nil) or (not mbCompareFileNames(AFile.FSFile.FullPath, FRenameFile.FullPath)) then
begin
edtRename.Hide;
SetFocus;
end;
end;
end;

View file

@ -83,7 +83,7 @@ type
procedure EnsureDisplayProperties; override;
function GetFileViewGridClass: TFileViewGridClass; override;
function GetVisibleFilesIndexes: TRange; override;
procedure ShowRenameFileEdit(aFile: TFile); override;
procedure ShowRenameFileEdit(var aFile: TFile); override;
procedure UpdateRenameFileEditPosition(); override;
function GetIconRect(FileIndex: PtrInt): TRect; override;
procedure MouseScrollTimer(Sender: TObject); override;
@ -658,7 +658,7 @@ begin
end;
end;
procedure TThumbFileView.ShowRenameFileEdit(aFile: TFile);
procedure TThumbFileView.ShowRenameFileEdit(var aFile: TFile);
begin
if not edtRename.Visible then
begin
@ -676,6 +676,8 @@ procedure TThumbFileView.UpdateRenameFileEditPosition();
var
ARect: TRect;
begin
inherited UpdateRenameFileEditPosition;
ARect := dgPanel.CellRect(dgPanel.Col, dgPanel.Row);
ARect.Top := ARect.Bottom - dgPanel.Canvas.TextHeight('Wg') - 4;