CopyParams.cpp 13 KB

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