CopyParams.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <Common.h>
  5. #include "CopyParams.h"
  6. #include <VCLCommon.h>
  7. #include <CoreMain.h>
  8. #include "CustomWinConfiguration.h"
  9. #include "TextsWin.h"
  10. #include "Tools.h"
  11. //---------------------------------------------------------------------------
  12. #pragma package(smart_init)
  13. #pragma link "Rights"
  14. #pragma link "HistoryComboBox"
  15. #pragma link "ComboEdit"
  16. #pragma resource "*.dfm"
  17. //---------------------------------------------------------------------------
  18. __fastcall TCopyParamsFrame::TCopyParamsFrame(TComponent* Owner)
  19. : TFrame(Owner)
  20. {
  21. FRightsFrame = new TRightsExtFrame(this);
  22. FRightsFrame->TabStop = false;
  23. FRightsFrame->Parent = this;
  24. FRightsFrame->TabOrder = 1000;
  25. FRightsFrame->AllowAddXToDirectories = True;
  26. FRightsFrame->Popup = true;
  27. FRightsFrame->PopupParent = RightsEdit;
  28. FRightsFrame->OnChange = RightsFrameChange;
  29. RightsEdit->PopupMenu = FRightsFrame->RightsPopup;
  30. // on start set different value than we want to allow property-setter to proceed
  31. FDirection = pdToLocal;
  32. Direction = pdToRemote;
  33. FCopyParamAttrs = 0;
  34. FParams = new TCopyParamType();
  35. TCopyParamType DefParams;
  36. Params = DefParams;
  37. InstallPathWordBreakProc(AsciiFileMaskCombo);
  38. InstallPathWordBreakProc(ExcludeFileMaskCombo);
  39. HintLabel(ExcludeFileMaskHintText,
  40. FORMAT("%s\n \n%s",(LoadStr(MASK_HINT), LoadStr(PATH_MASK_HINT))));
  41. }
  42. //---------------------------------------------------------------------------
  43. __fastcall TCopyParamsFrame::~TCopyParamsFrame()
  44. {
  45. delete FParams;
  46. }
  47. //---------------------------------------------------------------------------
  48. void __fastcall TCopyParamsFrame::SetParams(TCopyParamType value)
  49. {
  50. assert((value.TransferMode == tmAscii) ||
  51. (value.TransferMode == tmBinary) || (value.TransferMode == tmAutomatic));
  52. switch (value.TransferMode) {
  53. case tmAscii: TMTextButton->Checked = True; break;
  54. case tmBinary: TMBinaryButton->Checked = True; break;
  55. default: TMAutomaticButton->Checked = True; break;
  56. }
  57. FOrigMasks = value.AsciiFileMask.Masks;
  58. AsciiFileMaskCombo->Text = value.AsciiFileMask.Masks;
  59. switch (value.FileNameCase) {
  60. case ncNoChange: CCNoChangeButton->Checked = True; break;
  61. case ncLowerCase: CCLowerCaseButton->Checked = True; break;
  62. case ncUpperCase: CCUpperCaseButton->Checked = True; break;
  63. case ncFirstUpperCase: CCFirstUpperCaseButton->Checked = True; break;
  64. case ncLowerCaseShort: CCLowerCaseShortButton->Checked = True; break;
  65. }
  66. ReplaceInvalidCharsCheck->Checked =
  67. (value.InvalidCharsReplacement != TCopyParamType::NoReplacement);
  68. FRightsFrame->AddXToDirectories = value.AddXToDirectories;
  69. FRightsFrame->Rights = value.Rights;
  70. PreserveRightsCheck->Checked = value.PreserveRights;
  71. IgnorePermErrorsCheck->Checked = value.IgnorePermErrors;
  72. PreserveReadOnlyCheck->Checked = value.PreserveReadOnly;
  73. assert(PreserveTimeCheck);
  74. PreserveTimeCheck->Checked = value.PreserveTime;
  75. CommonCalculateSizeCheck->Checked = value.CalculateSize;
  76. NegativeExcludeCombo->ItemIndex = (value.NegativeExclude ? 1 : 0);
  77. ExcludeFileMaskCombo->Text = value.ExcludeFileMask.Masks;
  78. ClearArchiveCheck->Checked = value.ClearArchive;
  79. *FParams = value;
  80. UpdateControls();
  81. }
  82. //---------------------------------------------------------------------------
  83. TCopyParamType __fastcall TCopyParamsFrame::GetParams()
  84. {
  85. TCopyParamType Result = *FParams;
  86. assert(TMTextButton->Checked || TMBinaryButton->Checked || TMAutomaticButton->Checked);
  87. if (TMTextButton->Checked) Result.TransferMode = tmAscii;
  88. else
  89. if (TMBinaryButton->Checked) Result.TransferMode = tmBinary;
  90. else Result.TransferMode = tmAutomatic;
  91. Result.AsciiFileMask.Masks = AsciiFileMaskCombo->Text;
  92. if (!Result.AsciiFileMask.IsValid()) Result.AsciiFileMask.Masks = FOrigMasks;
  93. if (CCLowerCaseButton->Checked) Result.FileNameCase = ncLowerCase;
  94. else
  95. if (CCUpperCaseButton->Checked) Result.FileNameCase = ncUpperCase;
  96. else
  97. if (CCFirstUpperCaseButton->Checked) Result.FileNameCase = ncFirstUpperCase;
  98. else
  99. if (CCLowerCaseShortButton->Checked) Result.FileNameCase = ncLowerCaseShort;
  100. else Result.FileNameCase = ncNoChange;
  101. Result.ReplaceInvalidChars = ReplaceInvalidCharsCheck->Checked;
  102. Result.AddXToDirectories = FRightsFrame->AddXToDirectories;
  103. Result.Rights = FRightsFrame->Rights;
  104. Result.PreserveRights = PreserveRightsCheck->Checked;
  105. Result.IgnorePermErrors = IgnorePermErrorsCheck->Checked;
  106. Result.PreserveReadOnly = PreserveReadOnlyCheck->Checked;
  107. assert(PreserveTimeCheck);
  108. Result.PreserveTime = PreserveTimeCheck->Checked;
  109. Result.CalculateSize = CommonCalculateSizeCheck->Checked;
  110. Result.ExcludeFileMask.Masks = ExcludeFileMaskCombo->Text;
  111. Result.NegativeExclude = (NegativeExcludeCombo->ItemIndex == 1);
  112. Result.ClearArchive = ClearArchiveCheck->Checked;
  113. return Result;
  114. }
  115. //---------------------------------------------------------------------------
  116. TCheckBox * __fastcall TCopyParamsFrame::GetPreserveTimeCheck()
  117. {
  118. switch (Direction) {
  119. case pdToRemote: return RemotePreserveTimeCheck;
  120. case pdToLocal: return LocalPreserveTimeCheck;
  121. case pdBoth:
  122. default: return CommonPreserveTimestampCheck;
  123. }
  124. }
  125. //---------------------------------------------------------------------------
  126. void __fastcall TCopyParamsFrame::UpdateControls()
  127. {
  128. EnableControl(CommonPropertiesGroup, FLAGCLEAR(CopyParamAttrs, cpaExcludeMaskOnly) && Enabled);
  129. EnableControl(LocalPropertiesGroup, FLAGCLEAR(CopyParamAttrs, cpaExcludeMaskOnly) && Enabled);
  130. EnableControl(RemotePropertiesGroup, FLAGCLEAR(CopyParamAttrs, cpaExcludeMaskOnly) && Enabled);
  131. EnableControl(TransferModeGroup,
  132. FLAGCLEAR(CopyParamAttrs, cpaNoTransferMode) &&
  133. FLAGCLEAR(CopyParamAttrs, cpaExcludeMaskOnly) && Enabled);
  134. EnableControl(AsciiFileMaskLabel,
  135. TransferModeGroup->Enabled && TMAutomaticButton->Checked);
  136. EnableControl(AsciiFileMaskCombo,
  137. TransferModeGroup->Enabled && TMAutomaticButton->Checked);
  138. EnableControl(PreserveRightsCheck, FLAGCLEAR(CopyParamAttrs, cpaExcludeMaskOnly) &&
  139. FLAGCLEAR(CopyParamAttrs, cpaNoRights) && Enabled);
  140. EnableControl(RightsEdit, PreserveRightsCheck->Checked &&
  141. PreserveRightsCheck->Enabled);
  142. EnableControl(FRightsFrame, RightsEdit->Enabled);
  143. EnableControl(PreserveReadOnlyCheck, FLAGCLEAR(CopyParamAttrs, cpaExcludeMaskOnly) &&
  144. FLAGCLEAR(CopyParamAttrs, cpaNoPreserveReadOnly) && Enabled);
  145. EnableControl(ExcludeFileMaskCombo,
  146. (FLAGCLEAR(CopyParamAttrs, cpaNoExcludeMask) ||
  147. FLAGSET(CopyParamAttrs, cpaExcludeMaskOnly)) &&
  148. Enabled);
  149. EnableControl(ExclusionFileMaskLabel, ExcludeFileMaskCombo->Enabled);
  150. EnableControl(NegativeExcludeCombo, ExcludeFileMaskCombo->Enabled);
  151. EnableControl(ClearArchiveCheck, FLAGCLEAR(CopyParamAttrs, cpaNoClearArchive) &&
  152. FLAGCLEAR(CopyParamAttrs, cpaExcludeMaskOnly) && Enabled);
  153. EnableControl(PreserveTimeCheck, FLAGCLEAR(CopyParamAttrs, cpaNoPreserveTime) &&
  154. FLAGCLEAR(CopyParamAttrs, cpaExcludeMaskOnly) && Enabled);
  155. EnableControl(ChangeCaseGroup, FLAGCLEAR(CopyParamAttrs, cpaExcludeMaskOnly) && Enabled);
  156. EnableControl(IgnorePermErrorsCheck,
  157. ((PreserveRightsCheck->Enabled && PreserveRightsCheck->Checked) ||
  158. (PreserveTimeCheck->Enabled && PreserveTimeCheck->Checked)) &&
  159. FLAGCLEAR(CopyParamAttrs, cpaNoIgnorePermErrors) &&
  160. FLAGCLEAR(CopyParamAttrs, cpaExcludeMaskOnly));
  161. }
  162. //---------------------------------------------------------------------------
  163. void __fastcall TCopyParamsFrame::SetDirection(TParamsForDirection value)
  164. {
  165. if (Direction != value)
  166. {
  167. Boolean APreserveTime = PreserveTimeCheck->Checked;
  168. FDirection = value;
  169. PreserveTimeCheck->Checked = APreserveTime;
  170. LocalPropertiesGroup->Visible = (Direction == pdToLocal || Direction == pdAll );
  171. RemotePropertiesGroup->Visible = (Direction == pdToRemote || Direction == pdAll );
  172. CommonPropertiesGroup->Visible = (Direction == pdBoth || Direction == pdAll );
  173. LocalPreserveTimeCheck->Visible = (Direction != pdAll);
  174. RemotePreserveTimeCheck->Visible = (Direction != pdAll);
  175. ReplaceInvalidCharsCheck->Visible =
  176. (Direction == pdToLocal || Direction == pdBoth || Direction == pdAll);
  177. CCFirstUpperCaseButton->Visible =
  178. (Direction == pdToLocal || Direction == pdToRemote);
  179. CCLowerCaseShortButton->Visible =
  180. (Direction == pdToRemote || Direction == pdBoth || Direction == pdAll);
  181. if (Direction == pdBoth || Direction == pdAll)
  182. {
  183. CCLowerCaseShortButton->Top = CCFirstUpperCaseButton->Top;
  184. IgnorePermErrorsCheck->Top = RemotePreserveTimeCheck->Top;
  185. }
  186. else
  187. {
  188. CCLowerCaseShortButton->Top = ReplaceInvalidCharsCheck->Top;
  189. IgnorePermErrorsCheck->Top = CCFirstUpperCaseButton->Top;
  190. }
  191. UpdateControls();
  192. }
  193. }
  194. //---------------------------------------------------------------------------
  195. void __fastcall TCopyParamsFrame::ControlChange(TObject * /*Sender*/)
  196. {
  197. UpdateControls();
  198. }
  199. //---------------------------------------------------------------------------
  200. void __fastcall TCopyParamsFrame::BeforeExecute()
  201. {
  202. // adding TRightsFrame on run-time corrupts the tab order, fix it
  203. TransferModeGroup->TabOrder = 0;
  204. assert(CustomWinConfiguration);
  205. AsciiFileMaskCombo->Items = CustomWinConfiguration->History["Mask"];
  206. ExcludeFileMaskCombo->Items = CustomWinConfiguration->History["ExcludeMask"];
  207. }
  208. //---------------------------------------------------------------------------
  209. void __fastcall TCopyParamsFrame::AfterExecute()
  210. {
  211. assert(CustomWinConfiguration);
  212. AsciiFileMaskCombo->SaveToHistory();
  213. CustomWinConfiguration->History["Mask"] = AsciiFileMaskCombo->Items;
  214. ExcludeFileMaskCombo->SaveToHistory();
  215. CustomWinConfiguration->History["ExcludeMask"] = ExcludeFileMaskCombo->Items;
  216. }
  217. //---------------------------------------------------------------------------
  218. void __fastcall TCopyParamsFrame::SetCopyParamAttrs(int value)
  219. {
  220. FCopyParamAttrs = value;
  221. UpdateControls();
  222. }
  223. //---------------------------------------------------------------------------
  224. void __fastcall TCopyParamsFrame::SetEnabled(Boolean Value)
  225. {
  226. TFrame::SetEnabled(Value);
  227. UpdateControls();
  228. }
  229. //---------------------------------------------------------------------------
  230. void __fastcall TCopyParamsFrame::ValidateMaskComboExit(TObject * Sender)
  231. {
  232. ValidateMaskEdit(dynamic_cast<TComboBox*>(Sender));
  233. }
  234. //---------------------------------------------------------------------------
  235. void __fastcall TCopyParamsFrame::RightsEditButtonClick(TObject * Sender)
  236. {
  237. if (!FRightsFrame->Visible)
  238. {
  239. // validate input before showing the popup
  240. RightsEditExit(Sender);
  241. FRightsFrame->DropDown();
  242. }
  243. else
  244. {
  245. FRightsFrame->CloseUp();
  246. }
  247. }
  248. //---------------------------------------------------------------------------
  249. void __fastcall TCopyParamsFrame::RightsFrameChange(TObject * /*Sender*/)
  250. {
  251. RightsEdit->Text = FRightsFrame->Text;
  252. RightsEdit->Modified = false;
  253. RightsEdit->SelectAll();
  254. }
  255. //---------------------------------------------------------------------------
  256. void __fastcall TCopyParamsFrame::UpdateRightsByStr()
  257. {
  258. if (!RightsEdit->Text.IsEmpty())
  259. {
  260. FRightsFrame->Text = RightsEdit->Text;
  261. // change handler may not be called if the rights were not actually changed,
  262. // but we want to normalize the user-entered information anyway
  263. RightsFrameChange(NULL);
  264. }
  265. UpdateControls();
  266. RightsEdit->Modified = false;
  267. }
  268. //---------------------------------------------------------------------------
  269. void __fastcall TCopyParamsFrame::RightsEditExit(TObject * /*Sender*/)
  270. {
  271. if (RightsEdit->Modified)
  272. {
  273. try
  274. {
  275. UpdateRightsByStr();
  276. }
  277. catch(...)
  278. {
  279. RightsEdit->SelectAll();
  280. RightsEdit->SetFocus();
  281. throw;
  282. }
  283. }
  284. }
  285. //---------------------------------------------------------------------------
  286. void __fastcall TCopyParamsFrame::RightsEditContextPopup(TObject * Sender,
  287. TPoint & MousePos, bool & Handled)
  288. {
  289. MenuPopup(Sender, MousePos, Handled);
  290. }
  291. //---------------------------------------------------------------------------