1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.diagram.adapter;
14 import java.awt.Point;
16 import org.simantics.databoard.binding.Binding;
17 import org.simantics.databoard.Bindings;
18 import org.simantics.db.AsyncReadGraph;
19 import org.simantics.db.Resource;
20 import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener;
21 import org.simantics.db.common.procedure.guarded.GuardedAsyncProcedureWrapper;
22 import org.simantics.db.common.request.BinaryAsyncRead;
23 import org.simantics.db.procedure.AsyncProcedure;
24 import org.simantics.diagram.elements.AnimatedSVGImage;
25 import org.simantics.diagram.stubs.G2DResource;
26 import org.simantics.diagram.synchronization.SynchronizationHints;
27 import org.simantics.diagram.synchronization.graph.TransformSynchronizer;
28 import org.simantics.g2d.canvas.ICanvasContext;
29 import org.simantics.g2d.diagram.DiagramHints;
30 import org.simantics.g2d.diagram.IDiagram;
31 import org.simantics.g2d.element.ElementClass;
32 import org.simantics.g2d.element.ElementHints;
33 import org.simantics.g2d.element.IElement;
34 import org.simantics.g2d.element.handler.impl.DefaultTransform;
35 import org.simantics.g2d.element.handler.impl.SimpleElementLayers;
36 import org.simantics.g2d.element.handler.impl.StaticObjectAdapter;
37 import org.simantics.g2d.element.handler.impl.StaticSymbolImageInitializer;
38 import org.simantics.g2d.element.handler.impl.StaticSymbolImpl;
39 import org.simantics.g2d.element.handler.impl.TextImpl;
40 import org.simantics.g2d.elementclass.ImageClass.ImageElementHandler;
41 import org.simantics.g2d.image.DefaultImages;
42 import org.simantics.g2d.image.Image;
43 import org.simantics.g2d.image.ProviderUtils;
44 import org.simantics.layer0.Layer0;
45 import org.simantics.utils.datastructures.cache.IFactory;
46 import org.simantics.utils.datastructures.cache.ProvisionException;
47 import org.simantics.utils.strings.StringUtils;
48 import org.simantics.utils.ui.ErrorLogger;
53 public class AnimatedSVGElementClassFactory extends ElementFactoryAdapter {
55 public static final ElementFactory INSTANCE = new AnimatedSVGElementClassFactory();
57 private static final StaticSymbolImpl STATIC_SYMBOL = new StaticSymbolImpl(DefaultImages.SVG.get());
59 static class ClassRequest extends BinaryAsyncRead<Resource, ICanvasContext, ElementClass> {
61 final private IDiagram diagram;
63 public ClassRequest(Resource elementType, ICanvasContext canvas, IDiagram diagram) {
64 super(elementType, canvas);
65 this.diagram = diagram;
69 public void perform(AsyncReadGraph graph, AsyncProcedure<ElementClass> procedure) {
70 createClass(graph, parameter2, diagram, parameter, procedure);
76 public void create(AsyncReadGraph graph, final ICanvasContext canvas, final IDiagram diagram,
77 final Resource elementType, final AsyncProcedure<ElementClass> procedure) {
79 graph.asyncRequest(new ClassRequest(elementType, canvas, diagram), new TransientCacheAsyncListener<ElementClass>() {
82 public void exception(AsyncReadGraph graph, Throwable t) {
84 procedure.exception(graph, t);
88 public void execute(AsyncReadGraph graph, ElementClass result) {
89 procedure.execute(graph, result);
96 public static void createClass(AsyncReadGraph graph, final ICanvasContext canvas, final IDiagram diagram,
97 final Resource elementType, final AsyncProcedure<ElementClass> procedure) {
98 String id = "AnimatedSVGElement: " + elementType.getResourceId();
99 //System.out.println(id);
100 procedure.execute(graph, ElementClass.compile(
102 new StaticObjectAdapter(elementType),
103 DefaultTransform.INSTANCE,
104 StaticSymbolImageInitializer.INSTANCE,
106 ImageElementHandler.INSTANCE,
107 SimpleElementLayers.INSTANCE)
112 public void load(AsyncReadGraph graph, final ICanvasContext canvas, final IDiagram diagram, final Resource element, final IElement e, final AsyncProcedure<IElement> procedure) {
113 e.setHint(SynchronizationHints.HINT_SYNCHRONIZER, TransformSynchronizer.INSTANCE);
115 final GuardedAsyncProcedureWrapper<IElement> guard = new GuardedAsyncProcedureWrapper<IElement>(procedure, 3);
117 loadSVG(graph, diagram, element, e, guard);
118 ElementFactoryUtil.loadLayersForElement(graph, diagram, e, element, guard);
119 ElementFactoryUtil.readTransform(graph, element, e, guard);
122 private void loadSVG(AsyncReadGraph graph, final IDiagram diagram, final Resource element, final IElement e, final AsyncProcedure<IElement> guard) {
123 final Layer0 L0 = graph.getService(Layer0.class);
124 final G2DResource G2D = graph.getService(G2DResource.class);
125 final Binding stringBinding = Bindings.STRING;
127 graph.forPossibleRelatedValue(element, L0.HasName, stringBinding, new AsyncProcedure<String>() {
130 public void exception(AsyncReadGraph graph, Throwable throwable) {
131 guard.exception(graph, throwable);
135 public void execute(AsyncReadGraph graph, final String name) {
137 graph.forPossibleRelatedValue(element, G2D.HasSVGDocument, stringBinding, new AsyncProcedure<String>() {
140 public void exception(AsyncReadGraph graph, Throwable throwable) {
141 guard.exception(graph, throwable);
145 public void execute(AsyncReadGraph graph, final String svgDocument) {
147 graph.forPossibleRelatedValue(element, G2D.HasSVGScript, stringBinding, new AsyncProcedure<String>() {
150 public void exception(AsyncReadGraph graph, Throwable throwable) {
151 guard.exception(graph, throwable);
155 public void execute(AsyncReadGraph graph, final String svgScript) {
156 if (svgDocument != null) {
157 Point referenceSize = diagram.getHint(DiagramHints.KEY_ELEMENT_RASTER_TARGET_SIZE);
158 IFactory<Image> img = AnimatedSVGImage.createFactoryFromString(
159 StringUtils.safeString(name) + String.valueOf(element.getResourceId()),
161 StringUtils.safeString(svgScript),
164 img = ProviderUtils.rasterize(img);
165 e.setHint(ElementHints.KEY_IMAGE, img.get());
166 guard.execute(graph, e);
167 } catch (ProvisionException ex) {
168 ErrorLogger.defaultLogError(ex);
169 e.setHint(ElementHints.KEY_IMAGE, DefaultImages.SVG.get());
170 guard.execute(graph, e);
173 e.setHint(ElementHints.KEY_IMAGE, DefaultImages.UNKNOWN.get());
174 guard.execute(graph, e);