/*********************************************************************
 *
 *      Copyright (C) 2002 Andrew Khan
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ***************************************************************************/

package org.xbib.datastructures.xslx.jxl.format;

/**
 * Enumeration type which contains the available excel paper sizes and their
 * codes
 */
public final class PaperSize {
    /**
     * US Letter 8.5 x 11"
     */
    public static final PaperSize UNDEFINED = new PaperSize(0);
    /**
     * US Letter 8.5 x 11"
     */
    public static final PaperSize LETTER = new PaperSize(1);
    /**
     * Letter small 8.5" x 11"
     */
    public static final PaperSize LETTER_SMALL = new PaperSize(2);
    /**
     * Tabloid 11" x 17"
     */
    public static final PaperSize TABLOID = new PaperSize(3);
    /**
     * Leger 17" x 11"
     */
    public static final PaperSize LEDGER = new PaperSize(4);
    /**
     * US Legal 8.5" x 14"
     */
    public static final PaperSize LEGAL = new PaperSize(5);
    /**
     * Statement 5.5" x 8.5"
     */
    public static final PaperSize STATEMENT = new PaperSize(6);
    /**
     * Executive 7.25" x 10.5"
     */
    public static final PaperSize EXECUTIVE = new PaperSize(7);
    /**
     * A3 297mm x 420mm
     */
    public static final PaperSize A3 = new PaperSize(8);
    /**
     * A4 210mm x 297mm
     */
    public static final PaperSize A4 = new PaperSize(9);
    /**
     * A4 Small 210mm x 297 mm
     */
    public static final PaperSize A4_SMALL = new PaperSize(10);
    /**
     * A5 148mm x 210mm
     */
    public static final PaperSize A5 = new PaperSize(11);
    /**
     * B4 (JIS) 257mm x 364mm
     */
    public static final PaperSize B4 = new PaperSize(12);
    /**
     * B5 (JIS) 182mm x 257mm
     */
    public static final PaperSize B5 = new PaperSize(13);
    /**
     * Folio 8.5" x 13"
     */
    public static final PaperSize FOLIO = new PaperSize(14);
    /**
     * Quarto 215mm x 275mm
     */
    public static final PaperSize QUARTO = new PaperSize(15);
    /**
     * 10" x 14"
     */
    public static final PaperSize SIZE_10x14 = new PaperSize(16);
    /**
     * 11" x 17"
     */
    public static final PaperSize SIZE_10x17 = new PaperSize(17);
    /**
     * NOTE 8.5" x 11"
     */
    public static final PaperSize NOTE = new PaperSize(18);
    /**
     * Envelope #9 3 7/8" x 8 7/8"
     */
    public static final PaperSize ENVELOPE_9 = new PaperSize(19);
    /**
     * Envelope #10 4 1/8" x 9.5"
     */
    public static final PaperSize ENVELOPE_10 = new PaperSize(20);
    /**
     * Envelope #11 4.5" x 10 3/8"
     */
    public static final PaperSize ENVELOPE_11 = new PaperSize(21);
    /**
     * Envelope #12 4.75" x 11"
     */
    public static final PaperSize ENVELOPE_12 = new PaperSize(22);
    /**
     * Envelope #14 5" x 11.5"
     */
    public static final PaperSize ENVELOPE_14 = new PaperSize(23);
    /**
     * C 17" x 22"
     */
    public static final PaperSize C = new PaperSize(24);
    /**
     * D 22" x 34"
     */
    public static final PaperSize D = new PaperSize(25);
    /**
     * E 34" x 44"
     */
    public static final PaperSize E = new PaperSize(26);
    /**
     * Envelope DL 110mm � 220mm
     */
    public static final PaperSize ENVELOPE_DL = new PaperSize(27);
    /**
     * Envelope C5 162mm � 229mm
     */
    public static final PaperSize ENVELOPE_C5 = new PaperSize(28);
    /**
     * Envelope C3 324mm � 458mm
     */
    public static final PaperSize ENVELOPE_C3 = new PaperSize(29);
    /**
     * Envelope C4 229mm � 324mm
     */
    public static final PaperSize ENVELOPE_C4 = new PaperSize(30);
    /**
     * Envelope C6 114mm � 162mm
     */
    public static final PaperSize ENVELOPE_C6 = new PaperSize(31);
    /**
     * Envelope C6/C5 114mm � 229mm
     */
    public static final PaperSize ENVELOPE_C6_C5 = new PaperSize(32);
    /**
     * B4 (ISO) 250mm � 353mm
     */
    public static final PaperSize B4_ISO = new PaperSize(33);
    /**
     * B5 (ISO) 176mm � 250mm
     */
    public static final PaperSize B5_ISO = new PaperSize(34);
    /**
     * B6 (ISO) 125mm � 176mm
     */
    public static final PaperSize B6_ISO = new PaperSize(35);
    /**
     * Envelope Italy 110mm � 230mm
     */
    public static final PaperSize ENVELOPE_ITALY = new PaperSize(36);
    /**
     * Envelope Monarch 3 7/8" � 7.5"
     */
    public static final PaperSize ENVELOPE_MONARCH = new PaperSize(37);
    /**
     * 6.75 Envelope 3 5/8" � 6.5"
     */
    public static final PaperSize ENVELOPE_6_75 = new PaperSize(38);
    /**
     * US Standard Fanfold 14 7/8" � 11"
     */
    public static final PaperSize US_FANFOLD = new PaperSize(39);
    /**
     * German Std. Fanfold 8.5" � 12"
     */
    public static final PaperSize GERMAN_FANFOLD = new PaperSize(40);
    /**
     * German Legal Fanfold 8.5" � 13"
     */
    public static final PaperSize GERMAN_LEGAL_FANFOLD = new PaperSize(41);
    /**
     * B4 (ISO) 250mm � 353mm
     */
    public static final PaperSize B4_ISO_2 = new PaperSize(42);
    /**
     * Japanese Postcard 100mm � 148mm
     */
    public static final PaperSize JAPANESE_POSTCARD = new PaperSize(43);
    /**
     * 9�11 9" � 11"
     */
    public static final PaperSize SIZE_9x11 = new PaperSize(44);
    /**
     * 10�11 10" � 11"
     */
    public static final PaperSize SIZE_10x11 = new PaperSize(45);
    /**
     * 15�11 15" � 11"
     */
    public static final PaperSize SIZE_15x11 = new PaperSize(46);
    /**
     * Envelope Invite 220mm � 220mm
     */
    public static final PaperSize ENVELOPE_INVITE = new PaperSize(47);
    /**
     * Letter Extra 9.5" � 12"
     */
    public static final PaperSize LETTER_EXTRA = new PaperSize(50);
    /**
     * Legal Extra 9.5" � 15"
     */
    public static final PaperSize LEGAL_EXTRA = new PaperSize(51);
    /**
     * Tabloid Extra 11 11/16" � 18"
     */
    public static final PaperSize TABLOID_EXTRA = new PaperSize(52);
    /**
     * A4 Extra 235mm � 322mm
     */
    public static final PaperSize A4_EXTRA = new PaperSize(53);
    /**
     * Letter Transverse 8.5" � 11"
     */
    public static final PaperSize LETTER_TRANSVERSE = new PaperSize(54);
    /**
     * A4 Transverse 210mm � 297mm
     */
    public static final PaperSize A4_TRANSVERSE = new PaperSize(55);
    /**
     * Letter Extra Transv. 9.5" � 12"
     */
    public static final PaperSize LETTER_EXTRA_TRANSVERSE = new PaperSize(56);

    /* 48 & 49 Undefined */
    /**
     * Super A/A4 227mm � 356mm
     */
    public static final PaperSize SUPER_A_A4 = new PaperSize(57);
    /**
     * Super B/A3 305mm � 487mm
     */
    public static final PaperSize SUPER_B_A3 = new PaperSize(58);
    /**
     * Letter Plus 8.5" x 12 11/16"
     */
    public static final PaperSize LETTER_PLUS = new PaperSize(59);
    /**
     * A4 Plus 210mm � 330mm
     */
    public static final PaperSize A4_PLUS = new PaperSize(60);
    /**
     * A5 Transverse 148mm � 210mm
     */
    public static final PaperSize A5_TRANSVERSE = new PaperSize(61);
    /**
     * B5 (JIS) Transverse 182mm � 257mm
     */
    public static final PaperSize B5_TRANSVERSE = new PaperSize(62);
    /**
     * A3 Extra 322mm � 445mm
     */
    public static final PaperSize A3_EXTRA = new PaperSize(63);
    /**
     * A5 Extra 174mm � 235mm
     */
    public static final PaperSize A5_EXTRA = new PaperSize(64);
    /**
     * B5 (ISO) Extra 201mm � 276mm
     */
    public static final PaperSize B5_EXTRA = new PaperSize(65);
    /**
     * A2 420mm � 594mm
     */
    public static final PaperSize A2 = new PaperSize(66);
    /**
     * A3 Transverse 297mm � 420mm
     */
    public static final PaperSize A3_TRANSVERSE = new PaperSize(67);
    /**
     * A3 Extra Transverse 322mm � 445mm
     */
    public static final PaperSize A3_EXTRA_TRANSVERSE = new PaperSize(68);
    /**
     * Dbl. Japanese Postcard 200mm � 148mm
     */
    public static final PaperSize DOUBLE_JAPANESE_POSTCARD = new PaperSize(69);
    /**
     * A6 105mm � 148mm
     */
    public static final PaperSize A6 = new PaperSize(70);
    /**
     * Letter Rotated 11" � 8.5"
     */
    public static final PaperSize LETTER_ROTATED = new PaperSize(75);
    /**
     * A3 Rotated 420mm � 297mm
     */
    public static final PaperSize A3_ROTATED = new PaperSize(76);
    /**
     * A4 Rotated 297mm � 210mm
     */
    public static final PaperSize A4_ROTATED = new PaperSize(77);
    /**
     * A5 Rotated 210mm � 148mm
     */
    public static final PaperSize A5_ROTATED = new PaperSize(78);
    /**
     * B4 (JIS) Rotated 364mm � 257mm
     */
    public static final PaperSize B4_ROTATED = new PaperSize(79);
    /**
     * B5 (JIS) Rotated 257mm � 182mm
     */
    public static final PaperSize B5_ROTATED = new PaperSize(80);
    /**
     * Japanese Postcard Rot. 148mm � 100mm
     */
    public static final PaperSize JAPANESE_POSTCARD_ROTATED = new PaperSize(81);

    /* 71 - 74 undefined */
    /**
     * Dbl. Jap. Postcard Rot. 148mm � 200mm
     */
    public static final PaperSize DOUBLE_JAPANESE_POSTCARD_ROTATED = new PaperSize(82);
    /**
     * A6 Rotated 148mm � 105mm
     */
    public static final PaperSize A6_ROTATED = new PaperSize(83);
    /**
     * B6 (JIS) 128mm � 182mm
     */
    public static final PaperSize B6 = new PaperSize(88);
    /**
     * B6 (JIS) Rotated 182mm � 128mm
     */
    public static final PaperSize B6_ROTATED = new PaperSize(89);
    private static final int LAST_PAPER_SIZE = 89;
    /**
     * The paper sizes
     */
    private static PaperSize[] paperSizes = new PaperSize[LAST_PAPER_SIZE + 1];
    /**
     * The excel encoding
     */
    private final int val;

    /**
     * Constructor
     */
    private PaperSize(int v, boolean growArray) {
        val = v;

        if (v >= paperSizes.length && growArray) {
            // Grow the array and add this to it
            PaperSize[] newarray = new PaperSize[v + 1];
            System.arraycopy(paperSizes, 0, newarray, 0, paperSizes.length);
            paperSizes = newarray;
        }
        if (v < paperSizes.length) {
            paperSizes[v] = this;
        }
    }

    /**
     * Constructor
     */
    private PaperSize(int v) {
        this(v, true);
    }

    /* 84 - 87 undefined */

    /**
     * Gets the paper size for a specific value
     *
     * @param val the value
     * @return the paper size
     */
    public static PaperSize getPaperSize(int val) {
        PaperSize p = val > paperSizes.length - 1 ? null : paperSizes[val];
        return p == null ? new PaperSize(val, false) : p;
    }

    /**
     * Accessor for the internal binary value association with this paper size
     *
     * @return the internal value
     */
    public int getValue() {
        return val;
    }
}
