]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/RasterElementClassFactory.java
Logger fixes after merge commit:fdbe8762
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / RasterElementClassFactory.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.adapter;\r
13 \r
14 import java.awt.image.BufferedImage;\r
15 import java.io.ByteArrayInputStream;\r
16 import java.io.IOException;\r
17 import java.net.MalformedURLException;\r
18 \r
19 import javax.imageio.ImageIO;\r
20 \r
21 import org.simantics.databoard.Bindings;\r
22 import org.simantics.db.AsyncReadGraph;\r
23 import org.simantics.db.Resource;\r
24 import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener;\r
25 import org.simantics.db.common.procedure.guarded.GuardedAsyncProcedureWrapper;\r
26 import org.simantics.db.common.request.BinaryAsyncRead;\r
27 import org.simantics.db.procedure.AsyncProcedure;\r
28 import org.simantics.diagram.stubs.G2DResource;\r
29 import org.simantics.diagram.synchronization.SynchronizationHints;\r
30 import org.simantics.diagram.synchronization.graph.TransformSynchronizer;\r
31 import org.simantics.g2d.canvas.ICanvasContext;\r
32 import org.simantics.g2d.diagram.IDiagram;\r
33 import org.simantics.g2d.element.ElementClass;\r
34 import org.simantics.g2d.element.ElementHints;\r
35 import org.simantics.g2d.element.IElement;\r
36 import org.simantics.g2d.element.handler.impl.DefaultTransform;\r
37 import org.simantics.g2d.element.handler.impl.SimpleElementLayers;\r
38 import org.simantics.g2d.element.handler.impl.StaticObjectAdapter;\r
39 import org.simantics.g2d.element.handler.impl.StaticSymbolImageInitializer;\r
40 import org.simantics.g2d.element.handler.impl.StaticSymbolImpl;\r
41 import org.simantics.g2d.element.handler.impl.TextImpl;\r
42 import org.simantics.g2d.elementclass.ImageClass.ImageElementHandler;\r
43 import org.simantics.g2d.image.DefaultImages;\r
44 import org.simantics.g2d.image.impl.AWTImage;\r
45 import org.simantics.utils.datastructures.cache.ProvisionException;\r
46 import org.simantics.utils.ui.ErrorLogger;\r
47 \r
48 /**\r
49  * An {@link ElementFactory} for DIA.SVGElement instances.\r
50  * \r
51  * <p>\r
52  * Loads element layers, transform and SVG document.\r
53  * \r
54  * @author Tuukka Lehtonen\r
55  */\r
56 public class RasterElementClassFactory extends ElementFactoryAdapter {\r
57 \r
58     public static final ElementFactory INSTANCE = new RasterElementClassFactory();\r
59 \r
60     private static final StaticSymbolImpl STATIC_SYMBOL = new StaticSymbolImpl(DefaultImages.HOURGLASS.get());\r
61 \r
62     static class ClassRequest extends BinaryAsyncRead<Resource, ICanvasContext, ElementClass> {\r
63 \r
64         final private IDiagram diagram;\r
65 \r
66         public ClassRequest(Resource elementType, ICanvasContext canvas, IDiagram diagram) {\r
67             super(elementType, canvas);\r
68             this.diagram = diagram;\r
69         }\r
70 \r
71         @Override\r
72         public void perform(AsyncReadGraph graph, AsyncProcedure<ElementClass> procedure) {\r
73             createClass(graph, parameter2, diagram, parameter, procedure);\r
74         }\r
75 \r
76     }\r
77 \r
78     @Override\r
79     public void create(AsyncReadGraph graph, final ICanvasContext canvas, final IDiagram diagram,\r
80             final Resource elementType, final AsyncProcedure<ElementClass> procedure) {\r
81 \r
82         graph.asyncRequest(new ClassRequest(elementType, canvas, diagram), new TransientCacheAsyncListener<ElementClass>() {\r
83 \r
84             @Override\r
85             public void exception(AsyncReadGraph graph, Throwable t) {\r
86                 t.printStackTrace();\r
87                 procedure.exception(graph, t);\r
88             }\r
89 \r
90             @Override\r
91             public void execute(AsyncReadGraph graph, ElementClass result) {\r
92                 procedure.execute(graph, result);\r
93             }\r
94 \r
95         });\r
96 \r
97     }\r
98 \r
99     static void createClass(AsyncReadGraph graph, final ICanvasContext canvas, final IDiagram diagram,\r
100             final Resource elementType, final AsyncProcedure<ElementClass> procedure) {\r
101         String id = "RasterElement: " + elementType.getResourceId();\r
102         procedure.execute(graph, ElementClass.compile(\r
103                 TextImpl.INSTANCE,\r
104                 new StaticObjectAdapter(elementType),\r
105                 DefaultTransform.INSTANCE,\r
106                 StaticSymbolImageInitializer.INSTANCE,\r
107                 STATIC_SYMBOL,\r
108                 ImageElementHandler.INSTANCE,\r
109                 SimpleElementLayers.INSTANCE)\r
110                 .setId(id));\r
111     }\r
112 \r
113     @Override\r
114     public void load(AsyncReadGraph graph, final ICanvasContext canvas, final IDiagram diagram, final Resource element, final IElement e, final AsyncProcedure<IElement> procedure) {\r
115         e.setHint(SynchronizationHints.HINT_SYNCHRONIZER, TransformSynchronizer.INSTANCE);\r
116 \r
117         final GuardedAsyncProcedureWrapper<IElement> guard = new GuardedAsyncProcedureWrapper<IElement>(procedure, 3);\r
118 \r
119         loadRaster(graph, diagram, element, e, guard);\r
120         ElementFactoryUtil.loadLayersForElement(graph, diagram, e, element, guard);\r
121         ElementFactoryUtil.readTransform(graph, element, e, guard);\r
122     }\r
123 \r
124     private void loadRaster(AsyncReadGraph graph, final IDiagram diagram, final Resource element, final IElement e, final AsyncProcedure<IElement> guard) {\r
125         G2DResource G2D = graph.getService(G2DResource.class);\r
126 \r
127         graph.forPossibleRelatedValue(element, G2D.HasRasterImage, Bindings.BYTE_ARRAY, new AsyncProcedure<byte[]>() {\r
128             @Override\r
129             public void exception(AsyncReadGraph graph, Throwable throwable) {\r
130                 guard.exception(graph, throwable);\r
131             }\r
132 \r
133             @Override\r
134             public void execute(AsyncReadGraph graph, final byte[] data) {\r
135                 if (data != null) {\r
136 \r
137                     try {\r
138                         BufferedImage bi = ImageIO.read(new ByteArrayInputStream(data));\r
139                         e.setHint(ElementHints.KEY_IMAGE, new AWTImage(bi));\r
140                         guard.execute(graph, e);\r
141                     } catch (ProvisionException ex) {\r
142                         ErrorLogger.defaultLogError(ex);\r
143                         e.setHint(ElementHints.KEY_IMAGE, DefaultImages.SVG.get());\r
144                         guard.execute(graph, e);\r
145                     } catch (MalformedURLException e1) {\r
146                         ErrorLogger.defaultLogError(e1);\r
147                         e.setHint(ElementHints.KEY_IMAGE, DefaultImages.SVG.get());\r
148                         guard.execute(graph, e);\r
149                                         } catch (IOException e1) {\r
150                         ErrorLogger.defaultLogError(e1);\r
151                         e.setHint(ElementHints.KEY_IMAGE, DefaultImages.SVG.get());\r
152                         guard.execute(graph, e);\r
153                                         }\r
154                 } else {\r
155                     e.setHint(ElementHints.KEY_IMAGE, DefaultImages.UNKNOWN.get());\r
156                     guard.execute(graph, e);\r
157                 }\r
158             }\r
159         });\r
160     }\r
161 \r
162 }