1/*
2 * Copyright (c) 2003, 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
27package sun.print;
28
29import javax.print.attribute.EnumSyntax;
30import javax.print.attribute.standard.Media;
31import javax.print.attribute.standard.MediaSize;
32import javax.print.attribute.standard.MediaSizeName;
33import java.util.ArrayList;
34
35class CustomMediaSizeName extends MediaSizeName {
36    private static ArrayList<String> customStringTable = new ArrayList<>();
37    private static ArrayList<MediaSizeName> customEnumTable = new ArrayList<>();
38    private String choiceName;
39    private MediaSizeName mediaName;
40
41    private CustomMediaSizeName(int x) {
42        super(x);
43
44    }
45
46    private static synchronized int nextValue(String name) {
47      customStringTable.add(name);
48
49      return (customStringTable.size()-1);
50    }
51
52    public CustomMediaSizeName(String name) {
53        super(nextValue(name));
54        customEnumTable.add(this);
55        choiceName = null;
56        mediaName = null;
57    }
58
59    public CustomMediaSizeName(String name, String choice,
60                               float width, float length) {
61        super(nextValue(name));
62        choiceName = choice;
63        customEnumTable.add(this);
64        mediaName = null;
65        try {
66            mediaName = MediaSize.findMedia(width, length,
67                                            MediaSize.INCH);
68        } catch (IllegalArgumentException iae) {
69        }
70        // The public API method finds a closest match even if it not
71        // all that close. Here we want to be sure its *really* close.
72        if (mediaName != null) {
73            MediaSize sz = MediaSize.getMediaSizeForName(mediaName);
74            if (sz == null) {
75                mediaName = null;
76            } else {
77                float w = sz.getX(MediaSize.INCH);
78                float h = sz.getY(MediaSize.INCH);
79                float dw = Math.abs(w - width);
80                float dh = Math.abs(h - length);
81                if (dw > 0.1 || dh > 0.1) {
82                    mediaName = null;
83                }
84            }
85        }
86    }
87
88    /**
89     * Version ID for serialized form.
90     */
91    private static final long serialVersionUID = 7412807582228043717L;
92
93    /**
94     * Returns the command string for this media.
95     */
96    public String getChoiceName() {
97        return choiceName;
98    }
99
100
101    /**
102     * Returns matching standard MediaSizeName.
103     */
104    public MediaSizeName getStandardMedia() {
105        return mediaName;
106    }
107
108
109    // moved from RasterPrinterJob
110    /**
111     * Returns closest matching MediaSizeName among given array of Media
112     */
113    public static MediaSizeName findMedia(Media[] media, float x, float y,
114                                          int units) {
115
116
117        if (x <= 0.0f || y <= 0.0f || units < 1) {
118            throw new IllegalArgumentException("args must be +ve values");
119        }
120
121        if (media == null || media.length == 0) {
122            throw new IllegalArgumentException("args must have valid array of media");
123        }
124
125        int size =0;
126        MediaSizeName[] msn = new MediaSizeName[media.length];
127        for (int i=0; i<media.length; i++) {
128            if (media[i] instanceof MediaSizeName) {
129                msn[size++] = (MediaSizeName)media[i];
130            }
131        }
132
133        if (size == 0) {
134            return null;
135        }
136
137        int match = 0;
138
139        double ls = x * x + y * y;
140        double tmp_ls;
141        float []dim;
142        float diffx = x;
143        float diffy = y;
144
145        for (int i=0; i < size ; i++) {
146            MediaSize mediaSize = MediaSize.getMediaSizeForName(msn[i]);
147            if (mediaSize == null) {
148                continue;
149            }
150            dim = mediaSize.getSize(units);
151            if (x == dim[0] && y == dim[1]) {
152                match = i;
153                break;
154            } else {
155                diffx = x - dim[0];
156                diffy = y - dim[1];
157                tmp_ls = diffx * diffx + diffy * diffy;
158                if (tmp_ls < ls) {
159                    ls = tmp_ls;
160                    match = i;
161                }
162            }
163        }
164
165        return msn[match];
166    }
167
168    /**
169     * Returns the string table for super class MediaSizeName.
170     */
171    public  Media[] getSuperEnumTable() {
172        return (Media[])super.getEnumValueTable();
173    }
174
175
176    /**
177     * Returns the string table for class CustomMediaSizeName.
178     */
179    protected String[] getStringTable() {
180      String[] nameTable = new String[customStringTable.size()];
181      return customStringTable.toArray(nameTable);
182    }
183
184    /**
185     * Returns the enumeration value table for class CustomMediaSizeName.
186     */
187    protected EnumSyntax[] getEnumValueTable() {
188      MediaSizeName[] enumTable = new MediaSizeName[customEnumTable.size()];
189      return customEnumTable.toArray(enumTable);
190    }
191
192}
193