/******************************************************************************* * Copyright (c) 2011 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.wst.css.ui.internal.text.hover; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; import org.eclipse.swt.graphics.RGB; import org.eclipse.wst.css.ui.internal.CSSUIPlugin; import org.eclipse.wst.css.ui.internal.Logger; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import com.ibm.icu.util.StringTokenizer; /** * Associates css color names to the appropriate {@link RGB} values. * These associations are defined in org.eclipse.wst.css.ui/csscolors/extended-color-mapping.xml * */ class CSSColorNames { private static CSSColorNames instance; private static final Map colors = new HashMap(); private CSSColorNames() { try { URL url = FileLocator.find(CSSUIPlugin.getDefault().getBundle(), new Path("csscolors/extended-color-mapping.xml"), null); //$NON-NLS-1$ final XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader(); xmlReader.setContentHandler(new ColorMappingHandler()); xmlReader.parse(new InputSource(url.openStream())); } catch (IOException e) { Logger.logException(e); } catch (SAXException e) { Logger.logException(e); } catch (ParserConfigurationException e) { Logger.logException(e); } } public static synchronized CSSColorNames getInstance() { if (instance == null) { instance = new CSSColorNames(); } return instance; } /** * Returns the {@link RGB} value associated with this color name. * @param name the color name * @return {@link RGB} associated with <code>name</code>, null if it is an unknown name or invalid RGB value */ public RGB getRGB(String name) { return (RGB) colors.get(name); } class ColorMappingHandler extends DefaultHandler { private final String COLOR_ELEM = "color"; //$NON-NLS-1$ private final String NAME_ATTR = "name"; //$NON-NLS-1$ private final String RGB_ATTR = "rgb"; //$NON-NLS-1$ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (COLOR_ELEM.equals(qName)) { final String name = attributes.getValue(NAME_ATTR); final String rgb = attributes.getValue(RGB_ATTR); if (name != null && rgb != null) { final RGB rgbValue = getRGB(rgb); if (rgbValue != null) { colors.put(name, rgbValue); } } } } /** * Converts an rgb string into an {@link RGB} * @param rgb the color string * @return an {@link RGB} if one can be created from the string; otherwise, null */ private RGB getRGB(String rgb) { final StringTokenizer tokenizer = new StringTokenizer(rgb, ","); //$NON-NLS-1$ int[] weights = new int[3]; for (int i = 0; tokenizer.hasMoreTokens(); i++) { if (i > 2) return null; try { weights[i] = Integer.parseInt(tokenizer.nextToken().trim()); } catch (NumberFormatException e) { return null; } if (weights[i] > 255 || weights[i] < 0) return null; } return new RGB(weights[0], weights[1], weights[2]); } } }