FullSynchronize.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  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 <CustomWinConfiguration.h>
  14. //---------------------------------------------------------------------------
  15. #pragma package(smart_init)
  16. #pragma link "HistoryComboBox"
  17. #ifndef NO_RESOURCES
  18. #pragma resource "*.dfm"
  19. #endif
  20. //---------------------------------------------------------------------------
  21. bool __fastcall DoFullSynchronizeDialog(TSynchronizeMode & Mode, int & Params,
  22. AnsiString & LocalDirectory, AnsiString & RemoteDirectory,
  23. TCopyParamType * CopyParams, bool & SaveSettings, bool & SaveMode, int Options,
  24. const TUsableCopyParamAttrs & CopyParamAttrs)
  25. {
  26. bool Result;
  27. TFullSynchronizeDialog * Dialog = new TFullSynchronizeDialog(Application);
  28. try
  29. {
  30. Dialog->Mode = Mode;
  31. Dialog->Options = Options;
  32. Dialog->Params = Params;
  33. Dialog->LocalDirectory = LocalDirectory;
  34. Dialog->RemoteDirectory = RemoteDirectory;
  35. Dialog->CopyParams = *CopyParams;
  36. Dialog->SaveSettings = SaveSettings;
  37. Dialog->SaveMode = SaveMode;
  38. Dialog->CopyParamAttrs = CopyParamAttrs;
  39. Result = Dialog->Execute();
  40. if (Result)
  41. {
  42. Mode = Dialog->Mode;
  43. Params = Dialog->Params;
  44. LocalDirectory = Dialog->LocalDirectory;
  45. RemoteDirectory = Dialog->RemoteDirectory;
  46. *CopyParams = Dialog->CopyParams;
  47. SaveSettings = Dialog->SaveSettings;
  48. SaveMode = Dialog->SaveMode;
  49. }
  50. }
  51. __finally
  52. {
  53. delete Dialog;
  54. }
  55. return Result;
  56. }
  57. //---------------------------------------------------------------------------
  58. __fastcall TFullSynchronizeDialog::TFullSynchronizeDialog(TComponent* Owner)
  59. : TForm(Owner)
  60. {
  61. UseSystemSettings(this);
  62. FParams = 0;
  63. FSaveMode = false;
  64. FOptions = 0;
  65. FPresetsMenu = new TPopupMenu(this);
  66. InstallPathWordBreakProc(LocalDirectoryEdit);
  67. InstallPathWordBreakProc(RemoteDirectoryEdit);
  68. FSynchronizeBySizeCaption = SynchronizeBySizeCheck->Caption;
  69. }
  70. //---------------------------------------------------------------------------
  71. __fastcall TFullSynchronizeDialog::~TFullSynchronizeDialog()
  72. {
  73. delete FPresetsMenu;
  74. }
  75. //---------------------------------------------------------------------------
  76. void __fastcall TFullSynchronizeDialog::UpdateControls()
  77. {
  78. EnableControl(SynchronizeTimestampsButton, FLAGCLEAR(Options, fsoDisableTimestamp));
  79. if (SynchronizeTimestampsButton->Checked)
  80. {
  81. SynchronizeExistingOnlyCheck->Checked = true;
  82. SynchronizeDeleteCheck->Checked = false;
  83. SynchronizeByTimeCheck->Checked = true;
  84. }
  85. if (SynchronizeBothButton->Checked)
  86. {
  87. SynchronizeByTimeCheck->Checked = true;
  88. SynchronizeBySizeCheck->Checked = false;
  89. if (MirrorFilesButton->Checked)
  90. {
  91. SynchronizeFilesButton->Checked = true;
  92. }
  93. }
  94. EnableControl(MirrorFilesButton, !SynchronizeBothButton->Checked);
  95. EnableControl(SynchronizeDeleteCheck, !SynchronizeBothButton->Checked &&
  96. !SynchronizeTimestampsButton->Checked);
  97. EnableControl(SynchronizeExistingOnlyCheck, !SynchronizeTimestampsButton->Checked);
  98. EnableControl(SynchronizeByTimeCheck, !SynchronizeBothButton->Checked &&
  99. !SynchronizeTimestampsButton->Checked);
  100. EnableControl(SynchronizeBySizeCheck, !SynchronizeBothButton->Checked);
  101. EnableControl(SynchronizeSelectedOnlyCheck, FLAGSET(FOptions, fsoAllowSelectedOnly));
  102. EnableControl(OkButton, !LocalDirectoryEdit->Text.IsEmpty() &&
  103. !RemoteDirectoryEdit->Text.IsEmpty());
  104. AnsiString InfoStr = FCopyParams.GetInfoStr("; ", ActualCopyParamAttrs());
  105. CopyParamLabel->Caption = InfoStr;
  106. CopyParamLabel->Hint = InfoStr;
  107. CopyParamLabel->ShowHint =
  108. (CopyParamLabel->Canvas->TextWidth(InfoStr) > (CopyParamLabel->Width * 3 / 2));
  109. SynchronizeBySizeCheck->Caption = SynchronizeTimestampsButton->Checked ?
  110. LoadStr(SYNCHRONIZE_SAME_SIZE) : FSynchronizeBySizeCaption;
  111. }
  112. //---------------------------------------------------------------------------
  113. int __fastcall TFullSynchronizeDialog::ActualCopyParamAttrs()
  114. {
  115. int Result;
  116. if (SynchronizeTimestampsButton->Checked)
  117. {
  118. Result = cpaExcludeMaskOnly;
  119. }
  120. else
  121. {
  122. switch (Mode)
  123. {
  124. case smRemote:
  125. Result = CopyParamAttrs.Upload;
  126. break;
  127. case smLocal:
  128. Result = CopyParamAttrs.Download;
  129. break;
  130. default:
  131. assert(false);
  132. //fallthru
  133. case smBoth:
  134. Result = CopyParamAttrs.General;
  135. break;
  136. }
  137. }
  138. return
  139. Result |
  140. FLAGMASK(SynchronizeByTimeCheck->Checked, cpaNoPreserveTime);
  141. }
  142. //---------------------------------------------------------------------------
  143. void __fastcall TFullSynchronizeDialog::ControlChange(TObject * /*Sender*/)
  144. {
  145. UpdateControls();
  146. }
  147. //---------------------------------------------------------------------------
  148. bool __fastcall TFullSynchronizeDialog::Execute()
  149. {
  150. // at start assume that copy param is current preset
  151. FPreset = GUIConfiguration->CopyParamCurrent;
  152. LocalDirectoryEdit->Items = CustomWinConfiguration->History["LocalDirectory"];
  153. RemoteDirectoryEdit->Items = CustomWinConfiguration->History["RemoteDirectory"];
  154. bool Result = (ShowModal() == mrOk);
  155. if (Result)
  156. {
  157. LocalDirectoryEdit->SaveToHistory();
  158. CustomWinConfiguration->History["LocalDirectory"] = LocalDirectoryEdit->Items;
  159. RemoteDirectoryEdit->SaveToHistory();
  160. CustomWinConfiguration->History["RemoteDirectory"] = RemoteDirectoryEdit->Items;
  161. }
  162. return Result;
  163. }
  164. //---------------------------------------------------------------------------
  165. void __fastcall TFullSynchronizeDialog::SetRemoteDirectory(const AnsiString value)
  166. {
  167. RemoteDirectoryEdit->Text = value;
  168. }
  169. //---------------------------------------------------------------------------
  170. AnsiString __fastcall TFullSynchronizeDialog::GetRemoteDirectory()
  171. {
  172. return RemoteDirectoryEdit->Text;
  173. }
  174. //---------------------------------------------------------------------------
  175. void __fastcall TFullSynchronizeDialog::SetLocalDirectory(const AnsiString value)
  176. {
  177. LocalDirectoryEdit->Text = value;
  178. }
  179. //---------------------------------------------------------------------------
  180. AnsiString __fastcall TFullSynchronizeDialog::GetLocalDirectory()
  181. {
  182. return LocalDirectoryEdit->Text;
  183. }
  184. //---------------------------------------------------------------------------
  185. void __fastcall TFullSynchronizeDialog::SetMode(TSynchronizeMode value)
  186. {
  187. FOrigMode = value;
  188. switch (value)
  189. {
  190. case smRemote:
  191. SynchronizeRemoteButton->Checked = true;
  192. break;
  193. case smLocal:
  194. SynchronizeLocalButton->Checked = true;
  195. break;
  196. case smBoth:
  197. SynchronizeBothButton->Checked = true;
  198. break;
  199. default:
  200. assert(false);
  201. }
  202. }
  203. //---------------------------------------------------------------------------
  204. TSynchronizeMode __fastcall TFullSynchronizeDialog::GetMode()
  205. {
  206. if (SynchronizeRemoteButton->Checked)
  207. {
  208. return smRemote;
  209. }
  210. else if (SynchronizeLocalButton->Checked)
  211. {
  212. return smLocal;
  213. }
  214. else
  215. {
  216. assert(SynchronizeBothButton->Checked);
  217. return smBoth;
  218. }
  219. }
  220. //---------------------------------------------------------------------------
  221. void __fastcall TFullSynchronizeDialog::SetParams(int value)
  222. {
  223. FParams = value & ~(spDelete | spExistingOnly |
  224. spPreviewChanges | spTimestamp | spNotByTime | spBySize | spSelectedOnly | spMirror);
  225. SynchronizeDeleteCheck->Checked = FLAGSET(value, spDelete);
  226. SynchronizeExistingOnlyCheck->Checked = FLAGSET(value, spExistingOnly);
  227. SynchronizePreviewChangesCheck->Checked = FLAGSET(value, spPreviewChanges);
  228. SynchronizeSelectedOnlyCheck->Checked = FLAGSET(value, spSelectedOnly);
  229. if (FLAGSET(value, spTimestamp) && FLAGCLEAR(Options, fsoDisableTimestamp))
  230. {
  231. SynchronizeTimestampsButton->Checked = true;
  232. }
  233. else if (FLAGSET(value, spMirror))
  234. {
  235. MirrorFilesButton->Checked = true;
  236. }
  237. else
  238. {
  239. SynchronizeFilesButton->Checked = true;
  240. }
  241. SynchronizeByTimeCheck->Checked = FLAGCLEAR(value, spNotByTime);
  242. SynchronizeBySizeCheck->Checked = FLAGSET(value, spBySize);
  243. UpdateControls();
  244. }
  245. //---------------------------------------------------------------------------
  246. int __fastcall TFullSynchronizeDialog::GetParams()
  247. {
  248. return FParams |
  249. FLAGMASK(SynchronizeDeleteCheck->Checked, spDelete) |
  250. FLAGMASK(SynchronizeExistingOnlyCheck->Checked, spExistingOnly) |
  251. FLAGMASK(SynchronizePreviewChangesCheck->Checked, spPreviewChanges) |
  252. FLAGMASK(SynchronizeSelectedOnlyCheck->Checked, spSelectedOnly) |
  253. FLAGMASK(SynchronizeTimestampsButton->Checked && FLAGCLEAR(Options, fsoDisableTimestamp),
  254. spTimestamp) |
  255. FLAGMASK(MirrorFilesButton->Checked, spMirror) |
  256. FLAGMASK(!SynchronizeByTimeCheck->Checked, spNotByTime) |
  257. FLAGMASK(SynchronizeBySizeCheck->Checked, spBySize);
  258. }
  259. //---------------------------------------------------------------------------
  260. void __fastcall TFullSynchronizeDialog::LocalDirectoryBrowseButtonClick(
  261. TObject * /*Sender*/)
  262. {
  263. AnsiString Directory = LocalDirectoryEdit->Text;
  264. if (SelectDirectory(Directory, LoadStr(SELECT_LOCAL_DIRECTORY), false))
  265. {
  266. LocalDirectoryEdit->Text = Directory;
  267. }
  268. }
  269. //---------------------------------------------------------------------------
  270. void __fastcall TFullSynchronizeDialog::SetSaveSettings(bool value)
  271. {
  272. SaveSettingsCheck->Checked = value;
  273. }
  274. //---------------------------------------------------------------------------
  275. bool __fastcall TFullSynchronizeDialog::GetSaveSettings()
  276. {
  277. return SaveSettingsCheck->Checked;
  278. }
  279. //---------------------------------------------------------------------------
  280. void __fastcall TFullSynchronizeDialog::SetOptions(int value)
  281. {
  282. if (Options != value)
  283. {
  284. FOptions = value;
  285. if (FLAGSET(Options, fsoDisableTimestamp) &&
  286. SynchronizeTimestampsButton->Checked)
  287. {
  288. SynchronizeFilesButton->Checked = true;
  289. }
  290. UpdateControls();
  291. }
  292. }
  293. //---------------------------------------------------------------------------
  294. void __fastcall TFullSynchronizeDialog::TransferSettingsButtonClick(
  295. TObject * /*Sender*/)
  296. {
  297. if (FLAGCLEAR(FOptions, fsoDoNotUsePresets))
  298. {
  299. CopyParamListPopup(
  300. TransferSettingsButton->ClientToScreen(TPoint(0, TransferSettingsButton->Height)),
  301. FPresetsMenu, FCopyParams, FPreset, CopyParamClick, cplCustomize);
  302. }
  303. else
  304. {
  305. CopyParamGroupDblClick(NULL);
  306. }
  307. }
  308. //---------------------------------------------------------------------------
  309. void __fastcall TFullSynchronizeDialog::CopyParamClick(TObject * Sender)
  310. {
  311. assert(FLAGCLEAR(FOptions, fsoDoNotUsePresets));
  312. // PreserveTime is forced for some settings, but avoid hard-setting it until
  313. // user really confirms it on custom dialog
  314. TCopyParamType ACopyParams = CopyParams;
  315. if (CopyParamListPopupClick(Sender, ACopyParams, FPreset,
  316. ActualCopyParamAttrs()))
  317. {
  318. FCopyParams = ACopyParams;
  319. UpdateControls();
  320. }
  321. }
  322. //---------------------------------------------------------------------------
  323. void __fastcall TFullSynchronizeDialog::FormShow(TObject * /*Sender*/)
  324. {
  325. UpdateControls();
  326. }
  327. //---------------------------------------------------------------------------
  328. void __fastcall TFullSynchronizeDialog::FormCloseQuery(TObject * /*Sender*/,
  329. bool & CanClose)
  330. {
  331. if ((ModalResult != mrCancel) &&
  332. SaveSettings && (FOrigMode != Mode) && !FSaveMode)
  333. {
  334. switch (MessageDialog(LoadStr(SAVE_SYNCHRONIZE_MODE),
  335. qtConfirmation, qaYes | qaNo | qaCancel, HELP_SYNCHRONIZE_SAVE_MODE))
  336. {
  337. case qaYes:
  338. FSaveMode = true;
  339. break;
  340. case qaCancel:
  341. CanClose = false;
  342. break;
  343. }
  344. }
  345. }
  346. //---------------------------------------------------------------------------
  347. TCopyParamType __fastcall TFullSynchronizeDialog::GetCopyParams()
  348. {
  349. TCopyParamType Result = FCopyParams;
  350. // when synchronizing by time, we force preserving time,
  351. // otherwise it does not make any sense
  352. if (FLAGCLEAR(Params, spNotByTime))
  353. {
  354. Result.PreserveTime = true;
  355. }
  356. return Result;
  357. }
  358. //---------------------------------------------------------------------------
  359. void __fastcall TFullSynchronizeDialog::SetCopyParams(const TCopyParamType & value)
  360. {
  361. FCopyParams = value;
  362. UpdateControls();
  363. }
  364. //---------------------------------------------------------------------------
  365. void __fastcall TFullSynchronizeDialog::CopyParamGroupContextPopup(
  366. TObject * /*Sender*/, TPoint & MousePos, bool & Handled)
  367. {
  368. if (FLAGCLEAR(FOptions, fsoDoNotUsePresets))
  369. {
  370. // We pass in FCopyParams, although it may not be the exact copy param
  371. // that will be used (because of Preservetime). The reason is to
  372. // display checkbox next to user-selected preset
  373. CopyParamListPopup(CopyParamGroup->ClientToScreen(MousePos), FPresetsMenu,
  374. FCopyParams, FPreset, CopyParamClick, cplCustomize | cplCustomizeDefault);
  375. Handled = true;
  376. }
  377. }
  378. //---------------------------------------------------------------------------
  379. void __fastcall TFullSynchronizeDialog::CopyParamGroupDblClick(
  380. TObject * /*Sender*/)
  381. {
  382. // PreserveTime is forced for some settings, but avoid hard-setting it until
  383. // user really confirms it on cutom dialog
  384. TCopyParamType ACopyParams = CopyParams;
  385. if (DoCopyParamCustomDialog(ACopyParams, ActualCopyParamAttrs()))
  386. {
  387. FCopyParams = ACopyParams;
  388. UpdateControls();
  389. }
  390. }
  391. //---------------------------------------------------------------------------
  392. void __fastcall TFullSynchronizeDialog::HelpButtonClick(TObject * /*Sender*/)
  393. {
  394. FormHelp(this);
  395. }
  396. //---------------------------------------------------------------------------