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 protected Rectangle2D imageBounds(IElement e, Rectangle2D size) {
64 Image i = getImage(e);
65 Rectangle2D r = i.getBounds();
72 public Rectangle2D getBounds(IElement e, Rectangle2D size) {
74 size = new Rectangle2D.Double();
76 ElementClass ec = e.getElementClass();
77 if (ec.containsClass(ConnectionHandler.class)) {
80 IG2DNode node = e.getHint(getNodeKey());
81 Rectangle2D r = node != null ? node.getBoundsInLocal() : null;
93 public Double getFixedAspectRatio(IElement e) {
94 Image i = getImage(e);
95 Rectangle2D r = i.getBounds();
96 return r.getWidth() / r.getHeight();
100 public Rectangle2D getMaximumSize(IElement e) {
101 Image i = getImage(e);
102 return i.getBounds();
106 public Rectangle2D getMinimumSize(IElement e) {
107 Image i = getImage(e);
108 return i.getBounds();
112 public void resize(IElement e, Rectangle2D newSize) {
116 public Shape getElementShape(IElement e) {
117 IG2DNode node = e.getHint(getNodeKey());
119 Rectangle2D bounds = node.getBoundsInLocal();
123 // Fallback to old logic.
124 Image i = getImage(e);
125 return i.getOutline();