You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AreaTreeBuilder.java 26KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  1. /*
  2. * Copyright 1999-2004 The Apache Software Foundation.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /* $Id$ */
  17. package org.apache.fop.tools;
  18. // Java
  19. import java.awt.geom.Rectangle2D;
  20. import java.io.IOException;
  21. import java.io.InputStream;
  22. import java.io.OutputStream;
  23. import java.util.List;
  24. import java.util.StringTokenizer;
  25. // JAXP
  26. import javax.xml.parsers.DocumentBuilderFactory;
  27. // DOM
  28. import org.w3c.dom.Node;
  29. import org.w3c.dom.NodeList;
  30. import org.w3c.dom.Element;
  31. /* org.w3c.dom.Document is not imported to avoid conflict with
  32. org.apache.fop.control.Document */
  33. // Batik
  34. import org.apache.batik.dom.svg.SVGDOMImplementation;
  35. // FOP
  36. import org.apache.fop.area.Area;
  37. import org.apache.fop.area.AreaTree;
  38. import org.apache.fop.area.AreaTreeModel;
  39. import org.apache.fop.area.BeforeFloat;
  40. import org.apache.fop.area.Block;
  41. import org.apache.fop.area.BodyRegion;
  42. import org.apache.fop.area.CTM;
  43. import org.apache.fop.area.Flow;
  44. import org.apache.fop.area.Footnote;
  45. import org.apache.fop.area.LineArea;
  46. import org.apache.fop.area.MainReference;
  47. import org.apache.fop.area.Page;
  48. import org.apache.fop.area.PageViewport;
  49. import org.apache.fop.area.RegionReference;
  50. import org.apache.fop.area.RegionViewport;
  51. import org.apache.fop.area.Span;
  52. import org.apache.fop.area.StorePagesModel;
  53. import org.apache.fop.area.Title;
  54. import org.apache.fop.area.Trait;
  55. import org.apache.fop.area.inline.Character;
  56. import org.apache.fop.area.inline.Container;
  57. import org.apache.fop.area.inline.ForeignObject;
  58. import org.apache.fop.area.inline.Image;
  59. import org.apache.fop.area.inline.InlineArea;
  60. import org.apache.fop.area.inline.Leader;
  61. import org.apache.fop.area.inline.Space;
  62. import org.apache.fop.area.inline.Viewport;
  63. import org.apache.fop.area.inline.TextArea;
  64. import org.apache.fop.apps.Document;
  65. import org.apache.fop.fonts.Font;
  66. import org.apache.fop.render.Renderer;
  67. import org.apache.fop.render.pdf.PDFRenderer;
  68. import org.apache.fop.render.svg.SVGRenderer;
  69. import org.apache.fop.render.xml.XMLRenderer;
  70. import org.apache.fop.apps.FOUserAgent;
  71. import org.apache.fop.fo.Constants;
  72. import org.apache.fop.fo.pagination.Region;
  73. import org.apache.fop.fonts.FontMetrics;
  74. // Avalon
  75. import org.apache.avalon.framework.logger.ConsoleLogger;
  76. import org.apache.avalon.framework.logger.AbstractLogEnabled;
  77. /**
  78. * Area tree tester.
  79. * The purpose of this class is to create and render an area tree
  80. * for the purpose of testing the area tree and rendering.
  81. * This covers the set of possible properties that can be set
  82. * on the area tree for rendering.
  83. * As this is not for general purpose there is no attempt to handle
  84. * invalid area tree xml.
  85. *
  86. * Tests: different renderers, saving and loading pages with serialization
  87. * out of order rendering
  88. */
  89. public class AreaTreeBuilder extends AbstractLogEnabled {
  90. /**
  91. * Main method
  92. * @param args command line arguments
  93. */
  94. public static void main(String[] args) {
  95. AreaTreeBuilder atb = new AreaTreeBuilder();
  96. atb.enableLogging(new ConsoleLogger(ConsoleLogger.LEVEL_DEBUG));
  97. atb.runTests(args[0], args[1], args[2]);
  98. System.exit(0);
  99. }
  100. /**
  101. * Run the tests.
  102. * @param in input filename
  103. * @param type output format
  104. * @param out output filename
  105. */
  106. protected void runTests(String in, String type, String out) {
  107. getLogger().debug("Starting tests");
  108. runTest(in, type, out);
  109. getLogger().debug("Finished");
  110. }
  111. /**
  112. * Run a test.
  113. * @param in input filename
  114. * @param type output format
  115. * @param out output filename
  116. */
  117. protected void runTest(String in, String type, String out) {
  118. Renderer rend = null;
  119. if ("xml".equals(type)) {
  120. rend = new XMLRenderer();
  121. } else if ("pdf".equals(type)) {
  122. rend = new PDFRenderer();
  123. } else if ("svg".equals(type)) {
  124. rend = new SVGRenderer();
  125. }
  126. setupLogger(rend);
  127. Document fi = new Document(null);
  128. rend.setupFontInfo(fi);
  129. FOUserAgent ua = new FOUserAgent();
  130. setupLogger(ua);
  131. rend.setUserAgent(ua);
  132. StorePagesModel sm = AreaTree.createStorePagesModel();
  133. TreeLoader tl = new TreeLoader(fi);
  134. setupLogger(tl);
  135. tl.setTreeModel(sm);
  136. try {
  137. InputStream is =
  138. new java.io.BufferedInputStream(new java.io.FileInputStream(in));
  139. tl.buildAreaTree(is);
  140. renderAreaTree(sm, rend, out);
  141. } catch (IOException e) {
  142. getLogger().error("error reading file" + e.getMessage(), e);
  143. }
  144. }
  145. /**
  146. * Renders an area tree to a target format using a renderer.
  147. * @param sm area tree pages
  148. * @param rend renderer to use for output
  149. * @param out target filename
  150. */
  151. protected void renderAreaTree(StorePagesModel sm,
  152. Renderer rend, String out) {
  153. try {
  154. OutputStream os =
  155. new java.io.BufferedOutputStream(new java.io.FileOutputStream(out));
  156. rend.startRenderer(os);
  157. int count = 0;
  158. int seqc = sm.getPageSequenceCount();
  159. while (count < seqc) {
  160. Title title = sm.getTitle(count);
  161. rend.startPageSequence(title);
  162. int pagec = sm.getPageCount(count);
  163. int c = 0;
  164. while (c < pagec) {
  165. PageViewport page = sm.getPage(count, c);
  166. c++;
  167. // save the page to a stream for testing
  168. /*ObjectOutputStream tempstream = new ObjectOutputStream(
  169. new BufferedOutputStream(
  170. new FileOutputStream("temp.ser")));
  171. page.savePage(tempstream);
  172. tempstream.close();
  173. File temp = new File("temp.ser");
  174. getLogger().debug("page serialized to: " + temp.length());
  175. temp = null;
  176. ObjectInputStream in = new ObjectInputStream(
  177. new BufferedInputStream(
  178. new FileInputStream("temp.ser")));
  179. page.loadPage(in);
  180. in.close();*/
  181. rend.renderPage(page);
  182. }
  183. count++;
  184. }
  185. rend.stopRenderer();
  186. os.close();
  187. } catch (Exception e) {
  188. getLogger().error("error rendering output", e);
  189. }
  190. }
  191. }
  192. // this loads an area tree from an xml file
  193. // the xml format is the same as the xml renderer output
  194. class TreeLoader extends AbstractLogEnabled {
  195. private AreaTree areaTree;
  196. private AreaTreeModel model;
  197. private Document fontInfo;
  198. private Font currentFontState;
  199. TreeLoader(Document fi) {
  200. fontInfo = fi;
  201. }
  202. public void setTreeModel(AreaTreeModel mo) {
  203. model = mo;
  204. }
  205. public void buildAreaTree(InputStream is) {
  206. org.w3c.dom.Document doc = null;
  207. try {
  208. DocumentBuilderFactory fact =
  209. DocumentBuilderFactory.newInstance();
  210. fact.setNamespaceAware(true);
  211. doc = fact.newDocumentBuilder().parse(is);
  212. } catch (Exception e) {
  213. e.printStackTrace();
  214. }
  215. Element root = null;
  216. root = doc.getDocumentElement();
  217. areaTree = new AreaTree(fontInfo);
  218. areaTree.setTreeModel(model);
  219. readAreaTree(root);
  220. }
  221. public void readAreaTree(Element root) {
  222. NodeList childs = root.getChildNodes();
  223. for (int i = 0; i < childs.getLength(); i++) {
  224. Node obj = childs.item(i);
  225. if (obj.getNodeName().equals("pageSequence")) {
  226. readPageSequence((Element) obj);
  227. }
  228. }
  229. }
  230. public void readPageSequence(Element root) {
  231. Title title = null;
  232. boolean started = false;
  233. NodeList childs = root.getChildNodes();
  234. for (int i = 0; i < childs.getLength(); i++) {
  235. Node obj = childs.item(i);
  236. if (obj.getNodeName().equals("title")) {
  237. if (started) {
  238. // problem
  239. } else {
  240. title = readTitle((Element) obj);
  241. model.startPageSequence(title);
  242. started = true;
  243. }
  244. } else if (obj.getNodeName().equals("pageViewport")) {
  245. if (!started) {
  246. model.startPageSequence(null);
  247. started = true;
  248. }
  249. PageViewport viewport = readPageViewport((Element) obj);
  250. areaTree.addPage(viewport);
  251. }
  252. }
  253. }
  254. public Title readTitle(Element root) {
  255. Title title = new Title();
  256. List childs = getInlineAreas(root);
  257. for (int i = 0; i < childs.size(); i++) {
  258. InlineArea obj = (InlineArea) childs.get(i);
  259. title.addInlineArea(obj);
  260. }
  261. return title;
  262. }
  263. public PageViewport readPageViewport(Element root) {
  264. Rectangle2D bounds = getRectangle(root, "bounds");
  265. PageViewport viewport = null;
  266. NodeList childs = root.getChildNodes();
  267. for (int i = 0; i < childs.getLength(); i++) {
  268. Node obj = childs.item(i);
  269. if (obj.getNodeName().equals("page")) {
  270. Page page = readPage((Element) obj);
  271. viewport = new PageViewport(page, bounds);
  272. }
  273. }
  274. return viewport;
  275. }
  276. public Page readPage(Element root) {
  277. //String bounds = root.getAttribute("bounds");
  278. Page page = new Page();
  279. NodeList childs = root.getChildNodes();
  280. for (int i = 0; i < childs.getLength(); i++) {
  281. Node obj = childs.item(i);
  282. if (obj.getNodeName().equals("regionViewport")) {
  283. readRegionViewport(page, (Element) obj);
  284. }
  285. }
  286. return page;
  287. }
  288. Rectangle2D getRectangle(Element root, String attr) {
  289. String rect = root.getAttribute(attr);
  290. StringTokenizer st = new StringTokenizer(rect, " ");
  291. int x = 0, y = 0, w = 0, h = 0;
  292. if (st.hasMoreTokens()) {
  293. String tok = st.nextToken();
  294. x = Integer.parseInt(tok);
  295. }
  296. if (st.hasMoreTokens()) {
  297. String tok = st.nextToken();
  298. y = Integer.parseInt(tok);
  299. }
  300. if (st.hasMoreTokens()) {
  301. String tok = st.nextToken();
  302. w = Integer.parseInt(tok);
  303. }
  304. if (st.hasMoreTokens()) {
  305. String tok = st.nextToken();
  306. h = Integer.parseInt(tok);
  307. }
  308. Rectangle2D r2d = new Rectangle2D.Float(x, y, w, h);
  309. return r2d;
  310. }
  311. public RegionViewport readRegionViewport(Page page, Element root) {
  312. RegionViewport reg = new RegionViewport(getRectangle(root, "rect"));
  313. NodeList childs = root.getChildNodes();
  314. for (int i = 0; i < childs.getLength(); i++) {
  315. Node obj = childs.item(i);
  316. if (obj.getNodeName().equals("regionBefore")) {
  317. reg.setRegion(readRegion((Element) obj, Region.BEFORE_CODE));
  318. page.setRegionViewport(Region.BEFORE_CODE, reg);
  319. } else if (obj.getNodeName().equals("regionStart")) {
  320. reg.setRegion(readRegion((Element) obj, Region.START_CODE));
  321. page.setRegionViewport(Region.START_CODE, reg);
  322. } else if (obj.getNodeName().equals("regionBody")) {
  323. reg.setRegion(readRegion((Element) obj, Region.BODY_CODE));
  324. page.setRegionViewport(Region.BODY_CODE, reg);
  325. } else if (obj.getNodeName().equals("regionEnd")) {
  326. reg.setRegion(readRegion((Element) obj, Region.END_CODE));
  327. page.setRegionViewport(Region.END_CODE, reg);
  328. } else if (obj.getNodeName().equals("regionAfter")) {
  329. reg.setRegion(readRegion((Element) obj, Region.AFTER_CODE));
  330. page.setRegionViewport(Region.AFTER_CODE, reg);
  331. }
  332. }
  333. return reg;
  334. }
  335. public RegionReference readRegion(Element root, int type) {
  336. RegionReference reg;
  337. if (type == Region.BODY_CODE) {
  338. BodyRegion br = new BodyRegion();
  339. NodeList childs = root.getChildNodes();
  340. for (int i = 0; i < childs.getLength(); i++) {
  341. Node obj = childs.item(i);
  342. if (obj.getNodeName().equals("beforeFloat")) {
  343. BeforeFloat bf = readBeforeFloat((Element) obj);
  344. br.setBeforeFloat(bf);
  345. } else if (obj.getNodeName().equals("mainReference")) {
  346. MainReference mr = readMainReference((Element) obj);
  347. br.setMainReference(mr);
  348. } else if (obj.getNodeName().equals("footnote")) {
  349. Footnote foot = readFootnote((Element) obj);
  350. br.setFootnote(foot);
  351. }
  352. }
  353. reg = br;
  354. } else {
  355. reg = new RegionReference(type);
  356. List blocks = getBlocks(root);
  357. for (int i = 0; i < blocks.size(); i++) {
  358. Block obj = (Block) blocks.get(i);
  359. reg.addBlock(obj);
  360. }
  361. }
  362. reg.setCTM(new CTM());
  363. return reg;
  364. }
  365. public BeforeFloat readBeforeFloat(Element root) {
  366. BeforeFloat bf = new BeforeFloat();
  367. List blocks = getBlocks(root);
  368. for (int i = 0; i < blocks.size(); i++) {
  369. Block obj = (Block) blocks.get(i);
  370. bf.addBlock(obj);
  371. }
  372. return bf;
  373. }
  374. public MainReference readMainReference(Element root) {
  375. MainReference mr = new MainReference();
  376. List spans = getSpans(root);
  377. for (int i = 0; i < spans.size(); i++) {
  378. Span obj = (Span) spans.get(i);
  379. mr.addSpan(obj);
  380. }
  381. return mr;
  382. }
  383. List getSpans(Element root) {
  384. List list = new java.util.ArrayList();
  385. NodeList childs = root.getChildNodes();
  386. for (int i = 0; i < childs.getLength(); i++) {
  387. Node obj = childs.item(i);
  388. if (obj.getNodeName().equals("span")) {
  389. List flows = getFlows((Element) obj);
  390. Span span = new Span(flows.size());
  391. for (int j = 0; j < flows.size(); j++) {
  392. Flow flow = (Flow) flows.get(j);
  393. span.addFlow(flow);
  394. }
  395. list.add(span);
  396. }
  397. }
  398. return list;
  399. }
  400. List getFlows(Element root) {
  401. List list = new java.util.ArrayList();
  402. NodeList childs = root.getChildNodes();
  403. for (int i = 0; i < childs.getLength(); i++) {
  404. Node obj = childs.item(i);
  405. if (obj.getNodeName().equals("flow")) {
  406. Flow flow = new Flow();
  407. List blocks = getBlocks((Element) obj);
  408. for (int j = 0; j < blocks.size(); j++) {
  409. Block block = (Block) blocks.get(j);
  410. flow.addBlock(block);
  411. }
  412. list.add(flow);
  413. }
  414. }
  415. return list;
  416. }
  417. public Footnote readFootnote(Element root) {
  418. Footnote foot = new Footnote();
  419. List blocks = getBlocks(root);
  420. for (int i = 0; i < blocks.size(); i++) {
  421. Block obj = (Block) blocks.get(i);
  422. foot.addBlock(obj);
  423. }
  424. return foot;
  425. }
  426. List getBlocks(Element root) {
  427. List list = new java.util.ArrayList();
  428. NodeList childs = root.getChildNodes();
  429. for (int i = 0; i < childs.getLength(); i++) {
  430. Node obj = childs.item(i);
  431. if (obj.getNodeName().equals("block")) {
  432. Block block = new Block();
  433. addTraits((Element)obj, block);
  434. addBlockChildren(block, (Element) obj);
  435. list.add(block);
  436. }
  437. }
  438. return list;
  439. }
  440. protected void addBlockChildren(Block block, Element root) {
  441. NodeList childs = root.getChildNodes();
  442. int type = -1;
  443. for (int i = 0; i < childs.getLength(); i++) {
  444. Node obj = childs.item(i);
  445. if (obj.getNodeName().equals("block")) {
  446. if (type == 2) {
  447. // error
  448. }
  449. Block b = new Block();
  450. addBlockChildren(b, (Element) obj);
  451. block.addBlock(b);
  452. type = 1;
  453. } else if (obj.getNodeName().equals("lineArea")) {
  454. if (type == 1) {
  455. // error
  456. }
  457. LineArea line = new LineArea();
  458. addTraits((Element) obj, line);
  459. String height = ((Element) obj).getAttribute("height");
  460. int h = Integer.parseInt(height);
  461. line.setHeight(h);
  462. List inlines = getInlineAreas((Element) obj);
  463. for (int j = 0; j < inlines.size(); j++) {
  464. InlineArea inline = (InlineArea) inlines.get(j);
  465. line.addInlineArea(inline);
  466. }
  467. block.addLineArea(line);
  468. type = 2;
  469. }
  470. }
  471. }
  472. // children of element are inline areas
  473. List getInlineAreas(Element root) {
  474. List list = new java.util.ArrayList();
  475. NodeList childs = root.getChildNodes();
  476. for (int i = 0; i < childs.getLength(); i++) {
  477. Node obj = childs.item(i);
  478. if (obj.getNodeName().equals("char")) {
  479. Character ch =
  480. new Character(getString((Element) obj).charAt(0));
  481. addTraits((Element) obj, ch);
  482. String fname = fontInfo.fontLookup("sans-serif", "normal", Font.NORMAL);
  483. FontMetrics metrics = fontInfo.getMetricsFor(fname);
  484. currentFontState =
  485. new Font(fname, metrics, 12000);
  486. ch.setWidth(currentFontState.getWidth(ch.getChar()));
  487. ch.setOffset(currentFontState.getCapHeight());
  488. list.add(ch);
  489. } else if (obj.getNodeName().equals("space")) {
  490. Space space = new Space();
  491. String width = ((Element) obj).getAttribute("width");
  492. int w = Integer.parseInt(width);
  493. space.setWidth(w);
  494. list.add(space);
  495. } else if (obj.getNodeName().equals("viewport")) {
  496. Viewport viewport = getViewport((Element) obj);
  497. if (viewport != null) {
  498. list.add(viewport);
  499. }
  500. } else if (obj.getNodeName().equals("leader")) {
  501. Leader leader = getLeader((Element) obj);
  502. if (leader != null) {
  503. list.add(leader);
  504. }
  505. } else if (obj.getNodeName().equals("word")) {
  506. String fname = fontInfo.fontLookup("sans-serif", "normal", Font.NORMAL);
  507. FontMetrics metrics = fontInfo.getMetricsFor(fname);
  508. currentFontState =
  509. new Font(fname, metrics, 12000);
  510. TextArea text = getText((Element) obj);
  511. text.addTrait(Trait.FONT_NAME, fname);
  512. text.addTrait(Trait.FONT_SIZE, new Integer(12000));
  513. if (text != null) {
  514. list.add(text);
  515. }
  516. } else {
  517. }
  518. }
  519. return list;
  520. }
  521. Viewport getViewport(Element root) {
  522. Area child = null;
  523. NodeList childs = root.getChildNodes();
  524. for (int i = 0; i < childs.getLength(); i++) {
  525. Node obj = childs.item(i);
  526. if (obj.getNodeName().equals("container")) {
  527. child = getContainer((Element) obj);
  528. } else if (obj.getNodeName().equals("foreignObject")) {
  529. child = getForeignObject((Element) obj);
  530. } else if (obj.getNodeName().equals("image")) {
  531. child = getImage((Element) obj);
  532. }
  533. }
  534. if (child == null) {
  535. return null;
  536. }
  537. Viewport viewport = new Viewport(child);
  538. String str = root.getAttribute("width");
  539. if (str != null && !"".equals(str)) {
  540. int width = Integer.parseInt(str);
  541. viewport.setWidth(width);
  542. }
  543. return viewport;
  544. }
  545. Container getContainer(Element root) {
  546. Container cont = new Container();
  547. List blocks = getBlocks(root);
  548. for (int i = 0; i < blocks.size(); i++) {
  549. Block obj = (Block) blocks.get(i);
  550. cont.addBlock(obj);
  551. }
  552. return cont;
  553. }
  554. ForeignObject getForeignObject(Element root) {
  555. org.w3c.dom.Document doc;
  556. String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
  557. NodeList childs = root.getChildNodes();
  558. for (int i = 0; i < childs.getLength(); i++) {
  559. Node obj = childs.item(i);
  560. if (obj instanceof Element) {
  561. //getLogger().debug(obj.getNodeName());
  562. Element rootEle = (Element) obj;
  563. String space = rootEle.getAttribute("xmlns");
  564. if (svgNS.equals(space)) {
  565. try {
  566. DocumentBuilderFactory fact =
  567. DocumentBuilderFactory.newInstance();
  568. fact.setNamespaceAware(true);
  569. doc = fact.newDocumentBuilder().newDocument();
  570. Node node = doc.importNode(obj, true);
  571. doc.appendChild(node);
  572. //DOMImplementation impl =
  573. // SVGDOMImplementation.getDOMImplementation();
  574. // due to namespace problem attributes are not cloned
  575. // serializing causes an npe
  576. //doc = DOMUtilities.deepCloneDocument(doc, impl);
  577. ForeignObject fo = new ForeignObject(doc, svgNS);
  578. return fo;
  579. } catch (Exception e) {
  580. e.printStackTrace();
  581. }
  582. } else {
  583. try {
  584. DocumentBuilderFactory fact =
  585. DocumentBuilderFactory.newInstance();
  586. fact.setNamespaceAware(true);
  587. doc = fact.newDocumentBuilder().newDocument();
  588. Node node = doc.importNode(obj, true);
  589. doc.appendChild(node);
  590. ForeignObject fo = new ForeignObject(doc, space);
  591. return fo;
  592. } catch (Exception e) {
  593. e.printStackTrace();
  594. }
  595. }
  596. }
  597. }
  598. return null;
  599. }
  600. Image getImage(Element root) {
  601. String url = root.getAttribute("url");
  602. Image image = new Image(url);
  603. return image;
  604. }
  605. Leader getLeader(Element root) {
  606. Leader leader = new Leader();
  607. String rs = root.getAttribute("ruleStyle");
  608. if ("solid".equals(rs)) {
  609. leader.setRuleStyle(Constants.RuleStyle.SOLID);
  610. } else if ("dotted".equals(rs)) {
  611. leader.setRuleStyle(Constants.RuleStyle.DOTTED);
  612. } else if ("dashed".equals(rs)) {
  613. leader.setRuleStyle(Constants.RuleStyle.DASHED);
  614. } else if ("double".equals(rs)) {
  615. leader.setRuleStyle(Constants.RuleStyle.DOUBLE);
  616. } else if ("groove".equals(rs)) {
  617. leader.setRuleStyle(Constants.RuleStyle.GROOVE);
  618. } else if ("ridge".equals(rs)) {
  619. leader.setRuleStyle(Constants.RuleStyle.RIDGE);
  620. }
  621. String rt = root.getAttribute("ruleThickness");
  622. int thick = Integer.parseInt(rt);
  623. leader.setRuleThickness(thick);
  624. rt = root.getAttribute("width");
  625. if (rt != null && !"".equals(rt)) {
  626. thick = Integer.parseInt(rt);
  627. leader.setWidth(thick);
  628. }
  629. leader.setOffset(currentFontState.getCapHeight());
  630. addTraits(root, leader);
  631. return leader;
  632. }
  633. TextArea getText(Element root) {
  634. String str = getString(root);
  635. TextArea text = new TextArea();
  636. text.setTextArea(str);
  637. addTraits(root, text);
  638. int width = 0;
  639. for (int count = 0; count < str.length(); count++) {
  640. width += currentFontState.getWidth(str.charAt(count));
  641. }
  642. text.setWidth(width);
  643. text.setOffset(currentFontState.getCapHeight());
  644. return text;
  645. }
  646. public void addTraits(Element ele, Area area) {
  647. String str = ele.getAttribute("props");
  648. StringTokenizer st = new StringTokenizer(str, ";");
  649. while (st.hasMoreTokens()) {
  650. String tok = st.nextToken();
  651. int index = tok.indexOf(":");
  652. String id = tok.substring(0, index);
  653. Object traitCode = Trait.getTraitCode(id);
  654. if (traitCode != null) {
  655. area.addTrait(traitCode,
  656. Trait.makeTraitValue(traitCode,
  657. tok.substring(index + 1)));
  658. } else {
  659. getLogger().error("Unknown trait: " + id);
  660. }
  661. }
  662. }
  663. public List getRanges(Element ele) {
  664. List list = new java.util.ArrayList();
  665. String str = ele.getAttribute("ranges");
  666. StringTokenizer st = new StringTokenizer(str, ";");
  667. while (st.hasMoreTokens()) {
  668. /*String tok =*/ st.nextToken();
  669. }
  670. return list;
  671. }
  672. public String getString(Element ele) {
  673. String str = "";
  674. NodeList childs = ele.getChildNodes();
  675. if (childs.getLength() == 0) {
  676. return null;
  677. }
  678. for (int i = 0; i < childs.getLength(); i++) {
  679. Node obj = childs.item(i);
  680. str = str + obj.getNodeValue();
  681. }
  682. return str;
  683. }
  684. }