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.scenegraph.g2d.nodes.SingleElementNode;
22 import org.simantics.utils.datastructures.hints.IHintContext.Key;
24 public class DefinedElementHandler implements SceneGraph, InternalSize, Resize, Outline {
26 private static final long serialVersionUID = -2074850877791708846L;
28 public static final DefinedElementHandler INSTANCE = new DefinedElementHandler();
30 public static final Key KEY_SG_NODE = new SceneGraphNodeKey(Node.class, "IMAGE_SG_NODE");
32 protected Image getImage(IElement e) {
33 Image i = e.getHint(ElementHints.KEY_IMAGE);
35 throw new IllegalStateException("element " + e + " has no ElementHints.KEY_IMAGE hint");
39 protected Key getNodeKey() {
44 public void init(final IElement e, final G2DParentNode parent) {
45 Image i = getImage(e);
46 Node node = i.init(parent);
48 e.setHint(getNodeKey(), node);
49 if(node instanceof IG2DNode) {
50 IG2DNode n = (IG2DNode)node;
51 AffineTransform at = ElementUtils.getTransform(e);
53 n.setTransform(at); // FIXME: not tested..
56 if(parent instanceof SingleElementNode) {
57 ((SingleElementNode)parent).setParameters(ElementUtils.getParameters(e));
61 public void cleanup(final IElement e) {
62 Node node = e.removeHint(getNodeKey());
67 protected Rectangle2D imageBounds(IElement e, Rectangle2D size) {
68 Image i = getImage(e);
69 Rectangle2D r = i.getBounds();
76 public Rectangle2D getBounds(IElement e, Rectangle2D size) {
78 size = new Rectangle2D.Double();
80 ElementClass ec = e.getElementClass();
81 if (ec.containsClass(ConnectionHandler.class)) {
84 IG2DNode node = e.getHint(getNodeKey());
85 Rectangle2D r = node != null ? node.getBoundsInLocal() : null;
97 public Double getFixedAspectRatio(IElement e) {
98 Image i = getImage(e);
99 Rectangle2D r = i.getBounds();
100 return r.getWidth() / r.getHeight();
104 public Rectangle2D getMaximumSize(IElement e) {
105 Image i = getImage(e);
106 return i.getBounds();
110 public Rectangle2D getMinimumSize(IElement e) {
111 Image i = getImage(e);
112 return i.getBounds();
116 public void resize(IElement e, Rectangle2D newSize) {
120 public Shape getElementShape(IElement e) {
121 IG2DNode node = e.getHint(getNodeKey());
123 Rectangle2D bounds = node.getBoundsInLocal();
127 // Fallback to old logic.
128 Image i = getImage(e);
129 return i.getOutline();