]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/RasterElementClassFactory.java
Combination of Simantics-platform related changes and fixes for district
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / RasterElementClassFactory.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
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
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.diagram.adapter;
13
14 import java.awt.image.BufferedImage;
15 import java.io.ByteArrayInputStream;
16 import java.io.IOException;
17 import java.net.MalformedURLException;
18
19 import javax.imageio.ImageIO;
20
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;
47
48 /**
49  * An {@link ElementFactory} for DIA.SVGElement instances.
50  * 
51  * <p>
52  * Loads element layers, transform and SVG document.
53  * 
54  * @author Tuukka Lehtonen
55  */
56 public class RasterElementClassFactory extends ElementFactoryAdapter {
57
58     public static final ElementFactory INSTANCE = new RasterElementClassFactory();
59
60     private static final StaticSymbolImpl STATIC_SYMBOL = new StaticSymbolImpl(DefaultImages.HOURGLASS.get());
61
62     static class ClassRequest extends BinaryAsyncRead<Resource, ICanvasContext, ElementClass> {
63
64         final private IDiagram diagram;
65
66         public ClassRequest(Resource elementType, ICanvasContext canvas, IDiagram diagram) {
67             super(elementType, canvas);
68             this.diagram = diagram;
69         }
70
71         @Override
72         public void perform(AsyncReadGraph graph, AsyncProcedure<ElementClass> procedure) {
73             createClass(graph, parameter2, diagram, parameter, procedure);
74         }
75
76     }
77
78     @Override
79     public void create(AsyncReadGraph graph, final ICanvasContext canvas, final IDiagram diagram,
80             final Resource elementType, final AsyncProcedure<ElementClass> procedure) {
81
82         graph.asyncRequest(new ClassRequest(elementType, canvas, diagram), new TransientCacheAsyncListener<ElementClass>() {
83
84             @Override
85             public void exception(AsyncReadGraph graph, Throwable t) {
86                 t.printStackTrace();
87                 procedure.exception(graph, t);
88             }
89
90             @Override
91             public void execute(AsyncReadGraph graph, ElementClass result) {
92                 procedure.execute(graph, result);
93             }
94
95         });
96
97     }
98
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(
103                 TextImpl.INSTANCE,
104                 new StaticObjectAdapter(elementType),
105                 DefaultTransform.INSTANCE,
106                 StaticSymbolImageInitializer.INSTANCE,
107                 STATIC_SYMBOL,
108                 ImageElementHandler.INSTANCE,
109                 SimpleElementLayers.INSTANCE)
110                 .setId(id));
111     }
112
113     @Override
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);
116
117         final GuardedAsyncProcedureWrapper<IElement> guard = new GuardedAsyncProcedureWrapper<IElement>(procedure, 3);
118
119         loadRaster(graph, diagram, element, e, guard);
120         ElementFactoryUtil.loadLayersForElement(graph, diagram, e, element, guard);
121         ElementFactoryUtil.readTransform(graph, element, e, guard);
122     }
123
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);
126
127         graph.forPossibleRelatedValue(element, G2D.HasRasterImage, Bindings.BYTE_ARRAY, new AsyncProcedure<byte[]>() {
128             @Override
129             public void exception(AsyncReadGraph graph, Throwable throwable) {
130                 guard.exception(graph, throwable);
131             }
132
133             @Override
134             public void execute(AsyncReadGraph graph, final byte[] data) {
135                 if (data != null) {
136
137                     try {
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);
153                                         }
154                 } else {
155                     e.setHint(ElementHints.KEY_IMAGE, DefaultImages.UNKNOWN.get());
156                     guard.execute(graph, e);
157                 }
158             }
159         });
160     }
161
162 }