--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.graphviz.internal.xdot;\r
+\r
+import java.io.IOException;\r
+import java.io.Reader;\r
+import java.io.StringReader;\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.Map;\r
+\r
+import org.simantics.graphviz.Edge;\r
+import org.simantics.graphviz.Graph;\r
+import org.simantics.graphviz.IGraph;\r
+import org.simantics.graphviz.IGraphPart;\r
+\r
+public class DrawCommandParser {\r
+\r
+ public static double readNumber(Reader s) throws IOException {\r
+ StringBuilder b = new StringBuilder();\r
+ while( true ) {\r
+ int c = s.read();\r
+ if(c == ' ' || c <= 0)\r
+ break;\r
+ b.append((char)c);\r
+ }\r
+ return Double.parseDouble(b.toString());\r
+ }\r
+ \r
+ public static int readInteger(Reader s) throws IOException {\r
+ StringBuilder b = new StringBuilder();\r
+ while( true ) {\r
+ int c = s.read();\r
+ if(c == ' ' || c <= 0)\r
+ break;\r
+ b.append((char)c);\r
+ }\r
+ return Integer.parseInt(b.toString());\r
+ }\r
+ \r
+ public static double[] readPoints(Reader s) throws IOException {\r
+ int n = readInteger(s);\r
+ double[] points = new double[n*2];\r
+ for(int i=0;i<n*2;++i)\r
+ points[i] = readNumber(s);\r
+ return points;\r
+ }\r
+ \r
+ public static String readString(Reader s) throws IOException {\r
+ int n = readInteger(s);\r
+ s.read();\r
+ char[] chars = new char[n];\r
+ for(int i=0;i<n;++i) {\r
+ char c = (char)s.read();\r
+ if(c == '\\')\r
+ c = (char)s.read();\r
+ chars[i] = c;\r
+ }\r
+ s.read();\r
+ return new String(chars);\r
+ }\r
+ \r
+ public static void parse(Collection<DrawCommand> commands, Reader s) throws IOException {\r
+ boolean hadSetStyle = false;\r
+ while(true) {\r
+ int commandChar = s.read();\r
+ s.read();\r
+ if(commandChar <= 0) {\r
+ if(hadSetStyle)\r
+ commands.add(new SetStyle("solid"));\r
+ return;\r
+ }\r
+ switch(commandChar) {\r
+ case 'E': {\r
+ double x = readNumber(s);\r
+ double y = readNumber(s);\r
+ double w = readNumber(s);\r
+ double h = readNumber(s);\r
+ commands.add(new FilledShape(Shapes.createEllipse(x, y, w, h)));\r
+ break;\r
+ }\r
+ case 'e': {\r
+ double x = readNumber(s);\r
+ double y = readNumber(s);\r
+ double w = readNumber(s);\r
+ double h = readNumber(s);\r
+ commands.add(new UnfilledShape(Shapes.createEllipse(x, y, w, h)));\r
+ break;\r
+ }\r
+ case 'P': {\r
+ commands.add(new FilledShape(Shapes.createPolygon(readPoints(s))));\r
+ break;\r
+ }\r
+ case 'p':\r
+ commands.add(new UnfilledShape(Shapes.createPolygon(readPoints(s))));\r
+ break;\r
+ case 'L':\r
+ commands.add(new UnfilledShape(Shapes.createPolyline(readPoints(s))));\r
+ break;\r
+ case 'B': \r
+ commands.add(new UnfilledShape(Shapes.createCubicSegments(readPoints(s))));\r
+ break;\r
+ case 'b':\r
+ commands.add(new FilledShape(Shapes.createCubicSegments(readPoints(s))));\r
+ break;\r
+ case 'T': {\r
+ double x = readNumber(s);\r
+ double y = readNumber(s);\r
+ int j = readInteger(s);\r
+ double w = readNumber(s);\r
+ String text = readString(s);\r
+ commands.add(new Text(x, y, j, w, text));\r
+ break;\r
+ }\r
+ case 'C':\r
+ commands.add(new SetFillColor(readString(s)));\r
+ break;\r
+ case 'c':\r
+ commands.add(new SetPenColor(readString(s)));\r
+ break;\r
+ case 'F': {\r
+ double points = readNumber(s);\r
+ String font = readString(s);\r
+ commands.add(new SetFont(points, font));\r
+ break;\r
+ }\r
+ case 'S':\r
+ hadSetStyle = true;\r
+ commands.add(new SetStyle(readString(s)));\r
+ break;\r
+ case 'I': {\r
+ double x = readNumber(s);\r
+ double y = readNumber(s);\r
+ double w = readNumber(s);\r
+ double h = readNumber(s);\r
+ String file = readString(s);\r
+ commands.add(new DrawImage(x, y, w, h, file));\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ public static void parse(Collection<DrawCommand> commands, String s) {\r
+ if(s != null)\r
+ try {\r
+ s = s.replace("\\\r\n", "");\r
+ parse(commands, new StringReader(s));\r
+ } catch(IOException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+ private static void parse(Collection<DrawCommand> commands, IGraph graph) {\r
+ for(IGraphPart part : graph.getParts()) {\r
+ parse(commands, part.get("_draw_"));\r
+ parse(commands, part.get("_ldraw_"));\r
+ if(part instanceof Edge) {\r
+ parse(commands, part.get("_hdraw_"));\r
+ parse(commands, part.get("_tdraw_"));\r
+ parse(commands, part.get("_hldraw_"));\r
+ parse(commands, part.get("_tldraw_"));\r
+ }\r
+ else if(part instanceof IGraph) {\r
+ parse(commands, (IGraph)part);\r
+ }\r
+ }\r
+ }\r
+ \r
+ private static void parse(Collection<DrawCommand> commands, Map<IGraphPart,Collection<DrawCommand>> partCommands, IGraph graph) {\r
+ for(IGraphPart part : graph.getParts()) {\r
+ Collection<DrawCommand> pCommands = new ArrayList<DrawCommand>();\r
+ parse(pCommands, part.get("_draw_"));\r
+ parse(pCommands, part.get("_ldraw_"));\r
+ if(part instanceof Edge) {\r
+ parse(pCommands, part.get("_hdraw_"));\r
+ parse(pCommands, part.get("_tdraw_"));\r
+ parse(pCommands, part.get("_hldraw_"));\r
+ parse(pCommands, part.get("_tldraw_"));\r
+ } else if(part instanceof IGraph) {\r
+ parse(commands, partCommands,(IGraph)part);\r
+ }\r
+ partCommands.put(part, pCommands);\r
+ commands.addAll(pCommands);\r
+ \r
+ }\r
+ }\r
+ \r
+ public static DrawCommand[] parse(Graph graph) {\r
+ Collection<DrawCommand> commands = new ArrayList<DrawCommand>();\r
+ parse(commands, graph);\r
+ return commands.toArray(new DrawCommand[commands.size()]);\r
+ }\r
+ \r
+ public static void parse(Graph graph, Collection<DrawCommand> commands, Map<IGraphPart,Collection<DrawCommand>> partCommands) {\r
+ parse(commands,partCommands, graph);\r
+ \r
+ }\r
+ \r
+}\r