FullSynchronize.cpp 17 KB

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