FullSynchronize.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <Common.h>
  5. #include "WinInterface.h"
  6. #include "FullSynchronize.h"
  7. #include "CopyParams.h"
  8. #include "VCLCommon.h"
  9. #include <CoreMain.h>
  10. #include <Configuration.h>
  11. #include <TextsWin.h>
  12. #include <HelpWin.h>
  13. #include <GUITools.h>
  14. #include <Terminal.h>
  15. #include <CustomWinConfiguration.h>
  16. #include <Tools.h>
  17. //---------------------------------------------------------------------------
  18. #pragma package(smart_init)
  19. #pragma link "HistoryComboBox"
  20. #ifndef NO_RESOURCES
  21. #pragma resource "*.dfm"
  22. #endif
  23. //---------------------------------------------------------------------------
  24. bool __fastcall DoFullSynchronizeDialog(TSynchronizeMode & Mode, int & Params,
  25. UnicodeString & LocalDirectory, UnicodeString & RemoteDirectory,
  26. TCopyParamType * CopyParams, bool & SaveSettings, bool & SaveMode, int Options,
  27. const TUsableCopyParamAttrs & CopyParamAttrs, TFullSynchronizeInNewWindow OnFullSynchronizeInNewWindow,
  28. int AutoSubmit)
  29. {
  30. bool Result;
  31. TFullSynchronizeDialog * Dialog = SafeFormCreate<TFullSynchronizeDialog>();
  32. try
  33. {
  34. Dialog->Init(Options, CopyParamAttrs, OnFullSynchronizeInNewWindow);
  35. Dialog->Mode = Mode;
  36. Dialog->Params = Params;
  37. Dialog->LocalDirectory = LocalDirectory;
  38. Dialog->RemoteDirectory = RemoteDirectory;
  39. Dialog->CopyParams = *CopyParams;
  40. Dialog->SaveSettings = SaveSettings;
  41. Dialog->SaveMode = SaveMode;
  42. if (AutoSubmit > 0)
  43. {
  44. InitiateDialogTimeout(Dialog, AutoSubmit * MSecsPerSec, Dialog->OkButton);
  45. }
  46. Result = Dialog->Execute();
  47. if (Result)
  48. {
  49. Mode = Dialog->Mode;
  50. Params = Dialog->Params;
  51. LocalDirectory = Dialog->LocalDirectory;
  52. RemoteDirectory = Dialog->RemoteDirectory;
  53. *CopyParams = Dialog->CopyParams;
  54. SaveSettings = Dialog->SaveSettings;
  55. SaveMode = Dialog->SaveMode;
  56. }
  57. }
  58. __finally
  59. {
  60. delete Dialog;
  61. }
  62. return Result;
  63. }
  64. //---------------------------------------------------------------------------
  65. __fastcall TFullSynchronizeDialog::TFullSynchronizeDialog(TComponent* Owner)
  66. : TForm(Owner)
  67. {
  68. UseSystemSettings(this);
  69. FParams = 0;
  70. FSaveMode = false;
  71. FOptions = 0;
  72. FOnFullSynchronizeInNewWindow = NULL;
  73. FPresetsMenu = new TPopupMenu(this);
  74. FSynchronizeBySizeCaption = SynchronizeBySizeCheck->Caption;
  75. HotTrackLabel(CopyParamLabel);
  76. CopyParamListButton(TransferSettingsButton);
  77. LoadDialogImage(Image, L"Synchronize directories");
  78. }
  79. //---------------------------------------------------------------------------
  80. __fastcall TFullSynchronizeDialog::~TFullSynchronizeDialog()
  81. {
  82. delete FPresetsMenu;
  83. }
  84. //---------------------------------------------------------------------------
  85. void __fastcall TFullSynchronizeDialog::Init(
  86. int Options, const TUsableCopyParamAttrs & CopyParamAttrs, TFullSynchronizeInNewWindow OnFullSynchronizeInNewWindow)
  87. {
  88. FOptions = Options;
  89. if (FLAGSET(Options, fsoDisableTimestamp) &&
  90. SynchronizeTimestampsButton->Checked)
  91. {
  92. SynchronizeFilesButton->Checked = true;
  93. }
  94. FCopyParamAttrs = CopyParamAttrs;
  95. FOnFullSynchronizeInNewWindow = OnFullSynchronizeInNewWindow;
  96. DebugAssert(FOnFullSynchronizeInNewWindow != NULL);
  97. UpdateControls();
  98. }
  99. //---------------------------------------------------------------------------
  100. void __fastcall TFullSynchronizeDialog::UpdateControls()
  101. {
  102. EnableControl(SynchronizeTimestampsButton, FLAGCLEAR(FOptions, fsoDisableTimestamp));
  103. if (SynchronizeTimestampsButton->Checked)
  104. {
  105. SynchronizeExistingOnlyCheck->Checked = true;
  106. SynchronizeDeleteCheck->Checked = false;
  107. SynchronizeByTimeCheck->Checked = true;
  108. }
  109. if (SynchronizeBothButton->Checked)
  110. {
  111. SynchronizeByTimeCheck->Checked = true;
  112. SynchronizeBySizeCheck->Checked = false;
  113. if (MirrorFilesButton->Checked)
  114. {
  115. SynchronizeFilesButton->Checked = true;
  116. }
  117. }
  118. EnableControl(MirrorFilesButton, !SynchronizeBothButton->Checked);
  119. EnableControl(SynchronizeDeleteCheck, !SynchronizeBothButton->Checked &&
  120. !SynchronizeTimestampsButton->Checked);
  121. EnableControl(SynchronizeExistingOnlyCheck, !SynchronizeTimestampsButton->Checked);
  122. EnableControl(SynchronizeByTimeCheck, !SynchronizeBothButton->Checked &&
  123. !SynchronizeTimestampsButton->Checked);
  124. EnableControl(SynchronizeBySizeCheck, !SynchronizeBothButton->Checked);
  125. EnableControl(SynchronizeSelectedOnlyCheck, FLAGSET(FOptions, fsoAllowSelectedOnly));
  126. EnableControl(OkButton, !LocalDirectoryEdit->Text.IsEmpty() &&
  127. !RemoteDirectoryEdit->Text.IsEmpty());
  128. UnicodeString InfoStr = FCopyParams.GetInfoStr(L"; ", ActualCopyParamAttrs());
  129. SetLabelHintPopup(CopyParamLabel, InfoStr);
  130. SynchronizeBySizeCheck->Caption = SynchronizeTimestampsButton->Checked ?
  131. LoadStr(SYNCHRONIZE_SAME_SIZE) : UnicodeString(FSynchronizeBySizeCaption);
  132. TransferSettingsButton->Style =
  133. FLAGCLEAR(FOptions, fsoDoNotUsePresets) ?
  134. TCustomButton::bsSplitButton : TCustomButton::bsPushButton;
  135. OkButton->Style = AllowStartInNewWindow() ? TCustomButton::bsSplitButton : TCustomButton::bsPushButton;
  136. }
  137. //---------------------------------------------------------------------------
  138. int __fastcall TFullSynchronizeDialog::ActualCopyParamAttrs()
  139. {
  140. int Result;
  141. if (SynchronizeTimestampsButton->Checked)
  142. {
  143. Result = cpaIncludeMaskOnly;
  144. }
  145. else
  146. {
  147. switch (Mode)
  148. {
  149. case smRemote:
  150. Result = FCopyParamAttrs.Upload;
  151. break;
  152. case smLocal:
  153. Result = FCopyParamAttrs.Download;
  154. break;
  155. default:
  156. DebugFail();
  157. //fallthru
  158. case smBoth:
  159. Result = FCopyParamAttrs.General;
  160. break;
  161. }
  162. }
  163. return
  164. Result |
  165. FLAGMASK(SynchronizeByTimeCheck->Checked, cpaNoPreserveTime) |
  166. cpaNoNewerOnly;
  167. }
  168. //---------------------------------------------------------------------------
  169. void __fastcall TFullSynchronizeDialog::ControlChange(TObject * /*Sender*/)
  170. {
  171. UpdateControls();
  172. }
  173. //---------------------------------------------------------------------------
  174. bool __fastcall TFullSynchronizeDialog::Execute()
  175. {
  176. // at start assume that copy param is current preset
  177. FPreset = GUIConfiguration->CopyParamCurrent;
  178. LocalDirectoryEdit->Items = CustomWinConfiguration->History[L"LocalDirectory"];
  179. RemoteDirectoryEdit->Items = CustomWinConfiguration->History[L"RemoteDirectory"];
  180. bool Result = (ShowModal() == DefaultResult(this));
  181. if (Result)
  182. {
  183. Submitted();
  184. }
  185. return Result;
  186. }
  187. //---------------------------------------------------------------------------
  188. void __fastcall TFullSynchronizeDialog::Submitted()
  189. {
  190. LocalDirectoryEdit->SaveToHistory();
  191. CustomWinConfiguration->History[L"LocalDirectory"] = LocalDirectoryEdit->Items;
  192. RemoteDirectoryEdit->SaveToHistory();
  193. CustomWinConfiguration->History[L"RemoteDirectory"] = RemoteDirectoryEdit->Items;
  194. }
  195. //---------------------------------------------------------------------------
  196. void __fastcall TFullSynchronizeDialog::SetRemoteDirectory(const UnicodeString value)
  197. {
  198. RemoteDirectoryEdit->Text = value;
  199. }
  200. //---------------------------------------------------------------------------
  201. UnicodeString __fastcall TFullSynchronizeDialog::GetRemoteDirectory()
  202. {
  203. return RemoteDirectoryEdit->Text;
  204. }
  205. //---------------------------------------------------------------------------
  206. void __fastcall TFullSynchronizeDialog::SetLocalDirectory(const UnicodeString value)
  207. {
  208. LocalDirectoryEdit->Text = value;
  209. }
  210. //---------------------------------------------------------------------------
  211. UnicodeString __fastcall TFullSynchronizeDialog::GetLocalDirectory()
  212. {
  213. return LocalDirectoryEdit->Text;
  214. }
  215. //---------------------------------------------------------------------------
  216. void __fastcall TFullSynchronizeDialog::SetMode(TSynchronizeMode value)
  217. {
  218. FOrigMode = value;
  219. switch (value)
  220. {
  221. case smRemote:
  222. SynchronizeRemoteButton->Checked = true;
  223. break;
  224. case smLocal:
  225. SynchronizeLocalButton->Checked = true;
  226. break;
  227. case smBoth:
  228. SynchronizeBothButton->Checked = true;
  229. break;
  230. default:
  231. DebugFail();
  232. }
  233. }
  234. //---------------------------------------------------------------------------
  235. TSynchronizeMode __fastcall TFullSynchronizeDialog::GetMode()
  236. {
  237. if (SynchronizeRemoteButton->Checked)
  238. {
  239. return smRemote;
  240. }
  241. else if (SynchronizeLocalButton->Checked)
  242. {
  243. return smLocal;
  244. }
  245. else
  246. {
  247. DebugAssert(SynchronizeBothButton->Checked);
  248. return smBoth;
  249. }
  250. }
  251. //---------------------------------------------------------------------------
  252. void __fastcall TFullSynchronizeDialog::SetParams(int value)
  253. {
  254. FParams = value &
  255. ~(TTerminal::spDelete | TTerminal::spExistingOnly | TTerminal::spPreviewChanges | TTerminal::spTimestamp |
  256. TTerminal::spNotByTime | TTerminal::spBySize | TTerminal::spSelectedOnly | TTerminal::spMirror);
  257. SynchronizeDeleteCheck->Checked = FLAGSET(value, TTerminal::spDelete);
  258. SynchronizeExistingOnlyCheck->Checked = FLAGSET(value, TTerminal::spExistingOnly);
  259. SynchronizePreviewChangesCheck->Checked = FLAGSET(value, TTerminal::spPreviewChanges);
  260. SynchronizeSelectedOnlyCheck->Checked = FLAGSET(value, TTerminal::spSelectedOnly);
  261. if (FLAGSET(value, TTerminal::spTimestamp) && FLAGCLEAR(FOptions, fsoDisableTimestamp))
  262. {
  263. SynchronizeTimestampsButton->Checked = true;
  264. }
  265. else if (FLAGSET(value, TTerminal::spMirror))
  266. {
  267. MirrorFilesButton->Checked = true;
  268. }
  269. else
  270. {
  271. SynchronizeFilesButton->Checked = true;
  272. }
  273. SynchronizeByTimeCheck->Checked = FLAGCLEAR(value, TTerminal::spNotByTime);
  274. SynchronizeBySizeCheck->Checked = FLAGSET(value, TTerminal::spBySize);
  275. UpdateControls();
  276. }
  277. //---------------------------------------------------------------------------
  278. int __fastcall TFullSynchronizeDialog::GetParams()
  279. {
  280. return FParams |
  281. FLAGMASK(SynchronizeDeleteCheck->Checked, TTerminal::spDelete) |
  282. FLAGMASK(SynchronizeExistingOnlyCheck->Checked, TTerminal::spExistingOnly) |
  283. FLAGMASK(SynchronizePreviewChangesCheck->Checked, TTerminal::spPreviewChanges) |
  284. FLAGMASK(SynchronizeSelectedOnlyCheck->Checked, TTerminal::spSelectedOnly) |
  285. FLAGMASK(SynchronizeTimestampsButton->Checked && FLAGCLEAR(FOptions, fsoDisableTimestamp),
  286. TTerminal::spTimestamp) |
  287. FLAGMASK(MirrorFilesButton->Checked, TTerminal::spMirror) |
  288. FLAGMASK(!SynchronizeByTimeCheck->Checked, TTerminal::spNotByTime) |
  289. FLAGMASK(SynchronizeBySizeCheck->Checked, TTerminal::spBySize);
  290. }
  291. //---------------------------------------------------------------------------
  292. void __fastcall TFullSynchronizeDialog::LocalDirectoryBrowseButtonClick(
  293. TObject * /*Sender*/)
  294. {
  295. UnicodeString Directory = LocalDirectoryEdit->Text;
  296. if (SelectDirectory(Directory, LoadStr(SELECT_LOCAL_DIRECTORY), false))
  297. {
  298. LocalDirectoryEdit->Text = Directory;
  299. }
  300. }
  301. //---------------------------------------------------------------------------
  302. void __fastcall TFullSynchronizeDialog::SetSaveSettings(bool value)
  303. {
  304. SaveSettingsCheck->Checked = value;
  305. }
  306. //---------------------------------------------------------------------------
  307. bool __fastcall TFullSynchronizeDialog::GetSaveSettings()
  308. {
  309. return SaveSettingsCheck->Checked;
  310. }
  311. //---------------------------------------------------------------------------
  312. void __fastcall TFullSynchronizeDialog::CopyParamListPopup(TRect R, int AdditionalOptions)
  313. {
  314. // We pass in FCopyParams, although it may not be the exact copy param
  315. // that will be used (because of Preservetime). The reason is to
  316. // display checkbox next to user-selected preset
  317. ::CopyParamListPopup(
  318. R, FPresetsMenu, FCopyParams, FPreset, CopyParamClick,
  319. AdditionalOptions,
  320. ActualCopyParamAttrs());
  321. }
  322. //---------------------------------------------------------------------------
  323. void __fastcall TFullSynchronizeDialog::TransferSettingsButtonClick(
  324. TObject * /*Sender*/)
  325. {
  326. if (FLAGCLEAR(FOptions, fsoDoNotUsePresets) && !SupportsSplitButton())
  327. {
  328. CopyParamListPopup(CalculatePopupRect(TransferSettingsButton), 0);
  329. }
  330. else
  331. {
  332. CopyParamGroupClick(NULL);
  333. }
  334. }
  335. //---------------------------------------------------------------------------
  336. void __fastcall TFullSynchronizeDialog::CopyParamClick(TObject * Sender)
  337. {
  338. DebugAssert(FLAGCLEAR(FOptions, fsoDoNotUsePresets));
  339. // PreserveTime is forced for some settings, but avoid hard-setting it until
  340. // user really confirms it on custom dialog
  341. TCopyParamType ACopyParams = CopyParams;
  342. if (CopyParamListPopupClick(Sender, ACopyParams, FPreset,
  343. ActualCopyParamAttrs()) > 0)
  344. {
  345. FCopyParams = ACopyParams;
  346. UpdateControls();
  347. }
  348. }
  349. //---------------------------------------------------------------------------
  350. void __fastcall TFullSynchronizeDialog::FormShow(TObject * /*Sender*/)
  351. {
  352. InstallPathWordBreakProc(LocalDirectoryEdit);
  353. InstallPathWordBreakProc(RemoteDirectoryEdit);
  354. UpdateControls();
  355. }
  356. //---------------------------------------------------------------------------
  357. void __fastcall TFullSynchronizeDialog::FormCloseQuery(TObject * /*Sender*/,
  358. bool & CanClose)
  359. {
  360. if ((ModalResult == DefaultResult(this)) &&
  361. SaveSettings && (FOrigMode != Mode) && !FSaveMode)
  362. {
  363. switch (MessageDialog(LoadStr(SAVE_SYNCHRONIZE_MODE2),
  364. qtConfirmation, qaYes | qaNo | qaCancel, HELP_SYNCHRONIZE_SAVE_MODE))
  365. {
  366. case qaYes:
  367. FSaveMode = true;
  368. break;
  369. case qaCancel:
  370. CanClose = false;
  371. break;
  372. }
  373. }
  374. }
  375. //---------------------------------------------------------------------------
  376. TCopyParamType __fastcall TFullSynchronizeDialog::GetCopyParams()
  377. {
  378. TCopyParamType Result = FCopyParams;
  379. // when synchronizing by time, we force preserving time,
  380. // otherwise it does not make any sense
  381. if (FLAGCLEAR(Params, TTerminal::spNotByTime))
  382. {
  383. Result.PreserveTime = true;
  384. }
  385. Result.NewerOnly = false;
  386. return Result;
  387. }
  388. //---------------------------------------------------------------------------
  389. void __fastcall TFullSynchronizeDialog::SetCopyParams(const TCopyParamType & value)
  390. {
  391. FCopyParams = value;
  392. UpdateControls();
  393. }
  394. //---------------------------------------------------------------------------
  395. void __fastcall TFullSynchronizeDialog::CopyParamGroupContextPopup(
  396. TObject * /*Sender*/, TPoint & MousePos, bool & Handled)
  397. {
  398. if (FLAGCLEAR(FOptions, fsoDoNotUsePresets))
  399. {
  400. CopyParamListPopup(CalculatePopupRect(CopyParamGroup, MousePos), cplCustomizeDefault);
  401. Handled = true;
  402. }
  403. }
  404. //---------------------------------------------------------------------------
  405. void __fastcall TFullSynchronizeDialog::CopyParamGroupClick(
  406. TObject * /*Sender*/)
  407. {
  408. // PreserveTime is forced for some settings, but avoid hard-setting it until
  409. // user really confirms it on custom dialog
  410. TCopyParamType ACopyParams = CopyParams;
  411. if (DoCopyParamCustomDialog(ACopyParams, ActualCopyParamAttrs()))
  412. {
  413. FCopyParams = ACopyParams;
  414. UpdateControls();
  415. }
  416. }
  417. //---------------------------------------------------------------------------
  418. void __fastcall TFullSynchronizeDialog::HelpButtonClick(TObject * /*Sender*/)
  419. {
  420. FormHelp(this);
  421. }
  422. //---------------------------------------------------------------------------
  423. void __fastcall TFullSynchronizeDialog::TransferSettingsButtonDropDownClick(TObject * /*Sender*/)
  424. {
  425. CopyParamListPopup(CalculatePopupRect(TransferSettingsButton), cplCustomizeDefault);
  426. }
  427. //---------------------------------------------------------------------------
  428. bool __fastcall TFullSynchronizeDialog::AllowStartInNewWindow()
  429. {
  430. return !IsMainFormLike(this);
  431. }
  432. //---------------------------------------------------------------------------
  433. void __fastcall TFullSynchronizeDialog::Start1Click(TObject *)
  434. {
  435. OkButton->Click();
  436. }
  437. //---------------------------------------------------------------------------
  438. void __fastcall TFullSynchronizeDialog::OkButtonDropDownClick(TObject *)
  439. {
  440. MenuPopup(OkMenu, OkButton);
  441. }
  442. //---------------------------------------------------------------------------
  443. void __fastcall TFullSynchronizeDialog::OkButtonClick(TObject *)
  444. {
  445. if (AllowStartInNewWindow() && OpenInNewWindow())
  446. {
  447. StartInNewWindow();
  448. ModalResult = mrCancel;
  449. Abort();
  450. }
  451. }
  452. //---------------------------------------------------------------------------
  453. void __fastcall TFullSynchronizeDialog::StartInNewWindow()
  454. {
  455. Submitted();
  456. FOnFullSynchronizeInNewWindow(Mode, Params, LocalDirectory, RemoteDirectory, &CopyParams);
  457. Close();
  458. }
  459. //---------------------------------------------------------------------------
  460. void __fastcall TFullSynchronizeDialog::StartInNewWindow1Click(TObject *)
  461. {
  462. StartInNewWindow();
  463. }
  464. //---------------------------------------------------------------------------