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.

RenderPagesModel.java 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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.area;
  18. // FOP
  19. import org.apache.fop.render.Renderer;
  20. // Java
  21. import java.util.List;
  22. import java.util.Iterator;
  23. /**
  24. * This uses the store pages model to store the pages
  25. * each page is either rendered if ready or prepared
  26. * for later rendering.
  27. * Once a page is rendered it is cleared to release the
  28. * contents but the PageViewport is retained. So even
  29. * though the pages are stored the contents are discarded.
  30. */
  31. public class RenderPagesModel extends StorePagesModel {
  32. /**
  33. * The renderer that will render the pages.
  34. */
  35. protected Renderer renderer;
  36. /**
  37. * Pages that have been prepared but not rendered yet.
  38. */
  39. protected List prepared = new java.util.ArrayList();
  40. private List pendingExt = new java.util.ArrayList();
  41. private List endDocExt = new java.util.ArrayList();
  42. /**
  43. * Create a new render pages model with the given renderer.
  44. * @param rend the renderer to render pages to
  45. */
  46. public RenderPagesModel(Renderer rend) {
  47. renderer = rend;
  48. }
  49. /**
  50. * Start a new page sequence.
  51. * This tells the renderer that a new page sequence has
  52. * started with the given title.
  53. * @param title the title of the new page sequence
  54. */
  55. public void startPageSequence(Title title) {
  56. super.startPageSequence(title);
  57. renderer.startPageSequence(title);
  58. }
  59. /**
  60. * Add a page to the render page model.
  61. * If the page is finished it can be rendered immediately.
  62. * If the page needs resolving then if the renderer supports
  63. * out of order rendering it can prepare the page. Otherwise
  64. * the page is added to a queue.
  65. * @param page the page to add to the model
  66. */
  67. public void addPage(PageViewport page) {
  68. super.addPage(page);
  69. // for links the renderer needs to prepare the page
  70. // it is more appropriate to do this after queued pages but
  71. // it will mean that the renderer has not prepared a page that
  72. // could be referenced
  73. boolean done = renderer.supportsOutOfOrder() && page.isResolved();
  74. if (done) {
  75. try {
  76. renderer.renderPage(page);
  77. } catch (Exception e) {
  78. // use error handler to handle this FOP or IO Exception
  79. e.printStackTrace();
  80. }
  81. page.clear();
  82. } else {
  83. preparePage(page);
  84. }
  85. // check prepared pages
  86. boolean cont = checkPreparedPages(page);
  87. if (cont) {
  88. renderExtensions(pendingExt);
  89. pendingExt.clear();
  90. }
  91. }
  92. /**
  93. * Check prepared pages
  94. *
  95. * @param newpage the new page being added
  96. * @return true if the current page should be rendered
  97. * false if the renderer doesn't support out of order
  98. * rendering and there are pending pages
  99. */
  100. protected boolean checkPreparedPages(PageViewport newpage) {
  101. for (Iterator iter = prepared.iterator(); iter.hasNext();) {
  102. PageViewport p = (PageViewport)iter.next();
  103. if (p.isResolved()) {
  104. try {
  105. renderer.renderPage(p);
  106. } catch (Exception e) {
  107. // use error handler to handle this FOP or IO Exception
  108. e.printStackTrace();
  109. }
  110. p.clear();
  111. iter.remove();
  112. } else {
  113. // if keeping order then stop at first page not resolved
  114. if (!renderer.supportsOutOfOrder()) {
  115. break;
  116. }
  117. }
  118. }
  119. return renderer.supportsOutOfOrder() || prepared.isEmpty();
  120. }
  121. /**
  122. * Prepare a page.
  123. * An unresolved page can be prepared if the renderer supports
  124. * it and the page will be rendered later.
  125. * @param page the page to prepare
  126. */
  127. protected void preparePage(PageViewport page) {
  128. if (renderer.supportsOutOfOrder()) {
  129. renderer.preparePage(page);
  130. }
  131. prepared.add(page);
  132. }
  133. /**
  134. * Add an extension to this model.
  135. * If handle immediately then send directly to the renderer.
  136. * The after page ones are handled after the next page is added.
  137. * End of document extensions are added to a list to be
  138. * handled at the end.
  139. * @param ext the extension
  140. * @param when when to render the extension
  141. */
  142. public void addExtension(TreeExt ext, int when) {
  143. switch(when) {
  144. case TreeExt.IMMEDIATELY:
  145. renderer.renderExtension(ext);
  146. break;
  147. case TreeExt.AFTER_PAGE:
  148. pendingExt.add(ext);
  149. break;
  150. case TreeExt.END_OF_DOC:
  151. endDocExt.add(ext);
  152. break;
  153. }
  154. }
  155. private void renderExtensions(List list) {
  156. for (int count = 0; count < list.size(); count++) {
  157. TreeExt ext = (TreeExt)list.get(count);
  158. renderer.renderExtension(ext);
  159. }
  160. }
  161. /**
  162. * End the document. Render any end document extensions.
  163. */
  164. public void endDocument() {
  165. // render any pages that had unresolved ids
  166. checkPreparedPages(null);
  167. renderExtensions(pendingExt);
  168. pendingExt.clear();
  169. renderExtensions(endDocExt);
  170. }
  171. }