wmreports.pp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. unit wmreports;
  2. {$mode objfpc}
  3. {$H+}
  4. {$I demos.inc}
  5. {$IFDEF ExportHTML}
  6. {$DEFINE HTMLHELPERS}
  7. {$ENDIF}
  8. {$IFDEF ExportFPIMAGE}
  9. {$DEFINE HTMLHELPERS}
  10. {$ENDIF}
  11. interface
  12. uses
  13. Classes, SysUtils, httpdefs, fphttp, fpreport, httproute;
  14. Type
  15. { TGenerateReportModule }
  16. TGenerateReportModule = class(TCustomHTTPModule)
  17. Private
  18. Public
  19. Procedure HandleRequest(ARequest: TRequest; AResponse: TResponse); override;
  20. end;
  21. { TPageReportModule }
  22. TPageReportModule = class(TCustomHTTPModule,IRouteInterface)
  23. private
  24. prefix: string;
  25. L : TStrings;
  26. procedure AddCb(const N, aLabel: String);
  27. procedure AddColor(const N, aLabel: String);
  28. procedure AddCombo(const N, aLabel: String; AValues: array of String);
  29. procedure AddConfigureFramePage;
  30. procedure AddConfigurePageNavigator;
  31. procedure AddConfigureTOCPage;
  32. procedure AddEdit(const N, aLabel: String);
  33. procedure AddNumber(const N, aLabel: String);
  34. Procedure AddPDFOptions;
  35. Procedure AddHTMLOptions;
  36. Procedure AddFPImageOptions;
  37. procedure AddStyleEmbedding;
  38. Public
  39. Procedure HandleRequest(ARequest: TRequest; AResponse: TResponse); override;
  40. end;
  41. { TViewReportModule }
  42. TViewReportModule = class(TCustomHTTPModule)
  43. Public
  44. Procedure HandleRequest(ARequest: TRequest; AResponse: TResponse); override;
  45. end;
  46. { TReportListModule }
  47. TReportListModule = class(TCustomHTTPModule)
  48. Public
  49. Procedure HandleRequest(ARequest: TRequest; AResponse: TResponse); override;
  50. end;
  51. procedure ShowPage(ARequest : TRequest; AResponse : TResponse);
  52. implementation
  53. uses
  54. udapp,
  55. {$IFDEF HTMLHELPERS}
  56. fpreporthtmlutil, fpimage,
  57. {$ENDIF}
  58. {$IFDEF ExportFPImage}
  59. fpreportfpimageexport,
  60. {$ENDIF}
  61. {$IFDEF ExportHTML}
  62. fpreporthtmlexport,
  63. {$ENDIF}
  64. {$IFDEF ExportPDF}
  65. fppdf,
  66. fpreportpdfexport,
  67. {$ENDIF}
  68. fpjson,
  69. fpjsonreport,
  70. fpmimetypes;
  71. Type
  72. { TReportConfigurator }
  73. TReportConfigurator = Class
  74. Private
  75. FStartFileName: String;
  76. FVars: TStrings;
  77. Function GetVar(S : String; ADefault : String = '') : String;
  78. Function GetBoolean(S : String) : Boolean;
  79. Function GetInteger(S : String; aDefault: integer) : Integer;
  80. {$IFDEF HTMLHELPERS}
  81. Procedure ConfigureTOCPage(Prefix : String; aTOCPage : TTOCPageOptions);
  82. Procedure ConfigureFramePage(Prefix : String; aFramePage : TFramePageOptions);
  83. Procedure ConfigurePageNavigator(Prefix : String; aPageNavigator : TPageNavigatorOptions);
  84. {$ENDIF}
  85. {$IFDEF ExportHTML}
  86. procedure ConfigHTMLExporter(Exporter: TFPReportExportHTML);
  87. {$ENDIF}
  88. {$IFDEF ExportFPImage}
  89. procedure ConfigImageExporter(Exporter: TFPReportExportFPImage);
  90. {$ENDIF}
  91. {$IFDEF ExportPDF}
  92. procedure ConfigPDFExporter(Exporter: TFPReportExportPDF);
  93. {$ENDIF}
  94. Public
  95. Constructor Create(AVar : TStrings);
  96. Procedure ConfigReport(Sender : TObject; Exporter : TFPReportExporter);
  97. Property StartFileName : String Read FStartFileName Write FStartFileName;
  98. end;
  99. Var Counter : Integer;
  100. { TReportListModule }
  101. procedure TReportListModule.HandleRequest(ARequest: TRequest; AResponse: TResponse);
  102. Var
  103. O : TJSONObject;
  104. A : TJSONArray;
  105. L : TStrings;
  106. I : integer;
  107. R : TReportDef;
  108. S,D : String;
  109. begin
  110. L:=Nil;
  111. A:=Nil;
  112. O:=TJSONObject.Create();
  113. try
  114. A:=TJSONArray.Create;
  115. O.Add('data',A);
  116. L:=TStringList.Create;
  117. TReportDemoApplication.GetRegisteredReports(L);
  118. For I:=0 to L.Count-1 do
  119. begin
  120. R:=TReportDef(L.Objects[i]);
  121. D:=R.ReportClass.Description;
  122. S:=L[i];
  123. if D='' then D:=S;
  124. A.Add(TJSONObject.Create(['name',S,'description',D]));
  125. end;
  126. AResponse.ContentType:='application/json';
  127. AResponse.Content:=O.AsJSON;
  128. AResponse.ContentLength:=Length(AResponse.Content);
  129. AResponse.SendContent;
  130. finally
  131. L.Free;
  132. O.Free;
  133. end;
  134. end;
  135. { TViewReportModule }
  136. procedure TViewReportModule.HandleRequest(ARequest: TRequest;
  137. AResponse: TResponse);
  138. Var
  139. FN,TFN : String;
  140. begin
  141. FN:=ARequest.PathInfo;
  142. if (FN<>'') and (FN[1]='/') then
  143. Delete(FN,1,1);
  144. Delete(FN,1,Pos('/',FN)); // Strip /View
  145. TFN:=GetTempDir+FN;
  146. If FileExists(TFN) then
  147. begin
  148. AResponse.ContentStream:=TFileStream.Create(GetTempDir+FN,fmOpenRead or fmShareDenyWrite);
  149. AResponse.FreeContentStream:=True;
  150. case lowercase(extractfileext(FN)) of
  151. '.png': AResponse.ContentType:='image/png';
  152. '.pdf' : AResponse.ContentType:='application/pdf';
  153. '.html' : AResponse.ContentType:='text/html';
  154. end;
  155. end
  156. else
  157. begin
  158. AResponse.Code:=404;
  159. AResponse.CodeText:='Not found';
  160. AResponse.Content:='File '+FN+' not found';
  161. AResponse.SendResponse;
  162. end;
  163. end;
  164. { TReportConfigurator }
  165. constructor TReportConfigurator.Create(AVar: TStrings);
  166. begin
  167. FVars:=AVar;
  168. end;
  169. procedure TReportConfigurator.ConfigReport(Sender: TObject; Exporter: TFPReportExporter);
  170. begin
  171. {$IFDEF ExportHTML}
  172. if (Exporter is TFPReportExportHTML) then
  173. ConfigHTMLExporter(Exporter as TFPReportExportHTML);
  174. {$ENDIF}
  175. {$IFDEF ExportFPImage}
  176. if (Exporter is TFPReportExportFPImage) then
  177. ConfigImageExporter(Exporter as TFPReportExportfpImage);
  178. {$ENDIF}
  179. {$IFDEF ExportPDF}
  180. if (Exporter is TFPReportExportPDF) then
  181. ConfigPDFExporter(Exporter as TFPReportExportPDF);
  182. {$ENDIF}
  183. end;
  184. function TReportConfigurator.GetVar(S: String; ADefault: String): String;
  185. begin
  186. Result:=FVars.Values[S];
  187. if (Result='') and (FVars.IndexOfName(S)=-1) then
  188. Result:=ADefault;
  189. end;
  190. function TReportConfigurator.GetInteger(S: String; aDefault: integer): Integer;
  191. begin
  192. Result:=StrToIntDef(GetVar(S),aDefault);
  193. end;
  194. function TReportConfigurator.GetBoolean(S: String): Boolean;
  195. Var
  196. v : String;
  197. begin
  198. v:=LowerCase(GetVar(S));
  199. Result:=(v<>'') and ((v='1') or (v='t') or (v='true') or (v='y') or (v='yes'));
  200. end;
  201. {$IFDEF HTMLHELPERS}
  202. procedure TReportConfigurator.ConfigureTOCPage(Prefix: String; aTOCPage: TTOCPageOptions);
  203. begin
  204. With aTOCPage do
  205. begin
  206. // We don't allow this Property FileName : string read FFileName write FFileName;
  207. CSSFileName:=GetVar(Prefix+'toccssfilename',CSSFileName);
  208. OddPageStyle:=GetVar(Prefix+'oddpagestyle',OddPageStyle);
  209. EvenPageStyle:=GetVar(Prefix+'evenpagestyle',EvenPageStyle);
  210. SkipStyling:=GetBoolean(Prefix+'skipstyling');
  211. end;
  212. end;
  213. procedure TReportConfigurator.ConfigureFramePage(Prefix: String; aFramePage: TFramePageOptions);
  214. begin
  215. With aFramePage do
  216. begin
  217. // We do not allow setting Frame page filename.
  218. // Frame page CSS filename. If empty, no <link> is added. Relative to CSSDir
  219. CSSFileName:=GetVar(Prefix+'framecssfilename',CSSFileName);
  220. TOCZoneSize:=GetInteger(Prefix+'toczonesize',TOCZoneSize);
  221. Case lowerCase(prefix+'toczoneposition') of
  222. 'right': TOCZonePosition:=tpRight;
  223. 'top' : TOCZonePosition:=tpTop;
  224. 'bottom': TOCZonePosition:=tpBottom;
  225. else
  226. TOCZonePosition:=tpLeft;
  227. end;
  228. end;
  229. end;
  230. Function RGBTripleToColor(AColor : TFPColor) : Cardinal;
  231. Function BS(C : Word; Sh : Byte) : Cardinal;
  232. begin
  233. Result:=C shr 8;
  234. If (Sh<>0) then
  235. Result:=Result shl SH
  236. end;
  237. begin
  238. Result:=BS(AColor.blue,0) or BS(AColor.Green,8) or BS(AColor.Red,16) or BS(AColor.alpha,24);
  239. end;
  240. procedure TReportConfigurator.ConfigurePageNavigator(Prefix: String; aPageNavigator: TPageNavigatorOptions);
  241. Var
  242. NP : TNavigatorPositions;
  243. NO : THTMLNavigatorOptions;
  244. S: String;
  245. Procedure MaybeAdd(aVar : String; aOption: TNavigatorPosition);
  246. begin
  247. If GetBoolean(Prefix+'nav'+aVar) then
  248. Include(NP,aOption);
  249. end;
  250. Procedure MaybeAdd(aVar : String; aOption: THTMLNavigatorOption);
  251. begin
  252. If GetBoolean(Prefix+aVar) then
  253. Include(NO,aOption);
  254. end;
  255. begin
  256. NP:=[];
  257. MaybeAdd('topnavigator',npTop);
  258. MaybeAdd('leftnavigator',npLeft);
  259. MaybeAdd('rightnavigator',npRight);
  260. MaybeAdd('bottomnavigator',npBottom);
  261. NO:=[];
  262. MaybeAdd('firstlast',hnoFirstLast);
  263. MaybeAdd('alwaysfirstlast',hnoAlwaysFirstLast);
  264. MaybeAdd('pageno',hnoPageNo);
  265. MaybeAdd('image',hnoImage);
  266. MaybeAdd('skipstyling',hnoSkipStyling);
  267. MaybeAdd('usepagenofm',hnoUsePageNOfM);
  268. MaybeAdd('pagenoedit',hnoPageNoEdit);
  269. With APageNavigator do
  270. begin
  271. if (NP<>[]) then
  272. Positions:=NP;
  273. if (NO<>[]) then
  274. Options:=NO;
  275. FixedWidth:=GetInteger(Prefix+'navigatorfixedwidth',FixedWidth);
  276. FixedHeight:=GetInteger(Prefix+'navigatorfixedheight',FixedHeight);
  277. FixedMargin:=GetInteger(Prefix+'navigatorfixedmargin',FixedMargin);
  278. S:=GetVar(Prefix+'navigatorbgcolor');
  279. if (S<>'') then
  280. ActiveBGColor:= RGBTripleToColor(HtmlToFpColor(S));
  281. S:=GetVar(Prefix+'navigatorinactivebgcolor');
  282. if (S<>'') then
  283. InActiveBGColor:= RGBTripleToColor(HtmlToFpColor(S));
  284. end;
  285. end;
  286. {$ENDIF}
  287. {$IFDEF ExportHTML}
  288. procedure TReportConfigurator.ConfigHTMLExporter(Exporter : TFPReportExportHTML);
  289. Const
  290. Prefix = 'html.';
  291. Var
  292. O : THTMLExportOptions;
  293. Procedure MaybeAdd(aVar : String; aOption: THTMLExportOption);
  294. begin
  295. If GetBoolean(Prefix+aVar) then
  296. Include(O,aOption);
  297. end;
  298. begin
  299. O:=[heoTOCPage];
  300. MaybeAdd('fixedpositioning',heoFixedPositioning);
  301. MaybeAdd('inlineimage',heoInlineImage);
  302. MaybeAdd('useimgtag',heoUseIMGtag);
  303. MaybeAdd('tocpageframe',heoTOCPageFrame);
  304. MaybeAdd('memoasis',heoMemoAsIs);
  305. MaybeAdd('externaljs',heoExternalJS);
  306. Exporter.Options:=O;
  307. Exporter.DPI:=GetInteger(Prefix+'DPI',Exporter.DPI);
  308. Exporter.SequenceFormat:=GetVar(Prefix+'sequence',Exporter.SequenceFormat);
  309. Case LowerCase(GetVar(Prefix+'styleembedding')) of
  310. 'styletag' : Exporter.StyleEmbedding:=seStyleTag;
  311. 'cssfile' : Exporter.StyleEmbedding:=seCSSFile;
  312. else
  313. Exporter.StyleEmbedding:=seInline;
  314. end;
  315. Exporter.FixedOffset.Top:=GetInteger('offsettop',Exporter.FixedOffset.Top);
  316. Exporter.FixedOffset.Left:=GetInteger('offsetleft',Exporter.FixedOffset.Left);
  317. ConfigureTOCPage(Prefix,Exporter.TOCPage);
  318. ConfigureFramePage(Prefix,Exporter.FramePage);
  319. ConfigurePageNavigator(Prefix,Exporter.PageNavigator);
  320. StartFileName:='index.html';
  321. end;
  322. {$ENDIF}
  323. {$IFDEF ExportFPImage}
  324. procedure TReportConfigurator.ConfigImageExporter(Exporter : TFPReportExportFPImage);
  325. Const
  326. Prefix = 'image.';
  327. Var
  328. HO : THTMLOptions;
  329. begin
  330. HO:=[hoEnabled,hoTOCPage];
  331. if GetBoolean(Prefix+'useframes') then
  332. Include(HO,hoFramePage);
  333. if GetBoolean(Prefix+'externaljs') then
  334. Include(HO,hoExternalJS);
  335. Exporter.HTMLOptions:=HO;
  336. Exporter.DPI:=GetInteger(Prefix+'DPI',Exporter.DPI);
  337. Exporter.SequenceFormat:=GetVar(Prefix+'sequence',Exporter.SequenceFormat);
  338. Case LowerCase(GetVar(Prefix+'styleembedding')) of
  339. 'styletag' : Exporter.StyleEmbedding:=seStyleTag;
  340. 'cssfile' : Exporter.StyleEmbedding:=seCSSFile;
  341. else
  342. Exporter.StyleEmbedding:=seInline;
  343. end;
  344. ConfigureTOCPage(Prefix,Exporter.TOCPage);
  345. ConfigureFramePage(Prefix,Exporter.FramePage);
  346. ConfigurePageNavigator(Prefix,Exporter.PageNavigator);
  347. StartFileName:='index.html';
  348. end;
  349. {$ENDIF}
  350. {$IFDEF ExportPDF}
  351. procedure TReportConfigurator.ConfigPDFExporter(Exporter: TFPReportExportPDF);
  352. Const
  353. Prefix = 'pdf.';
  354. Var
  355. O : TPDFOptions;
  356. Procedure MaybeAdd(aVar : String; aOption: TPDFOption);
  357. begin
  358. If GetBoolean(Prefix+aVar) then
  359. Include(O,aOption);
  360. end;
  361. begin
  362. Exporter.AutoSave:=True;
  363. O:=[];
  364. MaybeAdd('pagelayout',poOutLine);
  365. MaybeAdd('compresstext',poCompressText);
  366. MaybeAdd('compressfonts',poCompressFonts);
  367. MaybeAdd('compressimages',poCompressImages);
  368. MaybeAdd('userawjpeg',poUseRawJPEG);
  369. MaybeAdd('noembeddedfonts',poNoEmbeddedFonts);
  370. MaybeAdd('pageoriginattop',poPageOriginAtTop);
  371. MaybeAdd('subsetfont',poSubsetFont);
  372. Exporter.Options:=O;
  373. Case GetVar(Prefix+'pagelayout') of
  374. 'two': Exporter.PageLayout:=lTwo;
  375. 'continuous' : Exporter.PageLayout:=lContinuous;
  376. else
  377. Exporter.PageLayout:=lSingle;
  378. end;
  379. end;
  380. {$ENDIF}
  381. { TGenerateReportModule }
  382. procedure TGenerateReportModule.HandleRequest(ARequest: TRequest;
  383. AResponse: TResponse);
  384. Var
  385. F,D,FN : String;
  386. Conf : TReportConfigurator;
  387. Fmt : TRenderFormat;
  388. FRunner : TReportRunner;
  389. RC : TFPReportExporterClass;
  390. Flds : TStrings;
  391. begin
  392. if SameText(ARequest.Method,'GET') then
  393. flds:=ARequest.QueryFields
  394. else
  395. flds:=ARequest.ContentFields;
  396. // flds.SaveToFile('/tmp/vars.txt');
  397. D:=Flds.Values['demo'];
  398. if (D='') or (TReportDemoApplication.GetReportClass(D)=Nil) then
  399. Raise Exception.CreateFmt('Invalid or empty demo name : "%s"',[D]);
  400. F:=flds.Values['format'];
  401. Fmt:=High(TRenderFormat);
  402. While (fmt>rfDefault) and (CompareText(TReportDemoApplication.FormatName(fmt),F)<>0) do
  403. fmt:=Pred(fmt);
  404. if (fmt=rfDefault) then
  405. Raise Exception.CreateFmt('Invalid or empty format name : "%s"',[F]);
  406. FRunner:=TReportRunner.Create(Self);
  407. FRunner.Location:=ExtractFilePath(ParamStr(0));;
  408. FRunner.ReportApp:=TReportDemoApplication.GetReportClass(D).Create(Self);
  409. FRunner.ReportApp.rpt:=TFPJSONReport.Create(FRunner.ReportApp);
  410. FRunner.Format:=Fmt ;
  411. FRunner.location:=ExtractFilePath(ParamStr(0));
  412. RC:=TReportDemoApplication.GetRenderClass(Fmt);
  413. Inc(Counter);
  414. FN:=D+IntToStr(Counter);
  415. FN:=FN+PathDelim+FN+RC.DefaultExtension;
  416. FRunner.BaseOutputFileName:=GetTempDir+FN;
  417. Conf:= TReportConfigurator.Create(flds);
  418. Try
  419. FRunner.OnInitExporter:[email protected];
  420. FRunner.Execute;
  421. if (Conf.StartFileName<>'') then
  422. FN:=ExtractFilePath(FN)+Conf.StartFileName;
  423. Finally
  424. Conf.Free;
  425. end;
  426. AResponse.SendRedirect('../View/'+FN);
  427. end;
  428. { TPageReportModule }
  429. procedure TPageReportModule.AddCb(Const N,aLabel: String);
  430. begin
  431. L.Add(Format('<INPUT TYPE="CHECKBOX" id="CB%s" name="%s" value="1">%s<BR>',[Prefix+N,Prefix+N,aLabel]));
  432. end;
  433. procedure TPageReportModule.AddCombo(Const N,aLabel: String; AValues : Array of String);
  434. Var
  435. I : Integer;
  436. begin
  437. L.Add(aLabel+':&nbsp;&nbsp;');
  438. L.Add(Format('<SELECT ID="CBX%s" NAME="%s">',[Prefix+N,Prefix+N]));
  439. I:=0;
  440. While I<Length(AValues)-1 do
  441. begin
  442. L.Add(Format('<OPTION value="%s">%s</option>',[AValues[i],AValues[i+1]]));
  443. Inc(I,2);
  444. end;
  445. L.Add('</SELECT>');
  446. L.Add('<BR>');
  447. end;
  448. procedure TPageReportModule.AddNumber(Const N,aLabel: String);
  449. begin
  450. L.Add(aLabel+':&nbsp;&nbsp;');
  451. L.Add(Format('<INPUT TYPE="NUMBER" id="NE%s" name="%s"><BR>',[Prefix+N,Prefix+N]));
  452. end;
  453. procedure TPageReportModule.AddColor(Const N,aLabel: String);
  454. begin
  455. L.Add(aLabel+':&nbsp;&nbsp;');
  456. L.Add(Format('<INPUT TYPE="Color" id="NC%s" name="%s"><BR>',[Prefix+N,Prefix+N]));
  457. end;
  458. procedure TPageReportModule.AddPDFOptions;
  459. begin
  460. L.Add('<H1>PDF options</H1>');
  461. prefix:='pdf.';
  462. AddCB('pagelayout','Create outLine');
  463. AddCB('compresstext','Compress text');
  464. AddCB('compressfonts','Compress fonts');
  465. AddCB('compressimages','Compress images');
  466. AddCB('userawjpeg','use raw JPEG');
  467. AddCB('noembeddedfonts','Do not embed fonts');
  468. AddCB('pageoriginattop','Page origin at top');
  469. AddCB('subsetfont','Embed only used subset of font');
  470. L.Add('Page layout:<p>');
  471. AddCombo('pagelayout','Page layout',['single','Single page','two','Two pages','continuous','Continuous layout']);
  472. end;
  473. procedure TPageReportModule.AddStyleEmbedding;
  474. begin
  475. AddCombo('styleembedding','Style embedding',[
  476. 'inline','Inline, in HTML element',
  477. 'styletag','In separate style tag',
  478. 'cssfile','In separate CSS file'
  479. ]);
  480. end;
  481. procedure TPageReportModule.AddHTMLOptions;
  482. begin
  483. L.Add('<H1>HTML options</H1>');
  484. prefix:='html.';
  485. L.Add('<TABLE BORDER="1">');
  486. L.Add('<TR><TD valign="top">');
  487. L.Add('<H2>General options</H2>');
  488. AddCB('fixedpositioning','Use fixed positioning');
  489. AddCB('inlineimage','Use inline images');
  490. AddCB('useimgtag','Use IMG tag');
  491. AddCB('tocpageframe','Create TOC Frame');
  492. AddCB('memoasis','Insert memos as-is (let browser handle layout)');
  493. AddCB('externaljs','Use external file for JS');
  494. AddNumber('DPI','DPI (resolution)');
  495. AddEdit('sequence','Sequence format');
  496. AddStyleEmbedding;
  497. AddNumber('offsettop','Fixed positioning, offset from top');
  498. AddNumber('offsetleft','Fixed positioning, offset from left');
  499. AddConfigureTOCPage;
  500. AddConfigureFramePage;
  501. L.Add('</TD><TD valign="top">');
  502. AddConfigurePageNavigator;
  503. L.Add('</TD></TR>');
  504. L.Add('</TABLE>');
  505. end;
  506. procedure TPageReportModule.AddFPImageOptions;
  507. begin
  508. Prefix:='image.';
  509. L.Add('<H1>Image options</H1>');
  510. L.Add('<TABLE BORDER="1">');
  511. L.Add('<TR><TD valign="top">');
  512. L.Add('<H2>General options</H2>');
  513. AddCB('useframes','Use frames');
  514. AddCB('externaljs','Use external Javascript file');
  515. AddNumber('DPI','Image DPI');
  516. AddEdit('sequence','Page number sequence format');
  517. AddStyleEmbedding;
  518. AddConfigureTOCPage;
  519. AddConfigureFramePage;
  520. L.Add('</TD><TD valign="top">');
  521. AddConfigurePageNavigator;
  522. L.Add('</TD></TR>');
  523. L.Add('</TABLE>');
  524. end;
  525. procedure TPageReportModule.AddEdit(Const N,aLabel: String);
  526. begin
  527. L.Add(aLabel+':&nbsp;&nbsp;');
  528. L.Add(Format('<INPUT TYPE="EDIT" id="NE%s" name="%s"><BR>',[Prefix+N,Prefix+N]));
  529. end;
  530. procedure TPageReportModule.AddConfigureTOCPage;
  531. begin
  532. L.Add('<H2>TOC Page options:</H2>');
  533. AddEdit('toccssfilename','CSS file name');
  534. AddEdit('oddpagestyle','Odd page style elements');
  535. AddEdit('evenpagestyle','Even page style elements');
  536. AddCB('skipstyling','Skip Styling');
  537. end;
  538. procedure TPageReportModule.AddConfigureFramePage;
  539. begin
  540. L.Add('<H2>Frame options:</H2>');
  541. AddEdit('framecssfilename','CSS file name');
  542. AddNumber('toczonesize','TOC Zone size (percentage)');
  543. AddCombo('toczoneposition','Position of TOC zone',[
  544. 'left','Left',
  545. 'right', 'Right',
  546. 'top' , 'Top',
  547. 'bottom', 'Bottom'
  548. ])
  549. end;
  550. procedure TPageReportModule.AddConfigurePageNavigator;
  551. begin
  552. // L.Add('<DIV>');
  553. L.Add('<H2>Navigator</H2>');
  554. L.Add('<H3>Navigator positions:</H3>');
  555. AddCB('topnavigator','Top');
  556. AddCB('leftnavigator','Left');
  557. AddCB('rightnavigator','Right');
  558. AddCB('bottomnavigator','Bottom');
  559. L.Add('<H3>Navigator options:</H3>');
  560. AddCB('firstlast','Add First/Last buttons');
  561. AddCB('alwaysfirstlast','Always add First/Last buttons');
  562. AddCB('pageno','Add page number');
  563. AddCB('image','Use images (Not yet implemented)');
  564. AddCB('skipstyling','Skip all styling');
  565. AddCB('usepagenofm','Use Page N/M display');
  566. AddCB('pagenoedit','Allow page number editing');
  567. L.Add('<H3>Width/Color:</H3>');
  568. AddNumber('navigatorfixedwidth','Fixed width');
  569. AddNumber('navigatorfixedheight','Fixed height');
  570. AddNumber('navigatorfixedmargin','Fixed margin');
  571. AddColor('navigatorbgcolor','Active link color');
  572. AddColor('navigatorinactivebgcolor','Inactive link color');
  573. // L.Add('</DIV>');
  574. end;
  575. procedure TPageReportModule.HandleRequest(ARequest: TRequest;
  576. AResponse: TResponse);
  577. Var
  578. RL : TStrings;
  579. I : Integer;
  580. F : TRenderFormat;
  581. RC : TFPReportExporterClass;
  582. A : String;
  583. begin
  584. RL:=Nil;
  585. L:=TStringList.Create;
  586. try
  587. RL:=TStringList.Create;
  588. L.Add('<HTML><HEAD><TITLE>FPReport web demo</TITLE></HEAD>');
  589. L.Add('<BODY>');
  590. L.Add('<H1>Select report and output type</H1>');
  591. A:='/Generate';
  592. if Pos('/path',lowerCase(ARequest.PathInfo))<>0 then
  593. A:='..'+A;
  594. L.Add(Format('<FORM ACTION="%s" METHOD=POST>',[A]));
  595. L.Add('Report: ');
  596. L.Add('<SELECT NAME="demo">');
  597. //
  598. TReportDemoApplication.GetRegisteredReports(RL);
  599. For I:=0 to RL.Count-1 do
  600. L.Add('<OPTION>'+RL[i]+'</option>');
  601. L.Add('</SELECT>');
  602. L.Add('</p>');
  603. L.Add('Format: ');
  604. L.Add('<SELECT NAME="format">');
  605. for F in TRenderFormat do
  606. begin
  607. RC:=TReportDemoApplication.GetRenderClass(F);
  608. if (RC<>Nil) and (RC.DefaultExtension<>'') then
  609. L.Add('<OPTION>'+TReportDemoApplication.FormatName(F)+'</option>');
  610. end;
  611. L.Add('</SELECT>');
  612. L.Add('</p>');
  613. L.Add('<INPUT TYPE="Submit" Value="Generate"/>');
  614. L.Add('<HR>');
  615. AddPDFOptions;
  616. L.Add('<INPUT TYPE="Submit" Value="Generate"/>');
  617. L.Add('<HR>');
  618. AddHTMLOptions;
  619. L.Add('<INPUT TYPE="Submit" Value="Generate"/>');
  620. L.Add('<HR>');
  621. AddFPImageOptions;
  622. // Finish it off
  623. L.Add('<INPUT TYPE="Submit" Value="Generate"/>');
  624. L.Add('</FORM>');
  625. L.Add('</BODY>');
  626. L.Add('</HTML>');
  627. AResponse.Content:=L.Text;
  628. finally
  629. L.Free;
  630. end;
  631. end;
  632. procedure ShowPage(ARequest : TRequest; AResponse : TResponse);
  633. begin
  634. With TPageReportModule.CreateNew(Nil,0) do
  635. try
  636. HandleRequest(ARequest,AResponse);
  637. if Not AResponse.ContentSent then
  638. AResponse.SendContent;
  639. finally
  640. Free;
  641. end;
  642. end;
  643. end.