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.image.BufferedImage;
15 import java.io.ByteArrayInputStream;
16 import java.io.IOException;
17 import java.net.MalformedURLException;
19 import javax.imageio.ImageIO;
21 import org.simantics.databoard.Bindings;
22 import org.simantics.db.AsyncReadGraph;
23 import org.simantics.db.Resource;
24 import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener;
25 import org.simantics.db.common.procedure.guarded.GuardedAsyncProcedureWrapper;
26 import org.simantics.db.common.request.BinaryAsyncRead;
27 import org.simantics.db.procedure.AsyncProcedure;
28 import org.simantics.diagram.stubs.G2DResource;
29 import org.simantics.diagram.synchronization.SynchronizationHints;
30 import org.simantics.diagram.synchronization.graph.TransformSynchronizer;
31 import org.simantics.g2d.canvas.ICanvasContext;
32 import org.simantics.g2d.diagram.IDiagram;
33 import org.simantics.g2d.element.ElementClass;
34 import org.simantics.g2d.element.ElementHints;
35 import org.simantics.g2d.element.IElement;
36 import org.simantics.g2d.element.handler.impl.DefaultTransform;
37 import org.simantics.g2d.element.handler.impl.SimpleElementLayers;
38 import org.simantics.g2d.element.handler.impl.StaticObjectAdapter;
39 import org.simantics.g2d.element.handler.impl.StaticSymbolImageInitializer;
40 import org.simantics.g2d.element.handler.impl.StaticSymbolImpl;
41 import org.simantics.g2d.element.handler.impl.TextImpl;
42 import org.simantics.g2d.elementclass.ImageClass.ImageElementHandler;
43 import org.simantics.g2d.image.DefaultImages;
44 import org.simantics.g2d.image.impl.AWTImage;
45 import org.simantics.utils.datastructures.cache.ProvisionException;
46 import org.simantics.utils.ui.ErrorLogger;
49 * An {@link ElementFactory} for DIA.SVGElement instances.
52 * Loads element layers, transform and SVG document.
54 * @author Tuukka Lehtonen
56 public class RasterElementClassFactory extends ElementFactoryAdapter {
58 public static final ElementFactory INSTANCE = new RasterElementClassFactory();
60 private static final StaticSymbolImpl STATIC_SYMBOL = new StaticSymbolImpl(DefaultImages.HOURGLASS.get());
62 static class ClassRequest extends BinaryAsyncRead<Resource, ICanvasContext, ElementClass> {
64 final private IDiagram diagram;
66 public ClassRequest(Resource elementType, ICanvasContext canvas, IDiagram diagram) {
67 super(elementType, canvas);
68 this.diagram = diagram;
72 public void perform(AsyncReadGraph graph, AsyncProcedure<ElementClass> procedure) {
73 createClass(graph, parameter2, diagram, parameter, procedure);
79 public void create(AsyncReadGraph graph, final ICanvasContext canvas, final IDiagram diagram,
80 final Resource elementType, final AsyncProcedure<ElementClass> procedure) {
82 graph.asyncRequest(new ClassRequest(elementType, canvas, diagram), new TransientCacheAsyncListener<ElementClass>() {
85 public void exception(AsyncReadGraph graph, Throwable t) {
87 procedure.exception(graph, t);
91 public void execute(AsyncReadGraph graph, ElementClass result) {
92 procedure.execute(graph, result);
99 static void createClass(AsyncReadGraph graph, final ICanvasContext canvas, final IDiagram diagram,
100 final Resource elementType, final AsyncProcedure<ElementClass> procedure) {
101 String id = "RasterElement: " + elementType.getResourceId();
102 procedure.execute(graph, ElementClass.compile(
104 new StaticObjectAdapter(elementType),
105 DefaultTransform.INSTANCE,
106 StaticSymbolImageInitializer.INSTANCE,
108 ImageElementHandler.INSTANCE,
109 SimpleElementLayers.INSTANCE)
114 public void load(AsyncReadGraph graph, final ICanvasContext canvas, final IDiagram diagram, final Resource element, final IElement e, final AsyncProcedure<IElement> procedure) {
115 e.setHint(SynchronizationHints.HINT_SYNCHRONIZER, TransformSynchronizer.INSTANCE);
117 final GuardedAsyncProcedureWrapper<IElement> guard = new GuardedAsyncProcedureWrapper<IElement>(procedure, 3);
119 loadRaster(graph, diagram, element, e, guard);
120 ElementFactoryUtil.loadLayersForElement(graph, diagram, e, element, guard);
121 ElementFactoryUtil.readTransform(graph, element, e, guard);
124 private void loadRaster(AsyncReadGraph graph, final IDiagram diagram, final Resource element, final IElement e, final AsyncProcedure<IElement> guard) {
125 G2DResource G2D = graph.getService(G2DResource.class);
127 graph.forPossibleRelatedValue(element, G2D.HasRasterImage, Bindings.BYTE_ARRAY, new AsyncProcedure<byte[]>() {
129 public void exception(AsyncReadGraph graph, Throwable throwable) {
130 guard.exception(graph, throwable);
134 public void execute(AsyncReadGraph graph, final byte[] data) {
138 BufferedImage bi = ImageIO.read(new ByteArrayInputStream(data));
139 e.setHint(ElementHints.KEY_IMAGE, new AWTImage(bi));
140 guard.execute(graph, e);
141 } catch (ProvisionException ex) {
142 ErrorLogger.defaultLogError(ex);
143 e.setHint(ElementHints.KEY_IMAGE, DefaultImages.SVG.get());
144 guard.execute(graph, e);
145 } catch (MalformedURLException e1) {
146 ErrorLogger.defaultLogError(e1);
147 e.setHint(ElementHints.KEY_IMAGE, DefaultImages.SVG.get());
148 guard.execute(graph, e);
149 } catch (IOException e1) {
150 ErrorLogger.defaultLogError(e1);
151 e.setHint(ElementHints.KEY_IMAGE, DefaultImages.SVG.get());
152 guard.execute(graph, e);
155 e.setHint(ElementHints.KEY_IMAGE, DefaultImages.UNKNOWN.get());
156 guard.execute(graph, e);