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