package org.droiddraw.util;
import java.awt.Color;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Hashtable;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.droiddraw.property.ColorProperty;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ColorHandler extends DefaultHandler {
Hashtable<String,Color> colors;
StringBuffer buff;
String name;
public ColorHandler() {
colors = new Hashtable<String,Color>();
buff = new StringBuffer();
}
@Override
public void characters(char[] arg0, int arg1, int arg2) {
buff.append(arg0,arg1,arg2);
}
@Override
public void startDocument() {
colors.clear();
}
@Override
public void startElement(String ns, String lName, String qName, Attributes atts) {
buff.setLength(0);
if (qName.equals("color")) {
name = atts.getValue("name");
}
}
@Override
public void endElement(String uri, String localName, String qName)
{
if (qName.equals("color")) {
colors.put(name, ColorProperty.parseColor(buff.toString()));
}
}
public Hashtable<String,Color> getColors() {
return colors;
}
public static Hashtable<String, Color> load(InputStream is)
throws SAXException, ParserConfigurationException, IOException
{
return load(new InputSource(is));
}
public static Hashtable<String, Color> load(InputSource in)
throws SAXException, ParserConfigurationException, IOException
{
ColorHandler sh = new ColorHandler();
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(in, sh);
return sh.getColors();
}
public static void dump(Writer w, Hashtable<String, Color> colors)
throws IOException
{
PrintWriter pw = new PrintWriter(w);
pw.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
pw.println("<resources>");
for (String key : colors.keySet()) {
Color value = colors.get(key);
String clr = "#"+Integer.toString(value.getRed(), 16)+
Integer.toString(value.getGreen(), 16)+
Integer.toString(value.getBlue(), 16)+
Integer.toString(value.getAlpha(), 16);
pw.println("<drawable name=\""+key+"\">"+clr+"</drawable>");
}
pw.println("</resources>");
pw.flush();
w.flush();
}
}