1 package org.simantics.diagram.adapter;
4 import java.awt.geom.AffineTransform;
5 import java.awt.geom.Rectangle2D;
7 import org.simantics.g2d.connection.handler.ConnectionHandler;
8 import org.simantics.g2d.element.ElementClass;
9 import org.simantics.g2d.element.ElementHints;
10 import org.simantics.g2d.element.ElementUtils;
11 import org.simantics.g2d.element.IElement;
12 import org.simantics.g2d.element.SceneGraphNodeKey;
13 import org.simantics.g2d.element.handler.InternalSize;
14 import org.simantics.g2d.element.handler.Outline;
15 import org.simantics.g2d.element.handler.Resize;
16 import org.simantics.g2d.element.handler.SceneGraph;
17 import org.simantics.g2d.image.Image;
18 import org.simantics.scenegraph.Node;
19 import org.simantics.scenegraph.g2d.G2DParentNode;
20 import org.simantics.scenegraph.g2d.IG2DNode;
21 import org.simantics.utils.datastructures.hints.IHintContext.Key;
23 public class DefinedElementHandler implements SceneGraph, InternalSize, Resize, Outline {
25 private static final long serialVersionUID = -2074850877791708846L;
27 public static final DefinedElementHandler INSTANCE = new DefinedElementHandler();
29 public static final Key KEY_SG_NODE = new SceneGraphNodeKey(Node.class, "IMAGE_SG_NODE");
31 protected Image getImage(IElement e) {
32 Image i = e.getHint(ElementHints.KEY_IMAGE);
34 throw new IllegalStateException("element " + e + " has no ElementHints.KEY_IMAGE hint");
38 protected Key getNodeKey() {
43 public void init(final IElement e, final G2DParentNode parent) {
44 Image i = getImage(e);
45 Node node = i.init(parent);
47 e.setHint(getNodeKey(), node);
48 if(node instanceof IG2DNode) {
49 IG2DNode n = (IG2DNode)node;
50 AffineTransform at = ElementUtils.getTransform(e);
52 n.setTransform(at); // FIXME: not tested..
57 public void cleanup(final IElement e) {
58 Node node = e.removeHint(getNodeKey());
63 public Rectangle2D imageBounds(IElement e) {
64 Image i = getImage(e);
69 public Rectangle2D getBounds(IElement e, Rectangle2D size) {
72 size = new Rectangle2D.Double();
74 ElementClass ec = e.getElementClass();
75 if(ec.containsClass(ConnectionHandler.class)) {
76 size.setFrame(imageBounds(e));
78 IG2DNode node = e.getHint(getNodeKey());
80 size.setFrame(node.getBoundsInLocal());
82 size.setFrame(imageBounds(e));
91 public Double getFixedAspectRatio(IElement e) {
92 Image i = getImage(e);
93 Rectangle2D r = i.getBounds();
94 return r.getWidth() / r.getHeight();
98 public Rectangle2D getMaximumSize(IElement e) {
99 Image i = getImage(e);
100 return i.getBounds();
104 public Rectangle2D getMinimumSize(IElement e) {
105 Image i = getImage(e);
106 return i.getBounds();
110 public void resize(IElement e, Rectangle2D newSize) {
114 public Shape getElementShape(IElement e) {
116 IG2DNode node = e.getHint(getNodeKey());
118 throw new IllegalStateException();
119 return node.getBoundsInLocal();