]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/SingleElementNode.java
Fix RouteGraphNode styling
[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
38     public void setKey(Object key) {
39         this.key = key;
40     }
41
42     public Object getKey() {
43         return key;
44     }
45
46     public void setTransferableProvider(TransferableProvider transferableProvider) {
47         if (transferableProvider != this.transferableProvider) {
48             if (this.transferableProvider != null)
49                 removeEventHandler(this);
50             if (transferableProvider != null)
51                 addEventHandler(this);
52             this.transferableProvider = transferableProvider;
53         }
54     }
55
56     @Override
57     public boolean validate() {
58         return visible && !hidden;
59     }
60
61     @SyncField("composite")
62     public void setComposite(Composite composite) {
63         this.composite = composite;
64     }
65
66     @SyncField("visible")
67     public void setVisible(Boolean visible) {
68         this.visible = visible;
69     }
70
71     public boolean isVisible() {
72         return visible;
73     }
74
75     @SyncField("hidden")
76     public void setHidden(Boolean hidden) {
77         this.hidden = hidden;
78     }
79
80     public boolean isHidden() {
81         return hidden;
82     }
83
84     @Override
85     public void render(Graphics2D g) {
86         if (!visible || hidden)
87             return;
88
89         Composite oldComposite = null;
90         if(composite != null) {
91             oldComposite = g.getComposite();
92             g.setComposite(composite);
93         }
94         if(alphaComposite != null) {
95             if (oldComposite == null)
96                 oldComposite = g.getComposite();
97             g.setComposite(alphaComposite);
98         }
99
100         super.render(g);
101
102         if (oldComposite != null)
103             g.setComposite(oldComposite);
104     }
105
106     @Override
107     public String toString() {
108         StringBuilder sb = new StringBuilder();
109         sb.append(super.toString());
110         sb.append(" [");
111         if (composite != null) {
112             sb.append("composite=(");
113             AlphaComposite ac = (AlphaComposite) composite;
114             sb.append(ac.getRule());
115             sb.append(", ");
116             sb.append(ac.getAlpha());
117             sb.append("), ");
118         }
119         sb.append("visible=");
120         sb.append(visible);
121         sb.append("]");
122         return sb.toString();
123     }
124
125     protected Composite alphaComposite = null;
126
127     @PropertySetter("alpha")
128     @SyncField("alphaComposite")
129     public void setAlphaComposite(Composite alphaComposite) {
130         this.alphaComposite = alphaComposite;
131     }
132
133     @Override
134     public void initValues() {
135         alphaComposite = null;
136         for (IG2DNode node : getSortedNodes()) {
137             if (node instanceof InitValueSupport) {
138                 ((InitValueSupport) node).initValues();
139             }
140         }
141     }
142
143     @Override
144     public void cleanup() {
145         if (transferableProvider != null) {
146             removeEventHandler(this);
147             transferableProvider = null;
148         }
149         super.cleanup();
150     }
151
152     protected boolean isDragStartEvent(MouseEvent e) {
153         return e.isControlDown();
154     }
155
156     protected boolean hitTest(MouseEvent event) {
157         Rectangle2D bounds = super.getBoundsInLocal(true);
158         if (bounds == null)
159             return false;
160         Point2D localPos = NodeUtil.worldToLocal(this, event.controlPosition, new Point2D.Double());
161         double x = localPos.getX();
162         double y = localPos.getY();
163         boolean hit = bounds.contains(x, y);
164         return hit;
165     }
166
167     @Override
168     protected boolean mouseDragged(MouseDragBegin e) {
169         if (transferableProvider == null
170                 || !isDragStartEvent(e)
171                 || !hitTest(e))
172             return false;
173         e.transferable = transferableProvider.create();
174         return e.transferable != null;
175     }
176
177     @Override
178     public int getEventMask() {
179         return EventTypes.MouseDragBeginMask;
180     }
181
182     public void beforeRender(Graphics2D g) {
183         g.setRenderingHint(G2DRenderingHints.KEY_BEGIN_ELEMENT, "definedElement");
184     }
185
186     public void afterRender(Graphics2D g) {
187         g.setRenderingHint(G2DRenderingHints.KEY_END_ELEMENT, "definedElement");
188     }
189
190 }