]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/SingleElementNode.java
More type information for diagram elements
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / nodes / SingleElementNode.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * which accompanies this distribution, and is available at
7  * http://www.eclipse.org/legal/epl-v10.html
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.scenegraph.g2d.nodes;
13
14 import java.awt.AlphaComposite;
15 import java.awt.Composite;
16 import java.awt.Graphics2D;
17 import java.awt.geom.Point2D;
18 import java.awt.geom.Rectangle2D;
19
20 import org.simantics.scenegraph.g2d.G2DRenderingHints;
21 import org.simantics.scenegraph.g2d.IG2DNode;
22 import org.simantics.scenegraph.g2d.events.EventTypes;
23 import org.simantics.scenegraph.g2d.events.MouseEvent;
24 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin;
25 import org.simantics.scenegraph.utils.InitValueSupport;
26 import org.simantics.scenegraph.utils.NodeUtil;
27
28 public class SingleElementNode extends TransformNode implements InitValueSupport {
29
30     private static final long serialVersionUID = -4982578347433716440L;
31
32     private TransferableProvider transferableProvider;
33     protected Composite composite;
34     protected Boolean visible = Boolean.TRUE;
35     protected Boolean hidden = Boolean.FALSE;
36     private transient Object key;
37     private transient String typeClass;
38
39     public void setKey(Object key) {
40         this.key = key;
41     }
42
43     public void setTypeClass(String typeClass) {
44         this.typeClass = typeClass;
45     }
46
47     public Object getKey() {
48         return key;
49     }
50
51     public String getTypeClass() {
52         return typeClass;
53     }
54
55     public void setTransferableProvider(TransferableProvider transferableProvider) {
56         if (transferableProvider != this.transferableProvider) {
57             if (this.transferableProvider != null)
58                 removeEventHandler(this);
59             if (transferableProvider != null)
60                 addEventHandler(this);
61             this.transferableProvider = transferableProvider;
62         }
63     }
64
65     @Override
66     public boolean validate() {
67         return visible && !hidden;
68     }
69
70     @SyncField("composite")
71     public void setComposite(Composite composite) {
72         this.composite = composite;
73     }
74
75     @SyncField("visible")
76     public void setVisible(Boolean visible) {
77         this.visible = visible;
78     }
79
80     public boolean isVisible() {
81         return visible;
82     }
83
84     @SyncField("hidden")
85     public void setHidden(Boolean hidden) {
86         this.hidden = hidden;
87     }
88
89     public boolean isHidden() {
90         return hidden;
91     }
92
93     @Override
94     public void render(Graphics2D g) {
95         if (!visible || hidden)
96             return;
97
98         Composite oldComposite = null;
99         if(composite != null) {
100             oldComposite = g.getComposite();
101             g.setComposite(composite);
102         }
103         if(alphaComposite != null) {
104             if (oldComposite == null)
105                 oldComposite = g.getComposite();
106             g.setComposite(alphaComposite);
107         }
108
109         super.render(g);
110
111         if (oldComposite != null)
112             g.setComposite(oldComposite);
113     }
114
115     @Override
116     public String toString() {
117         StringBuilder sb = new StringBuilder();
118         sb.append(super.toString());
119         sb.append(" [");
120         if (composite != null) {
121             sb.append("composite=(");
122             AlphaComposite ac = (AlphaComposite) composite;
123             sb.append(ac.getRule());
124             sb.append(", ");
125             sb.append(ac.getAlpha());
126             sb.append("), ");
127         }
128         sb.append("visible=");
129         sb.append(visible);
130         sb.append("]");
131         return sb.toString();
132     }
133
134     protected Composite alphaComposite = null;
135
136     @PropertySetter("alpha")
137     @SyncField("alphaComposite")
138     public void setAlphaComposite(Composite alphaComposite) {
139         this.alphaComposite = alphaComposite;
140     }
141
142     @Override
143     public void initValues() {
144         alphaComposite = null;
145         for (IG2DNode node : getSortedNodes()) {
146             if (node instanceof InitValueSupport) {
147                 ((InitValueSupport) node).initValues();
148             }
149         }
150     }
151
152     @Override
153     public void cleanup() {
154         if (transferableProvider != null) {
155             removeEventHandler(this);
156             transferableProvider = null;
157         }
158         super.cleanup();
159     }
160
161     protected boolean isDragStartEvent(MouseEvent e) {
162         return e.isControlDown();
163     }
164
165     protected boolean hitTest(MouseEvent event) {
166         Rectangle2D bounds = super.getBoundsInLocal(true);
167         if (bounds == null)
168             return false;
169         Point2D localPos = NodeUtil.worldToLocal(this, event.controlPosition, new Point2D.Double());
170         double x = localPos.getX();
171         double y = localPos.getY();
172         boolean hit = bounds.contains(x, y);
173         return hit;
174     }
175
176     @Override
177     protected boolean mouseDragged(MouseDragBegin e) {
178         if (transferableProvider == null
179                 || !isDragStartEvent(e)
180                 || !hitTest(e))
181             return false;
182         e.transferable = transferableProvider.create();
183         return e.transferable != null;
184     }
185
186     @Override
187     public int getEventMask() {
188         return EventTypes.MouseDragBeginMask;
189     }
190
191     public void beforeRender(Graphics2D g) {
192         g.setRenderingHint(G2DRenderingHints.KEY_BEGIN_ELEMENT, "definedElement");
193     }
194
195     public void afterRender(Graphics2D g) {
196         g.setRenderingHint(G2DRenderingHints.KEY_END_ELEMENT, "definedElement");
197     }
198
199 }