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
26package java.awt.print;
27
28import java.util.Vector;
29
30/**
31 * The {@code Book} 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
39public 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}.
56     */
57    public Book() {
58        mPages = new Vector<>();
59    }
60
61    /**
62     * Returns the number of pages in this {@code Book}.
63     * @return the number of pages this {@code Book} 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}.
72     * @param pageIndex the zero based index of the page whose
73     *            {@code PageFormat} is being requested
74     * @return the {@code PageFormat} describing the size and
75     *          orientation of the page.
76     * @throws IndexOutOfBoundsException if the {@code Pageable}
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}.
88     * @param pageIndex the zero based index of the page whose
89     *                  {@code Printable} is being requested
90     * @return the {@code Printable} that renders the page.
91     * @throws IndexOutOfBoundsException if the {@code Pageable}
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} and the {@code Painter} 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} 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}
110     * @throws NullPointerException if the {@code painter} or
111     *          {@code page} argument is {@code null}
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}.
129     * @param painter   the {@code Printable} instance that
130     *                  renders the page
131     * @param page      the size and orientation of the page
132     * @throws NullPointerException
133     *          If the {@code painter} or {@code page}
134     *          argument is {@code null}
135     */
136    public void append(Printable painter, PageFormat page) {
137        mPages.addElement(new BookPage(painter, page));
138    }
139
140    /**
141     * Appends {@code numPages} pages to the end of this
142     * {@code Book}.  Each of the pages is associated with
143     * {@code page}.
144     * @param painter   the {@code Printable} 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}.
149     * @throws NullPointerException
150     *          If the {@code painter} or {@code page}
151     *          argument is {@code null}
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} or {@code format}
194         *          argument is {@code null}
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}
222