blob: 6a6a0d09a5b930f960f69384f4994b54d50bed88 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 Angelo Zerr and others.
* 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:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.e4.ui.css.core.css2;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.e4.ui.css.core.dom.properties.converters.ICSSValueConverterColorConfig;
import org.eclipse.e4.ui.css.core.dom.properties.converters.ICSSValueConverterConfig;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.RGBColor;
/**
* CSS2 Color Helper.
*
* @version 1.0.0
* @author <a href="mailto:angelo.zerr@gmail.com">Angelo ZERR</a>
*
*/
public class CSS2ColorHelper {
/**
* Map with key=color name and value=hexadecimal color.
*/
private static Map colorNamesMap = new HashMap();;
/**
* Map with key=hexadecimal color and value=color name.
*/
private static Map colorHexasMap = new HashMap();;
/**
* Return w3c {@link RGBColor} from string value. Format String value is
* hexadecimal like #FFFFFF or color name like white.
*
* @param value
* @return
*/
public static RGBColor getRGBColor(String value) {
if (value.startsWith("#") && value.length() == 7) {
// Color is like #FFFFFF
try {
int redValue = Integer.decode("0x" + value.substring(1, 3))
.intValue();
int greenValue = Integer.decode("0x" + value.substring(3, 5))
.intValue();
int blueValue = Integer.decode("0x" + value.substring(5))
.intValue();
return new CSS2RGBColorImpl(redValue, greenValue, blueValue);
} catch (Exception e) {
return null;
}
}
// Search if it's color name
value = value.toLowerCase();
value = (String) colorNamesMap.get(value);
if (value != null)
return getRGBColor(value);
return null;
}
/**
* Return color string form w3c <code>rgbColor</code> instance. The format
* (Hexa, color name or rgb format) of the color string is managed with
* <code>config</code> {@link ICSSValueConverterConfig}.
*
* @param rgbColor
* @param config
* @return
*/
public static String getColorStringValue(RGBColor rgbColor,
ICSSValueConverterConfig config) {
if (config instanceof ICSSValueConverterColorConfig) {
ICSSValueConverterColorConfig colorConfig = (ICSSValueConverterColorConfig) config;
switch (colorConfig.getFormat()) {
case ICSSValueConverterColorConfig.COLOR_HEXA_FORMAT:
return getHexaColorStringValue(rgbColor);
case ICSSValueConverterColorConfig.COLOR_RGB_FORMAT:
return getRGBColorStringValue(rgbColor);
case ICSSValueConverterColorConfig.COLOR_NAME_FORMAT:
// Get the Hexa color string value
String hexaColor = getHexaColorStringValue(rgbColor);
if (hexaColor != null) {
// Search into hexa map the color name
String colorName = getColorNameFromHexaColor(hexaColor);
if (colorName != null)
return colorName;
// Color name is not found, return the Hexa value
return hexaColor;
}
return getRGBColorStringValue(rgbColor);
}
}
return getHexaColorStringValue(rgbColor);
}
/**
* Return rgb (ex : rgb(0,0,0)) color string value from w3c
* <code>rgbColor</code> instance.
*
* @param rgbColor
* @return
*/
public static String getRGBColorStringValue(RGBColor rgbColor) {
String result = "rgb(";
int red = (int) rgbColor.getRed().getFloatValue(
CSSPrimitiveValue.CSS_NUMBER);
result += red;
result += ",";
int green = (int) rgbColor.getGreen().getFloatValue(
CSSPrimitiveValue.CSS_NUMBER);
result += green;
result += ",";
int blue = (int) rgbColor.getBlue().getFloatValue(
CSSPrimitiveValue.CSS_NUMBER);
result += blue;
result += ")";
return result;
}
/**
* Return hexadecimal (ex : #FFFFFF) color string value from w3c
* <code>rgbColor</code> instance.
*
* @param rgbColor
* @return
*/
public static String getHexaColorStringValue(RGBColor rgbColor) {
String result = "#";
int red = (int) rgbColor.getRed().getFloatValue(
CSSPrimitiveValue.CSS_NUMBER);
if (red < 16)
result += "0";
result += Integer.toHexString(red);
int green = (int) rgbColor.getGreen().getFloatValue(
CSSPrimitiveValue.CSS_NUMBER);
if (green < 16)
result += "0";
result += Integer.toHexString(green);
int blue = (int) rgbColor.getBlue().getFloatValue(
CSSPrimitiveValue.CSS_NUMBER);
if (blue < 16)
result += "0";
result += Integer.toHexString(blue);
return result;
}
/**
* Return the Hexa color (ex : #FFFFFF) from color name (ex : white).
*
* @param colorName
* @return
*/
public static String getHexaColorFromColorName(String colorName) {
return (String) colorNamesMap.get(colorName);
}
/**
* Return true if <code>value</code> is color name (ex : white) and false
* otherwise.
*
* @param value
* @return
*/
public static boolean isColorName(String value) {
return (colorNamesMap.get(value) != null);
}
/**
* Return the color name (ex : white) from Hexa color (ex : #FFFFFF).
*
* @param hexaColor
* @return
*/
public static String getColorNameFromHexaColor(String hexaColor) {
hexaColor = hexaColor.toUpperCase();
return (String) colorHexasMap.get(hexaColor);
}
static {
colorNamesMap.put("aliceBlue", "#F0F8FF");
colorNamesMap.put("aqua", "#00FFFF");
colorNamesMap.put("aquamarine", "#7FFFD4");
colorNamesMap.put("azure", "#F0FFFF");
colorNamesMap.put("beige", "#F5F5DC");
colorNamesMap.put("bisque", "#FFE4C4");
colorNamesMap.put("black", "#000000");
colorNamesMap.put("blanchedalmond", "#FFEBCD");
colorNamesMap.put("blue", "#0000FF");
colorNamesMap.put("blueviolet", "#8A2BE2");
colorNamesMap.put("brown", "#A52A2A");
colorNamesMap.put("burlywood", "#DEB887");
colorNamesMap.put("cadetblue", "#5F9EA0");
colorNamesMap.put("chartreuse", "#7FFF00");
colorNamesMap.put("chocolate", "#D2691E");
colorNamesMap.put("coral", "#FF7F50");
colorNamesMap.put("cornflowerblue", "#6495ED");
colorNamesMap.put("cornsilk", "#FFF8DC");
colorNamesMap.put("crimson", "#DC143C");
colorNamesMap.put("cyan", "#00FFFF");
colorNamesMap.put("darkblue", "#00008B");
colorNamesMap.put("darkcyan", "#008B8B");
colorNamesMap.put("darkgoldenrod", "#B8860B");
colorNamesMap.put("darkgray", "#A9A9A9");
colorNamesMap.put("darkgrey", "#A9A9A9");
colorNamesMap.put("darkgreen", "#006400");
colorNamesMap.put("darkkhaki", "#BDB76B");
colorNamesMap.put("darkmagenta", "#8B008B");
colorNamesMap.put("darkolivegreen", "#556B2F");
colorNamesMap.put("darkorange", "#FF8C00");
colorNamesMap.put("darkorchid", "#9932CC");
colorNamesMap.put("darkred", "#8B0000");
colorNamesMap.put("darksalmon", "#E9967A");
colorNamesMap.put("darkseagreen", "#8FBC8F");
colorNamesMap.put("darkslateblue", "#483D8B");
colorNamesMap.put("darkslategray", "#2F4F4F");
colorNamesMap.put("darkslategrey", "#2F4F4F");
colorNamesMap.put("darkturquoise", "#00CED1");
colorNamesMap.put("darkviolet", "#9400D3");
colorNamesMap.put("deeppink", "#FF1493");
colorNamesMap.put("deepskyblue", "#00BFFF");
colorNamesMap.put("dimgray", "#696969");
colorNamesMap.put("dimgrey", "#696969");
colorNamesMap.put("dodgerblue", "#1E90FF");
colorNamesMap.put("firebrick", "#B22222");
colorNamesMap.put("floralwhite", "#FFFAF0");
colorNamesMap.put("forestgreen", "#228B22");
colorNamesMap.put("fuchsia", "#FF00FF");
colorNamesMap.put("gainsboro", "#DCDCDC");
colorNamesMap.put("ghostwhite", "#F8F8FF");
colorNamesMap.put("gold", "#FFD700");
colorNamesMap.put("goldenrod", "#DAA520");
colorNamesMap.put("gray", "#808080");
colorNamesMap.put("grey", "#808080");
colorNamesMap.put("green", "#008000");
colorNamesMap.put("greenyellow", "#ADFF2F");
colorNamesMap.put("honeydew", "#F0FFF0");
colorNamesMap.put("hotpink", "#FF69B4");
colorNamesMap.put("indianred", "#CD5C5C");
colorNamesMap.put("indigo", "#4B0082");
colorNamesMap.put("ivory", "#FFFFF0");
colorNamesMap.put("khaki", "#F0E68C");
colorNamesMap.put("lavender", "#E6E6FA");
colorNamesMap.put("lavenderblush", "#FFF0F5");
colorNamesMap.put("lawngreen", "#7CFC00");
colorNamesMap.put("lemonchiffon", "#FFFACD");
colorNamesMap.put("lightblue", "#ADD8E6");
colorNamesMap.put("lightcoral", "#F08080");
colorNamesMap.put("lightcyan", "#E0FFFF");
colorNamesMap.put("lightgoldenrodyellow", "#FAFAD2");
colorNamesMap.put("lightgray", "#D3D3D3");
colorNamesMap.put("lightgrey", "#D3D3D3");
colorNamesMap.put("lightgreen", "#90EE90");
colorNamesMap.put("lightpink", "#FFB6C1");
colorNamesMap.put("lightsalmon", "#FFA07A");
colorNamesMap.put("lightseagreen", "#20B2AA");
colorNamesMap.put("lightskyblue", "#87CEFA");
colorNamesMap.put("lightslategray", "#778899");
colorNamesMap.put("lightslategrey", "#778899");
colorNamesMap.put("lightsteelblue", "#B0C4DE");
colorNamesMap.put("lightyellow", "#FFFFE0");
colorNamesMap.put("lime", "#00FF00");
colorNamesMap.put("limegreen", "#32CD32");
colorNamesMap.put("linen", "#FAF0E6");
colorNamesMap.put("magenta", "#FF00FF");
colorNamesMap.put("maroon", "#800000");
colorNamesMap.put("mediumaquamarine", "#66CDAA");
colorNamesMap.put("mediumblue", "#0000CD");
colorNamesMap.put("mediumorchid", "#BA55D3");
colorNamesMap.put("mediumpurple", "#9370D8");
colorNamesMap.put("mediumseagreen", "#3CB371");
colorNamesMap.put("mediumslateblue", "#7B68EE");
colorNamesMap.put("mediumspringgreen", "#00FA9A");
colorNamesMap.put("mediumturquoise", "#48D1CC");
colorNamesMap.put("mediumvioletred", "#C71585");
colorNamesMap.put("midnightblue", "#191970");
colorNamesMap.put("mintcream", "#F5FFFA");
colorNamesMap.put("mistyrose", "#FFE4E1");
colorNamesMap.put("moccasin", "#FFE4B5");
colorNamesMap.put("navajowhite", "#FFDEAD");
colorNamesMap.put("navy", "#000080");
colorNamesMap.put("oldlace", "#FDF5E6");
colorNamesMap.put("olive", "#808000");
colorNamesMap.put("olivedrab", "#6B8E23");
colorNamesMap.put("orange", "#FFA500");
colorNamesMap.put("orangered", "#FF4500");
colorNamesMap.put("orchid", "#DA70D6");
colorNamesMap.put("palegoldenrod", "#EEE8AA");
colorNamesMap.put("palegreen", "#98FB98");
colorNamesMap.put("paleturquoise", "#AFEEEE");
colorNamesMap.put("palevioletred", "#D87093");
colorNamesMap.put("papayawhip", "#FFEFD5");
colorNamesMap.put("peachpuff", "#FFDAB9");
colorNamesMap.put("peru", "#CD853F");
colorNamesMap.put("pink", "#FFC0CB");
colorNamesMap.put("plum", "#DDA0DD");
colorNamesMap.put("powderblue", "#B0E0E6");
colorNamesMap.put("purple", "#800080");
colorNamesMap.put("red", "#FF0000");
colorNamesMap.put("rosybrown", "#BC8F8F");
colorNamesMap.put("royalblue", "#4169E1");
colorNamesMap.put("saddlebrown", "#8B4513");
colorNamesMap.put("salmon", "#FA8072");
colorNamesMap.put("sandybrown", "#F4A460");
colorNamesMap.put("seagreen", "#2E8B57");
colorNamesMap.put("seashell", "#FFF5EE");
colorNamesMap.put("sienna", "#A0522D");
colorNamesMap.put("silver", "#C0C0C0");
colorNamesMap.put("skyblue", "#87CEEB");
colorNamesMap.put("slateblue", "#6A5ACD");
colorNamesMap.put("slategray", "#708090");
colorNamesMap.put("slategrey", "#708090");
colorNamesMap.put("snow", "#FFFAFA");
colorNamesMap.put("springgreen", "#00FF7F");
colorNamesMap.put("steelblue", "#4682B4");
colorNamesMap.put("tan", "#D2B48C");
colorNamesMap.put("teal", "#008080");
colorNamesMap.put("thistle", "#D8BFD8");
colorNamesMap.put("tomato", "#FF6347");
colorNamesMap.put("turquoise", "#40E0D0");
colorNamesMap.put("violet", "#EE82EE");
colorNamesMap.put("wheat", "#F5DEB3");
colorNamesMap.put("white", "#FFFFFF");
colorNamesMap.put("whitesmoke", "#F5F5F5");
colorNamesMap.put("yellow", "#FFFF00");
colorNamesMap.put("yellowgreen", "#9ACD32");
// Build Map with key=hexadecimal color and value=color name
for (Iterator iterator = colorNamesMap.entrySet().iterator(); iterator
.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
colorHexasMap.put(entry.getValue(), entry.getKey());
}
}
}