Browse Source

Bug 1473: Found files can be download on the Find dialog.

https://winscp.net/tracker/1473

Source commit: df7b0366e50afdede8e9398cd18ae2bc171ec0f3
Martin Prikryl 9 years ago
parent
commit
4db43c51b2

+ 26 - 7
source/forms/CustomScpExplorer.cpp

@@ -1135,10 +1135,17 @@ bool __fastcall TCustomScpExplorerForm::CopyParamDialog(
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::ClearTransferSourceSelection(TTransferDirection Direction)
 {
-  TOperationSide Side = ((Direction == tdToRemote) ? osLocal : osRemote);
-  if (HasDirView[Side])
+  if (FOnFileOperationFinished != NULL)
   {
-    DirView(Side)->SelectAll(smNone);
+    FOnFileOperationFinished(UnicodeString(), true);
+  }
+  else
+  {
+    TOperationSide Side = ((Direction == tdToRemote) ? osLocal : osRemote);
+    if (HasDirView[Side])
+    {
+      DirView(Side)->SelectAll(smNone);
+    }
   }
 }
 //---------------------------------------------------------------------------
@@ -8713,8 +8720,8 @@ void __fastcall TCustomScpExplorerForm::DoFocusRemotePath(TTerminal * ATerminal,
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::DoDeleteFoundFiles(
-  TTerminal * ATerminal, TStrings * FileList, TFileOperationFinishedEvent OnFileOperationFinished)
+void __fastcall TCustomScpExplorerForm::DoOperationOnFoundFiles(
+  TFileOperation Operation, TTerminal * ATerminal, TStrings * FileList, TFileOperationFinishedEvent OnFileOperationFinished)
 {
   if (!NonVisualDataModule->Busy)
   {
@@ -8724,7 +8731,7 @@ void __fastcall TCustomScpExplorerForm::DoDeleteFoundFiles(
     FOnFileOperationFinished = OnFileOperationFinished;
     try
     {
-      ExecuteFileOperation(foDelete, osRemote, FileList, false, NULL);
+      ExecuteFileOperation(Operation, osRemote, FileList, false, NULL);
     }
     __finally
     {
@@ -8733,10 +8740,22 @@ void __fastcall TCustomScpExplorerForm::DoDeleteFoundFiles(
   }
 }
 //---------------------------------------------------------------------------
+void __fastcall TCustomScpExplorerForm::DoDeleteFoundFiles(
+  TTerminal * ATerminal, TStrings * FileList, TFileOperationFinishedEvent OnFileOperationFinished)
+{
+  DoOperationOnFoundFiles(foDelete, ATerminal, FileList, OnFileOperationFinished);
+}
+//---------------------------------------------------------------------------
+void __fastcall TCustomScpExplorerForm::DoDownloadFoundFiles(
+  TTerminal * ATerminal, TStrings * FileList, TFileOperationFinishedEvent OnFileOperationFinished)
+{
+  DoOperationOnFoundFiles(foCopy, ATerminal, FileList, OnFileOperationFinished);
+}
+//---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::RemoteFindFiles()
 {
   FFileFindTerminal = Terminal;
-  ShowFileFindDialog(Terminal, RemoteDirView->Path, DoFindFiles, DoFocusRemotePath, DoDeleteFoundFiles);
+  ShowFileFindDialog(Terminal, RemoteDirView->Path, DoFindFiles, DoFocusRemotePath, DoDeleteFoundFiles, DoDownloadFoundFiles);
 }
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::UpdateTaskbarList(ITaskbarList3 * TaskbarList)

+ 3 - 0
source/forms/CustomScpExplorer.h

@@ -520,7 +520,10 @@ protected:
   void __fastcall DoFindFiles(TTerminal * Terminal, UnicodeString Directory, const TFileMasks & FileMask,
     TFileFoundEvent OnFileFound, TFindingFileEvent OnFindingFile);
   virtual void __fastcall DoFocusRemotePath(TTerminal * Terminal, const UnicodeString & Path);
+  void __fastcall DoOperationOnFoundFiles(
+    TFileOperation Operation, TTerminal * ATerminal, TStrings * FileList, TFileOperationFinishedEvent OnFileOperationFinished);
   void __fastcall DoDeleteFoundFiles(TTerminal * Terminal, TStrings * FileList, TFileOperationFinishedEvent OnFileOperationFinished);
+  void __fastcall DoDownloadFoundFiles(TTerminal * ATerminal, TStrings * FileList, TFileOperationFinishedEvent OnFileOperationFinished);
   bool __fastcall ExecuteFileOperation(TFileOperation Operation, TOperationSide Side,
     bool OnFocused, bool NoConfirmation = false, void * Param = NULL);
   void __fastcall UpdateCopyParamCounters(const TCopyParamType & CopyParam);

+ 55 - 14
source/forms/FileFind.cpp

@@ -25,13 +25,14 @@
 TFileFindDialog * FileFindDialog = NULL;
 //---------------------------------------------------------------------------
 void __fastcall ShowFileFindDialog(
-  TTerminal * Terminal, UnicodeString Directory, TFindEvent OnFind, TFocusFileEvent OnFocusFile, TDeleteFilesEvent OnDeleteFiles)
+  TTerminal * Terminal, UnicodeString Directory, TFindEvent OnFind, TFocusFileEvent OnFocusFile,
+  TFileListOperationEvent OnDeleteFiles, TFileListOperationEvent OnDownloadFiles)
 {
   if (FileFindDialog == NULL)
   {
     FileFindDialog = new TFileFindDialog(Application);
   }
-  FileFindDialog->Init(Terminal, Directory, OnFind, OnFocusFile, OnDeleteFiles);
+  FileFindDialog->Init(Terminal, Directory, OnFind, OnFocusFile, OnDeleteFiles, OnDownloadFiles);
   FileFindDialog->Show();
 }
 //---------------------------------------------------------------------------
@@ -112,6 +113,7 @@ void __fastcall TFileFindDialog::UpdateControls()
   FocusAction->Enabled = (FileView->ItemFocused != NULL);
   bool EnableFileOperations = !Finding && (FileView->SelCount > 0);
   DeleteAction->Enabled = EnableFileOperations;
+  DownloadAction->Enabled = EnableFileOperations;
   CopyAction->Enabled = (FileView->Items->Count > 0);
   SelectAllAction->Enabled = (FileView->SelCount < FileView->Items->Count);
 
@@ -156,7 +158,8 @@ void __fastcall TFileFindDialog::ControlChange(TObject * /*Sender*/)
 }
 //---------------------------------------------------------------------------
 void __fastcall TFileFindDialog::Init(
-  TTerminal * Terminal, UnicodeString Directory, TFindEvent OnFind, TFocusFileEvent OnFocusFile, TDeleteFilesEvent OnDeleteFiles)
+  TTerminal * Terminal, UnicodeString Directory, TFindEvent OnFind, TFocusFileEvent OnFocusFile,
+  TFileListOperationEvent OnDeleteFiles, TFileListOperationEvent OnDownloadFiles)
 {
   if (FTerminal != Terminal)
   {
@@ -170,6 +173,7 @@ void __fastcall TFileFindDialog::Init(
   FOnFind = OnFind;
   FOnFocusFile = OnFocusFile;
   FOnDeleteFiles = OnDeleteFiles;
+  FOnDownloadFiles = OnDownloadFiles;
 
   MaskEdit->Text = WinConfiguration->SelectMask;
   RemoteDirectoryEdit->Text = UnixExcludeTrailingBackslash(Directory);
@@ -522,25 +526,52 @@ void __fastcall TFileFindDialog::FileViewContextPopup(TObject * Sender, TPoint &
   MenuPopup(Sender, MousePos, Handled);
 }
 //---------------------------------------------------------------------------
-void __fastcall TFileFindDialog::FileDeleteFinished(const UnicodeString & FileName, bool Success)
+TListItem * __fastcall TFileFindDialog::FileOperationFinished(const UnicodeString & FileName)
 {
   TFileItemMap::iterator I = FFileItemMap.find(FileName);
 
+  TListItem * Result = NULL;
   if (DebugAlwaysTrue(I != FFileItemMap.end()))
   {
-    TListItem * Item = I->second;
-    FileView->MakeProgressVisible(Item);
-    if (Success)
+    Result = I->second;
+    FileView->MakeProgressVisible(Result);
+    FFileItemMap.erase(I);
+  }
+  return Result;
+}
+//---------------------------------------------------------------------------
+void __fastcall TFileFindDialog::FileDeleteFinished(const UnicodeString & FileName, bool Success)
+{
+  // Delete in queue not supported
+  DebugAssert(!FileName.IsEmpty());
+  TListItem * Item = FileOperationFinished(FileName);
+  if (DebugAlwaysTrue(Item != NULL) && Success)
+  {
+    ClearItem(Item);
+    Item->Delete();
+  }
+}
+//---------------------------------------------------------------------------
+void __fastcall TFileFindDialog::FileDownloadFinished(const UnicodeString & FileName, bool Success)
+{
+  if (FileName.IsEmpty())
+  {
+    DebugAssert(Success);
+    // Moved to queue, see call in TCustomScpExplorerForm::CopyParamDialog
+    FileView->SelectAll(smNone);
+  }
+  else
+  {
+    TListItem * Item = FileOperationFinished(FileName);
+    if (DebugAlwaysTrue(Item != NULL) && Success)
     {
-      ClearItem(Item);
-      Item->Delete();
+      Item->Selected = false;
     }
-
-    FFileItemMap.erase(I);
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TFileFindDialog::DeleteActionExecute(TObject * /*Sender*/)
+void __fastcall TFileFindDialog::FileListOperation(
+  TFileListOperationEvent Operation, TFileOperationFinishedEvent OnFileOperationFinished)
 {
   std::unique_ptr<TStrings> FileList(new TStringList());
 
@@ -556,19 +587,29 @@ void __fastcall TFileFindDialog::DeleteActionExecute(TObject * /*Sender*/)
 
   try
   {
-    FOnDeleteFiles(FTerminal, FileList.get(), FileDeleteFinished);
+    Operation(FTerminal, FileList.get(), OnFileOperationFinished);
   }
   __finally
   {
-    // can be non-empty only when not all files were deleted
+    // can be non-empty only when not all files were processed
     FFileItemMap.clear();
   }
 
   UpdateControls();
 }
 //---------------------------------------------------------------------------
+void __fastcall TFileFindDialog::DeleteActionExecute(TObject * /*Sender*/)
+{
+  FileListOperation(FOnDeleteFiles, FileDeleteFinished);
+}
+//---------------------------------------------------------------------------
 void __fastcall TFileFindDialog::SelectAllActionExecute(TObject * /*Sender*/)
 {
   FileView->SelectAll(smAll);
 }
 //---------------------------------------------------------------------------
+void __fastcall TFileFindDialog::DownloadActionExecute(TObject * /*Sender*/)
+{
+  FileListOperation(FOnDownloadFiles, FileDownloadFinished);
+}
+//---------------------------------------------------------------------------

+ 19 - 2
source/forms/FileFind.dfm

@@ -1532,15 +1532,24 @@ object FileFindDialog: TFileFindDialog
     Height = 25
     Action = CopyAction
     Anchors = [akRight, akBottom]
-    TabOrder = 6
+    TabOrder = 7
   end
   object DeleteButton: TButton
     Left = 448
-    Top = 173
+    Top = 204
     Width = 108
     Height = 25
     Action = DeleteAction
     Anchors = [akTop, akRight]
+    TabOrder = 6
+  end
+  object DownloadButton: TButton
+    Left = 448
+    Top = 173
+    Width = 108
+    Height = 25
+    Action = DownloadAction
+    Anchors = [akTop, akRight]
     TabOrder = 5
   end
   object FileViewPopupMenu: TPopupMenu
@@ -1553,6 +1562,9 @@ object FileFindDialog: TFileFindDialog
     object N1: TMenuItem
       Caption = '-'
     end
+    object Download1: TMenuItem
+      Action = DownloadAction
+    end
     object Delete1: TMenuItem
       Action = DeleteAction
     end
@@ -1593,5 +1605,10 @@ object FileFindDialog: TFileFindDialog
       ShortCut = 16451
       OnExecute = CopyActionExecute
     end
+    object DownloadAction: TAction
+      Caption = 'Down&load'
+      ShortCut = 116
+      OnExecute = DownloadActionExecute
+    end
   end
 end

+ 11 - 2
source/forms/FileFind.h

@@ -52,6 +52,9 @@ __published:
   TMenuItem *N1;
   TMenuItem *N3;
   TMenuItem *CopyResults1;
+  TButton *DownloadButton;
+  TAction *DownloadAction;
+  TMenuItem *Download1;
   void __fastcall ControlChange(TObject *Sender);
   void __fastcall StartStopButtonClick(TObject *Sender);
   void __fastcall StopButtonClick(TObject *Sender);
@@ -71,13 +74,15 @@ __published:
   void __fastcall CopyActionExecute(TObject *Sender);
   void __fastcall FocusActionExecute(TObject *Sender);
   void __fastcall SelectAllActionExecute(TObject *Sender);
+  void __fastcall DownloadActionExecute(TObject *Sender);
 
 public:
   __fastcall TFileFindDialog(TComponent * Owner);
   virtual __fastcall ~TFileFindDialog();
 
   void __fastcall Init(
-    TTerminal * Terminal, UnicodeString Directory, TFindEvent OnFind, TFocusFileEvent OnFocusFile, TDeleteFilesEvent OnDeleteFiles);
+    TTerminal * Terminal, UnicodeString Directory, TFindEvent OnFind, TFocusFileEvent OnFocusFile,
+    TFileListOperationEvent OnDeleteFiles, TFileListOperationEvent OnDownloadFiles);
 
 protected:
   void __fastcall Clear();
@@ -101,7 +106,8 @@ private:
   UnicodeString FWindowParams;
   TFindEvent FOnFind;
   TFocusFileEvent FOnFocusFile;
-  TDeleteFilesEvent FOnDeleteFiles;
+  TFileListOperationEvent FOnDeleteFiles;
+  TFileListOperationEvent FOnDownloadFiles;
   TImageList * FSystemImageList;
   TFrameAnimation FFrameAnimation;
   UnicodeString FFocusPath;
@@ -118,6 +124,9 @@ private:
   void __fastcall CMDialogKey(TWMKeyDown & Message);
   void __fastcall ClearItem(TListItem * Item);
   void __fastcall FileDeleteFinished(const UnicodeString & FileName, bool Success);
+  void __fastcall FileDownloadFinished(const UnicodeString & FileName, bool Success);
+  TListItem * __fastcall FileOperationFinished(const UnicodeString & FileName);
+  void __fastcall FileListOperation(TFileListOperationEvent Operation, TFileOperationFinishedEvent OnFileOperationFinished);
 };
 //---------------------------------------------------------------------------
 #endif

+ 3 - 2
source/windows/WinInterface.h

@@ -419,10 +419,11 @@ typedef void __fastcall (__closure *TFocusFileEvent)
   (TTerminal * Terminal, const UnicodeString & Path);
 typedef void __fastcall (__closure *TFileOperationFinishedEvent)
   (const UnicodeString & FileName, bool Success);
-typedef void __fastcall (__closure *TDeleteFilesEvent)
+typedef void __fastcall (__closure *TFileListOperationEvent)
   (TTerminal * Terminal, TStrings * FileList, TFileOperationFinishedEvent OnFileOperationFinished);
 void __fastcall ShowFileFindDialog(
-  TTerminal * Terminal, UnicodeString Directory, TFindEvent OnFind, TFocusFileEvent OnFocusFile, TDeleteFilesEvent OnDeleteFiles);
+  TTerminal * Terminal, UnicodeString Directory, TFindEvent OnFind, TFocusFileEvent OnFocusFile,
+  TFileListOperationEvent OnDeleteFiles, TFileListOperationEvent OnDownloadFiles);
 void __fastcall HideFileFindDialog();
 
 // forms\GenerateUrl.cpp