]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/DefinedElementHandler.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / DefinedElementHandler.java
1 package org.simantics.diagram.adapter;
2
3 import java.awt.Shape;
4 import java.awt.geom.AffineTransform;
5 import java.awt.geom.Rectangle2D;
6
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;
23
24 public class DefinedElementHandler implements SceneGraph, InternalSize, Resize, Outline {
25
26         private static final long serialVersionUID = -2074850877791708846L;
27
28         public static final DefinedElementHandler INSTANCE = new DefinedElementHandler();
29
30     public static final Key  KEY_SG_NODE             = new SceneGraphNodeKey(Node.class, "IMAGE_SG_NODE");
31
32     protected Image getImage(IElement e) {
33         Image i = e.getHint(ElementHints.KEY_IMAGE);
34         if (i == null)
35             throw new IllegalStateException("element " + e + " has no ElementHints.KEY_IMAGE hint");
36         return i;
37     }
38
39     protected Key getNodeKey() {
40         return KEY_SG_NODE;
41     }
42
43     @Override
44     public void init(final IElement e, final G2DParentNode parent) {
45         Image i = getImage(e);
46         Node node = i.init(parent);
47         if (node != null)
48             e.setHint(getNodeKey(), node);
49         if(node instanceof IG2DNode) {
50                 IG2DNode n = (IG2DNode)node;
51                 AffineTransform at = ElementUtils.getTransform(e);
52                 if(at != null) {
53                         n.setTransform(at); // FIXME: not tested..
54                 }
55         }
56         if(parent instanceof SingleElementNode) {
57             ((SingleElementNode)parent).setParameters(ElementUtils.getParameters(e));
58         }
59     }
60
61     public void cleanup(final IElement e) {
62         Node node = e.removeHint(getNodeKey());
63         if (node != null)
64             node.remove();
65     }
66     
67     protected Rectangle2D imageBounds(IElement e, Rectangle2D size) {
68         Image i = getImage(e);
69         Rectangle2D r = i.getBounds();
70         if (r != null)
71             size.setFrame(r);
72         return r;
73     }
74
75     @Override
76     public Rectangle2D getBounds(IElement e, Rectangle2D size) {
77         if (size == null)
78             size = new Rectangle2D.Double();
79
80         ElementClass ec = e.getElementClass();
81         if (ec.containsClass(ConnectionHandler.class)) {
82             imageBounds(e, size);
83         } else {
84             IG2DNode node = e.getHint(getNodeKey());
85             Rectangle2D r = node != null ? node.getBoundsInLocal() : null;
86             if (r != null) {
87                 size.setFrame(r);
88             } else {
89                 imageBounds(e, size);
90             }
91         }
92
93         return size;
94     }
95
96     @Override
97     public Double getFixedAspectRatio(IElement e) {
98         Image i = getImage(e);
99         Rectangle2D r = i.getBounds();
100         return r.getWidth() / r.getHeight();
101     }
102
103     @Override
104     public Rectangle2D getMaximumSize(IElement e) {
105         Image i = getImage(e);
106         return i.getBounds();
107     }
108
109     @Override
110     public Rectangle2D getMinimumSize(IElement e) {
111         Image i = getImage(e);
112         return i.getBounds();
113     }
114
115     @Override
116     public void resize(IElement e, Rectangle2D newSize) {
117     }
118
119     @Override
120     public Shape getElementShape(IElement e) {
121         IG2DNode node = e.getHint(getNodeKey());
122         if (node != null) {
123             Rectangle2D bounds = node.getBoundsInLocal();
124             if (bounds != null)
125                 return bounds;
126         }
127         // Fallback to old logic.
128         Image i = getImage(e);
129         return i.getOutline();
130     }
131         
132 }