1 /*
   2  * Copyright (c) 1997, 2013, 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 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 (BookPage) 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 }