UnixDirView.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <Common.h>
  5. #include "UnixDirView.h"
  6. #include "UnixDriveView.h"
  7. #include <FileCtrl.hpp>
  8. #ifndef DESIGN_ONLY
  9. #include <CoreMain.h>
  10. #include <Terminal.h>
  11. #include <WinConfiguration.h>
  12. #endif
  13. #pragma package(smart_init)
  14. #ifndef DESIGN_ONLY
  15. #define ITEMFILE ((TRemoteFile *)(Item->Data))
  16. #define ASSERT_VALID_ITEM assert(Item && Item->Data && Terminal); assert(Terminal->Files->IndexOf(ITEMFILE) >= 0)
  17. #endif
  18. //---------------------------------------------------------------------------
  19. static inline void ValidCtrCheck(TUnixDirView *)
  20. {
  21. new TUnixDirView(NULL);
  22. }
  23. //---------------------------------------------------------------------------
  24. namespace Unixdirview
  25. {
  26. void __fastcall PACKAGE Register()
  27. {
  28. TComponentClass classes[1] = {__classid(TUnixDirView)};
  29. RegisterComponents("Scp", classes, 0);
  30. }
  31. }
  32. //---------------------------------------------------------------------------
  33. #ifndef DESIGN_ONLY
  34. #define RFILE(N) ((TRemoteFile *)(Item ## N->Data))
  35. int __stdcall CompareDirectories(TListItem *Item1, TListItem *Item2, TUnixDirView *DirView)
  36. {
  37. // Because CompareDirectories is called from each other compare functions
  38. // it's sufficient to check pointers only here (see below)
  39. assert(DirView && Item1 && RFILE(1) && Item2 && RFILE(2));
  40. if (RFILE(1)->IsParentDirectory && !RFILE(2)->IsParentDirectory) return -1;
  41. else
  42. if (!RFILE(1)->IsParentDirectory && RFILE(2)->IsParentDirectory) return 1;
  43. else
  44. if (DirView->DirsOnTop &&
  45. RFILE(1)->IsDirectory && !RFILE(2)->IsDirectory) return -1;
  46. else
  47. if (DirView->DirsOnTop &&
  48. !RFILE(1)->IsDirectory && RFILE(2)->IsDirectory) return 1;
  49. else
  50. return 0;
  51. }
  52. //---------------------------------------------------------------------------
  53. #define DEFINE_COMPARE_FUNC_EX(PROPERTY, NAME, COMPAREFUNC, FALLBACK) \
  54. int __stdcall Compare ## NAME(TListItem *Item1, TListItem *Item2, TUnixDirView *DirView) \
  55. { \
  56. int Result = CompareDirectories(Item1, Item2, DirView); \
  57. if (!Result) \
  58. { \
  59. Result = COMPAREFUNC(RFILE(1)->PROPERTY, RFILE(2)->PROPERTY); \
  60. if (Result == 0) \
  61. { \
  62. Result = FALLBACK(RFILE(1)->FileName, RFILE(2)->FileName); \
  63. } \
  64. if (!DirView->UnixColProperties->SortAscending) Result = -Result; \
  65. } \
  66. return Result; \
  67. }
  68. #define DEFINE_COMPARE_FUNC(PROPERTY, COMPAREFUNC) \
  69. DEFINE_COMPARE_FUNC_EX(PROPERTY, PROPERTY, COMPAREFUNC, AnsiCompareText)
  70. #define COMPARE_NUMBER(Num1, Num2) ( Num1 < Num2 ? -1 : ( Num1 > Num2 ? 1 : 0) )
  71. #define COMPARE_DUMMY(X1, X2) 0
  72. //---------------------------------------------------------------------------
  73. DEFINE_COMPARE_FUNC_EX(FileName, ItemFileName, AnsiCompareText, COMPARE_DUMMY);
  74. DEFINE_COMPARE_FUNC(Size, COMPARE_NUMBER);
  75. DEFINE_COMPARE_FUNC(Modification, COMPARE_NUMBER);
  76. DEFINE_COMPARE_FUNC(RightsStr, AnsiCompareText);
  77. DEFINE_COMPARE_FUNC(Owner, AnsiCompareText);
  78. DEFINE_COMPARE_FUNC(Group, AnsiCompareText);
  79. DEFINE_COMPARE_FUNC(Extension, AnsiCompareText);
  80. DEFINE_COMPARE_FUNC(LinkTo, AnsiCompareText);
  81. DEFINE_COMPARE_FUNC(TypeName, AnsiCompareText);
  82. //---------------------------------------------------------------------------
  83. #undef DEFINE_COMPARE_FUNC
  84. #undef COMPARE_NUMBER
  85. #undef RFILE
  86. #endif
  87. //---------------------------------------------------------------------------
  88. #define HOMEDIRECTORY ""
  89. //---------------------------------------------------------------------------
  90. __fastcall TUnixDirView::TUnixDirView(TComponent* Owner)
  91. : TCustomUnixDirView(Owner)
  92. {
  93. #ifndef DESIGN_ONLY
  94. FTerminal = NULL;
  95. #endif
  96. FCaseSensitive = true;
  97. DDAllowMove = false;
  98. FShowInaccesibleDirectories = true;
  99. FFullLoad = false;
  100. FDriveView = NULL;
  101. FInvalidNameChars = "/";
  102. }
  103. //---------------------------------------------------------------------------
  104. __fastcall TUnixDirView::~TUnixDirView()
  105. {
  106. #ifndef DESIGN_ONLY
  107. Terminal = NULL;
  108. #endif
  109. }
  110. //---------------------------------------------------------------------------
  111. void __fastcall TUnixDirView::DisplayContextMenu(const TPoint &Where)
  112. {
  113. bool Handled = false;
  114. if (OnContextPopup) OnContextPopup(this, ScreenToClient(Where), Handled);
  115. if (!Handled)
  116. {
  117. if (PopupMenu && !PopupMenu->AutoPopup)
  118. PopupMenu->Popup(Where.x, Where.y);
  119. }
  120. }
  121. //---------------------------------------------------------------------------
  122. void __fastcall TUnixDirView::DisplayPropertiesMenu()
  123. {
  124. if (OnDisplayProperties) OnDisplayProperties(this);
  125. }
  126. //---------------------------------------------------------------------------
  127. void __fastcall TUnixDirView::ExecuteFile(TListItem * Item)
  128. {
  129. #ifndef DESIGN_ONLY
  130. ASSERT_VALID_ITEM;
  131. if (ITEMFILE->IsDirectory ||
  132. !Terminal->ResolvingSymlinks)
  133. {
  134. PathChanging(true);
  135. ChangeDirectory(ITEMFILE->FileName);
  136. }
  137. else
  138. {
  139. if (ItemFocused != Item) ItemFocused = Item;
  140. DisplayPropertiesMenu();
  141. }
  142. #endif
  143. }
  144. //---------------------------------------------------------------------------
  145. void __fastcall TUnixDirView::ExecuteParentDirectory()
  146. {
  147. PathChanging(true);
  148. #ifndef DESIGN_ONLY
  149. ChangeDirectory(PARENTDIRECTORY);
  150. #endif
  151. }
  152. //---------------------------------------------------------------------------
  153. void __fastcall TUnixDirView::ExecuteHomeDirectory()
  154. {
  155. #ifndef DESIGN_ONLY
  156. // don't select any directory
  157. PathChanging(false);
  158. AnsiString APath = Terminal->SessionData->RemoteDirectory;
  159. if (WinConfiguration->DefaultDirIsHome && !APath.IsEmpty() &&
  160. !Terminal->SessionData->UpdateDirectories)
  161. {
  162. if (APath[1] != '/')
  163. {
  164. Terminal->BeginTransaction();
  165. try
  166. {
  167. ChangeDirectory(HOMEDIRECTORY);
  168. ChangeDirectory(APath);
  169. }
  170. __finally
  171. {
  172. Terminal->EndTransaction();
  173. }
  174. }
  175. else
  176. {
  177. ChangeDirectory(APath);
  178. }
  179. }
  180. else
  181. {
  182. ChangeDirectory(HOMEDIRECTORY);
  183. }
  184. #endif
  185. }
  186. //---------------------------------------------------------------------------
  187. void __fastcall TUnixDirView::ReloadDirectory()
  188. {
  189. #ifndef DESIGN_ONLY
  190. FLastPath = "";
  191. DoAnimation(true);
  192. Terminal->ReloadDirectory();
  193. #endif
  194. }
  195. //---------------------------------------------------------------------------
  196. void __fastcall TUnixDirView::ExecuteRootDirectory()
  197. {
  198. #ifndef DESIGN_ONLY
  199. // We set LastPath to top directory, so it will be selected
  200. // after entering root directory
  201. // DISABLED: see PathChanged(): back moves to top directory, not to current
  202. PathChanging(false);
  203. ChangeDirectory(ROOTDIRECTORY);
  204. #endif
  205. }
  206. //---------------------------------------------------------------------------
  207. bool __fastcall TUnixDirView::ItemIsDirectory(TListItem * Item)
  208. {
  209. #ifndef DESIGN_ONLY
  210. ASSERT_VALID_ITEM;
  211. return ITEMFILE->IsDirectory;
  212. #else
  213. return false;
  214. #endif
  215. }
  216. //---------------------------------------------------------------------------
  217. bool __fastcall TUnixDirView::ItemIsFile(TListItem * Item)
  218. {
  219. #ifndef DESIGN_ONLY
  220. ASSERT_VALID_ITEM;
  221. return !(ITEMFILE->IsParentDirectory);
  222. #else
  223. return false;
  224. #endif
  225. }
  226. //---------------------------------------------------------------------------
  227. bool __fastcall TUnixDirView::ItemIsParentDirectory(TListItem * Item)
  228. {
  229. #ifndef DESIGN_ONLY
  230. ASSERT_VALID_ITEM;
  231. return ITEMFILE->IsParentDirectory;
  232. #else
  233. return false;
  234. #endif
  235. }
  236. //---------------------------------------------------------------------------
  237. AnsiString __fastcall TUnixDirView::ItemFileName(TListItem * Item)
  238. {
  239. #ifndef DESIGN_ONLY
  240. ASSERT_VALID_ITEM;
  241. return ITEMFILE->FileName;
  242. #else
  243. return AnsiString();
  244. #endif
  245. }
  246. //---------------------------------------------------------------------------
  247. __int64 __fastcall TUnixDirView::ItemFileSize(TListItem * Item)
  248. {
  249. #ifndef DESIGN_ONLY
  250. ASSERT_VALID_ITEM;
  251. return ITEMFILE->IsDirectory ? 0 : ITEMFILE->Size;
  252. #else
  253. return 0;
  254. #endif
  255. }
  256. //---------------------------------------------------------------------------
  257. AnsiString __fastcall TUnixDirView::ItemFullFileName(TListItem * Item)
  258. {
  259. #ifndef DESIGN_ONLY
  260. ASSERT_VALID_ITEM;
  261. return ITEMFILE->FullFileName;
  262. #else
  263. return AnsiString();
  264. #endif
  265. }
  266. //---------------------------------------------------------------------------
  267. int __fastcall TUnixDirView::ItemImageIndex(TListItem * Item, bool /*Cache*/)
  268. {
  269. #ifndef DESIGN_ONLY
  270. ASSERT_VALID_ITEM;
  271. // TCustomDirView::ItemImageIndex is used for icon caching
  272. // so we don't need it here. But it's implemented anyway.
  273. return ITEMFILE->IconIndex;
  274. #else
  275. return 0;
  276. #endif
  277. }
  278. //---------------------------------------------------------------------------
  279. bool __fastcall TUnixDirView::ItemMatchesFilter(TListItem * Item,
  280. const TFileFilter &Filter)
  281. {
  282. #ifndef DESIGN_ONLY
  283. ASSERT_VALID_ITEM;
  284. TRemoteFile *File = ITEMFILE;
  285. int Attr = File->Attr;
  286. return
  287. ((Attr & Filter.IncludeAttr) == Filter.IncludeAttr) &&
  288. ((Attr & Filter.ExcludeAttr) == 0) &&
  289. ((!File->IsDirectory) || Filter.Directories) &&
  290. ((Filter.FileSizeFrom == 0) || (File->Size >= Filter.FileSizeFrom)) &&
  291. ((Filter.FileSizeTo == 0) || (File->Size <= Filter.FileSizeTo)) &&
  292. ((!(int)Filter.ModificationFrom) || (File->Modification >= Filter.ModificationFrom)) &&
  293. ((!(int)Filter.ModificationTo) || (File->Modification <= Filter.ModificationTo)) &&
  294. ((Filter.Masks.IsEmpty()) ||
  295. FileNameMatchesMasks(File->FileName, File->IsDirectory, File->Size, Filter.Masks));
  296. #else
  297. return false;
  298. #endif
  299. }
  300. //---------------------------------------------------------------------------
  301. Word __fastcall TUnixDirView::ItemOverlayIndexes(TListItem * Item)
  302. {
  303. #ifndef DESIGN_ONLY
  304. ASSERT_VALID_ITEM;
  305. Word Result = TCustomDirView::ItemOverlayIndexes(Item);
  306. if (ITEMFILE->IsParentDirectory)
  307. {
  308. Result |= oiDirUp;
  309. }
  310. if (ITEMFILE->IsSymLink)
  311. {
  312. Result |= ITEMFILE->BrokenLink ? oiBrokenLink : oiLink;
  313. }
  314. return Result;
  315. #else
  316. return 0;
  317. #endif
  318. }
  319. //---------------------------------------------------------------------------
  320. void __fastcall TUnixDirView::LoadFiles()
  321. {
  322. #ifndef DESIGN_ONLY
  323. assert(Terminal);
  324. if (DirOK)
  325. {
  326. // it's enough if we reach this point, we don't require that loading files into
  327. // list succeeded. FDirLoadedAfterChangeDir == false tells only that
  328. // loding file list from server failed, not loading into listview
  329. FDirLoadedAfterChangeDir = true;
  330. FFilesSize = 0;
  331. FHasParentDir = false;
  332. int VisibleFiles = 0;
  333. for (int Index = 0; Index < Terminal->Files->Count; Index++)
  334. {
  335. TRemoteFile *File = Terminal->Files->Files[Index];
  336. assert(File);
  337. TListItem *Item;
  338. if ((ShowHiddenFiles || !File->IsHidden) &&
  339. (ShowInaccesibleDirectories || !File->IsInaccesibleDirectory))
  340. {
  341. VisibleFiles++;
  342. if (!File->IsDirectory) FFilesSize += File->Size;
  343. if (File->IsParentDirectory) FHasParentDir = true;
  344. Item = Items->Add();
  345. Item->Data = File;
  346. Item->Caption = File->FileName;
  347. if (FFullLoad)
  348. {
  349. // this is out of date
  350. // (missing columns and does not update then file properties are loaded)
  351. Item->ImageIndex = File->IconIndex;
  352. Item->SubItems->Add((!File->IsDirectory ? FormatFloat("#,##0", File->Size) : AnsiString()));
  353. Item->SubItems->Add(File->UserModificationStr);
  354. Item->SubItems->Add(File->RightsStr);
  355. Item->SubItems->Add(File->Owner);
  356. Item->SubItems->Add(File->Group);
  357. Item->SubItems->Add(File->Extension);
  358. }
  359. }
  360. }
  361. if (OwnerData)
  362. {
  363. Items->Count = VisibleFiles;
  364. }
  365. }
  366. #endif
  367. }
  368. //---------------------------------------------------------------------------
  369. void __fastcall TUnixDirView::GetDisplayInfo(TListItem * Item, tagLVITEMA &DispInfo)
  370. {
  371. if (!FFullLoad)
  372. {
  373. #ifndef DESIGN_ONLY
  374. TRemoteFile * File = ITEMFILE;
  375. if (DispInfo.mask & LVIF_TEXT)
  376. {
  377. AnsiString Value;
  378. switch (DispInfo.iSubItem) {
  379. case uvName: Value = File->FileName; break;
  380. case uvSize:
  381. // expanded from ?: to avoid memory leaks
  382. if (!File->IsDirectory)
  383. {
  384. Value = FormatFloat("#,##0", File->Size);
  385. }
  386. break;
  387. case uvChanged: Value = File->UserModificationStr; break;
  388. case uvRights: Value = File->RightsStr; break;
  389. case uvOwner: Value = File->Owner; break;
  390. case uvGroup: Value = File->Group; break;
  391. case uvExt: Value = File->Extension; break;
  392. case uvLinkTarget: Value = File->LinkTo; break;
  393. case uvType: Value = File->TypeName; break;
  394. default: assert(false);
  395. }
  396. StrPLCopy(DispInfo.pszText, Value, DispInfo.cchTextMax);
  397. }
  398. if (DispInfo.iSubItem == 0 && DispInfo.mask & LVIF_IMAGE)
  399. {
  400. DispInfo.iImage = File->IconIndex;
  401. DispInfo.mask |= LVIF_DI_SETITEM;
  402. }
  403. #endif
  404. }
  405. }
  406. //---------------------------------------------------------------------------
  407. bool __fastcall TUnixDirView::PasteFromClipBoard(AnsiString TargetPath)
  408. {
  409. DragDropFilesEx->FileList->Clear();
  410. bool Result = false;
  411. if (CanPasteFromClipBoard() &&
  412. DragDropFilesEx->GetFromClipboard())
  413. {
  414. if (TargetPath.IsEmpty())
  415. {
  416. TargetPath = PathName;
  417. }
  418. PerformItemDragDropOperation(NULL, DROPEFFECT_COPY);
  419. if (OnDDExecuted != NULL)
  420. {
  421. OnDDExecuted(this, DROPEFFECT_COPY);
  422. }
  423. Result = true;
  424. }
  425. return Result;
  426. }
  427. //---------------------------------------------------------------------------
  428. void __fastcall TUnixDirView::PerformItemDragDropOperation(TListItem * Item,
  429. int Effect)
  430. {
  431. #ifndef DESIGN_ONLY
  432. if (OnDDFileOperation)
  433. {
  434. assert(DragDropFilesEx->FileList->Count > 0);
  435. AnsiString SourceDirectory;
  436. AnsiString TargetDirectory;
  437. SourceDirectory = ExtractFilePath(DragDropFilesEx->FileList->Items[0]->Name);
  438. if (Item)
  439. {
  440. assert(ITEMFILE->IsDirectory && (Terminal->Files->IndexOf(ITEMFILE) >= 0));
  441. TargetDirectory = ITEMFILE->FullFileName;
  442. }
  443. else
  444. {
  445. TargetDirectory = Path;
  446. }
  447. bool DoFileOperation = true;
  448. OnDDFileOperation(this, Effect, SourceDirectory, TargetDirectory,
  449. DoFileOperation);
  450. }
  451. #endif
  452. }
  453. //---------------------------------------------------------------------------
  454. void __fastcall TUnixDirView::SetItemImageIndex(TListItem * /* Item */, int /* Index */)
  455. {
  456. // TCustomDirView::SetItemImageIndex is used for icon caching
  457. // so we don't need it here.
  458. }
  459. //---------------------------------------------------------------------------
  460. void __fastcall TUnixDirView::DDMenuDone(TObject* /* Sender */, HMENU /* AMenu */)
  461. {
  462. // TODO: Why I need to duplicate this method? (see TCustomDirView::DDMenuDone)
  463. }
  464. //---------------------------------------------------------------------------
  465. void __fastcall TUnixDirView::SetDriveView(TCustomUnixDriveView * Value)
  466. {
  467. if (Value != FDriveView)
  468. {
  469. if (FDriveView != NULL)
  470. {
  471. FDriveView->Terminal = NULL;
  472. }
  473. FDriveView = Value;
  474. if (FDriveView != NULL)
  475. {
  476. FDriveView->Terminal = Terminal;
  477. }
  478. }
  479. }
  480. //---------------------------------------------------------------------------
  481. #ifndef DESIGN_ONLY
  482. void __fastcall TUnixDirView::SetTerminal(TTerminal *value)
  483. {
  484. if (FTerminal != value)
  485. {
  486. if (FTerminal)
  487. {
  488. assert(FTerminal->OnReadDirectory == DoReadDirectory);
  489. FTerminal->OnReadDirectory = NULL;
  490. assert(FTerminal->OnStartReadDirectory == DoStartReadDirectory);
  491. FTerminal->OnStartReadDirectory = NULL;
  492. assert(FTerminal->OnChangeDirectory == DoChangeDirectory);
  493. FTerminal->OnChangeDirectory = NULL;
  494. if (!value || !value->Files->Loaded)
  495. {
  496. ClearItems();
  497. }
  498. }
  499. FTerminal = value;
  500. PathChanging(false);
  501. if (FDriveView != NULL)
  502. {
  503. FDriveView->Terminal = FTerminal;
  504. }
  505. if (FTerminal)
  506. {
  507. FTerminal->OnReadDirectory = DoReadDirectory;
  508. FTerminal->OnStartReadDirectory = DoStartReadDirectory;
  509. FTerminal->OnChangeDirectory = DoChangeDirectory;
  510. FTerminal->Files->IncludeParentDirectory = AddParentDir;
  511. if (FTerminal->Files->Loaded)
  512. {
  513. DoChangeDirectory(FTerminal);
  514. DoStartReadDirectory(FTerminal); // just for style and the assertions
  515. DoReadDirectory(FTerminal, false);
  516. }
  517. }
  518. }
  519. }
  520. #endif
  521. //---------------------------------------------------------------------------
  522. void __fastcall TUnixDirView::DoStartReadDirectory(TObject * /*Sender*/)
  523. {
  524. assert(!FLoading);
  525. FLoading = true;
  526. }
  527. //---------------------------------------------------------------------------
  528. void __fastcall TUnixDirView::DoReadDirectory(TObject * /*Sender*/, bool ReloadOnly)
  529. {
  530. assert(FLoading);
  531. FLoading = false;
  532. #ifndef DESIGN_ONLY
  533. if (Terminal->Active)
  534. {
  535. if (ReloadOnly)
  536. {
  537. Reload(false);
  538. }
  539. else
  540. {
  541. Load();
  542. PathChanged();
  543. }
  544. if ((FDriveView != NULL) && FDriveView->Visible)
  545. {
  546. FDriveView->LoadDirectory();
  547. }
  548. }
  549. else
  550. {
  551. // Make sure file list is cleared, to remove all references to invalid
  552. // file objects. LoadFiles check for disconnected terminal, so no reloading
  553. // actually occures.
  554. Load();
  555. }
  556. #endif
  557. }
  558. //---------------------------------------------------------------------------
  559. void __fastcall TUnixDirView::DoChangeDirectory(TObject * /*Sender*/)
  560. {
  561. #ifndef DESIGN_ONLY
  562. // Reload(false);
  563. #endif
  564. }
  565. //---------------------------------------------------------------------------
  566. bool __fastcall TUnixDirView::GetDirOK()
  567. {
  568. #ifndef DESIGN_ONLY
  569. return (Active && Terminal->Files->Loaded);
  570. #else
  571. return false;
  572. #endif
  573. }
  574. //---------------------------------------------------------------------------
  575. AnsiString __fastcall TUnixDirView::GetPathName()
  576. {
  577. #ifndef DESIGN_ONLY
  578. if (DirOK) return Terminal->CurrentDirectory;
  579. else
  580. #endif
  581. return "";
  582. }
  583. //---------------------------------------------------------------------------
  584. AnsiString __fastcall TUnixDirView::GetPath()
  585. {
  586. #ifndef DESIGN_ONLY
  587. if (DirOK) return UnixIncludeTrailingBackslash(Terminal->CurrentDirectory);
  588. else
  589. #endif
  590. return "";
  591. }
  592. //---------------------------------------------------------------------------
  593. void __fastcall TUnixDirView::SetPath(AnsiString Value)
  594. {
  595. #ifndef DESIGN_ONLY
  596. Value = UnixExcludeTrailingBackslash(
  597. StringReplace(Value, '\\', '/', TReplaceFlags() << rfReplaceAll));
  598. if (Active && (Terminal->CurrentDirectory != Value))
  599. {
  600. PathChanging(true);
  601. Terminal->CurrentDirectory = Value;
  602. }
  603. #endif
  604. }
  605. //---------------------------------------------------------------------------
  606. void __fastcall TUnixDirView::SortItems()
  607. {
  608. #ifndef DESIGN_ONLY
  609. assert(Terminal);
  610. if (HandleAllocated())
  611. {
  612. PFNLVCOMPARE SortProc;
  613. switch (SortColumn) {
  614. case uvName: SortProc = (PFNLVCOMPARE)CompareItemFileName; break;
  615. case uvSize: SortProc = (PFNLVCOMPARE)CompareSize; break;
  616. case uvChanged: SortProc = (PFNLVCOMPARE)CompareModification; break;
  617. case uvRights: SortProc = (PFNLVCOMPARE)CompareRightsStr; break;
  618. case uvOwner: SortProc = (PFNLVCOMPARE)CompareOwner; break;
  619. case uvGroup: SortProc = (PFNLVCOMPARE)CompareGroup; break;
  620. case uvExt: SortProc = (PFNLVCOMPARE)CompareExtension; break;
  621. case uvLinkTarget: SortProc = (PFNLVCOMPARE)CompareLinkTo; break;
  622. case uvType: SortProc = (PFNLVCOMPARE)CompareTypeName; break;
  623. default: assert(false);
  624. }
  625. CustomSortItems(SortProc);
  626. }
  627. #endif
  628. }
  629. //---------------------------------------------------------------------------
  630. bool __fastcall TUnixDirView::GetActive()
  631. {
  632. #ifndef DESIGN_ONLY
  633. return ((Terminal != NULL) && Terminal->Active);
  634. #else
  635. return false;
  636. #endif
  637. }
  638. //---------------------------------------------------------------------------
  639. void __fastcall TUnixDirView::DDDragDetect(int grfKeyState,
  640. const TPoint &DetectStart, const TPoint &Point, TDragDetectStatus DragStatus)
  641. {
  642. if ((DragStatus == ddsDrag) && (!Loading) && (MarkedCount > 0))
  643. {
  644. TCustomUnixDirView::DDDragDetect(grfKeyState, DetectStart, Point, DragStatus);
  645. }
  646. }
  647. //---------------------------------------------------------------------------
  648. void __fastcall TUnixDirView::SetAddParentDir(bool Value)
  649. {
  650. if (Value != AddParentDir)
  651. {
  652. #ifndef DESIGN_ONLY
  653. if (Terminal) Terminal->Files->IncludeParentDirectory = Value;
  654. #endif
  655. TCustomUnixDirView::SetAddParentDir(Value);
  656. }
  657. }
  658. //---------------------------------------------------------------------------
  659. bool __fastcall TUnixDirView::TargetHasDropHandler(TListItem * /* Item */, int /* Effect */)
  660. {
  661. return false;
  662. }
  663. //---------------------------------------------------------------------------
  664. void __fastcall TUnixDirView::DDChooseEffect(int grfKeyState, int &dwEffect)
  665. {
  666. if ((grfKeyState & (MK_CONTROL | MK_SHIFT)) == 0)
  667. {
  668. dwEffect = DROPEFFECT_Copy;
  669. }
  670. TCustomDirView::DDChooseEffect(grfKeyState, dwEffect);
  671. }
  672. //---------------------------------------------------------------------------
  673. void __fastcall TUnixDirView::SetDDAllowMove(bool value)
  674. {
  675. if (DDAllowMove != value)
  676. {
  677. assert(DragDropFilesEx);
  678. FDDAllowMove = value;
  679. DragDropFilesEx->SourceEffects = DragSourceEffects;
  680. }
  681. }
  682. //---------------------------------------------------------------------------
  683. TDropEffectSet __fastcall TUnixDirView::GetDragSourceEffects()
  684. {
  685. TDropEffectSet Result;
  686. Result << deCopy;
  687. if (DDAllowMove) Result << deMove;
  688. return Result;
  689. }
  690. //---------------------------------------------------------------------------
  691. void __fastcall TUnixDirView::ChangeDirectory(AnsiString Path)
  692. {
  693. AnsiString LastFile = "";
  694. if (ItemFocused) LastFile = ItemFileName(ItemFocused);
  695. ClearItems();
  696. DoAnimation(true);
  697. #ifndef DESIGN_ONLY
  698. try
  699. {
  700. FDirLoadedAfterChangeDir = false;
  701. if (Path == HOMEDIRECTORY)
  702. {
  703. Terminal->HomeDirectory();
  704. }
  705. else
  706. // this works even with LockInHome
  707. if (Path == ROOTDIRECTORY)
  708. {
  709. Terminal->CurrentDirectory = ROOTDIRECTORY;
  710. }
  711. else
  712. {
  713. Terminal->ChangeDirectory(Path);
  714. }
  715. }
  716. __finally
  717. {
  718. // changing directory failed, so we load again old directory
  719. if (!FDirLoadedAfterChangeDir)
  720. {
  721. FSelectFile = LastFile;
  722. Reload(false);
  723. };
  724. }
  725. #endif
  726. }
  727. //---------------------------------------------------------------------------
  728. bool __fastcall TUnixDirView::CanEdit(TListItem* Item)
  729. {
  730. #ifndef DESIGN_ONLY
  731. assert(Terminal);
  732. return TCustomUnixDirView::CanEdit(Item) && Terminal->IsCapable[fcRename];
  733. #else
  734. return false;
  735. #endif
  736. }
  737. //---------------------------------------------------------------------------
  738. void __fastcall TUnixDirView::InternalEdit(const tagLVITEMA & HItem)
  739. {
  740. #ifndef DESIGN_ONLY
  741. TListItem *Item = GetItemFromHItem(HItem);
  742. ASSERT_VALID_ITEM;
  743. FSelectFile = HItem.pszText;
  744. LoadEnabled = true;
  745. Terminal->RenameFile(ITEMFILE, HItem.pszText, true);
  746. #endif
  747. }
  748. //---------------------------------------------------------------------------
  749. int __fastcall TUnixDirView::SecondaryColumnHeader(int Index, bool & AliasOnly)
  750. {
  751. AliasOnly = false;
  752. return ((Index == uvName) ? uvExt : -1);
  753. }
  754. //---------------------------------------------------------------------------
  755. void __fastcall TUnixDirView::CreateDirectory(AnsiString DirName)
  756. {
  757. CreateDirectoryEx(DirName, NULL);
  758. }
  759. //---------------------------------------------------------------------------
  760. void __fastcall TUnixDirView::CreateDirectoryEx(AnsiString DirName, const TRemoteProperties * Properties)
  761. {
  762. #ifndef DESIGN_ONLY
  763. assert(Terminal);
  764. // if file would be created in current directory, select it after reload
  765. if (UnixExtractFileName(DirName) == DirName)
  766. {
  767. FSelectFile = DirName;
  768. }
  769. Terminal->CreateDirectory(DirName, Properties);
  770. #endif
  771. }
  772. //---------------------------------------------------------------------------
  773. AnsiString __fastcall TUnixDirView::MinimizePath(AnsiString Path, int Length)
  774. {
  775. return StringReplace(MinimizeName(
  776. StringReplace(Path, '/', '\\', TReplaceFlags() << rfReplaceAll),
  777. Canvas, Length), '\\', '/', TReplaceFlags() << rfReplaceAll);
  778. }
  779. //---------------------------------------------------------------------------
  780. bool __fastcall TUnixDirView::GetIsRoot()
  781. {
  782. #ifndef DESIGN_ONLY
  783. return (PathName == ROOTDIRECTORY);
  784. #else
  785. return false;
  786. #endif
  787. }
  788. //---------------------------------------------------------------------------
  789. TColor __fastcall TUnixDirView::ItemColor(TListItem * Item)
  790. {
  791. assert(Item);
  792. #ifndef DESIGN_ONLY
  793. if (DimmHiddenFiles && !Item->Selected && ITEMFILE->IsHidden)
  794. {
  795. return clGrayText;
  796. }
  797. else
  798. #endif
  799. {
  800. return (TColor)clDefaultItemColor;
  801. }
  802. }
  803. //---------------------------------------------------------------------------
  804. TDateTime __fastcall TUnixDirView::ItemFileTime(TListItem * Item,
  805. TDateTimePrecision & Precision)
  806. {
  807. assert(Item);
  808. #ifndef DESIGN_ONLY
  809. switch (ITEMFILE->ModificationFmt)
  810. {
  811. case mfNone:
  812. Precision = tpNone;
  813. break;
  814. case mfMDHM:
  815. Precision = tpMinute;
  816. break;
  817. case mfMDY:
  818. Precision = tpDay;
  819. break;
  820. case mfFull:
  821. default:
  822. Precision = tpSecond;
  823. break;
  824. }
  825. return ITEMFILE->Modification;
  826. #else
  827. Precision = tpSecond;
  828. return Now();
  829. #endif
  830. }
  831. //---------------------------------------------------------------------------
  832. void __fastcall TUnixDirView::SetShowInaccesibleDirectories(bool value)
  833. {
  834. if (FShowInaccesibleDirectories != value)
  835. {
  836. FShowInaccesibleDirectories = value;
  837. if (DirOK) Reload(false);
  838. }
  839. }
  840. //---------------------------------------------------------------------------
  841. void __fastcall TUnixDirView::AddToDragFileList(TFileList * FileList,
  842. TListItem * Item)
  843. {
  844. AnsiString FileName = ItemFullFileName(Item);
  845. #ifndef DESIGN_ONLY
  846. if (OnDDDragFileName != NULL)
  847. {
  848. OnDDDragFileName(this, ITEMFILE, FileName);
  849. }
  850. #endif
  851. FileList->AddItem(NULL, FileName);
  852. }