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.diagram;
\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
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
40 * Utility class for handling G2D ontology concepts.
\r
42 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
\r
44 public class G2DUtils {
\r
47 * Utility to wrap resource to a object
\r
52 * @throws ServiceException
\r
53 * @throws NoSingleResultException
\r
54 * @throws DoesNotContainValueException
\r
55 * @throws ManyObjectsForFunctionalRelationException
\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
63 if (types.contains(g2d.Color)) {
\r
64 return getColor(g, resource);
\r
66 if (types.contains(g2d.Transform)) {
\r
67 return getTransform(g, resource);
\r
69 if (types.contains(g2d.Rectangle2D)) {
\r
70 return getRectangle(g, resource);
\r
73 return g.getPossibleValue(resource);
\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
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
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
95 throw new IllegalArgumentException("Given font " + fontResource + " does not contain valid style. Current style is " + styleResource);
\r
99 return new Font(name, style, size);
\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
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
111 return new Color(value[0], value[1], value[2], value[3]);
\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
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
123 return new AffineTransform(values);
\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
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
135 return new Rectangle2D.Double(values[0], values[1], values[2], values[3]);
\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
152 g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_normal_font_style);
\r
155 return fontResource;
\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
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
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
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
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
197 public static BasicStroke getStroke(ReadGraph graph, Resource stroke, Float defaultDashOffset, Float defaultStrokeWidth, Float defaultMiterLimit) throws DatabaseException {
\r
198 if (stroke == null)
\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
210 if (strokeWidth < 0)
\r
213 return new BasicStroke(strokeWidth, lineCap.ordinal(), lineJoin.ordinal(), miterLimit, dashArray, dashOffset);
\r
216 public static Resource createStroke(WriteGraph graph, BasicStroke stroke) throws DatabaseException {
\r
217 if (stroke == null)
\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