frmmain.pp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. unit frmmain;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, JS, Web;
  6. Type
  7. { TMainForm }
  8. TJSHTMLElementArray = Array of TJSHTMLElement;
  9. TFormStyle = (fsPlain,fsHorizontal,fsInline);
  10. TMainForm = Class(TComponent)
  11. private
  12. labelclassname,
  13. controlclassname,
  14. Prefix : String;
  15. FNavs : TJSHTMLElementArray;
  16. PTop : TJSHTMLElement;
  17. POptions : TJSHTMLElement;
  18. CBDemo : TJSHTMLSelectElement;
  19. CBFormat : TJSHTMLSelectElement;
  20. CBNewWindow : TJSHTMLInputElement;
  21. PPDFOptions : TJSHTMLElement;
  22. PHTMLOptions : TJSHTMLElement;
  23. PImageOptions : TJSHTMLElement;
  24. PTabs : TJSHTMLElementArray;
  25. ImageOptionsArr,
  26. PDFOptionsArr,
  27. HTMLOPtionsArr : TJSHTMLElementArray;
  28. function AddConfigureFramePage(aParent: TJSHTMLElement; AnArray: TJSHTMLElementArray; STartAt: integer): Integer;
  29. function AddConfigureTOCPage(aParent: TJSHTMLElement; AnArray: TJSHTMLElementArray; STartAt: integer): Integer;
  30. function AddConfigurePageNavigator(aParent: TJSHTMLElement; AnArray: TJSHTMLElementArray; STartAt: integer): Integer;
  31. function AddEdit(AParent: TJSHTMLElement; const AName, ALabel: String): TJSHTMLInputElement;
  32. procedure AddHTMLOptions(AParent: TJSHTMLElement);
  33. procedure AddImageOptions(AParent: TJSHTMLElement);
  34. procedure AddPDFOptions(AParent: TJSHTMLElement);
  35. function AddStyleEmbedding(AParent: TJSHTMLElement): TJSHTMLElement;
  36. function CreateTabSheet(Aparent: TJSHTMLElement; AIDName: String; IsActive: Boolean): TJSHTMLElement;
  37. function DemosLoaded(Event: TEventListenerEvent): boolean;
  38. function DoClick(aEvent: TJSMouseEvent): boolean;
  39. function DoNavClick(aEvent: TJSMouseEvent): boolean;
  40. procedure GetDemoList;
  41. procedure Getoptions(A: TJSHTMLElementArray; L: Tstrings);
  42. Protected
  43. Procedure ShowError(Msg : String);
  44. Function AddFormControl(AParent : TJSHTMLElement; Const AID,ALabel : String) : TJSHTMLElement;
  45. Public
  46. Function AddPanel(AParent : TJSHTMLElement; AHeader : String; AHeading : Integer = 0) : TJSHTMLElement;
  47. Function AddCheckBox(AParent : TJSHTMLElement; Const AName,ALabel : String; IsInline : Boolean = False) : TJSHTMLInputElement;
  48. Function AddNumber(AParent : TJSHTMLElement; Const AName,ALabel : String) : TJSHTMLInputElement;
  49. Function AddColor(AParent : TJSHTMLElement; Const AName,ALabel : String) : TJSHTMLInputElement;
  50. function AddCombo(AParent: TJSHTMLElement; const AName, ALabel: String; AValues: array of String): TJSHTMLSelectElement;
  51. // Element 0 is the container, 1+i are the tabs
  52. function AddNav(AParent: TJSHTMLElement; Tabs: array of string; AActive: String; AOnClick: THTMLClickEventHandler): TJSHTMLElementArray;
  53. Function AddForm(AParent : TJSHTMLElement; FormStyle : TFormStyle = fsPlain) : TJSHTMLFormElement;
  54. Constructor create(AOwner : TCOmponent); override;
  55. Procedure Initialize;
  56. end;
  57. implementation
  58. Const
  59. // ServerURL = 'http://localhost:8080/';
  60. ServerURL = '/';
  61. BaseURL = ServerURL + 'Generate?';
  62. { TMainForm }
  63. function TMainForm.DoNavClick(aEvent: TJSMouseEvent): boolean;
  64. Procedure ActivateTab(AID: string);
  65. Var
  66. I : Integer;
  67. E : TJSHTMLElement;
  68. begin
  69. For I:=1 to Length(FNavs)-1 do
  70. begin
  71. E:=FNavs[i];
  72. if E.id=AID then
  73. E.classlist.add('active')
  74. else
  75. E.classlist.remove('active');
  76. end;
  77. end;
  78. Procedure Activate(P : TJSHTMLElement);
  79. Var
  80. I : Integer;
  81. E : TJSHTMLElement;
  82. begin
  83. For I:=0 to Length(Ptabs)-1 do
  84. begin
  85. E:=PTabs[i];
  86. if E=P then
  87. begin
  88. E.classlist.add('active');
  89. E.classlist.add('in');
  90. end
  91. else
  92. begin
  93. E.classlist.remove('active');
  94. E.classlist.remove('in');
  95. end;
  96. end;
  97. end;
  98. Var
  99. tid : String;
  100. begin
  101. Result:=true;
  102. tid:=TJSElement(aEvent.CurrentTarget).id;
  103. ActivateTab(tid);
  104. If (tid='navpdf') then
  105. Activate(PPDFOptions)
  106. else If (tid='navhtml') then
  107. Activate(PHTMLOptions)
  108. else If (tid='navfpimage') then
  109. Activate(PImageOptions)
  110. end;
  111. function TMainForm.AddFormControl(AParent: TJSHTMLElement; const AID, ALabel: String): TJSHTMLElement;
  112. Var
  113. FG,D : TJSElement;
  114. L : TJSElement;
  115. begin
  116. FG:=Document.createElement('div');
  117. FG.className:='form-group';
  118. AParent.appendChild(FG);
  119. L:=Document.createElement('label');
  120. L.Attrs['for']:=AID;
  121. L.classname:=labelclassname;
  122. FG.append(L);
  123. if (ALabel<>'') then
  124. L.append(ALabel);
  125. D:=Document.createElement('div');
  126. FG.Append(D);
  127. D.classname:=controlclassname;
  128. Result:=TJSHTMLElement(D);
  129. end;
  130. function TMainForm.AddPanel(AParent: TJSHTMLElement; AHeader: String; AHeading: Integer = 0): TJSHTMLElement;
  131. Var
  132. P,H,H2,B : TJSElement;
  133. begin
  134. P:=Document.createElement('div');
  135. P.classname:='panel panel-default';
  136. AParent.Append(P);
  137. if (AHeader<>'') then
  138. begin
  139. H:=Document.createElement('div');
  140. h.classname:='panel-heading';
  141. P.Append(H);
  142. if AHeading=0 then
  143. H.Append(AHeader)
  144. else
  145. begin
  146. H2:=Document.createElement('h'+IntToStr(AHeading));
  147. H2.ClassName:='panel-title';
  148. H2.Append(AHeader);
  149. H.Append(H2);
  150. end;
  151. end;
  152. B:=Document.createElement('div');
  153. P.Append(B);
  154. B.classname:='panel-body';
  155. Result:=TJSHTMLElement(B);
  156. end;
  157. function TMainForm.AddNav(AParent: TJSHTMLElement; Tabs: array of string; AActive: String; AOnClick: THTMLClickEventHandler): TJSHTMLElementArray;
  158. Var
  159. I : Integer;
  160. TP,A,T : TJSHTMLElement;
  161. begin
  162. TP:=TJSHTMLElement(Document.CreateElement('ul'));
  163. TP.ClassName:='nav nav-tabs';
  164. SetLength(Result,1+(Length(Tabs) div 2));
  165. Result[0]:=TP;
  166. AParent.Append(TP);
  167. I:=0;
  168. While I<Length(Tabs)-1 do
  169. begin
  170. T:=TJSHTMLElement(Document.CreateElement('li'));
  171. T['role']:='presentation';
  172. T.id:='nav'+Tabs[i];
  173. if SameText(T.ID,'nav'+AActive) then
  174. T.Classname:='active';
  175. A:=TJSHTMLElement(Document.CreateElement('a'));
  176. A.Append(Tabs[I+1]);
  177. A['href']:='#';
  178. T.onclick:=AOnClick;
  179. T.Append(A);
  180. TP.Append(T);
  181. Result[1+(I div 2)]:=T;
  182. inc(I,2);
  183. end;
  184. end;
  185. function TMainForm.AddForm(AParent: TJSHTMLElement; FormStyle: TFormStyle): TJSHTMLFormElement;
  186. begin
  187. Result:=TJSHTMLFormElement(document.CreateElement('form'));
  188. Case FormStyle of
  189. fsInline : Result.className:='form-inline';
  190. fsHorizontal : Result.className:='form-horizontal';
  191. end;
  192. AParent.Append(Result);
  193. end;
  194. function TMainForm.AddCheckBox(AParent: TJSHTMLElement; const AName, ALabel: String; IsInline: Boolean): TJSHTMLInputElement;
  195. Var
  196. FG,D,D2,L : TJSHTMLElement;
  197. IE : TJSHTMLInputElement;
  198. begin
  199. // FG:=AddFormControl(APArent,Prefix+AName,aLabel);
  200. FG:=TJSHTMLElement(Document.createElement('div'));
  201. FG.className:='form-group';
  202. AParent.appendChild(FG);
  203. D:=TJSHTMLElement(Document.createElement('div'));
  204. D.ClassName:='col-sm-offset-3 col-sm-8';
  205. FG.Append(D);
  206. D2:=TJSHTMLElement(Document.createElement('div'));
  207. D2.ClassName:='checkbox';
  208. D.Append(D2);
  209. L:=TJSHTMLElement(Document.createElement('label'));
  210. L.Attrs['for']:='ID'+Prefix+AName;
  211. D2.append(L);
  212. IE:=TJSHTMLInputElement(Document.createElement('input'));
  213. L.Append(IE);
  214. if (ALabel<>'') then
  215. L.append(ALabel);
  216. IE['type']:='checkbox';
  217. // IE.ClassName:='form-control';
  218. IE.id:='ID'+Prefix+AName;
  219. IE.name:=Prefix+AName;
  220. IE.value:='1';
  221. Result:=IE;
  222. end;
  223. function TMainForm.AddNumber(AParent: TJSHTMLElement; const AName, ALabel: String): TJSHTMLInputElement;
  224. Var
  225. FG : TJSHTMLElement;
  226. IE : TJSHTMLInputElement;
  227. begin
  228. FG:=AddFormControl(APArent,Prefix+AName,aLabel);
  229. IE:=TJSHTMLInputElement(Document.createElement('input'));
  230. FG.Append(IE);
  231. IE['type']:='number';
  232. IE.ClassName:='form-control';
  233. IE.id:='ID'+Prefix+AName;
  234. IE.Name:=Prefix+AName;
  235. Result:=IE;
  236. end;
  237. function TMainForm.AddColor(AParent: TJSHTMLElement; const AName, ALabel: String): TJSHTMLInputElement;
  238. Var
  239. FG : TJSHTMLElement;
  240. IE : TJSHTMLInputElement;
  241. begin
  242. FG:=AddFormControl(APArent,Prefix+AName,aLabel);
  243. IE:=TJSHTMLInputElement(Document.createElement('input'));
  244. FG.Append(IE);
  245. IE['type']:='color';
  246. IE.ClassName:='form-control';
  247. IE.id:='ID'+Prefix+AName;
  248. IE.name:=Prefix+AName;
  249. Result:=IE;
  250. end;
  251. function TMainForm.AddEdit(AParent: TJSHTMLElement; const AName, ALabel: String): TJSHTMLInputElement;
  252. Var
  253. FG : TJSHTMLElement;
  254. IE : TJSHTMLInputElement;
  255. begin
  256. FG:=AddFormControl(APArent,Prefix+AName,aLabel);
  257. IE:=TJSHTMLInputElement(Document.createElement('input'));
  258. FG.Append(IE);
  259. IE['type']:='edit';
  260. IE.ClassName:='form-control';
  261. IE.id:='ID'+Prefix+AName;
  262. IE.name:=Prefix+AName;
  263. Result:=IE;
  264. end;
  265. function TMainForm.AddCombo(AParent: TJSHTMLElement; const AName, ALabel: String; AValues : Array of String): TJSHTMLSelectElement;
  266. Var
  267. FG: TJSHTMLElement;
  268. SE : TJSHTMLSelectElement;
  269. O : TJSHTMLOptionElement;
  270. I : Integer;
  271. begin
  272. FG:=AddFormControl(APArent,Prefix+AName,ALabel);
  273. SE:=TJSHTMLSelectElement(Document.createElement('select'));
  274. SE.ClassName:='form-control';
  275. FG.Append(SE);
  276. SE.id:='ID'+Prefix+AName;
  277. SE.Name:=Prefix+AName;
  278. I:=0;
  279. While I<Length(AValues)-1 do
  280. begin
  281. O:=TJSHTMLOptionElement(Document.CreateElement('option'));
  282. O.value:=AVAlues[i];
  283. O.Append(AVAlues[i+1]);
  284. SE.add(O);
  285. Inc(I,2);
  286. end;
  287. Result:=SE;
  288. end;
  289. constructor TMainForm.create(AOwner: TCOmponent);
  290. begin
  291. inherited create(AOwner);
  292. labelclassname:='col-sm-3 control-label';
  293. controlclassname:='col-sm-8';
  294. Initialize;
  295. end;
  296. Function TMainForm.CreateTabSheet(Aparent : TJSHTMLElement;AIDName : String; IsActive : Boolean) : TJSHTMLElement;
  297. Var
  298. C : String;
  299. begin
  300. Result:=TJSHTMLElement(Document.createElement('div'));
  301. C:='tab-pane fade';
  302. if IsActive then
  303. c:=c+' in active';
  304. Result.id:=AIDName;
  305. Result.classname:=C;
  306. AParent.append(Result);
  307. end;
  308. Procedure TMainForm.Getoptions(A : TJSHTMLElementArray; L : Tstrings);
  309. Var
  310. I : Integer;
  311. E : TJSHTMLElement;
  312. IE : TJSHTMLInputElement;
  313. SE : TJSHTMLSelectElement;
  314. begin
  315. for I:=0 to Length(A)-1 do
  316. begin
  317. E:=A[i];
  318. if SameText(E.tagName,'INPUT') then
  319. begin
  320. IE:=TJSHTMLInputElement(E);
  321. if IE._type='checkbox' then
  322. begin
  323. if IE.checked then
  324. L.Add(IE.Name+'=1');
  325. end
  326. else if IE.value<>'' then
  327. L.Add(IE.Name+'='+IE.value);
  328. end
  329. else if SameText(E.tagName,'SELECT') then
  330. begin
  331. SE:=TJSHTMLSelectElement(E);
  332. L.Add(SE.Name+'='+SE.value);
  333. end;
  334. end;
  335. end;
  336. function TMainForm.DoClick(aEvent: TJSMouseEvent): boolean;
  337. Var
  338. Fmt,URL : String;
  339. A : TJSHTMLElementArray;
  340. L : Tstrings;
  341. I : Integer;
  342. begin
  343. Result:=true;
  344. URL:=BaseURL;
  345. fmt:=CBFormat.value;
  346. if (fmt='HTML') then
  347. A:=HTMLOPtionsArr
  348. else if (fmt='PDF') then
  349. A:=PDFOptionsArr
  350. else if (fmt='FPImage') then
  351. A:=ImageOptionsArr
  352. else
  353. begin
  354. ShowError('Unknown output format: '+Fmt);
  355. Exit;
  356. end;
  357. URL:=URL+'demo='+CBDemo.value;
  358. URL:=URL+'&format='+fmt;
  359. L:=TstringList.Create;
  360. try
  361. GetOptions(A,L);
  362. For I:=0 to L.Count-1 do
  363. URL:=URL+'&'+L[i];
  364. finally
  365. L.Free;
  366. end;
  367. if (CBNewWindow.checked) then
  368. Window.Open(URL)
  369. else
  370. Window.locationString:=URL;
  371. end;
  372. procedure TMainForm.AddPDFOptions(AParent : TJSHTMLElement);
  373. Var
  374. F : TJSHTMLElement;
  375. I : Integer;
  376. Procedure AddOption(E : TJSHTMLElement);
  377. begin
  378. PDFOptionsArr[I]:=E;
  379. inc(I);
  380. end;
  381. begin
  382. prefix:='pdf.';
  383. F:=AddForm(aParent,fsHorizontal);
  384. I:=0;
  385. SetLength(PDFOptionsArr,9);
  386. AddOption(AddCheckbox(F,'pagelayout','Create outLine'));
  387. AddOption(AddCheckbox(F,'compresstext','Compress text'));
  388. AddOption(AddCheckbox(F,'compressfonts','Compress fonts'));
  389. AddOption(AddCheckbox(F,'compressimages','Compress images'));
  390. AddOption(AddCheckbox(F,'userawjpeg','use raw JPEG'));
  391. AddOption(AddCheckbox(F,'noembeddedfonts','Do not embed fonts'));
  392. AddOption(AddCheckbox(F,'pageoriginattop','Page origin at top'));
  393. AddOption(AddCheckbox(F,'subsetfont','Embed only used subset of font'));
  394. AddOption(AddCombo(F,'pagelayout','Page layout',['single','Single page','two','Two pages','continuous','Continuous layout']));
  395. end;
  396. Function TMainForm.AddStyleEmbedding (AParent : TJSHTMLElement): TJSHTMLElement;
  397. begin
  398. Result:=AddCombo(AParent,'styleembedding','Style embedding',[
  399. 'inline','Inline, in HTML element',
  400. 'styletag','In separate style tag',
  401. 'cssfile','In separate CSS file'
  402. ]);
  403. end;
  404. function TMainForm.AddConfigureFramePage(aParent: TJSHTMLElement; AnArray: TJSHTMLElementArray; STartAt: integer): Integer;
  405. begin
  406. AnArray[StartAt]:=AddEdit(AParent,'framecssfilename','CSS file name');
  407. AnArray[StartAt+1]:=AddNumber(AParent,'toczonesize','TOC Zone size (percentage)');
  408. AnArray[StartAt+2]:=AddCombo(AParent,'toczoneposition','Position of TOC zone',[
  409. 'left','Left',
  410. 'right', 'Right',
  411. 'top' , 'Top',
  412. 'bottom', 'Bottom'
  413. ]);
  414. Result:=3;
  415. end;
  416. Function TMainForm.AddConfigureTOCPage(aParent : TJSHTMLElement; AnArray : TJSHTMLElementArray; STartAt : integer) : Integer;
  417. begin
  418. AnArray[StartAt]:=AddEdit(AParent,'toccssfilename','CSS file name');
  419. AnArray[StartAt+1]:=AddEdit(AParent,'oddpagestyle','Odd page style elements');
  420. AnArray[StartAt+2]:=AddEdit(AParent,'evenpagestyle','Even page style elements');
  421. AnArray[StartAt+3]:=AddCheckBox(AParent,'skipstyling','Skip Styling');
  422. Result:=4;
  423. end;
  424. function TMainForm.AddConfigurePageNavigator(aParent: TJSHTMLElement; AnArray: TJSHTMLElementArray; STartAt: integer): Integer;
  425. Var
  426. P : TJSHTMLElement;
  427. begin
  428. P:=AddPanel(Aparent,'Navigator positions',5);
  429. anArray[StartAt]:=AddCheckBox(P,'topnavigator','Top',True);
  430. anArray[StartAt+1]:=AddCheckBox(P,'leftnavigator','Left',True);
  431. anArray[StartAt+2]:=AddCheckBox(P,'rightnavigator','Right',True);
  432. anArray[StartAt+3]:=AddCheckBox(P,'bottomnavigator','Bottom',True);
  433. P:=AddPanel(Aparent,'Navigator options',5);
  434. anArray[StartAt+4]:=AddCheckBox(P,'firstlast','Add First/Last buttons');
  435. anArray[StartAt+5]:=AddCheckBox(P,'alwaysfirstlast','Always add First/Last buttons');
  436. anArray[StartAt+6]:=AddCheckBox(P,'pageno','Add page number');
  437. anArray[StartAt+7]:=AddCheckBox(P,'image','Use images (Not yet implemented)');
  438. anArray[StartAt+8]:=AddCheckBox(P,'skipstyling','Skip all styling');
  439. anArray[StartAt+9]:=AddCheckBox(P,'usepagenofm','Use Page N/M display');
  440. anArray[StartAt+10]:=AddCheckBox(P,'pagenoedit','Allow page number editing');
  441. P:=AddPanel(Aparent,'Width/Color',5);
  442. anArray[StartAt+11]:=AddNumber(P,'navigatorfixedwidth','Fixed width');
  443. anArray[StartAt+12]:=AddNumber(P,'navigatorfixedheight','Fixed height');
  444. anArray[StartAt+13]:=AddNumber(P,'navigatorfixedmargin','Fixed margin');
  445. anArray[StartAt+14]:=AddColor(P,'navigatorbgcolor','Active link color');
  446. anArray[StartAt+15]:=AddColor(P,'navigatorinactivebgcolor','Inactive link color');
  447. Result:=16;
  448. end;
  449. procedure TMainForm.AddHTMLOptions(AParent : TJSHTMLElement);
  450. Var
  451. F : TJSHTMLFormElement;
  452. E : TJSHTMLElement;
  453. I : Integer;
  454. Procedure AddOption(E : TJSHTMLElement);
  455. begin
  456. HTMLOptionsArr[I]:=E;
  457. inc(I);
  458. end;
  459. begin
  460. Prefix:='html.';
  461. F:=AddForm(aParent,fsHorizontal);
  462. I:=0;
  463. SetLength(HTMLOptionsArr,100);
  464. E:=AddPanel(F,'HTML Options',4);
  465. AddOption(AddCheckBox(E,'fixedpositioning','Use fixed positioning'));
  466. AddOption(AddCheckbox(E,'inlineimage','Use inline images'));
  467. AddOption(AddCheckbox(E,'useimgtag','Use IMG tag'));
  468. AddOption(AddCheckbox(E,'tocpageframe','Create TOC Frame'));
  469. AddOption(AddCheckbox(E,'memoasis','Insert memos as-is (let browser handle layout)'));
  470. AddOption(AddCheckbox(E,'externaljs','Use external file for JS'));
  471. AddOption(AddNumber(E,'DPI','DPI (resolution)'));
  472. AddOption(AddEdit(E,'sequence','Sequence format'));
  473. AddOption(AddStyleEmbedding(E));
  474. AddOption(AddNumber(E,'offsettop','Fixed positioning, offset from top'));
  475. AddOption(AddNumber(E,'offsetleft','Fixed positioning, offset from left'));
  476. E:=AddPanel(F,'TOC page',4);
  477. I:=I+AddConfigureTOCPage(E,HTMLOptionsArr,I);
  478. E:=AddPanel(F,'Frame page',4);
  479. I:=I+AddConfigureFramePage(E,HTMLOptionsArr,I);
  480. E:=AddPanel(F,'Page Navigator',4);
  481. I:=I+AddConfigurePageNavigator(E,HTMLOptionsArr,I);
  482. SetLength(HTMLOptionsArr,I);
  483. end;
  484. procedure TMainForm.AddImageOptions(AParent : TJSHTMLElement);
  485. Var
  486. F : TJSHTMLFormElement;
  487. E : TJSHTMLElement;
  488. I : Integer;
  489. Procedure AddOption(A : TJSHTMLElement);
  490. begin
  491. ImageOptionsArr[I]:=A;
  492. inc(I);
  493. end;
  494. begin
  495. F:=AddForm(aParent,fsHorizontal);
  496. I:=0;
  497. SetLength(ImageOptionsArr,100);
  498. E:=AddPanel(F,'Image Options',4);
  499. Prefix:='image.';
  500. AddOption(AddCheckBox(E,'useframes','Use frames'));
  501. AddOption(AddCheckBox(E,'externaljs','Use external Javascript file'));
  502. AddOption(AddNumber(E,'DPI','Image DPI'));
  503. AddOption(AddEdit(E,'sequence','Page number sequence format'));
  504. AddStyleEmbedding(E);
  505. E:=AddPanel(F,'TOC page',4);
  506. I:=I+AddConfigureTOCPage(E,ImageOptionsArr,I);
  507. E:=AddPanel(F,'Frame page',4);
  508. I:=I+AddConfigureFramePage(E,ImageOptionsArr,I);
  509. E:=AddPanel(F,'Page Navigator',4);
  510. I:=I+AddConfigurePageNavigator(E,ImageOptionsArr,I);
  511. SetLength(ImageOptionsArr,I);
  512. end;
  513. function TMainForm.DemosLoaded(Event: TEventListenerEvent): boolean;
  514. var
  515. i : integer;
  516. C,J : TJSObject;
  517. A : TJSObjectDynArray;
  518. N,D : String;
  519. O : TJSHTMLOptionElement;
  520. xhr : TJSXMLHttpRequest;
  521. begin
  522. xhr:=TJSXMLHttpRequest(Event.Target);
  523. console.log('Result of call ',xhr.Status);
  524. if (xhr.status = 200) then
  525. begin
  526. J:=TJSJSON.parseObject(xhr.responseText);
  527. A:=TJSObjectDynArray(J.Properties['data']);
  528. for I:=0 to Length(A)-1 do
  529. begin
  530. C:=A[i];
  531. N:=String(C.Properties['name']);
  532. D:=String(C.Properties['description']);
  533. O:=TJSHTMLOptionElement(Document.CreateElement('option'));
  534. O.value:=N;
  535. O.text:=D;
  536. CBDemo.append(O);
  537. end;
  538. end
  539. else
  540. ShowError('Failed to load countries: '+IntToStr(xhr.Status));
  541. Result := True;
  542. end;
  543. procedure TMainForm.GetDemoList;
  544. Var
  545. xhr : TJSXMLHttpRequest;
  546. begin
  547. xhr:=TJSXMLHttpRequest.New;
  548. xhr.addEventListener('load', @DemosLoaded);
  549. // Case sensitive
  550. xhr.open('GET', ServerURL+'ReportList/', true);
  551. xhr.send;
  552. end;
  553. procedure TMainForm.ShowError(Msg: String);
  554. Var
  555. E : TJSHTMLElement;
  556. begin
  557. E:=TJSHTMLElement(Document.CreateElement('p'));
  558. E.className:='text-danger';
  559. E.append(Msg);
  560. Ptop.append(E);
  561. end;
  562. procedure TMainForm.Initialize;
  563. Var
  564. frm, cont, PP, BOK : TJSHTMLElement;
  565. begin
  566. cont:=TJSHTMLElement(Document.createElement('div'));
  567. cont.classname:='container-fluid';
  568. Document.Body.Append(cont);
  569. PTop:=AddPanel(Cont,'Report',1);
  570. frm:=AddForm(PTop ,fsHorizontal);
  571. frm.style.cssText:='width: 50%';
  572. CBDemo:=AddCombo(frm,'output','Report demo',[]);
  573. GetDemoList;
  574. CBFormat:=AddCombo(frm,'format','Output format',['PDF','PDF','HTML','Plain HTML','FPIMage','Images in HTML pages']);
  575. CBNewWindow:=AddCheckBox(frm,'NewWindow','Open in new window');
  576. BOK:=TJSHTMLElement(Document.createElement('button'));
  577. BOK.Append('Show report');
  578. BOK.ClassName:='btn btn-default';
  579. BOK.onClick:=@DoClick;
  580. PTOP.Append(BOK);
  581. POptions:=AddPanel(Cont,'Options',1);
  582. FNavs:=AddNav(POptions,['pdf','PDF','html','HTML','fpimage','Image'],'PDF',@DoNavClick);
  583. PP:=TJSHTMLElement(Document.CreateElement('div'));
  584. PP.classname:='tab-content';
  585. POPtions.Append(PP);
  586. SetLength(PTabs,3);
  587. PPDFOptions:=CreateTabSheet(PP,'pdf',True);
  588. AddPDFOptions(PPDFOptions);
  589. PHTMLOptions:=CreateTabSheet(PP,'html',False);
  590. AddHTMLOptions(PHTMLOptions);
  591. PImageOptions:=CreateTabSheet(PP,'image',False);
  592. AddImageOptions(PImageOptions);
  593. PTabs[0]:=PPDFOptions;
  594. PTabs[1]:=PHTMLOptions;
  595. PTabs[2]:=PImageOptions;
  596. end;
  597. end.