wmreports.pp 20 KB

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