1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.graphviz.internal.xdot;
\r
14 import java.io.IOException;
\r
15 import java.io.Reader;
\r
16 import java.io.StringReader;
\r
17 import java.util.ArrayList;
\r
18 import java.util.Collection;
\r
19 import java.util.Map;
\r
21 import org.simantics.graphviz.Edge;
\r
22 import org.simantics.graphviz.Graph;
\r
23 import org.simantics.graphviz.IGraph;
\r
24 import org.simantics.graphviz.IGraphPart;
\r
26 public class DrawCommandParser {
\r
28 public static double readNumber(Reader s) throws IOException {
\r
29 StringBuilder b = new StringBuilder();
\r
32 if(c == ' ' || c <= 0)
\r
36 return Double.parseDouble(b.toString());
\r
39 public static int readInteger(Reader s) throws IOException {
\r
40 StringBuilder b = new StringBuilder();
\r
43 if(c == ' ' || c <= 0)
\r
47 return Integer.parseInt(b.toString());
\r
50 public static double[] readPoints(Reader s) throws IOException {
\r
51 int n = readInteger(s);
\r
52 double[] points = new double[n*2];
\r
53 for(int i=0;i<n*2;++i)
\r
54 points[i] = readNumber(s);
\r
58 public static String readString(Reader s) throws IOException {
\r
59 int n = readInteger(s);
\r
61 char[] chars = new char[n];
\r
62 for(int i=0;i<n;++i) {
\r
63 char c = (char)s.read();
\r
69 return new String(chars);
\r
72 public static void parse(Collection<DrawCommand> commands, Reader s) throws IOException {
\r
73 boolean hadSetStyle = false;
\r
75 int commandChar = s.read();
\r
77 if(commandChar <= 0) {
\r
79 commands.add(new SetStyle("solid"));
\r
82 switch(commandChar) {
\r
84 double x = readNumber(s);
\r
85 double y = readNumber(s);
\r
86 double w = readNumber(s);
\r
87 double h = readNumber(s);
\r
88 commands.add(new FilledShape(Shapes.createEllipse(x, y, w, h)));
\r
92 double x = readNumber(s);
\r
93 double y = readNumber(s);
\r
94 double w = readNumber(s);
\r
95 double h = readNumber(s);
\r
96 commands.add(new UnfilledShape(Shapes.createEllipse(x, y, w, h)));
\r
100 commands.add(new FilledShape(Shapes.createPolygon(readPoints(s))));
\r
104 commands.add(new UnfilledShape(Shapes.createPolygon(readPoints(s))));
\r
107 commands.add(new UnfilledShape(Shapes.createPolyline(readPoints(s))));
\r
110 commands.add(new UnfilledShape(Shapes.createCubicSegments(readPoints(s))));
\r
113 commands.add(new FilledShape(Shapes.createCubicSegments(readPoints(s))));
\r
116 double x = readNumber(s);
\r
117 double y = readNumber(s);
\r
118 int j = readInteger(s);
\r
119 double w = readNumber(s);
\r
120 String text = readString(s);
\r
121 commands.add(new Text(x, y, j, w, text));
\r
125 commands.add(new SetFillColor(readString(s)));
\r
128 commands.add(new SetPenColor(readString(s)));
\r
131 double points = readNumber(s);
\r
132 String font = readString(s);
\r
133 commands.add(new SetFont(points, font));
\r
137 hadSetStyle = true;
\r
138 commands.add(new SetStyle(readString(s)));
\r
141 double x = readNumber(s);
\r
142 double y = readNumber(s);
\r
143 double w = readNumber(s);
\r
144 double h = readNumber(s);
\r
145 String file = readString(s);
\r
146 commands.add(new DrawImage(x, y, w, h, file));
\r
153 public static void parse(Collection<DrawCommand> commands, String s) {
\r
156 s = s.replace("\\\r\n", "");
\r
157 parse(commands, new StringReader(s));
\r
158 } catch(IOException e) {
\r
159 e.printStackTrace();
\r
163 private static void parse(Collection<DrawCommand> commands, IGraph graph) {
\r
164 for(IGraphPart part : graph.getParts()) {
\r
165 parse(commands, part.get("_draw_"));
\r
166 parse(commands, part.get("_ldraw_"));
\r
167 if(part instanceof Edge) {
\r
168 parse(commands, part.get("_hdraw_"));
\r
169 parse(commands, part.get("_tdraw_"));
\r
170 parse(commands, part.get("_hldraw_"));
\r
171 parse(commands, part.get("_tldraw_"));
\r
173 else if(part instanceof IGraph) {
\r
174 parse(commands, (IGraph)part);
\r
179 private static void parse(Collection<DrawCommand> commands, Map<IGraphPart,Collection<DrawCommand>> partCommands, IGraph graph) {
\r
180 for(IGraphPart part : graph.getParts()) {
\r
181 Collection<DrawCommand> pCommands = new ArrayList<DrawCommand>();
\r
182 parse(pCommands, part.get("_draw_"));
\r
183 parse(pCommands, part.get("_ldraw_"));
\r
184 if(part instanceof Edge) {
\r
185 parse(pCommands, part.get("_hdraw_"));
\r
186 parse(pCommands, part.get("_tdraw_"));
\r
187 parse(pCommands, part.get("_hldraw_"));
\r
188 parse(pCommands, part.get("_tldraw_"));
\r
189 } else if(part instanceof IGraph) {
\r
190 parse(commands, partCommands,(IGraph)part);
\r
192 partCommands.put(part, pCommands);
\r
193 commands.addAll(pCommands);
\r
198 public static DrawCommand[] parse(Graph graph) {
\r
199 Collection<DrawCommand> commands = new ArrayList<DrawCommand>();
\r
200 parse(commands, graph);
\r
201 return commands.toArray(new DrawCommand[commands.size()]);
\r
204 public static void parse(Graph graph, Collection<DrawCommand> commands, Map<IGraphPart,Collection<DrawCommand>> partCommands) {
\r
205 parse(commands,partCommands, graph);
\r