1 /* 2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package java.awt.print; 27 28 import java.util.Vector; 29 30 /** 31 * The <code>Book</code> class provides a representation of a document in 32 * which pages may have different page formats and page painters. This 33 * class uses the {@link Pageable} interface to interact with a 34 * {@link PrinterJob}. 35 * @see Pageable 36 * @see PrinterJob 37 */ 38 39 public class Book implements Pageable { 40 41 /* Class Constants */ 42 43 /* Class Variables */ 44 45 /* Instance Variables */ 46 47 /** 48 * The set of pages that make up the Book. 49 */ 50 private Vector<BookPage> mPages; 51 52 /* Instance Methods */ 53 54 /** 55 * Creates a new, empty <code>Book</code>. 56 */ 57 public Book() { 58 mPages = new Vector<>(); 59 } 60 61 /** 62 * Returns the number of pages in this <code>Book</code>. 63 * @return the number of pages this <code>Book</code> contains. 64 */ 65 public int getNumberOfPages(){ 66 return mPages.size(); 67 } 68 69 /** 70 * Returns the {@link PageFormat} of the page specified by 71 * <code>pageIndex</code>. 72 * @param pageIndex the zero based index of the page whose 73 * <code>PageFormat</code> is being requested 74 * @return the <code>PageFormat</code> describing the size and 75 * orientation of the page. 76 * @throws IndexOutOfBoundsException if the <code>Pageable</code> 77 * does not contain the requested page 78 */ 79 public PageFormat getPageFormat(int pageIndex) 80 throws IndexOutOfBoundsException 81 { 82 return getPage(pageIndex).getPageFormat(); 83 } 84 85 /** 86 * Returns the {@link Printable} instance responsible for rendering 87 * the page specified by <code>pageIndex</code>. 88 * @param pageIndex the zero based index of the page whose 89 * <code>Printable</code> is being requested 90 * @return the <code>Printable</code> that renders the page. 91 * @throws IndexOutOfBoundsException if the <code>Pageable</code> 92 * does not contain the requested page 93 */ 94 public Printable getPrintable(int pageIndex) 95 throws IndexOutOfBoundsException 96 { 97 return getPage(pageIndex).getPrintable(); 98 } 99 100 /** 101 * Sets the <code>PageFormat</code> and the <code>Painter</code> for a 102 * specified page number. 103 * @param pageIndex the zero based index of the page whose 104 * painter and format is altered 105 * @param painter the <code>Printable</code> instance that 106 * renders the page 107 * @param page the size and orientation of the page 108 * @throws IndexOutOfBoundsException if the specified 109 * page is not already in this <code>Book</code> 110 * @throws NullPointerException if the <code>painter</code> or 111 * <code>page</code> argument is <code>null</code> 112 */ 113 public void setPage(int pageIndex, Printable painter, PageFormat page) 114 throws IndexOutOfBoundsException 115 { 116 if (painter == null) { 117 throw new NullPointerException("painter is null"); 118 } 119 120 if (page == null) { 121 throw new NullPointerException("page is null"); 122 } 123 124 mPages.setElementAt(new BookPage(painter, page), pageIndex); 125 } 126 127 /** 128 * Appends a single page to the end of this <code>Book</code>. 129 * @param painter the <code>Printable</code> instance that 130 * renders the page 131 * @param page the size and orientation of the page 132 * @throws NullPointerException 133 * If the <code>painter</code> or <code>page</code> 134 * argument is <code>null</code> 135 */ 136 public void append(Printable painter, PageFormat page) { 137 mPages.addElement(new BookPage(painter, page)); 138 } 139 140 /** 141 * Appends <code>numPages</code> pages to the end of this 142 * <code>Book</code>. Each of the pages is associated with 143 * <code>page</code>. 144 * @param painter the <code>Printable</code> instance that renders 145 * the page 146 * @param page the size and orientation of the page 147 * @param numPages the number of pages to be added to the 148 * this <code>Book</code>. 149 * @throws NullPointerException 150 * If the <code>painter</code> or <code>page</code> 151 * argument is <code>null</code> 152 */ 153 public void append(Printable painter, PageFormat page, int numPages) { 154 BookPage bookPage = new BookPage(painter, page); 155 int pageIndex = mPages.size(); 156 int newSize = pageIndex + numPages; 157 158 mPages.setSize(newSize); 159 for(int i = pageIndex; i < newSize; i++){ 160 mPages.setElementAt(bookPage, i); 161 } 162 } 163 164 /** 165 * Return the BookPage for the page specified by 'pageIndex'. 166 */ 167 private BookPage getPage(int pageIndex) 168 throws ArrayIndexOutOfBoundsException 169 { 170 return mPages.elementAt(pageIndex); 171 } 172 173 /** 174 * The BookPage inner class describes an individual 175 * page in a Book through a PageFormat-Printable pair. 176 */ 177 private class BookPage { 178 /** 179 * The size and orientation of the page. 180 */ 181 private PageFormat mFormat; 182 183 /** 184 * The instance that will draw the page. 185 */ 186 private Printable mPainter; 187 188 /** 189 * A new instance where 'format' describes the page's 190 * size and orientation and 'painter' is the instance 191 * that will draw the page's graphics. 192 * @throws NullPointerException 193 * If the <code>painter</code> or <code>format</code> 194 * argument is <code>null</code> 195 */ 196 BookPage(Printable painter, PageFormat format) { 197 198 if (painter == null || format == null) { 199 throw new NullPointerException(); 200 } 201 202 mFormat = format; 203 mPainter = painter; 204 } 205 206 /** 207 * Return the instance that paints the 208 * page. 209 */ 210 Printable getPrintable() { 211 return mPainter; 212 } 213 214 /** 215 * Return the format of the page. 216 */ 217 PageFormat getPageFormat() { 218 return mFormat; 219 } 220 } 221 }