package jas.util; import java.awt.Color; import java.util.Hashtable; public final class ColorConverter { static final Color hexToColor(String value) throws ColorConversionException { try { return Color.decode("0x" + value.substring(1)); } catch (Throwable t) { throw new ColorConversionException(value); } } static final Color rgbToColor(String value) throws ColorConversionException { String red, blue, green; int comma1, comma2; int r,g,b; comma1 = value.indexOf(","); comma2 = value.indexOf(",", comma1 + 1); if (comma1<2 || comma2<comma1+2 || value.length() < comma1+2) throw new ColorConversionException(value); try { red = value.substring(1, comma1); green = value.substring(comma1 + 1, comma2); blue = value.substring(comma2 + 1, value.length() - 1); r = Integer.parseInt(red); g = Integer.parseInt(green); b = Integer.parseInt(blue); return new Color(r,g,b); } catch (Throwable t) { throw new ColorConversionException(value); } } /** * Convert a color string "RED" (case-insensitive) or "#NNNNNN" or "(RRR,GGG,BBB)" to a Color. * @return the Color (null if no match is found) */ public static Color stringToHTMLColor(String str) throws ColorConversionException { if (str == null || str.equals("") || str.equals("default")) return null; //First we handle #NNNNNN and (RRR,GGG,BBB) colors. if (str.charAt(0) == '#') return hexToColor(str); if (str.charAt(0) == '(') return rgbToColor(str); Color c = (Color) cc.stringToColor.get(str.toLowerCase()); if (c == null) throw new ColorConversionException(str); return c; } public static String colorToString(Color c) { if (c == null) return "default"; String s = (String) cc.colorToString.get(c); if (s != null) return s; //if we got here, we didn't find a match so let's return a nice (RRR,GGG,BBB) String return "(" + c.getRed() + "," + c.getGreen() + "," + c.getBlue() + ")"; } private ColorConverter() { //first we look for the special named Java colors addEntry(Color.black,"Black"); addEntry(Color.blue,"Blue"); addEntry(Color.cyan,"Cyan"); addEntry(Color.darkGray,"Dark Gray"); addEntry(Color.gray,"Gray"); addEntry(Color.green,"Green"); addEntry(Color.lightGray,"Light Gray"); addEntry(Color.magenta,"Magenta"); addEntry(Color.orange,"Orange"); addEntry(Color.pink,"Pink"); addEntry(Color.red,"Red"); addEntry(Color.white,"White"); addEntry(Color.yellow,"Yellow"); //now we look for the HTML3.2 colors (we look for all of them since //we don't want to depend on the RGB values of Java and HTML3.2 colors //being the same) addEntry(new Color(0,0,0),"Black"); addEntry(new Color(192,192,192),"Silver"); addEntry(new Color(128,128,128),"Gray"); addEntry(new Color(255,255,255),"White"); addEntry(new Color(128,0,0),"Maroon"); addEntry(new Color(255,0,0),"Red"); addEntry(new Color(128,0,128),"Purple"); addEntry(new Color(255,0,255),"Fuchsia"); addEntry(new Color(0,128,0),"Green"); addEntry(new Color(0,255,0),"Lime"); addEntry(new Color(128,128,0),"Olive"); addEntry(new Color(255,255,0),"Yellow"); addEntry(new Color(0,0,128),"Navy"); addEntry(new Color(0,0,255),"Blue"); addEntry(new Color(0,128,128),"Teal"); addEntry(new Color(0,255,255),"Aqua"); //now we look for the "all hail Crayola" colors :) //(we don't look for those which are also Java named colors) addEntry(new Color(0.1f, 0.1f, 0.1f),"Gray 10%"); addEntry(new Color(0.2f, 0.2f, 0.2f),"Gray 20%"); addEntry(new Color(0.3f, 0.3f, 0.3f),"Gray 30%"); addEntry(new Color(0.4f, 0.4f, 0.4f),"Gray 40%"); addEntry(new Color(0.5f, 0.5f, 0.5f),"Gray 50%"); addEntry(new Color(0.6f, 0.6f, 0.6f),"Gray 60%"); addEntry(new Color(0.7f, 0.7f, 0.7f),"Gray 70%"); addEntry(new Color(0.8f, 0.8f, 0.8f),"Gray 80%"); addEntry(new Color(0.9f, 0.9f, 0.9f),"Gray 90%"); addEntry(new Color(255, 136, 28),"Orange"); addEntry(new Color(120, 62, 27),"Brown"); addEntry(new Color(0, 125, 32),"Forest Green"); addEntry(new Color(11, 157, 150),"Turquoise"); addEntry(new Color(109, 0, 168),"Purple"); addEntry(new Color(168, 0, 126),"Magenta"); addEntry(new Color(164, 207, 255),"Sky Blue"); addEntry(new Color(225, 170, 255),"Violet"); addEntry(new Color(255, 170, 210),"Light Magenta"); } private void addEntry(Color c, String name) { stringToColor.put(name.toLowerCase(),c); colorToString.put(c,name); } private Hashtable stringToColor = new Hashtable(); private Hashtable colorToString = new Hashtable(); private static ColorConverter cc = new ColorConverter(); public static class ColorConversionException extends Exception { ColorConversionException(String value) { super("Cannot convert "+value+" to Color"); } } }