FullSynchronize.cpp 17 KB

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