mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
FIX: Bug [0001966] Wrong file is renamed if the original file was deleted after the start of rename
This commit is contained in:
parent
0d36b613a7
commit
b53e5866d6
4 changed files with 52 additions and 30 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue