00001 package edu.stanford.hci.r3.paper.sheets;
00002
00003 import java.io.File;
00004 import java.io.IOException;
00005 import java.util.Iterator;
00006
00007 import javax.xml.parsers.DocumentBuilder;
00008 import javax.xml.parsers.DocumentBuilderFactory;
00009 import javax.xml.parsers.ParserConfigurationException;
00010
00011 import org.w3c.dom.NamedNodeMap;
00012 import org.w3c.dom.Node;
00013 import org.w3c.dom.NodeList;
00014 import org.xml.sax.SAXException;
00015
00016 import edu.stanford.hci.r3.paper.Sheet;
00017 import edu.stanford.hci.r3.paper.regions.XMLRegion;
00018 import edu.stanford.hci.r3.units.Points;
00019
00030 public class XMLSheet extends Sheet {
00031
00032 public static void main(String args[]) {
00033 try {
00034 File file = new File("SketchedPaperUI.xml");
00035 new XMLSheet(file);
00036
00037 } catch (Exception ex) {
00038 ex.printStackTrace();
00039 }
00040 }
00041
00042 public XMLSheet(File xmlFile) throws IOException {
00043 try {
00044 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
00045 DocumentBuilder builder = factory.newDocumentBuilder();
00046 Node sheetNode = builder.parse( xmlFile ).getFirstChild();
00047
00048 NamedNodeMap sheetAttributes = sheetNode.getAttributes();
00049
00050 double sheetWidth = Double.parseDouble(sheetAttributes.getNamedItem("width").getTextContent());
00051 double sheetHeight = Double.parseDouble(sheetAttributes.getNamedItem("height").getTextContent());
00052
00053 setSize(new Points(sheetWidth), new Points(sheetHeight));
00054
00055 System.out.println("sheet: width="+sheetWidth+" x height="+sheetHeight);
00056
00057 for (Node region : new Iterate(sheetNode)) {
00058 if (region.getNodeName().equals("region")) {
00059 NamedNodeMap attributes = region.getAttributes();
00060 String name = attributes.getNamedItem("name").getTextContent();
00061 double x = Double.parseDouble(attributes.getNamedItem("x").getTextContent());
00062 double y = Double.parseDouble(attributes.getNamedItem("y").getTextContent());
00063 double width = Double.parseDouble(attributes.getNamedItem("width").getTextContent());
00064 double height = Double.parseDouble(attributes.getNamedItem("height").getTextContent());
00065 System.out.println("region: "+name+"[x="+x+",y="+y+" width="+width+" x height="+height+"]");
00066
00067 String eventType = null;
00068
00069 for (Node eventHandler : new Iterate(region)) {
00070 if (eventHandler.getNodeName().equals("eventHandler")) {
00071 eventType = eventHandler.getAttributes().getNamedItem("type").getTextContent();
00072 System.out.println("event: "+ eventType);
00073 }
00074 }
00075 addRegion(new XMLRegion(name,x,y,width,height,eventType));
00076
00077 }
00078 }
00079 } catch (SAXException ex) {
00080 throw new IOException(ex);
00081 } catch (ParserConfigurationException ex) {
00082 throw new IOException(ex);
00083 }
00084 }
00085
00086 private class Iterate implements Iterator<Node>,Iterable<Node> {
00087 NodeList list;
00088 int i = 0;
00089 Iterate(Node n) {
00090 this.list = n.getChildNodes();
00091 }
00092 Iterate(NodeList list) {
00093 this.list = list;
00094 }
00095 public boolean hasNext() {
00096 return i < list.getLength();
00097 }
00098 public Node next() {
00099 return list.item(i++);
00100 }
00101 public void remove() {
00102 throw new UnsupportedOperationException();
00103 }
00104 public Iterator<Node> iterator() {
00105 return new Iterate(list);
00106 }
00107
00108 }
00109 }