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 27 package sun.print; 28 29 import javax.print.attribute.EnumSyntax; 30 import javax.print.attribute.standard.Media; 31 import javax.print.attribute.standard.MediaSize; 32 import javax.print.attribute.standard.MediaSizeName; 33 import java.util.ArrayList; 34 35 class 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 synchronized static 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 } 71 72 /** 73 * Version ID for serialized form. 74 */ 75 private static final long serialVersionUID = 7412807582228043717L; 76 77 /** 78 * Returns the command string for this media. 79 */ 80 public String getChoiceName() { 81 return choiceName; 82 } 83 84 85 /** 86 * Returns matching standard MediaSizeName. 87 */ 88 public MediaSizeName getStandardMedia() { 89 return mediaName; 90 } 91 92 93 // moved from RasterPrinterJob 94 /** 95 * Returns closest matching MediaSizeName among given array of Media 96 */ 97 public static MediaSizeName findMedia(Media[] media, float x, float y, 98 int units) { 99 100 101 if (x <= 0.0f || y <= 0.0f || units < 1) { 102 throw new IllegalArgumentException("args must be +ve values"); 103 } 104 105 if (media == null || media.length == 0) { 106 throw new IllegalArgumentException("args must have valid array of media"); 107 } 108 109 int size =0; 110 MediaSizeName[] msn = new MediaSizeName[media.length]; 111 for (int i=0; i<media.length; i++) { 112 if (media[i] instanceof MediaSizeName) { 113 msn[size++] = (MediaSizeName)media[i]; 114 } 115 } 116 117 if (size == 0) { 118 return null; 119 } 120 121 int match = 0; 122 123 double ls = x * x + y * y; 124 double tmp_ls; 125 float []dim; 126 float diffx = x; 127 float diffy = y; 128 129 for (int i=0; i < size ; i++) { 130 MediaSize mediaSize = MediaSize.getMediaSizeForName(msn[i]); 131 if (mediaSize == null) { 132 continue; 133 } 134 dim = mediaSize.getSize(units); 135 if (x == dim[0] && y == dim[1]) { 136 match = i; 137 break; 138 } else { 139 diffx = x - dim[0]; 140 diffy = y - dim[1]; 141 tmp_ls = diffx * diffx + diffy * diffy; 142 if (tmp_ls < ls) { 143 ls = tmp_ls; 144 match = i; 145 } 146 } 147 } 148 149 return msn[match]; 150 } 151 152 /** 153 * Returns the string table for super class MediaSizeName. 154 */ 155 public Media[] getSuperEnumTable() { 156 return (Media[])super.getEnumValueTable(); 157 } 158 159 160 /** 161 * Returns the string table for class CustomMediaSizeName. 162 */ 163 protected String[] getStringTable() { 164 String[] nameTable = new String[customStringTable.size()]; 165 return customStringTable.toArray(nameTable); 166 } 167 168 /** 169 * Returns the enumeration value table for class CustomMediaSizeName. 170 */ 171 protected EnumSyntax[] getEnumValueTable() { 172 MediaSizeName[] enumTable = new MediaSizeName[customEnumTable.size()]; 173 return customEnumTable.toArray(enumTable); 174 } 175 176 }