OpenDirectory.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. //---------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <ScpMain.h>
  5. #include <Configuration.h>
  6. #include <RemoteFiles.h>
  7. #include <VCLCommon.h>
  8. #include <TextsWin.h>
  9. #include <Common.h>
  10. #include "OpenDirectory.h"
  11. #include "WinConfiguration.h"
  12. //---------------------------------------------------------------------
  13. #pragma link "XPGroupBox"
  14. #pragma link "IEComboBox"
  15. #pragma resource "*.dfm"
  16. //---------------------------------------------------------------------
  17. bool __fastcall DoOpenDirectoryDialog(TOpenDirectoryMode Mode, TOperationSide Side,
  18. AnsiString & Directory, TStrings * Directories, TTerminal * Terminal)
  19. {
  20. bool Result;
  21. TOpenDirectoryDialog * Dialog = new TOpenDirectoryDialog(Application);
  22. try
  23. {
  24. Dialog->Mode = Mode;
  25. Dialog->OperationSide = Side;
  26. Dialog->Directory = Directory;
  27. Dialog->Directories = Directories;
  28. Dialog->Terminal = Terminal;
  29. Result = Dialog->Execute();
  30. if (Result)
  31. {
  32. Directory = Dialog->Directory;
  33. }
  34. }
  35. __finally
  36. {
  37. delete Dialog;
  38. }
  39. return Result;
  40. }
  41. //---------------------------------------------------------------------
  42. __fastcall TOpenDirectoryDialog::TOpenDirectoryDialog(TComponent * AOwner):
  43. TForm(AOwner)
  44. {
  45. FOperationSide = osCurrent;
  46. OperationSide = osLocal;
  47. FBookmarkDragDest = -1;
  48. FTerminal = NULL;
  49. FBookmarkList = new TBookmarkList();
  50. UseSystemSettings(this);
  51. }
  52. //---------------------------------------------------------------------
  53. __fastcall TOpenDirectoryDialog::~TOpenDirectoryDialog()
  54. {
  55. SAFE_DESTROY(FBookmarkList);
  56. }
  57. //---------------------------------------------------------------------
  58. void __fastcall TOpenDirectoryDialog::SetOperationSide(TOperationSide value)
  59. {
  60. if (OperationSide != value)
  61. {
  62. AnsiString ADirectory = Directory;
  63. FOperationSide = value;
  64. Directory = ADirectory;
  65. RemoteDirectoryEdit->Visible = False;
  66. LocalDirectoryEdit->Visible = False;
  67. CurrentEdit->Visible = True;
  68. EditLabel->FocusControl = CurrentEdit;
  69. UpdateControls();
  70. }
  71. }
  72. //---------------------------------------------------------------------------
  73. void __fastcall TOpenDirectoryDialog::SetDirectory(AnsiString value)
  74. {
  75. if (OperationSide == osRemote)
  76. {
  77. RemoteDirectoryEdit->Text = value;
  78. }
  79. else
  80. {
  81. LocalDirectoryEdit->Text = value;
  82. }
  83. DirectoryEditChange(NULL);
  84. }
  85. //---------------------------------------------------------------------------
  86. AnsiString __fastcall TOpenDirectoryDialog::GetDirectory()
  87. {
  88. if (OperationSide == osRemote)
  89. return UnixExcludeTrailingBackslash(RemoteDirectoryEdit->Text);
  90. else
  91. return ExcludeTrailingBackslash(LocalDirectoryEdit->Text);
  92. }
  93. //---------------------------------------------------------------------------
  94. TWinControl * __fastcall TOpenDirectoryDialog::GetCurrentEdit()
  95. {
  96. if (OperationSide == osRemote) return RemoteDirectoryEdit;
  97. else return LocalDirectoryEdit;
  98. }
  99. //---------------------------------------------------------------------------
  100. void __fastcall TOpenDirectoryDialog::ControlChange(TObject * /*Sender*/)
  101. {
  102. UpdateControls();
  103. }
  104. //---------------------------------------------------------------------------
  105. void __fastcall TOpenDirectoryDialog::UpdateControls(bool ListBoxUpdate)
  106. {
  107. EnableControl(OKBtn, !Directory.IsEmpty());
  108. EnableControl(AddBookmarkButton,
  109. !Directory.IsEmpty() && (FindBookmark(Directory) < 0));
  110. EnableControl(RemoveBookmarkButton, BookmarksList->ItemIndex >= 0);
  111. EnableControl(UpBookmarkButton, BookmarksList->ItemIndex > 0);
  112. EnableControl(DownBookmarkButton, BookmarksList->ItemIndex >= 0 &&
  113. BookmarksList->ItemIndex < BookmarksList->Items->Count-1);
  114. if (ListBoxUpdate)
  115. {
  116. int MaxWidth = 0;
  117. for (int i = 0; i < BookmarksList->Items->Count; i++)
  118. {
  119. int Width = BookmarksList->Canvas->TextExtent(BookmarksList->Items->Strings[i]).cx;
  120. if (Width > MaxWidth)
  121. {
  122. MaxWidth = Width;
  123. }
  124. }
  125. BookmarksList->ScrollWidth = MaxWidth;
  126. MaxWidth += 6;
  127. if (BookmarksList->Items->Count > BookmarksList->ClientHeight / BookmarksList->ItemHeight)
  128. {
  129. MaxWidth += GetSystemMetrics(SM_CXVSCROLL);
  130. }
  131. if (MaxWidth > BookmarksList->Width)
  132. {
  133. int CWidth = ClientWidth + (MaxWidth - BookmarksList->Width);
  134. ClientWidth = CWidth > 600 ? 600 : CWidth;
  135. }
  136. }
  137. }
  138. //---------------------------------------------------------------------------
  139. void __fastcall TOpenDirectoryDialog::SetDirectories(TStrings * value)
  140. {
  141. RemoteDirectoryEdit->Items = value;
  142. }
  143. //---------------------------------------------------------------------------
  144. TStrings * __fastcall TOpenDirectoryDialog::GetDirectories()
  145. {
  146. return RemoteDirectoryEdit->Items;
  147. }
  148. //---------------------------------------------------------------------------
  149. void __fastcall TOpenDirectoryDialog::LoadBookmarks()
  150. {
  151. BookmarksList->Items->Clear();
  152. for (int i = 0; i < FBookmarkList->Count; i++)
  153. {
  154. TBookmark * Bookmark = FBookmarkList->Bookmarks[i];
  155. AnsiString Directory = OperationSide == osLocal ? Bookmark->Local : Bookmark->Remote;
  156. if (!Directory.IsEmpty() && (BookmarksList->Items->IndexOf(Directory) < 0))
  157. {
  158. BookmarksList->Items->AddObject(Directory, Bookmark);
  159. }
  160. }
  161. }
  162. //---------------------------------------------------------------------------
  163. bool __fastcall TOpenDirectoryDialog::Execute()
  164. {
  165. bool Result;
  166. if (Terminal)
  167. {
  168. TBookmarkList * BookmarkList;
  169. BookmarkList = WinConfiguration->Bookmarks[Terminal->SessionData->SessionKey];
  170. if (BookmarkList)
  171. {
  172. FBookmarkList->Assign(BookmarkList);
  173. }
  174. else
  175. {
  176. FBookmarkList->Clear();
  177. }
  178. LoadBookmarks();
  179. DirectoryEditChange(NULL);
  180. if (Mode == odAddBookmark)
  181. {
  182. AddAsBookmark();
  183. }
  184. }
  185. Result = (ShowModal() == mrOk);
  186. if (Terminal)
  187. {
  188. WinConfiguration->Bookmarks[Terminal->SessionData->SessionKey] = FBookmarkList;
  189. }
  190. return Result;
  191. }
  192. //---------------------------------------------------------------------------
  193. void __fastcall TOpenDirectoryDialog::AddAsBookmark()
  194. {
  195. if (Directory.IsEmpty() || (FindBookmark(Directory) >= 0))
  196. {
  197. return;
  198. }
  199. TBookmark * Bookmark = new TBookmark;
  200. if (OperationSide == osRemote)
  201. {
  202. RemoteDirectoryEdit->SelectAll();
  203. Bookmark->Remote = Directory;
  204. }
  205. else
  206. {
  207. LocalDirectoryEdit->SelectAll();
  208. Bookmark->Local = Directory;
  209. }
  210. Bookmark->Name = Directory;
  211. if (BookmarksList->ItemIndex >= 0)
  212. {
  213. int PrevItemIndex = BookmarksList->ItemIndex;
  214. FBookmarkList->InsertBefore(
  215. dynamic_cast<TBookmark *>(BookmarksList->Items->Objects[BookmarksList->ItemIndex]),
  216. Bookmark);
  217. BookmarksList->Items->InsertObject(BookmarksList->ItemIndex, Directory, Bookmark);
  218. BookmarksList->ItemIndex = PrevItemIndex;
  219. }
  220. else
  221. {
  222. FBookmarkList->Add(Bookmark);
  223. BookmarksList->Items->AddObject(Directory, Bookmark);
  224. BookmarksList->ItemIndex = BookmarksList->Items->Count-1;
  225. }
  226. UpdateControls(true);
  227. }
  228. //---------------------------------------------------------------------------
  229. void __fastcall TOpenDirectoryDialog::AddBookmarkButtonClick(TObject */*Sender*/)
  230. {
  231. AddAsBookmark();
  232. }
  233. //---------------------------------------------------------------------------
  234. void __fastcall TOpenDirectoryDialog::RemoveBookmarkButtonClick(TObject * /*Sender*/)
  235. {
  236. int PrevItemIndex = BookmarksList->ItemIndex;
  237. TBookmark * Bookmark;
  238. Bookmark = dynamic_cast<TBookmark *>(BookmarksList->Items->Objects[PrevItemIndex]);
  239. assert(Bookmark);
  240. FBookmarkList->Delete(Bookmark);
  241. BookmarksList->Items->Delete(PrevItemIndex);
  242. if (PrevItemIndex < BookmarksList->Items->Count)
  243. {
  244. BookmarksList->ItemIndex = PrevItemIndex;
  245. }
  246. else
  247. {
  248. BookmarksList->ItemIndex = BookmarksList->Items->Count-1;
  249. }
  250. UpdateControls(true);
  251. BookmarksListClick(NULL);
  252. }
  253. //---------------------------------------------------------------------------
  254. Integer __fastcall TOpenDirectoryDialog::FindBookmark(const AnsiString Bookmark)
  255. {
  256. if (OperationSide == osRemote)
  257. {
  258. for (int Index = 0; Index < BookmarksList->Items->Count; Index++)
  259. {
  260. if (AnsiCompareStr(BookmarksList->Items->Strings[Index], Bookmark) == 0)
  261. {
  262. return Index;
  263. }
  264. }
  265. }
  266. else
  267. {
  268. for (int Index = 0; Index < BookmarksList->Items->Count; Index++)
  269. {
  270. if (AnsiCompareText(BookmarksList->Items->Strings[Index], Bookmark) == 0)
  271. {
  272. return Index;
  273. }
  274. }
  275. }
  276. return -1;
  277. }
  278. //---------------------------------------------------------------------------
  279. void __fastcall TOpenDirectoryDialog::BookmarksListClick(TObject * /*Sender*/)
  280. {
  281. if (BookmarksList->ItemIndex >= 0)
  282. {
  283. Directory = BookmarksList->Items->Strings[BookmarksList->ItemIndex];
  284. }
  285. UpdateControls();
  286. }
  287. //---------------------------------------------------------------------------
  288. void __fastcall TOpenDirectoryDialog::BookmarkMove(int Source, int Dest)
  289. {
  290. if (Source >= 0 && Source < BookmarksList->Items->Count &&
  291. Dest >= 0 && Dest < BookmarksList->Items->Count)
  292. {
  293. FBookmarkList->MoveBefore(
  294. dynamic_cast<TBookmark *>(BookmarksList->Items->Objects[Dest]),
  295. dynamic_cast<TBookmark *>(BookmarksList->Items->Objects[Source]));
  296. BookmarksList->Items->Move(Source, Dest);
  297. BookmarksList->ItemIndex = Dest;
  298. BookmarksList->SetFocus();
  299. }
  300. }
  301. //---------------------------------------------------------------------------
  302. void __fastcall TOpenDirectoryDialog::BookmarkButtonClick(TObject *Sender)
  303. {
  304. BookmarkMove(BookmarksList->ItemIndex,
  305. BookmarksList->ItemIndex + (Sender == UpBookmarkButton ? -1 : 1));
  306. UpdateControls();
  307. }
  308. //---------------------------------------------------------------------------
  309. bool __fastcall TOpenDirectoryDialog::AllowBookmarkDrag(int X, int Y)
  310. {
  311. FBookmarkDragDest = BookmarksList->ItemAtPos(TPoint(X, Y), true);
  312. return (FBookmarkDragDest >= 0) && (FBookmarkDragDest != FBookmarkDragSource);
  313. }
  314. //---------------------------------------------------------------------------
  315. void __fastcall TOpenDirectoryDialog::BookmarksListStartDrag(
  316. TObject * /*Sender*/ , TDragObject *& /*DragObject*/)
  317. {
  318. FBookmarkDragSource = BookmarksList->ItemIndex;
  319. FBookmarkDragDest = -1;
  320. }
  321. //---------------------------------------------------------------------------
  322. void __fastcall TOpenDirectoryDialog::BookmarksListDragOver(
  323. TObject */*Sender*/, TObject *Source, int X, int Y, TDragState /*State*/,
  324. bool &Accept)
  325. {
  326. if (Source == BookmarksList) Accept = AllowBookmarkDrag(X, Y);
  327. }
  328. //---------------------------------------------------------------------------
  329. void __fastcall TOpenDirectoryDialog::BookmarksListDragDrop(
  330. TObject * /*Sender*/, TObject *Source, int X, int Y)
  331. {
  332. if (Source == BookmarksList)
  333. {
  334. if (AllowBookmarkDrag(X, Y)) BookmarkMove(FBookmarkDragSource, FBookmarkDragDest);
  335. }
  336. }
  337. //---------------------------------------------------------------------------
  338. void __fastcall TOpenDirectoryDialog::DirectoryEditChange(TObject * /*Sender*/)
  339. {
  340. int ItemIndex = FindBookmark(Directory);
  341. if (ItemIndex >= 0) BookmarksList->ItemIndex = ItemIndex;
  342. UpdateControls();
  343. }
  344. //---------------------------------------------------------------------------
  345. void __fastcall TOpenDirectoryDialog::BookmarksListDblClick(TObject * /*Sender*/)
  346. {
  347. if (BookmarksList->ItemIndex >= 0) ModalResult = mrOk;
  348. }
  349. //---------------------------------------------------------------------------
  350. void __fastcall TOpenDirectoryDialog::SetMode(TOpenDirectoryMode value)
  351. {
  352. FMode = value;
  353. Caption = LoadStr(Mode == odBrowse ?
  354. OPEN_DIRECTORY_BROWSE_CAPTION : OPEN_DIRECTORY_ADD_BOOMARK_ACTION );
  355. }
  356. //---------------------------------------------------------------------------
  357. void __fastcall TOpenDirectoryDialog::FormShow(TObject * /*Sender*/)
  358. {
  359. UpdateControls(true);
  360. if (Mode == odBrowse)
  361. {
  362. CurrentEdit->SetFocus();
  363. }
  364. else
  365. {
  366. BookmarksList->SetFocus();
  367. }
  368. }
  369. //---------------------------------------------------------------------------
  370. void __fastcall TOpenDirectoryDialog::BookmarksListKeyDown(TObject * /*Sender*/,
  371. WORD &Key, TShiftState /*Shift*/)
  372. {
  373. if ((BookmarksList->ItemIndex >= 0) && (Key == VK_DELETE))
  374. {
  375. RemoveBookmarkButtonClick(NULL);
  376. }
  377. }
  378. //---------------------------------------------------------------------------