]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/elementclass/ImageClass.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / elementclass / ImageClass.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.g2d.elementclass;\r
13 \r
14 import java.awt.Shape;\r
15 import java.awt.geom.AffineTransform;\r
16 import java.awt.geom.Rectangle2D;\r
17 \r
18 import org.simantics.g2d.element.ElementClass;\r
19 import org.simantics.g2d.element.ElementHints;\r
20 import org.simantics.g2d.element.ElementUtils;\r
21 import org.simantics.g2d.element.IElement;\r
22 import org.simantics.g2d.element.SceneGraphNodeKey;\r
23 import org.simantics.g2d.element.handler.InternalSize;\r
24 import org.simantics.g2d.element.handler.Outline;\r
25 import org.simantics.g2d.element.handler.Resize;\r
26 import org.simantics.g2d.element.handler.SceneGraph;\r
27 import org.simantics.g2d.element.handler.impl.DefaultTransform;\r
28 import org.simantics.g2d.image.Image;\r
29 import org.simantics.scenegraph.Node;\r
30 import org.simantics.scenegraph.g2d.G2DParentNode;\r
31 import org.simantics.scenegraph.g2d.IG2DNode;\r
32 import org.simantics.utils.datastructures.hints.IHintContext.Key;\r
33 \r
34 /**\r
35  * See {@link ElementHints}.KEY_IMAGE\r
36  *\r
37  * @author Toni Kalajainen <toni.kalajainen@vtt.fi>\r
38  * @author Tuukka Lehtonen\r
39  */\r
40 public class ImageClass {\r
41 \r
42     public static final ElementClass INSTANCE =\r
43         ElementClass.compile(\r
44                 ImageElementHandler.INSTANCE,\r
45                 DefaultTransform.INSTANCE\r
46         );\r
47 \r
48     public static class ImageElementHandler implements SceneGraph, InternalSize, Resize, Outline {\r
49 \r
50         private static final long serialVersionUID = 7980198654721917029L;\r
51 \r
52         public static final ImageElementHandler INSTANCE = new ImageElementHandler();\r
53 \r
54         public static final Key  KEY_SG_NODE             = new SceneGraphNodeKey(Node.class, "IMAGE_SG_NODE");\r
55 \r
56         protected Image getImage(IElement e) {\r
57             Image i = e.getHint(ElementHints.KEY_IMAGE);\r
58             if (i == null)\r
59                 throw new IllegalStateException("element " + e + " has no ElementHints.KEY_IMAGE hint");\r
60             return i;\r
61         }\r
62 \r
63         protected Key getNodeKey() {\r
64             return KEY_SG_NODE;\r
65         }\r
66 \r
67         @Override\r
68         public void init(final IElement e, final G2DParentNode parent) {\r
69             Image i = getImage(e);\r
70             Node node = i.init(parent);\r
71             if (node != null)\r
72                 e.setHint(getNodeKey(), node);\r
73             if(node instanceof IG2DNode) {\r
74                 IG2DNode n = (IG2DNode)node;\r
75                 AffineTransform at = ElementUtils.getTransform(e);\r
76                 if(at != null) {\r
77                         n.setTransform(at); // FIXME: not tested..\r
78                 }\r
79             }\r
80         }\r
81 \r
82         public void cleanup(final IElement e) {\r
83             Node node = e.removeHint(getNodeKey());\r
84             if (node != null)\r
85                 node.remove();\r
86         }\r
87 \r
88         @Override\r
89         public Rectangle2D getBounds(IElement e, Rectangle2D size) {\r
90             Image i = getImage(e);\r
91             Rectangle2D r = i.getBounds();\r
92             if (size == null)\r
93                 size = new Rectangle2D.Double();\r
94             size.setFrame(r);\r
95             return size;\r
96         }\r
97 \r
98         @Override\r
99         public Double getFixedAspectRatio(IElement e) {\r
100             Image i = getImage(e);\r
101             Rectangle2D r = i.getBounds();\r
102             return r.getWidth() / r.getHeight();\r
103         }\r
104 \r
105         @Override\r
106         public Rectangle2D getMaximumSize(IElement e) {\r
107             Image i = getImage(e);\r
108             return i.getBounds();\r
109         }\r
110 \r
111         @Override\r
112         public Rectangle2D getMinimumSize(IElement e) {\r
113             Image i = getImage(e);\r
114             return i.getBounds();\r
115         }\r
116 \r
117         @Override\r
118         public void resize(IElement e, Rectangle2D newSize) {\r
119         }\r
120 \r
121         @Override\r
122         public Shape getElementShape(IElement e) {\r
123             Image i = getImage(e);\r
124             return i.getOutline();\r
125         }\r
126     }\r
127 \r
128 \r
129     public static class StaticImageElementHandler extends ImageElementHandler {\r
130         private static final long serialVersionUID = 7691329107125520049L;\r
131 \r
132         public static final Key   KEY_SG_NODE      = new SceneGraphNodeKey(Node.class, "STATIC_IMAGE_SG_NODE");\r
133 \r
134         private final Image i;\r
135 \r
136         public StaticImageElementHandler(Image i) {\r
137             this.i = i;\r
138         }\r
139 \r
140         @Override\r
141         protected Image getImage(IElement e) {\r
142             return i;\r
143         }\r
144 \r
145         @Override\r
146         protected Key getNodeKey() {\r
147             return KEY_SG_NODE;\r
148         }\r
149     }\r
150 \r
151 }