]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/G2DUtils.java
Logger fixes after merge commit:fdbe8762
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / G2DUtils.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.diagram;\r
13 \r
14 import java.awt.BasicStroke;\r
15 import java.awt.Color;\r
16 import java.awt.Font;\r
17 import java.awt.geom.AffineTransform;\r
18 import java.awt.geom.Rectangle2D;\r
19 import java.util.Set;\r
20 \r
21 import org.simantics.databoard.Bindings;\r
22 import org.simantics.db.ReadGraph;\r
23 import org.simantics.db.Resource;\r
24 import org.simantics.db.WriteGraph;\r
25 import org.simantics.db.exception.DatabaseException;\r
26 import org.simantics.db.exception.DoesNotContainValueException;\r
27 import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;\r
28 import org.simantics.db.exception.NoSingleResultException;\r
29 import org.simantics.db.exception.ServiceException;\r
30 import org.simantics.diagram.stubs.DiagramResource;\r
31 import org.simantics.diagram.stubs.G2DResource;\r
32 import org.simantics.diagram.synchronization.graph.DiagramGraphUtil;\r
33 import org.simantics.g2d.svg.LineCap;\r
34 import org.simantics.g2d.svg.LineJoin;\r
35 import org.simantics.layer0.Layer0;\r
36 import org.simantics.utils.strings.format.MetricsFormat;\r
37 \r
38 \r
39 /**\r
40  * Utility class for handling G2D ontology concepts.\r
41  * \r
42  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
43  */\r
44 public class G2DUtils {\r
45 \r
46     /**\r
47      * Utility to wrap resource to a object\r
48      * \r
49      * @param g\r
50      * @param resource\r
51      * @return\r
52      * @throws ServiceException\r
53      * @throws NoSingleResultException\r
54      * @throws DoesNotContainValueException\r
55      * @throws ManyObjectsForFunctionalRelationException\r
56      */\r
57     public static Object getObject(ReadGraph g, Resource resource) throws ServiceException, NoSingleResultException, DoesNotContainValueException, ManyObjectsForFunctionalRelationException {\r
58         G2DResource g2d = G2DResource.getInstance(g);\r
59         Set<Resource> types = g.getTypes(resource);\r
60         if (types.contains(g2d.Font)) {\r
61             return getFont(g, resource);\r
62         }\r
63         if (types.contains(g2d.Color)) {\r
64             return getColor(g, resource);\r
65         }\r
66         if (types.contains(g2d.Transform)) {\r
67             return getTransform(g, resource);\r
68         }\r
69         if (types.contains(g2d.Rectangle2D)) {\r
70             return getRectangle(g, resource);\r
71         }\r
72 \r
73         return g.getPossibleValue(resource);\r
74     }\r
75 \r
76     public static Font getFont(ReadGraph g, Resource fontResource) throws ServiceException, NoSingleResultException, DoesNotContainValueException, ManyObjectsForFunctionalRelationException {\r
77         G2DResource g2d = G2DResource.getInstance(g);\r
78         if (!g.isInstanceOf(fontResource, g2d.Font))\r
79             throw new IllegalArgumentException("Resource " + fontResource + " is not a font");\r
80 \r
81         String name = g.getRelatedValue(fontResource, g2d.HasFontFamily);\r
82         int size = g.getRelatedValue(fontResource, g2d.HasFontSize);\r
83         int style = Font.PLAIN;\r
84         Resource styleResource = g.getPossibleObject(fontResource, g2d.HasFontStyle);\r
85         if (styleResource != null) {\r
86             if (styleResource.equals(g2d.FontStyle_bold_italic_style)) {\r
87                 style = Font.BOLD | Font.ITALIC;\r
88             } else if (styleResource.equals(g2d.FontStyle_bold_font_style)) {\r
89                 style = Font.BOLD;\r
90             } else if (styleResource.equals(g2d.FontStyle_italic_font_style)) {\r
91                 style = Font.ITALIC;\r
92             } else if (styleResource.equals(g2d.FontStyle_normal_font_style)) {\r
93                 style = Font.PLAIN;\r
94             } else {\r
95                 throw new IllegalArgumentException("Given font " + fontResource + " does not contain valid style. Current style is " + styleResource);\r
96             }\r
97         }\r
98 \r
99         return new Font(name, style, size);\r
100     }\r
101 \r
102     public static Color getColor(ReadGraph g, Resource colorResource) throws DoesNotContainValueException, ServiceException {\r
103         G2DResource g2d = G2DResource.getInstance(g);\r
104         if (!g.isInstanceOf(colorResource, g2d.Color))\r
105             throw new IllegalArgumentException("Resource " + colorResource + " is not a color");\r
106 \r
107         float value[] = (float[])g.getValue(colorResource);\r
108         if (value.length != 4)\r
109             throw new IllegalArgumentException("Color " + colorResource + " does not have proper definition, expected 4 components, got " + value.length + " components");\r
110 \r
111         return new Color(value[0], value[1], value[2], value[3]);\r
112     }\r
113 \r
114     public static AffineTransform getTransform(ReadGraph g, Resource resource) throws DoesNotContainValueException, ServiceException {\r
115         G2DResource g2d = G2DResource.getInstance(g);\r
116         if (!g.isInstanceOf(resource, g2d.Transform))\r
117             throw new IllegalArgumentException("Resource " + resource + " is not a transform");\r
118 \r
119         double values[] = (double[])g.getValue(resource);\r
120         if (values.length != 6)\r
121             throw new IllegalArgumentException("Transform " + resource + " does not have proper definition, expected 6 components, got " + values.length + " components");\r
122 \r
123         return new AffineTransform(values);\r
124     }\r
125 \r
126     public static Rectangle2D getRectangle(ReadGraph g, Resource resource) throws DoesNotContainValueException, ServiceException {\r
127         G2DResource g2d = G2DResource.getInstance(g);\r
128         if (!g.isInstanceOf(resource, g2d.Rectangle2D))\r
129             throw new IllegalArgumentException("Resource " + resource + " is not a rectangle");\r
130 \r
131         double values[] = (double[])g.getValue(resource);\r
132         if (values.length != 4)\r
133             throw new IllegalArgumentException("Transform " + resource + " does not have proper definition, expected 4 components, got " + values.length + " components");\r
134 \r
135         return new Rectangle2D.Double(values[0], values[1], values[2], values[3]);\r
136     }\r
137 \r
138     public static Resource createFont(WriteGraph g, Font font) throws ServiceException, ManyObjectsForFunctionalRelationException {\r
139         Layer0 b = Layer0.getInstance(g);\r
140         G2DResource g2d = G2DResource.getInstance(g);\r
141         Resource fontResource = g.newResource();\r
142         g.claim(fontResource, b.InstanceOf, null, g2d.Font);\r
143         g.claimLiteral(fontResource, g2d.HasFontFamily, font.getFamily());\r
144         g.claimLiteral(fontResource, g2d.HasFontSize, font.getSize());\r
145         if (font.getStyle() == (Font.BOLD|Font.ITALIC)) {\r
146             g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_bold_italic_style);\r
147         } else if (font.getStyle() == Font.BOLD) {\r
148             g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_bold_font_style);\r
149         } else if (font.getStyle() == Font.ITALIC) {\r
150             g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_italic_font_style);\r
151         } else {\r
152             g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_normal_font_style);\r
153         }\r
154 \r
155         return fontResource;\r
156     }\r
157 \r
158     public static Resource createColor(WriteGraph g, Color color) throws ServiceException {\r
159         Layer0 b = Layer0.getInstance(g);\r
160         G2DResource g2d = G2DResource.getInstance(g);\r
161         Resource colorResource = g.newResource();\r
162         g.claim(colorResource, b.InstanceOf, null, g2d.Color);\r
163         g.claimValue(colorResource, color.getRGBComponents(null));\r
164         return colorResource;\r
165     }\r
166 \r
167     /*\r
168      * Metrics Format\r
169      */\r
170 \r
171     public static Resource createMetricsFormat(WriteGraph g, MetricsFormat format) throws ServiceException, ManyObjectsForFunctionalRelationException {\r
172         Layer0 b = Layer0.getInstance(g);\r
173         DiagramResource dr = DiagramResource.getInstance(g);\r
174         Resource formatResource = g.newResource();\r
175         g.claim(formatResource, b.InstanceOf, null, dr.Format);\r
176         g.claimLiteral(formatResource, b.HasName, format.getName());\r
177         g.claimLiteral(formatResource, dr.HasPattern, format.getPattern());\r
178         return formatResource;\r
179     }\r
180 \r
181     public static MetricsFormat getMetricsFormat(ReadGraph g, Resource formatResource) throws NoSingleResultException, DoesNotContainValueException, ServiceException {\r
182         Layer0 l0 = Layer0.getInstance(g);\r
183         DiagramResource dr = DiagramResource.getInstance(g);\r
184         String name = g.getRelatedValue(formatResource, l0.HasName);\r
185         String pattern = g.getRelatedValue(formatResource, dr.HasPattern);\r
186         return new MetricsFormat(pattern,1.0,name);\r
187     }\r
188 \r
189     public static final Float DEFAULT_DASH_OFFSET  = 0f;\r
190     public static final Float DEFAULT_STROKE_WIDTH = 1f;\r
191     public static final Float DEFAULT_MITER_LIMIT  = 10f;\r
192 \r
193     public static BasicStroke getStroke(ReadGraph graph, Resource stroke) throws DatabaseException {\r
194         return getStroke(graph, stroke, DEFAULT_DASH_OFFSET, DEFAULT_STROKE_WIDTH, DEFAULT_MITER_LIMIT);\r
195     }\r
196 \r
197     public static BasicStroke getStroke(ReadGraph graph, Resource stroke, Float defaultDashOffset, Float defaultStrokeWidth, Float defaultMiterLimit) throws DatabaseException {\r
198         if (stroke == null)\r
199             return null;\r
200 \r
201         G2DResource g2d = G2DResource.getInstance(graph);\r
202         float[] dashArray = DiagramGraphUtil.getPossibleRelatedValue(graph, stroke, g2d.HasDashArray, float[].class, null);\r
203         Float dashOffset = DiagramGraphUtil.getPossibleRelatedValue(graph, stroke, g2d.HasDashOffset, Float.class, defaultDashOffset);\r
204         Float strokeWidth = DiagramGraphUtil.getPossibleRelatedValue(graph, stroke, g2d.HasStrokeWidth, Float.class, defaultStrokeWidth);\r
205         Float miterLimit = DiagramGraphUtil.getPossibleRelatedValue(graph, stroke, g2d.HasMiterLimit, Float.class, defaultMiterLimit);\r
206         LineJoin lineJoin = DiagramGraphUtil.toLineJoin(g2d, graph.getPossibleObject(stroke, g2d.HasLineJoin));\r
207         LineCap lineCap = DiagramGraphUtil.toLineCap(g2d, graph.getPossibleObject(stroke, g2d.HasLineCap));\r
208 \r
209         // Sanity checks.\r
210         if (strokeWidth < 0)\r
211             strokeWidth = 0f;\r
212 \r
213         return new BasicStroke(strokeWidth, lineCap.ordinal(), lineJoin.ordinal(), miterLimit, dashArray, dashOffset);\r
214     }\r
215 \r
216     public static Resource createStroke(WriteGraph graph, BasicStroke stroke) throws DatabaseException {\r
217         if (stroke == null)\r
218             return null;\r
219 \r
220         Layer0 L0 = Layer0.getInstance(graph);\r
221         G2DResource g2d = G2DResource.getInstance(graph);\r
222         Resource result = graph.newResource();\r
223         graph.claim(result, L0.InstanceOf, null, g2d.Stroke);\r
224         if (stroke.getDashArray() != null)\r
225             graph.claimLiteral(result, g2d.HasDashArray, L0.FloatArray, stroke.getDashArray(), Bindings.FLOAT_ARRAY);\r
226         graph.claimLiteral(result, g2d.HasDashOffset, L0.Float, stroke.getDashPhase(), Bindings.FLOAT);\r
227         graph.claimLiteral(result, g2d.HasStrokeWidth, L0.Float, stroke.getLineWidth(), Bindings.FLOAT);\r
228         graph.claimLiteral(result, g2d.HasMiterLimit, L0.Float, stroke.getMiterLimit(), Bindings.FLOAT);\r
229         graph.claim(result, g2d.HasLineJoin, null, DiagramGraphUtil.toLineJoin(g2d, LineJoin.values()[stroke.getLineJoin()]));\r
230         graph.claim(result, g2d.HasLineCap, null, DiagramGraphUtil.toLineCap(g2d, LineCap.values()[stroke.getEndCap()]));\r
231 \r
232         return result;\r
233     }\r
234 \r
235 }\r