/******************************************************************************* * Copyright (c) 2008 Hallvard Traetteberg. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Hallvard Traetteberg - initial API and implementation ******************************************************************************/ package org.eclipse.e4.tm.stringconverters; import org.eclipse.e4.tm.stringconverter.StringConverterContext; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; public class WebColorStringConverter extends RGBStringConverter { public Object convert(String source, StringConverterContext context) throws Exception { String colorDef = null; if (source.length() > 0 && Character.isJavaIdentifierStart(source.charAt(0))) { colorDef = findColorDef(source); } Object result = super.convert(colorDef != null ? colorDef : source, context); if (! (result instanceof RGB)) { return null; } Display display = context.adapt(null, Display.class); Color color = new Color(display, (RGB)result); context.registerDisposable(color); return color; } public static RGB findRGB(String source) throws Exception { String colorDef = findColorDef(source); return RGBStringConverter.convertHexToRGB(colorDef != null ? colorDef : source); } public static String findColorDef(String colorName) { String colorDef = findColorDef(colorName, colorNames); if (colorDef == null) { colorName = fixColorName(colorName); colorDef = findColorDef(colorName, colorNames); } return colorDef; } public static String findColorName(String colorDef) { for (int i = 0; i < colorNames.length; i += 2) { if (colorDef.equals(colorNames[i + 1])) { return colorNames[i]; } } return null; } private static char toHexDigit(int n) { return (char)(n < 10 ? '0' + n : 'A' + n - 10); } private static String toHex(byte n) { int n1 = n / 16, n2 = n % 16; char[] buf = new char[] {toHexDigit(n1), toHexDigit(n2)}; return new String(buf); } public static String findColorName(int red, int green, int blue) { return findColorName("#" + toHex((byte)red) + toHex((byte)green) + toHex((byte)blue)); } private static String fixColorName(String colorName) { StringBuffer buffer = new StringBuffer(colorName.length()); boolean upcase = true; for (int i = 0; i < colorName.length(); i++) { char c = colorName.charAt(i); if ("-_".indexOf(c) >= 0) { upcase = true; } else { c = (upcase ? Character.toUpperCase(c) : Character.toLowerCase(c)); buffer.append(c); upcase = false; } } colorName = buffer.toString(); return colorName; } private static String findColorDef(String name, String table[]) { int slotsPrLine = 2, nameSlot = 0, colorSlot = 1; int low = 0, high = (table.length / slotsPrLine) - 1; while (low <= high) { int mid = (low + high) / 2; int cmp = table[mid * slotsPrLine + nameSlot].compareTo(name); if (cmp < 0) { low = mid + 1; } else if (cmp > 0) { high = mid - 1; } else { return table[mid * slotsPrLine + colorSlot]; } } return null; } // from http://www.w3schools.com/HTML/html_colornames.asp private static String[] colorNames = { "AliceBlue", "#F0F8FF", "AntiqueWhite", "#FAEBD7", "Aqua", "#00FFFF", "Aquamarine", "#7FFFD4", "Azure", "#F0FFFF", "Beige", "#F5F5DC", "Bisque", "#FFE4C4", "Black", "#000000", "BlanchedAlmond", "#FFEBCD", "Blue", "#0000FF", "BlueViolet", "#8A2BE2", "Brown", "#A52A2A", "BurlyWood", "#DEB887", "CadetBlue", "#5F9EA0", "Chartreuse", "#7FFF00", "Chocolate", "#D2691E", "Coral", "#FF7F50", "CornflowerBlue", "#6495ED", "Cornsilk", "#FFF8DC", "Crimson", "#DC143C", "Cyan", "#00FFFF", "DarkBlue", "#00008B", "DarkCyan", "#008B8B", "DarkGoldenRod", "#B8860B", "DarkGray", "#A9A9A9", "DarkGreen", "#006400", "DarkKhaki", "#BDB76B", "DarkMagenta", "#8B008B", "DarkOliveGreen", "#556B2F", "Darkorange", "#FF8C00", "DarkOrchid", "#9932CC", "DarkRed", "#8B0000", "DarkSalmon", "#E9967A", "DarkSeaGreen", "#8FBC8F", "DarkSlateBlue", "#483D8B", "DarkSlateGray", "#2F4F4F", "DarkTurquoise", "#00CED1", "DarkViolet", "#9400D3", "DeepPink", "#FF1493", "DeepSkyBlue", "#00BFFF", "DimGray", "#696969", "DodgerBlue", "#1E90FF", "FireBrick", "#B22222", "FloralWhite", "#FFFAF0", "ForestGreen", "#228B22", "Fuchsia", "#FF00FF", "Gainsboro", "#DCDCDC", "GhostWhite", "#F8F8FF", "Gold", "#FFD700", "GoldenRod", "#DAA520", "Gray", "#808080", "Green", "#008000", "GreenYellow", "#ADFF2F", "HoneyDew", "#F0FFF0", "HotPink", "#FF69B4", "IndianRed", "#CD5C5C", "Indigo", "#4B0082", "Ivory", "#FFFFF0", "Khaki", "#F0E68C", "Lavender", "#E6E6FA", "LavenderBlush", "#FFF0F5", "LawnGreen", "#7CFC00", "LemonChiffon", "#FFFACD", "LightBlue", "#ADD8E6", "LightCoral", "#F08080", "LightCyan", "#E0FFFF", "LightGoldenRodYellow", "#FAFAD2", "LightGrey", "#D3D3D3", "LightGreen", "#90EE90", "LightPink", "#FFB6C1", "LightSalmon", "#FFA07A", "LightSeaGreen", "#20B2AA", "LightSkyBlue", "#87CEFA", "LightSlateGray", "#778899", "LightSteelBlue", "#B0C4DE", "LightYellow", "#FFFFE0", "Lime", "#00FF00", "LimeGreen", "#32CD32", "Linen", "#FAF0E6", "Magenta", "#FF00FF", "Maroon", "#800000", "MediumAquaMarine", "#66CDAA", "MediumBlue", "#0000CD", "MediumOrchid", "#BA55D3", "MediumPurple", "#9370D8", "MediumSeaGreen", "#3CB371", "MediumSlateBlue", "#7B68EE", "MediumSpringGreen", "#00FA9A", "MediumTurquoise", "#48D1CC", "MediumVioletRed", "#C71585", "MidnightBlue", "#191970", "MintCream", "#F5FFFA", "MistyRose", "#FFE4E1", "Moccasin", "#FFE4B5", "NavajoWhite", "#FFDEAD", "Navy", "#000080", "OldLace", "#FDF5E6", "Olive", "#808000", "OliveDrab", "#6B8E23", "Orange", "#FFA500", "OrangeRed", "#FF4500", "Orchid", "#DA70D6", "PaleGoldenRod", "#EEE8AA", "PaleGreen", "#98FB98", "PaleTurquoise", "#AFEEEE", "PaleVioletRed", "#D87093", "PapayaWhip", "#FFEFD5", "PeachPuff", "#FFDAB9", "Peru", "#CD853F", "Pink", "#FFC0CB", "Plum", "#DDA0DD", "PowderBlue", "#B0E0E6", "Purple", "#800080", "Red", "#FF0000", "RosyBrown", "#BC8F8F", "RoyalBlue", "#4169E1", "SaddleBrown", "#8B4513", "Salmon", "#FA8072", "SandyBrown", "#F4A460", "SeaGreen", "#2E8B57", "SeaShell", "#FFF5EE", "Sienna", "#A0522D", "Silver", "#C0C0C0", "SkyBlue", "#87CEEB", "SlateBlue", "#6A5ACD", "SlateGray", "#708090", "Snow", "#FFFAFA", "SpringGreen", "#00FF7F", "SteelBlue", "#4682B4", "Tan", "#D2B48C", "Teal", "#008080", "Thistle", "#D8BFD8", "Tomato", "#FF6347", "Turquoise", "#40E0D0", "Violet", "#EE82EE", "Wheat", "#F5DEB3", "White", "#FFFFFF", "WhiteSmoke", "#F5F5F5", "Yellow", "#FFFF00", }; }