PageRenderTime 27ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/AfterDownload_ConditionForm.pas

http://dm-after-download.googlecode.com/
Pascal | 535 lines | 450 code | 38 blank | 47 comment | 57 complexity | 8d097985f610116687bc3bfe6fd1661b MD5 | raw file
  1. unit AfterDownload_ConditionForm;
  2. interface
  3. uses
  4. AfterDownload_Defines,
  5. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  6. Dialogs, StdCtrls, Buttons, Mask, JvExMask, JvToolEdit,
  7. JvGroupHeader, JvBaseDlg, JvSelectDirectory, JvBaseEdits, JvExControls;
  8. type
  9. TAD_ConditionForm = class(TForm)
  10. Label1: TLabel;
  11. BitBtn1: TBitBtn;
  12. BitBtn2: TBitBtn;
  13. CBX_Category: TComboBox;
  14. RB_Category: TRadioButton;
  15. RB_URL: TRadioButton;
  16. RB_Folder: TRadioButton;
  17. RB_Filename: TRadioButton;
  18. RB_SizeLT: TRadioButton;
  19. RB_SizeGT: TRadioButton;
  20. RB_SizeEQ: TRadioButton;
  21. FE: TJvFilenameEdit;
  22. RB_Flag: TRadioButton;
  23. RB_CategoryHas: TRadioButton;
  24. RB_Referer: TRadioButton;
  25. RB_Desc: TRadioButton;
  26. GH_Category: TJvGroupHeader;
  27. GH_Text: TJvGroupHeader;
  28. GH_Folder: TJvGroupHeader;
  29. GH_Size: TJvGroupHeader;
  30. GH_Special: TJvGroupHeader;
  31. CBX_Text: TComboBox;
  32. JSD_Folder: TJvSelectDirectory;
  33. CBX_Folder: TComboBox;
  34. SB_Folder: TSpeedButton;
  35. JCE_Size: TJvCalcEdit;
  36. SB_CompileRE: TSpeedButton;
  37. procedure BitBtn1Click(Sender: TObject);
  38. procedure BitBtn2Click(Sender: TObject);
  39. procedure FormCreate(Sender: TObject);
  40. procedure CBX_CategoryChange(Sender: TObject);
  41. procedure FEChange(Sender: TObject);
  42. procedure RB_CategoryClick(Sender: TObject);
  43. procedure RB_URLClick(Sender: TObject);
  44. procedure RB_FolderClick(Sender: TObject);
  45. procedure RB_FilenameClick(Sender: TObject);
  46. procedure RB_SizeLTClick(Sender: TObject);
  47. procedure RB_SizeGTClick(Sender: TObject);
  48. procedure RB_SizeEQClick(Sender: TObject);
  49. procedure RB_FlagClick(Sender: TObject);
  50. procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  51. procedure FormDestroy(Sender: TObject);
  52. procedure RB_CategoryHasClick(Sender: TObject);
  53. procedure CBX_TextChange(Sender: TObject);
  54. procedure RB_RefererClick(Sender: TObject);
  55. procedure RB_DescClick(Sender: TObject);
  56. procedure CBX_FolderChange(Sender: TObject);
  57. procedure SB_FolderClick(Sender: TObject);
  58. procedure JCE_SizeChange(Sender: TObject);
  59. procedure SB_CompileREClick(Sender: TObject);
  60. private
  61. { Private declarations }
  62. FCondition: Condition;
  63. procedure BitBtnClick(BitBtn: TBitBtn);
  64. procedure SetLanguage(language: String);
  65. procedure TranslateToo;
  66. procedure SetCondition(ACondition: Condition);
  67. procedure SetCategories;
  68. procedure CheckCondition(Other: Boolean = true);
  69. public
  70. { Public declarations }
  71. property Language: String write SetLanguage;
  72. property myCondition: Condition read FCondition write SetCondition;
  73. end;
  74. var
  75. AD_CF: TAD_ConditionForm = nil;
  76. implementation
  77. {$R *.dfm}
  78. uses
  79. gnugettext,
  80. Locales,
  81. RegExpr,
  82. Tokens;
  83. var
  84. CanSetCond: Boolean = true;
  85. procedure TAD_ConditionForm.BitBtnClick(BitBtn: TBitBtn);
  86. begin
  87. Self.ModalResult:=BitBtn.ModalResult;
  88. if not (fsModal in Self.FormState) then
  89. Self.Close;
  90. end;
  91. procedure TAD_ConditionForm.BitBtn1Click(Sender: TObject);
  92. begin
  93. BitBtnClick(BitBtn1);
  94. end;
  95. procedure TAD_ConditionForm.BitBtn2Click(Sender: TObject);
  96. begin
  97. BitBtnClick(BitBtn2);
  98. end;
  99. procedure TAD_ConditionForm.SetLanguage(language: String);
  100. begin
  101. TranslateForm(Self, Language, TranslateToo);
  102. end;
  103. procedure TAD_ConditionForm.TranslateToo;
  104. begin
  105. BitBtn2.Caption:=_('Cancel');
  106. end;
  107. procedure TAD_ConditionForm.SetCondition(ACondition: Condition);
  108. begin
  109. FCondition.Assign(ACondition);
  110. //
  111. CanSetCond:=false;
  112. CheckCondition(false);
  113. CanSetCond:=true;
  114. end;
  115. procedure TAD_ConditionForm.SetCategories;
  116. var
  117. i: Integer;
  118. begin
  119. CBX_Category.Items.Clear;
  120. for i:=0 to CatList.Count-1 do
  121. CBX_Category.Items.Add(CatList.ValueFromIndex[i]);
  122. end;
  123. procedure TAD_ConditionForm.FormCreate(Sender: TObject);
  124. begin
  125. TranslateComponent(Self);
  126. //
  127. FCondition:=Condition.Create(nil);
  128. //
  129. SetCategories;
  130. //
  131. CBX_Text.Sorted:=true;
  132. end;
  133. procedure TAD_ConditionForm.CheckCondition(Other: Boolean = true);
  134. var
  135. i: Integer;
  136. s: String;
  137. procedure SetEdit(Edit: TEdit; AText: String; Clear: Boolean = false);
  138. begin
  139. if Clear then
  140. Edit.Text:=''
  141. else
  142. Edit.Text:=AText;
  143. end;
  144. procedure SetCBX(CBX: TComboBox; AText: String; Clear: Boolean = false);
  145. var
  146. Index: Integer;
  147. begin
  148. if Clear then
  149. CBX.Text:=''
  150. else
  151. begin
  152. Index:=CBX.Items.IndexOf(AText);
  153. if Index<0 then
  154. CBX.Text:=AText
  155. else
  156. CBX.ItemIndex:=Index;
  157. CBX.Hint:=CBX.Text;
  158. end;
  159. end;
  160. begin
  161. RB_Category.Checked:=FCondition.CondType=cndCategory;
  162. RB_CategoryHas.Checked:=FCondition.CondType=cndCategoryHas;
  163. CBX_Category.Enabled:=RB_Category.Checked or RB_CategoryHas.Checked;
  164. if CBX_Category.Enabled then
  165. begin
  166. if Other then
  167. i:=0
  168. else
  169. begin
  170. i:=IndexOfValue(FCondition.Parameter, CatList);
  171. if i<0 then
  172. i:=0;
  173. end;
  174. CBX_Category.ItemIndex:=i;
  175. if i=0 then
  176. FCondition.Parameter:=CBX_Category.Text;
  177. end
  178. else
  179. CBX_Category.ItemIndex:=0;
  180. //
  181. CBX_Text.Items.Clear;
  182. CBX_Text.Enabled:=FCondition.CondType in [cndURL, cndFilename, cndReferer, cndDescription];
  183. SB_CompileRE.Enabled:=CBX_Text.Enabled;
  184. if not CBX_Text.Enabled then
  185. SetCBX(CBX_Text, '');
  186. //
  187. RB_URL.Checked:=FCondition.CondType=cndURL;
  188. //ShowMessage(FCondition.Parameter); //debug
  189. if RB_URL.Checked then
  190. begin
  191. //build list of urls
  192. Assert(Assigned(myInfo), 'INFO must be assigned!');
  193. for i:=0 to myInfo.Count-1 do
  194. begin
  195. s:=ExtractToken('url', myInfo.ValueFromIndex[i]);
  196. if s<>'' then
  197. begin
  198. if CBX_Text.Items.IndexOf(s)<0 then
  199. CBX_Text.Items.Add(s);
  200. end;
  201. end;
  202. //
  203. SetCBX(CBX_Text, FCondition.Parameter, Other)
  204. end;
  205. //
  206. RB_Folder.Checked:=FCondition.CondType=cndFolder;
  207. CBX_Folder.Enabled:=RB_Folder.Checked;
  208. SB_Folder.Enabled:=RB_Folder.Checked;
  209. if CBX_Folder.Enabled then
  210. begin
  211. CBX_Folder.Items.Clear;
  212. //build list of folders
  213. Assert(Assigned(myInfo), 'INFO must be assigned!');
  214. for i:=0 to myInfo.Count-1 do
  215. begin
  216. s:=IncludeTrailingPathDelimiter(ExtractFilePath(ExtractToken('saveto', myInfo.ValueFromIndex[i])));
  217. if s<>'' then
  218. begin
  219. if CBX_Folder.Items.IndexOf(s)<0 then
  220. CBX_Folder.Items.Add(s);
  221. end;
  222. end;
  223. //
  224. SetCBX(CBX_Folder, FCondition.Parameter, Other)
  225. end
  226. else
  227. SetCBX(CBX_Folder, '');
  228. //
  229. RB_Filename.Checked:=FCondition.CondType=cndFilename;
  230. if RB_Filename.Checked then
  231. begin
  232. //build list of filenames
  233. Assert(Assigned(myInfo), 'INFO must be assigned!');
  234. for i:=0 to myInfo.Count-1 do
  235. begin
  236. s:=ExtractFileName(ExtractToken('saveto', myInfo.ValueFromIndex[i]));
  237. if s<>'' then
  238. begin
  239. if CBX_Text.Items.IndexOf(s)<0 then
  240. CBX_Text.Items.Add(s);
  241. end;
  242. end;
  243. //
  244. SetCBX(CBX_Text, FCondition.Parameter, Other)
  245. end;
  246. //
  247. RB_Referer.Checked:=FCondition.CondType=cndReferer;
  248. if RB_Referer.Checked then
  249. begin
  250. //build list of referers
  251. Assert(Assigned(myInfo), 'INFO must be assigned!');
  252. for i:=0 to myInfo.Count-1 do
  253. begin
  254. s:=ExtractToken('referer', myInfo.ValueFromIndex[i]);
  255. if s<>'' then
  256. begin
  257. if CBX_Text.Items.IndexOf(s)<0 then
  258. CBX_Text.Items.Add(s);
  259. end;
  260. end;
  261. //
  262. SetCBX(CBX_Text, FCondition.Parameter, Other)
  263. end;
  264. //
  265. RB_Desc.Checked:=FCondition.CondType=cndDescription;
  266. if RB_Desc.Checked then
  267. begin
  268. //build list of descriptions
  269. Assert(Assigned(myInfo), 'INFO must be assigned!');
  270. for i:=0 to myInfo.Count-1 do
  271. begin
  272. s:=ExtractToken('description', myInfo.ValueFromIndex[i]);
  273. if s<>'' then
  274. begin
  275. if CBX_Text.Items.IndexOf(s)<0 then
  276. CBX_Text.Items.Add(s);
  277. end;
  278. end;
  279. //
  280. SetCBX(CBX_Text, FCondition.Parameter, Other)
  281. end;
  282. //
  283. RB_SizeLT.Checked:=FCondition.CondType=cndSizeLT;
  284. //RB_SizeLE.Checked:=FCondition.CondType=cndSizeLE;
  285. RB_SizeGT.Checked:=FCondition.CondType=cndSizeGT;
  286. //RB_SizeGE.Checked:=FCondition.CondType=cndSizeGE;
  287. RB_SizeEQ.Checked:=FCondition.CondType=cndSizeEQ;
  288. JCE_Size.Enabled:=FCondition.CondType in [cndSizeLT, cndSizeGT, cndSizeEQ];
  289. if JCE_Size.Enabled then
  290. JCE_Size.Value:=StrToIntDef(FCondition.Parameter, 0)
  291. else
  292. JCE_Size.Value:=0;
  293. //
  294. RB_Flag.Checked:=FCondition.CondType=cndFlagExists;
  295. //RB_FlagNo.Checked:=FCondition.CondType=cndFlagDontExists;
  296. FE.Enabled:=RB_Flag.Checked{ or RB_FlagNo.Checked};
  297. if FE.Enabled then
  298. begin
  299. if Other then
  300. FE.Text:=''
  301. else
  302. FE.Text:=FCondition.Parameter;
  303. end
  304. else
  305. FE.Text:='';
  306. end;
  307. procedure TAD_ConditionForm.CBX_CategoryChange(Sender: TObject);
  308. begin
  309. if CanSetCond then
  310. FCondition.Parameter:=CBX_Category.Text;
  311. end;
  312. procedure TAD_ConditionForm.FEChange(Sender: TObject);
  313. begin
  314. if CanSetCond then
  315. FCondition.Parameter:=FE.Text;
  316. end;
  317. procedure TAD_ConditionForm.RB_CategoryClick(Sender: TObject);
  318. begin
  319. if CanSetCond then
  320. begin
  321. FCondition.CondType:=cndCategory;
  322. CheckCondition();
  323. end;
  324. end;
  325. procedure TAD_ConditionForm.RB_URLClick(Sender: TObject);
  326. begin
  327. if CanSetCond then
  328. begin
  329. FCondition.CondType:=cndURL;
  330. CheckCondition();
  331. end;
  332. end;
  333. procedure TAD_ConditionForm.RB_FolderClick(Sender: TObject);
  334. begin
  335. if CanSetCond then
  336. begin
  337. FCondition.CondType:=cndFolder;
  338. CheckCondition();
  339. end;
  340. end;
  341. procedure TAD_ConditionForm.RB_FilenameClick(Sender: TObject);
  342. begin
  343. if CanSetCond then
  344. begin
  345. FCondition.CondType:=cndFilename;
  346. CheckCondition();
  347. end;
  348. end;
  349. procedure TAD_ConditionForm.RB_SizeLTClick(Sender: TObject);
  350. begin
  351. if CanSetCond then
  352. begin
  353. FCondition.CondType:=cndSizeLT;
  354. CheckCondition();
  355. end;
  356. end;
  357. procedure TAD_ConditionForm.RB_SizeGTClick(Sender: TObject);
  358. begin
  359. if CanSetCond then
  360. begin
  361. FCondition.CondType:=cndSizeGT;
  362. CheckCondition();
  363. end;
  364. end;
  365. procedure TAD_ConditionForm.RB_SizeEQClick(Sender: TObject);
  366. begin
  367. if CanSetCond then
  368. begin
  369. FCondition.CondType:=cndSizeEQ;
  370. CheckCondition();
  371. end;
  372. end;
  373. procedure TAD_ConditionForm.RB_FlagClick(Sender: TObject);
  374. begin
  375. if CanSetCond then
  376. begin
  377. FCondition.CondType:=cndFlagExists;
  378. CheckCondition();
  379. end;
  380. end;
  381. procedure TAD_ConditionForm.FormCloseQuery(Sender: TObject;
  382. var CanClose: Boolean);
  383. var
  384. //re: TRegExpr;
  385. //i: Integer;
  386. s: String;
  387. begin
  388. if ModalResult=mrOK then
  389. begin
  390. if FCondition.CondType=0 then
  391. begin
  392. MessageDlg(_('Please select type of condition!'), mtError, [mbOK], 0);
  393. CanClose:=false;
  394. Exit;
  395. end;
  396. if CBX_Text.Enabled then
  397. begin
  398. {
  399. re:=TRegExpr.Create;
  400. re.ModifierI:=true; //case insensitive search
  401. re.Expression:=CBX_Text.Text;
  402. try
  403. CanClose:=true;
  404. re.Compile;
  405. except
  406. CanClose:=false;
  407. ActiveControl:=CBX_Text;
  408. raise;
  409. end;
  410. FreeAndNil(re);
  411. }
  412. s:=CompileRE(CBX_Text.Text);
  413. if s<>'' then
  414. begin
  415. CanClose:=False;
  416. ActiveControl:=CBX_Text;
  417. MessageDlg(Format(_('Error in regular expression: %s'), [s]), mtError, [mbOK], 0);
  418. end;
  419. Exit;
  420. end;
  421. if JCE_Size.Enabled then
  422. begin
  423. if JCE_Size.AsInteger<0 then
  424. begin
  425. MessageDlg(_('Size value must be 0 or greater!'), mtError, [mbOK], 0);
  426. ActiveControl:=JCE_Size;
  427. CanClose:=false;
  428. Exit;
  429. end;
  430. end;
  431. //set external function flag
  432. FCondition.ExternalFlag:=FCondition.CondType=cndCategoryHas;
  433. end;
  434. end;
  435. procedure TAD_ConditionForm.FormDestroy(Sender: TObject);
  436. begin
  437. FreeAndNil(FCondition);
  438. end;
  439. procedure TAD_ConditionForm.RB_CategoryHasClick(Sender: TObject);
  440. begin
  441. if CanSetCond then
  442. begin
  443. FCondition.CondType:=cndCategoryHas;
  444. CheckCondition();
  445. end;
  446. end;
  447. procedure TAD_ConditionForm.CBX_TextChange(Sender: TObject);
  448. begin
  449. if CanSetCond then
  450. FCondition.Parameter:=CBX_Text.Text;
  451. end;
  452. procedure TAD_ConditionForm.RB_RefererClick(Sender: TObject);
  453. begin
  454. if CanSetCond then
  455. begin
  456. FCondition.CondType:=cndReferer;
  457. CheckCondition();
  458. end;
  459. end;
  460. procedure TAD_ConditionForm.RB_DescClick(Sender: TObject);
  461. begin
  462. if CanSetCond then
  463. begin
  464. FCondition.CondType:=cndDescription;
  465. CheckCondition();
  466. end;
  467. end;
  468. procedure TAD_ConditionForm.CBX_FolderChange(Sender: TObject);
  469. begin
  470. if CanSetCond then
  471. begin
  472. FCondition.Parameter:=IncludeTrailingPathDelimiter(CBX_Folder.Text);
  473. CBX_Folder.Hint:=CBX_Folder.Text;
  474. end;
  475. end;
  476. procedure TAD_ConditionForm.SB_FolderClick(Sender: TObject);
  477. begin
  478. //JSD_Folder.InitialDir:=CBX_Folder.Text;
  479. if JSD_Folder.Execute then
  480. CBX_Folder.Text:=JSD_Folder.Directory;
  481. end;
  482. procedure TAD_ConditionForm.JCE_SizeChange(Sender: TObject);
  483. begin
  484. if CanSetCond then
  485. FCondition.Parameter:=IntToStr(JCE_Size.AsInteger);
  486. end;
  487. procedure TAD_ConditionForm.SB_CompileREClick(Sender: TObject);
  488. var
  489. s: string;
  490. begin
  491. s:=CompileRE(CBX_Text.Text);
  492. if s='' then
  493. MessageDlg(Format(_('Regular expression is valid.'), [s]), mtInformation, [mbOK], 0)
  494. else
  495. MessageDlg(Format(_('Error in regular expression: %s'), [s]), mtError, [mbOK], 0);
  496. end;
  497. end.