]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.graphviz/src/org/simantics/graphviz/internal/xdot/DrawCommandParser.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.graphviz / src / org / simantics / graphviz / internal / xdot / DrawCommandParser.java
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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.graphviz.internal.xdot;\r
13 \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
20 \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
25 \r
26 public class DrawCommandParser {\r
27 \r
28         public static double readNumber(Reader s) throws IOException {\r
29                 StringBuilder b = new StringBuilder();\r
30                 while( true ) {\r
31                         int c = s.read();\r
32                         if(c == ' ' || c <= 0)\r
33                                 break;\r
34                         b.append((char)c);\r
35                 }\r
36                 return Double.parseDouble(b.toString());\r
37         }\r
38         \r
39         public static int readInteger(Reader s) throws IOException {\r
40                 StringBuilder b = new StringBuilder();\r
41                 while( true ) {\r
42                         int c = s.read();\r
43                         if(c == ' ' || c <= 0)\r
44                                 break;\r
45                         b.append((char)c);\r
46                 }\r
47                 return Integer.parseInt(b.toString());\r
48         }\r
49         \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
55                 return points;\r
56         }\r
57         \r
58         public static String readString(Reader s) throws IOException {\r
59                 int n = readInteger(s);\r
60                 s.read();\r
61                 char[] chars = new char[n];\r
62                 for(int i=0;i<n;++i) {\r
63                         char c = (char)s.read();\r
64                         if(c == '\\')\r
65                                 c = (char)s.read();\r
66                         chars[i] = c;\r
67                 }\r
68                 s.read();\r
69                 return new String(chars);\r
70         }\r
71         \r
72         public static void parse(Collection<DrawCommand> commands, Reader s) throws IOException {\r
73             boolean hadSetStyle = false;\r
74                 while(true) {\r
75                         int commandChar = s.read();\r
76                         s.read();\r
77                         if(commandChar <= 0) {\r
78                             if(hadSetStyle)\r
79                                 commands.add(new SetStyle("solid"));\r
80                                 return;\r
81                         }\r
82                         switch(commandChar) {\r
83                         case 'E': {\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
89                                 break;\r
90                         }\r
91                         case 'e': {\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
97                                 break;\r
98                         }\r
99                         case 'P': {\r
100                                 commands.add(new FilledShape(Shapes.createPolygon(readPoints(s))));\r
101                                 break;\r
102                         }\r
103                         case 'p':\r
104                                 commands.add(new UnfilledShape(Shapes.createPolygon(readPoints(s))));\r
105                                 break;\r
106                         case 'L':\r
107                                 commands.add(new UnfilledShape(Shapes.createPolyline(readPoints(s))));\r
108                                 break;\r
109                         case 'B':                               \r
110                                 commands.add(new UnfilledShape(Shapes.createCubicSegments(readPoints(s))));\r
111                                 break;\r
112                         case 'b':\r
113                                 commands.add(new FilledShape(Shapes.createCubicSegments(readPoints(s))));\r
114                                 break;\r
115                         case 'T': {\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
122                                 break;\r
123                         }\r
124                         case 'C':\r
125                                 commands.add(new SetFillColor(readString(s)));\r
126                                 break;\r
127                         case 'c':\r
128                                 commands.add(new SetPenColor(readString(s)));\r
129                                 break;\r
130                         case 'F': {\r
131                                 double points = readNumber(s);\r
132                                 String font = readString(s);\r
133                                 commands.add(new SetFont(points, font));\r
134                                 break;\r
135                         }\r
136                         case 'S':\r
137                             hadSetStyle = true;\r
138                                 commands.add(new SetStyle(readString(s)));\r
139                                 break;\r
140                         case 'I': {\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
147                                 break;\r
148                         }\r
149                         }\r
150                 }\r
151         }\r
152         \r
153         public static void parse(Collection<DrawCommand> commands, String s) {\r
154                 if(s != null)\r
155                         try {\r
156                                 s = s.replace("\\\r\n", "");\r
157                                 parse(commands, new StringReader(s));\r
158                         } catch(IOException e) {\r
159                                 e.printStackTrace();\r
160                         }\r
161         }\r
162 \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
172             }\r
173             else if(part instanceof IGraph) {\r
174                 parse(commands, (IGraph)part);\r
175             }\r
176         }\r
177         }\r
178         \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
191             }\r
192             partCommands.put(part, pCommands);\r
193             commands.addAll(pCommands);\r
194             \r
195         }\r
196         }\r
197         \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
202         }\r
203         \r
204         public static void parse(Graph graph, Collection<DrawCommand> commands, Map<IGraphPart,Collection<DrawCommand>> partCommands) {\r
205                 parse(commands,partCommands, graph);\r
206                 \r
207         }\r
208         \r
209 }\r