| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741 | 
							- //---------------------------------------------------------------------------
 
- #include <FormsPCH.h>
 
- #pragma hdrstop
 
- #include <Terminal.h>
 
- #include "FileFind.h"
 
- //---------------------------------------------------------------------------
 
- #pragma link "HistoryComboBox"
 
- #pragma link "IEListView"
 
- #pragma link "NortonLikeListView"
 
- #pragma resource "*.dfm"
 
- //---------------------------------------------------------------------------
 
- static TFileFindDialog * FileFindDialog = NULL;
 
- static const int NoSort = 1;
 
- //---------------------------------------------------------------------------
 
- void __fastcall ShowFileFindDialog(
 
-   TTerminal * Terminal, UnicodeString Directory, TFindEvent OnFind, TFocusFileEvent OnFocusFile,
 
-   TFileListOperationEvent OnDeleteFiles, TFileListOperationEvent OnDownloadFiles, TFileListOperationEvent OnEditFiles)
 
- {
 
-   if (FileFindDialog == NULL)
 
-   {
 
-     FileFindDialog = new TFileFindDialog(Application);
 
-   }
 
-   FileFindDialog->Init(Terminal, Directory, OnFind, OnFocusFile, OnDeleteFiles, OnDownloadFiles, OnEditFiles);
 
-   FileFindDialog->Show();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall HideFileFindDialog()
 
- {
 
-   if (FileFindDialog != NULL)
 
-   {
 
-     delete FileFindDialog;
 
-   }
 
- }
 
- //---------------------------------------------------------------------------
 
- __fastcall TFileFindDialog::TFileFindDialog(TComponent * Owner)
 
-   : TForm(Owner)
 
- {
 
-   UseSystemSettings(this);
 
-   FState = ffInit;
 
-   FixComboBoxResizeBug(MaskEdit);
 
-   FixComboBoxResizeBug(RemoteDirectoryEdit);
 
-   HintLabel(MaskHintText,
 
-     FORMAT(L"%s\n \n%s\n \n%s\n \n%s\n \n%s\n \n%s", (LoadStr(MASK_HINT2),
 
-       LoadStr(FILE_MASK_EX_HINT), LoadStr(COMBINING_MASKS_HINT),
 
-       LoadStr(PATH_MASK_HINT2), LoadStr(DIRECTORY_MASK_HINT),
 
-       LoadStr(MASK_HELP))));
 
-   UpdateImages();
 
-   UseDesktopFont(FileView2);
 
-   UseDesktopFont(StatusBar);
 
-   FFrameAnimation.Init(AnimationPaintBox, L"Find");
 
-   FixFormIcons(this);
 
- }
 
- //---------------------------------------------------------------------------
 
- __fastcall TFileFindDialog::~TFileFindDialog()
 
- {
 
-   TFindFileConfiguration FormConfiguration = CustomWinConfiguration->FindFile;
 
-   // | is there to make TCustomListViewColProperties.SetParamsStr stop there
 
-   // (and it allows adding new parameters to the col properties in the future)
 
-   FormConfiguration.ListParams = FORMAT(L"%s|/%d", (FileView2->ColProperties->ParamsStr, 1));
 
-   UnicodeString WindowParams = StoreFormSize(this);
 
-   // this is particularly to prevent saving the form state
 
-   // for the first time, keeping default positioning by a system
 
-   if (!FWindowParams.IsEmpty() && (FWindowParams != WindowParams))
 
-   {
 
-     FormConfiguration.WindowParams = WindowParams;
 
-   }
 
-   CustomWinConfiguration->FindFile = FormConfiguration;
 
-   Clear();
 
-   DebugAssert(FileFindDialog == this);
 
-   FileFindDialog = NULL;
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::UpdateImages()
 
- {
 
-   FileView2->SmallImages = ShellImageListForControl(this, ilsSmall);
 
- }
 
- //---------------------------------------------------------------------------
 
- bool __fastcall TFileFindDialog::IsFinding()
 
- {
 
-   return (FState == ffFinding) || (FState == ffAborting);
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::UpdateControls()
 
- {
 
-   bool Finding = IsFinding();
 
-   Caption = LoadStr(Finding ? FIND_FILE_FINDING : FIND_FILE_TITLE) + TitleSeparator + FTerminalName;
 
-   UnicodeString StartStopCaption;
 
-   if (Finding)
 
-   {
 
-     EnableControl(StartStopButton, true);
 
-     StartStopCaption = LoadStr(FIND_FILE_STOP);
 
-   }
 
-   else
 
-   {
 
-     EnableControl(StartStopButton, !RemoteDirectoryEdit->Text.IsEmpty());
 
-     StartStopCaption = LoadStr(FIND_FILE_START);
 
-   }
 
-   StartStopButton->Caption = StartStopCaption;
 
-   EnableControl(FilterGroup, !Finding);
 
-   FocusAction->Enabled = (FileView2->ItemFocused != NULL);
 
-   bool EnableFileOperations = !Finding && (FileView2->SelCount > 0);
 
-   DeleteAction->Enabled = EnableFileOperations;
 
-   DownloadAction->Enabled = EnableFileOperations;
 
-   EditAction->Enabled = EnableFileOperations;
 
-   CopyAction->Enabled = (FileView2->Items->Count > 0);
 
-   SelectAllAction->Enabled = (FileView2->SelCount < FileView2->Items->Count);
 
-   switch (FState)
 
-   {
 
-     case ffInit:
 
-       StatusBar->SimpleText = L"";
 
-       break;
 
-     case ffFinding:
 
-     case ffAborting:
 
-       if (!FFindingInDirectory.IsEmpty())
 
-       {
 
-         StatusBar->SimpleText = FMTLOAD(FIND_FILE_IN_DIRECTORY, (FFindingInDirectory));
 
-       }
 
-       else
 
-       {
 
-         StatusBar->SimpleText = L"";
 
-       }
 
-       break;
 
-     case ffAborted:
 
-       StatusBar->SimpleText = LoadStr(FIND_FILE_ABORTED);
 
-       break;
 
-     case ffDone:
 
-       StatusBar->SimpleText = LoadStr(FIND_FILE_DONE);
 
-       break;
 
-     default:
 
-       DebugFail();
 
-       break;
 
-   }
 
-   FocusButton->Default = FileView2->Focused() && (FState != ffInit);
 
-   StartStopButton->Default = !FocusButton->Default;
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::ControlChange(TObject * /*Sender*/)
 
- {
 
-   UpdateControls();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::Init(
 
-   TTerminal * Terminal, UnicodeString Directory, TFindEvent OnFind, TFocusFileEvent OnFocusFile,
 
-   TFileListOperationEvent OnDeleteFiles, TFileListOperationEvent OnDownloadFiles, TFileListOperationEvent OnEditFiles)
 
- {
 
-   if (FTerminal != Terminal)
 
-   {
 
-     FTerminal = Terminal;
 
-     FTerminalName = Terminal->SessionData->SessionName;
 
-     Clear();
 
-     FState = ffInit;
 
-     ActiveControl = MaskEdit;
 
-   }
 
-   FOnFind = OnFind;
 
-   FOnFocusFile = OnFocusFile;
 
-   FOnDeleteFiles = OnDeleteFiles;
 
-   FOnDownloadFiles = OnDownloadFiles;
 
-   FOnEditFiles = OnEditFiles;
 
-   MaskEdit->Text = WinConfiguration->SelectMask;
 
-   RemoteDirectoryEdit->Text = UnixExcludeTrailingBackslash(Directory);
 
-   UpdateControls();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::CreateParams(TCreateParams & Params)
 
- {
 
-   TForm::CreateParams(Params);
 
-   Params.WndParent = GetDesktopWindow();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::ClearItem(TListItem * Item)
 
- {
 
-   TRemoteFile * File = static_cast<TRemoteFile *>(Item->Data);
 
-   Item->Data = NULL;
 
-   delete File;
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::Clear()
 
- {
 
-   for (int Index = 0; Index < FileView2->Items->Count; Index++)
 
-   {
 
-     ClearItem(FileView2->Items->Item[Index]);
 
-   }
 
-   FileView2->Items->Clear();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::Start()
 
- {
 
-   if (MaskEdit->Focused())
 
-   {
 
-     MaskEditExit(NULL);
 
-   }
 
-   RemoteDirectoryEdit->SaveToHistory();
 
-   CustomWinConfiguration->History[L"RemoteDirectory"] = RemoteDirectoryEdit->Items;
 
-   MaskEdit->SaveToHistory();
 
-   WinConfiguration->History[L"Mask"] = MaskEdit->Items;
 
-   WinConfiguration->SelectMask = MaskEdit->Text;
 
-   DebugAssert(FState != ffFinding);
 
-   FState = ffFinding;
 
-   FClosePending = false;
 
-   try
 
-   {
 
-     FFrameAnimation.Start();
 
-     UpdateControls();
 
-     Repaint();
 
-     TOperationVisualizer Visualizer;
 
-     DebugAssert(FOnFind != NULL);
 
-     UnicodeString Directory = UnixExcludeTrailingBackslash(RemoteDirectoryEdit->Text);
 
-     FDirectory = Directory;
 
-     if (FDirectory == ROOTDIRECTORY)
 
-     {
 
-       FDirectory = UnicodeString();
 
-     }
 
-     FOnFind(FTerminal, Directory, MaskEdit->Text, FileFound, FindingFile);
 
-   }
 
-   __finally
 
-   {
 
-     FFindingInDirectory = L"";
 
-     if (FState == ffFinding)
 
-     {
 
-       FState = ffDone;
 
-     }
 
-     if (FState == ffAborting)
 
-     {
 
-       FState = ffAborted;
 
-     }
 
-     FFrameAnimation.Stop();
 
-     if (WindowState == wsMinimized)
 
-     {
 
-       ShowNotification(
 
-         NULL, MainInstructions(LoadStr(BALLOON_OPERATION_COMPLETE)),
 
-         qtInformation);
 
-     }
 
-     if (!FFocusPath.IsEmpty())
 
-     {
 
-       UnicodeString FocusPath = FFocusPath;
 
-       FFocusPath = L"";
 
-       DoFocusFile(FocusPath);
 
-     }
 
-     UpdateControls();
 
-   }
 
-   if (FClosePending)
 
-   {
 
-     FClosePending = false;
 
-     Close();
 
-   }
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FileFound(TTerminal * /*Terminal*/,
 
-   const UnicodeString DebugUsedArg(FileName), const TRemoteFile * AFile, bool & Cancel)
 
- {
 
-   TListItem * Item;
 
-   int Count = FileView2->Items->Count;
 
-   if ((GetColProperties()->SortColumn == NoSort) || (Count == 0))
 
-   {
 
-     Item = FileView2->Items->Add();
 
-   }
 
-   else
 
-   {
 
-     TRemoteFile * FirstFile = static_cast<TRemoteFile *>(FileView2->Items->Item[0]->Data);
 
-     TRemoteFile * LastFile = static_cast<TRemoteFile *>(FileView2->Items->Item[Count - 1]->Data);
 
-     if (FilesCompare(AFile, FirstFile) < 0)
 
-     {
 
-       Item = FileView2->Items->Insert(0);
 
-     }
 
-     else if (FilesCompare(LastFile, AFile) < 0)
 
-     {
 
-       Item = FileView2->Items->Add();
 
-     }
 
-     else
 
-     {
 
-       int Start = 0;
 
-       int End = Count;
 
-       while (Start < End - 1)
 
-       {
 
-         int Index = (Start + End) / 2;
 
-         DebugAssert((Index >= 0) && (Index < End));
 
-         TRemoteFile * FileAtIndex = static_cast<TRemoteFile *>(FileView2->Items->Item[Index]->Data);
 
-         int Compare = FilesCompare(AFile, FileAtIndex);
 
-         if (Compare <= 0)
 
-         {
 
-           End = Index;
 
-         }
 
-         else
 
-         {
 
-           Start = Index;
 
-         }
 
-       }
 
-       Item = FileView2->Items->Insert(Start + 1);
 
-     }
 
-   }
 
-   TRemoteFile * File = AFile->Duplicate(true);
 
-   Item->Data = File;
 
-   Item->ImageIndex = File->IconIndex;
 
-   UnicodeString Caption = File->FileName;
 
-   if (File->IsDirectory)
 
-   {
 
-     Caption = UnixIncludeTrailingBackslash(Caption);
 
-   }
 
-   Item->Caption = Caption;
 
-   UnicodeString Directory = UnixExtractFilePath(File->FullFileName);
 
-   if (AnsiSameText(FDirectory, Directory.SubString(1, FDirectory.Length())))
 
-   {
 
-     Directory = L"." + Directory.SubString(FDirectory.Length() + 1, Directory.Length() - FDirectory.Length());
 
-   }
 
-   else
 
-   {
 
-     DebugFail();
 
-   }
 
-   Item->SubItems->Add(Directory);
 
-   if (File->IsDirectory)
 
-   {
 
-     Item->SubItems->Add(L"");
 
-   }
 
-   else
 
-   {
 
-     Item->SubItems->Add(
 
-       FormatPanelBytes(File->Size, WinConfiguration->FormatSizeBytes));
 
-   }
 
-   Item->SubItems->Add(UserModificationStr(File->Modification, File->ModificationFmt));
 
-   UpdateControls();
 
-   Cancel = (FState == ffAborting);
 
-   Application->ProcessMessages();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FindingFile(TTerminal * /*Terminal*/,
 
-   const UnicodeString Directory, bool & Cancel)
 
- {
 
-   if (!Directory.IsEmpty() && (FFindingInDirectory != Directory))
 
-   {
 
-     FFindingInDirectory = Directory;
 
-     UpdateControls();
 
-   }
 
-   Cancel = (FState == ffAborting);
 
-   Application->ProcessMessages();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::StartStopButtonClick(TObject * /*Sender*/)
 
- {
 
-   if (IsFinding())
 
-   {
 
-     Stop();
 
-   }
 
-   else
 
-   {
 
-     Clear();
 
-     if (ActiveControl->Parent == FilterGroup)
 
-     {
 
-       FileView2->SetFocus();
 
-     }
 
-     Start();
 
-   }
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::StopButtonClick(TObject * /*Sender*/)
 
- {
 
-   Stop();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::Stop()
 
- {
 
-   FState = ffAborting;
 
-   UpdateControls();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FormShow(TObject * /*Sender*/)
 
- {
 
-   InstallPathWordBreakProc(MaskEdit);
 
-   InstallPathWordBreakProc(RemoteDirectoryEdit);
 
-   // have to set history after value, to prevent autocompletition
 
-   MaskEdit->Items = WinConfiguration->History[L"Mask"];
 
-   RemoteDirectoryEdit->Items = CustomWinConfiguration->History[L"RemoteDirectory"];
 
-   UpdateFormPosition(this, poOwnerFormCenter);
 
-   RestoreFormSize(CustomWinConfiguration->FindFile.WindowParams, this);
 
-   UnicodeString S = CustomWinConfiguration->FindFile.ListParams;
 
-   UnicodeString ParamsStr = CutToChar(S, L'/', true);
 
-   FileView2->ColProperties->ParamsStr = ParamsStr;
 
-   UnicodeString V = CutToChar(S, L'/', true);
 
-   if (StrToIntDef(V, 0) == 0)
 
-   {
 
-     // Old versions had non-sense (while unused) default to sorting by "Changed", ignore it.
 
-     GetColProperties()->SortColumn = NoSort;
 
-   }
 
-   DebugAssert(FWindowParams.IsEmpty());
 
-   if (FWindowParams.IsEmpty())
 
-   {
 
-     FWindowParams = StoreFormSize(this);
 
-   }
 
-   UpdateControls();
 
- }
 
- //---------------------------------------------------------------------------
 
- bool __fastcall TFileFindDialog::StopIfFinding()
 
- {
 
-   bool Result = IsFinding();
 
-   if (Result)
 
-   {
 
-     Stop();
 
-   }
 
-   return Result;
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FormCloseQuery(TObject * /*Sender*/,
 
-   bool & CanClose)
 
- {
 
-   if (StopIfFinding())
 
-   {
 
-     FClosePending = true;
 
-     CanClose = false;
 
-   }
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::HelpButtonClick(TObject * /*Sender*/)
 
- {
 
-   FormHelp(this);
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::Dispatch(void * Message)
 
- {
 
-   TMessage * M = reinterpret_cast<TMessage*>(Message);
 
-   if (M->Msg == CM_DIALOGKEY)
 
-   {
 
-     CMDialogKey(*((TWMKeyDown *)Message));
 
-   }
 
-   else
 
-   {
 
-     TForm::Dispatch(Message);
 
-   }
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FormAfterMonitorDpiChanged(TObject *, int OldDPI, int NewDPI)
 
- {
 
-   DebugUsedParam2(OldDPI, NewDPI);
 
-   UpdateImages();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::CMDialogKey(TWMKeyDown & Message)
 
- {
 
-   // Handling VK_ESCAPE in FormKeyDown causes a beep when any "edit" has focus.
 
-   // Moreover FormKeyDown is called when the the "esc" is pressed while drop down list is unrolled.
 
-   if (Message.CharCode == VK_ESCAPE)
 
-   {
 
-     if (!StopIfFinding())
 
-     {
 
-       Close();
 
-     }
 
-     Message.Result = 1;
 
-     return;
 
-   }
 
-   TForm::Dispatch(&Message);
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FormKeyDown(TObject * /*Sender*/, WORD & Key,
 
-   TShiftState Shift)
 
- {
 
-   if ((Key == L'C') && Shift.Contains(ssCtrl) &&
 
-       (dynamic_cast<TCustomCombo *>(ActiveControl) == NULL))
 
-   {
 
-     CopyToClipboard();
 
-     Key = 0;
 
-   }
 
-   else if ((Key == VK_F10) && Shift.Empty())
 
-   {
 
-     Key = 0;
 
-     StopIfFinding();
 
-     Close();
 
-   }
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::MaskEditExit(TObject * /*Sender*/)
 
- {
 
-   ValidateMaskEdit(MaskEdit);
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::DoFocusFile(const UnicodeString & Path)
 
- {
 
-   FOnFocusFile(FTerminal, Path);
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FocusFile()
 
- {
 
-   UnicodeString Path = static_cast<TRemoteFile *>(FileView2->ItemFocused->Data)->FullFileName;
 
-   // To make focussing directories work,
 
-   // otherwise it would try to focus "empty-named file" in the Path
 
-   Path = UnixExcludeTrailingBackslash(Path);
 
-   if (StopIfFinding())
 
-   {
 
-     FFocusPath = Path;
 
-   }
 
-   else
 
-   {
 
-     DoFocusFile(Path);
 
-   }
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FileView2DblClick(TObject * /*Sender*/)
 
- {
 
-   if (FileView2->ItemFocused != NULL)
 
-   {
 
-     FocusFile();
 
-   }
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FocusActionExecute(TObject * /*Sender*/)
 
- {
 
-   FocusFile();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FileView2SelectItem(TObject * /*Sender*/,
 
-   TListItem * /*Item*/, bool /*Selected*/)
 
- {
 
-   UpdateControls();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::MaskButtonClick(TObject * /*Sender*/)
 
- {
 
-   TFileMasks Masks = MaskEdit->Text;
 
-   if (DoEditMaskDialog(Masks))
 
-   {
 
-     MaskEdit->Text = Masks.Masks;
 
-   }
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::CopyToClipboard()
 
- {
 
-   TInstantOperationVisualizer Visualizer;
 
-   std::unique_ptr<TStrings> Strings(new TStringList());
 
-   for (int Index = 0; Index < FileView2->Items->Count; Index++)
 
-   {
 
-     TListItem * Item = FileView2->Items->Item[Index];
 
-     TRemoteFile * File = static_cast<TRemoteFile *>(Item->Data);
 
-     Strings->Add(File->FullFileName);
 
-   }
 
-   ::CopyToClipboard(Strings.get());
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::CopyActionExecute(TObject * /*Sender*/)
 
- {
 
-   CopyToClipboard();
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FormClose(TObject * /*Sender*/, TCloseAction & Action)
 
- {
 
-   StopIfFinding();
 
-   Action = caFree;
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FileView2ContextPopup(TObject * Sender, TPoint & MousePos, bool & Handled)
 
- {
 
-   // to update source popup menu before TBX menu is created
 
-   UpdateControls();
 
-   MenuPopup(Sender, MousePos, Handled);
 
- }
 
- //---------------------------------------------------------------------------
 
- TListItem * __fastcall TFileFindDialog::FileOperationFinished(const UnicodeString & FileName)
 
- {
 
-   TFileItemMap::iterator I = FFileItemMap.find(FileName);
 
-   TListItem * Result = NULL;
 
-   if (DebugAlwaysTrue(I != FFileItemMap.end()))
 
-   {
 
-     Result = I->second;
 
-     FileView2->MakeProgressVisible(Result);
 
-     FFileItemMap.erase(I);
 
-   }
 
-   return Result;
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FileDeleteFinished(
 
-   TOperationSide, const UnicodeString & FileName, bool Success, bool NotCancelled)
 
- {
 
-   DebugUsedParam(NotCancelled);
 
-   if (FileName.IsEmpty())
 
-   {
 
-     DebugAssert(Success && NotCancelled);
 
-     FileView2->SelectAll(smNone);
 
-   }
 
-   else
 
-   {
 
-     TListItem * Item = FileOperationFinished(FileName);
 
-     if (DebugAlwaysTrue(Item != NULL) && Success)
 
-     {
 
-       ClearItem(Item);
 
-       Item->Delete();
 
-     }
 
-   }
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FileDownloadFinished(
 
-   TOperationSide, const UnicodeString & FileName, bool Success, bool NotCancelled)
 
- {
 
-   if (FileName.IsEmpty())
 
-   {
 
-     DebugAssert(Success && NotCancelled);
 
-     // Moved to queue, see call in TCustomScpExplorerForm::CopyParamDialog
 
-     FileView2->SelectAll(smNone);
 
-   }
 
-   else
 
-   {
 
-     TListItem * Item = FileOperationFinished(FileName);
 
-     if (DebugAlwaysTrue(Item != NULL) && Success && NotCancelled)
 
-     {
 
-       Item->Selected = false;
 
-     }
 
-   }
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FileListOperation(
 
-   TFileListOperationEvent Operation, TFileOperationFinishedEvent OnFileOperationFinished)
 
- {
 
-   std::unique_ptr<TStrings> FileList(new TStringList());
 
-   DebugAssert(FFileItemMap.empty());
 
-   TListItem * Item = FileView2->Selected;
 
-   while (Item != NULL)
 
-   {
 
-     TRemoteFile * File = static_cast<TRemoteFile *>(Item->Data);
 
-     FileList->AddObject(File->FullFileName, File);
 
-     FFileItemMap.insert(std::make_pair(File->FullFileName, Item));
 
-     Item = FileView2->GetNextItem(Item, sdAll, TItemStates() << isSelected);
 
-   }
 
-   try
 
-   {
 
-     Operation(FTerminal, FileList.get(), OnFileOperationFinished);
 
-   }
 
-   __finally
 
-   {
 
-     // 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*/)
 
- {
 
-   FileView2->SelectAll(smAll);
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::DownloadActionExecute(TObject * /*Sender*/)
 
- {
 
-   FileListOperation(FOnDownloadFiles, FileDownloadFinished);
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::EditActionExecute(TObject * /*Sender*/)
 
- {
 
-   FileListOperation(FOnEditFiles, FileDownloadFinished);
 
- }
 
- //---------------------------------------------------------------------------
 
- TIEListViewColProperties * TFileFindDialog::GetColProperties()
 
- {
 
-   return dynamic_cast<TIEListViewColProperties *>(FileView2->ColProperties);
 
- }
 
- //---------------------------------------------------------------------------
 
- int TFileFindDialog::FilesCompare(const TRemoteFile * File1, const TRemoteFile * File2)
 
- {
 
-   int Result = 0;
 
-   switch (GetColProperties()->SortColumn)
 
-   {
 
-     case 0: // name
 
-       Result = CompareText(File1->FileName, File2->FileName);
 
-       break;
 
-     case NoSort: // directories
 
-       Result = 0; // default sort
 
-       break;
 
-     case 2: // size
 
-       Result = CompareNumber(File1->Size, File2->Size);
 
-       break;
 
-     case 3: // changed
 
-       Result = CompareFileTime(File1->Modification, File2->Modification);
 
-       break;
 
-   }
 
-   if (Result == 0)
 
-   {
 
-     Result = CompareText(UnixExtractFilePath(File1->FullFileName), UnixExtractFilePath(File2->FullFileName));
 
-     if (Result == 0)
 
-     {
 
-       Result = CompareText(File1->FileName, File2->FileName);
 
-     }
 
-   }
 
-   if (!GetColProperties()->SortAscending)
 
-   {
 
-     Result = -Result;
 
-   }
 
-   return Result;
 
- }
 
- //---------------------------------------------------------------------------
 
- void __fastcall TFileFindDialog::FileView2Compare(TObject *, TListItem * Item1, TListItem * Item2, int DebugUsedArg(Data), int & Compare)
 
- {
 
-   TRemoteFile * File1 = static_cast<TRemoteFile *>(Item1->Data);
 
-   TRemoteFile * File2 = static_cast<TRemoteFile *>(Item2->Data);
 
-   Compare = FilesCompare(File1, File2);
 
- }
 
- //---------------------------------------------------------------------------
 
 
  |