]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/DefinedElementHandler.java
Combination of Simantics-platform related changes and fixes for district
[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     protected Rectangle2D imageBounds(IElement e, Rectangle2D size) {
64         Image i = getImage(e);
65         Rectangle2D r = i.getBounds();
66         if (r != null)
67             size.setFrame(r);
68         return r;
69     }
70
71     @Override
72     public Rectangle2D getBounds(IElement e, Rectangle2D size) {
73         if (size == null)
74             size = new Rectangle2D.Double();
75
76         ElementClass ec = e.getElementClass();
77         if (ec.containsClass(ConnectionHandler.class)) {
78             imageBounds(e, size);
79         } else {
80             IG2DNode node = e.getHint(getNodeKey());
81             Rectangle2D r = node != null ? node.getBoundsInLocal() : null;
82             if (r != null) {
83                 size.setFrame(r);
84             } else {
85                 imageBounds(e, size);
86             }
87         }
88
89         return size;
90     }
91
92     @Override
93     public Double getFixedAspectRatio(IElement e) {
94         Image i = getImage(e);
95         Rectangle2D r = i.getBounds();
96         return r.getWidth() / r.getHeight();
97     }
98
99     @Override
100     public Rectangle2D getMaximumSize(IElement e) {
101         Image i = getImage(e);
102         return i.getBounds();
103     }
104
105     @Override
106     public Rectangle2D getMinimumSize(IElement e) {
107         Image i = getImage(e);
108         return i.getBounds();
109     }
110
111     @Override
112     public void resize(IElement e, Rectangle2D newSize) {
113     }
114
115     @Override
116     public Shape getElementShape(IElement e) {
117         IG2DNode node = e.getHint(getNodeKey());
118         if (node != null) {
119             Rectangle2D bounds = node.getBoundsInLocal();
120             if (bounds != null)
121                 return bounds;
122         }
123         // Fallback to old logic.
124         Image i = getImage(e);
125         return i.getOutline();
126     }
127         
128 }