Synchronize.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <Common.h>
  5. #include "Synchronize.h"
  6. #include "VCLCommon.h"
  7. #include <ScpMain.h>
  8. #include <Configuration.h>
  9. #include <TextsWin.h>
  10. #include <CustomWinConfiguration.h>
  11. //---------------------------------------------------------------------------
  12. #pragma package(smart_init)
  13. #pragma link "XPGroupBox"
  14. #pragma link "HistoryComboBox"
  15. #pragma resource "*.dfm"
  16. //---------------------------------------------------------------------------
  17. const int WM_USER_STOP = WM_USER + 100;
  18. //---------------------------------------------------------------------------
  19. bool __fastcall DoSynchronizeDialog(TSynchronizeParamType & Params,
  20. TSynchronizeStartStopEvent OnStartStop, bool & SaveSettings)
  21. {
  22. bool Result;
  23. TSynchronizeDialog * Dialog = new TSynchronizeDialog(Application);
  24. try
  25. {
  26. Dialog->OnStartStop = OnStartStop;
  27. Dialog->Params = Params;
  28. Dialog->SaveSettings = SaveSettings;
  29. Result = Dialog->Execute();
  30. if (Result)
  31. {
  32. SaveSettings = Dialog->SaveSettings;
  33. Params = Dialog->Params;
  34. }
  35. }
  36. __finally
  37. {
  38. delete Dialog;
  39. }
  40. return Result;
  41. }
  42. //---------------------------------------------------------------------------
  43. __fastcall TSynchronizeDialog::TSynchronizeDialog(TComponent* Owner)
  44. : TForm(Owner)
  45. {
  46. UseSystemSettings(this);
  47. FSynchronizing = false;
  48. FMinimizedByMe = false;
  49. }
  50. //---------------------------------------------------------------------------
  51. void __fastcall TSynchronizeDialog::UpdateControls()
  52. {
  53. EnableControl(StartButton, !LocalDirectoryEdit->Text.IsEmpty() &&
  54. !RemoteDirectoryEdit->Text.IsEmpty());
  55. StartButton->Visible = !FSynchronizing;
  56. StartButton->Default = StartButton->Visible;
  57. StopButton->Visible = FSynchronizing;
  58. StopButton->Default = StopButton->Visible;
  59. Caption = LoadStr(FSynchronizing ? SYCHRONIZE_SYCHRONIZING : SYCHRONIZE_TITLE);
  60. EnableControl(TransferPreferencesButton, !FSynchronizing);
  61. EnableControl(CancelButton, !FSynchronizing);
  62. EnableControl(DirectoriesGroup, !FSynchronizing);
  63. EnableControl(OptionsGroup, !FSynchronizing);
  64. EnableControl(MinimizeButton, FSynchronizing);
  65. }
  66. //---------------------------------------------------------------------------
  67. void __fastcall TSynchronizeDialog::ControlChange(TObject * /*Sender*/)
  68. {
  69. UpdateControls();
  70. }
  71. //---------------------------------------------------------------------------
  72. bool __fastcall TSynchronizeDialog::Execute()
  73. {
  74. LocalDirectoryEdit->Items = CustomWinConfiguration->History["LocalDirectory"];
  75. RemoteDirectoryEdit->Items = CustomWinConfiguration->History["RemoteDirectory"];
  76. ShowModal();
  77. return true;
  78. }
  79. //---------------------------------------------------------------------------
  80. void __fastcall TSynchronizeDialog::SetParams(const TSynchronizeParamType& value)
  81. {
  82. FParams = value;
  83. RemoteDirectoryEdit->Text = value.RemoteDirectory;
  84. LocalDirectoryEdit->Text = value.LocalDirectory;
  85. SynchronizeDeleteCheck->Checked = FLAGSET(value.Params, spDelete);
  86. SynchronizeExistingOnlyCheck->Checked = FLAGSET(value.Params, spExistingOnly);
  87. SynchronizeNoConfirmationCheck->Checked = FLAGSET(value.Params, spNoConfirmation);
  88. SynchronizeRecursiveCheck->Checked = value.Recurse;
  89. }
  90. //---------------------------------------------------------------------------
  91. TSynchronizeParamType __fastcall TSynchronizeDialog::GetParams()
  92. {
  93. TSynchronizeParamType Result = FParams;
  94. Result.RemoteDirectory = RemoteDirectoryEdit->Text;
  95. Result.LocalDirectory = LocalDirectoryEdit->Text;
  96. Result.Params =
  97. (Result.Params & ~(spDelete | spExistingOnly | spNoConfirmation)) |
  98. FLAGMASK(SynchronizeDeleteCheck->Checked, spDelete) |
  99. FLAGMASK(SynchronizeExistingOnlyCheck->Checked, spExistingOnly) |
  100. FLAGMASK(SynchronizeNoConfirmationCheck->Checked, spNoConfirmation);
  101. Result.Recurse = SynchronizeRecursiveCheck->Checked;
  102. return Result;
  103. }
  104. //---------------------------------------------------------------------------
  105. void __fastcall TSynchronizeDialog::LocalDirectoryBrowseButtonClick(
  106. TObject * /*Sender*/)
  107. {
  108. AnsiString Directory = LocalDirectoryEdit->Text;
  109. if (SelectDirectory(Directory, LoadStr(SELECT_LOCAL_DIRECTORY), false))
  110. {
  111. LocalDirectoryEdit->Text = Directory;
  112. }
  113. }
  114. //---------------------------------------------------------------------------
  115. void __fastcall TSynchronizeDialog::DirectoryEditKeyDown(
  116. TObject * Sender, WORD & Key, TShiftState Shift)
  117. {
  118. PathComboBoxKeyDown(dynamic_cast<TCustomComboBox*>(Sender), Key, Shift,
  119. (Sender == RemoteDirectoryEdit));
  120. }
  121. //---------------------------------------------------------------------------
  122. void __fastcall TSynchronizeDialog::TransferPreferencesButtonClick(
  123. TObject * /*Sender*/)
  124. {
  125. DoPreferencesDialog(pmTransfer);
  126. }
  127. //---------------------------------------------------------------------------
  128. void __fastcall TSynchronizeDialog::DoStartStop(bool Start)
  129. {
  130. if (FOnStartStop)
  131. {
  132. FOnStartStop(this, Start, GetParams(), DoAbort);
  133. }
  134. }
  135. //---------------------------------------------------------------------------
  136. void __fastcall TSynchronizeDialog::Dispatch(void * Message)
  137. {
  138. assert(Message);
  139. if ((reinterpret_cast<TMessage *>(Message)->Msg == WM_USER_STOP) && FAbort)
  140. {
  141. if (FSynchronizing)
  142. {
  143. Stop();
  144. }
  145. if (FClose)
  146. {
  147. FClose = false;
  148. ModalResult = mrCancel;
  149. }
  150. }
  151. else
  152. {
  153. TForm::Dispatch(Message);
  154. }
  155. }
  156. //---------------------------------------------------------------------------
  157. void __fastcall TSynchronizeDialog::DoAbort(TObject * /*Sender*/, bool Close)
  158. {
  159. FAbort = true;
  160. FClose = Close;
  161. PostMessage(Handle, WM_USER_STOP, 0, 0);
  162. }
  163. //---------------------------------------------------------------------------
  164. void __fastcall TSynchronizeDialog::StartButtonClick(TObject * /*Sender*/)
  165. {
  166. assert(!FSynchronizing);
  167. LocalDirectoryEdit->SaveToHistory();
  168. CustomWinConfiguration->History["LocalDirectory"] = LocalDirectoryEdit->Items;
  169. RemoteDirectoryEdit->SaveToHistory();
  170. CustomWinConfiguration->History["RemoteDirectory"] = RemoteDirectoryEdit->Items;
  171. FSynchronizing = true;
  172. try
  173. {
  174. UpdateControls();
  175. FAbort = false;
  176. DoStartStop(true);
  177. }
  178. catch(...)
  179. {
  180. FSynchronizing = false;
  181. UpdateControls();
  182. throw;
  183. }
  184. }
  185. //---------------------------------------------------------------------------
  186. void __fastcall TSynchronizeDialog::StopButtonClick(TObject * /*Sender*/)
  187. {
  188. Stop();
  189. }
  190. //---------------------------------------------------------------------------
  191. void __fastcall TSynchronizeDialog::Stop()
  192. {
  193. FSynchronizing = false;
  194. DoStartStop(false);
  195. UpdateControls();
  196. if (IsIconic(Application->Handle) && FMinimizedByMe)
  197. {
  198. FMinimizedByMe = false;
  199. Application->Restore();
  200. }
  201. }
  202. //---------------------------------------------------------------------------
  203. void __fastcall TSynchronizeDialog::MinimizeButtonClick(TObject * /*Sender*/)
  204. {
  205. Application->Minimize();
  206. FMinimizedByMe = true;
  207. }
  208. //---------------------------------------------------------------------------
  209. void __fastcall TSynchronizeDialog::SetSaveSettings(bool value)
  210. {
  211. SaveSettingsCheck->Checked = value;
  212. }
  213. //---------------------------------------------------------------------------
  214. bool __fastcall TSynchronizeDialog::GetSaveSettings()
  215. {
  216. return SaveSettingsCheck->Checked;
  217. }
  218. //---------------------------------------------------------------------------
  219. void __fastcall TSynchronizeDialog::FormShow(TObject * /*Sender*/)
  220. {
  221. UpdateControls();
  222. }
  223. //---------------------------------------------------------------------------