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