]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/SingleElementNode.java
00ca6b8663f59c984097508f9cc9a5dba1491fc5
[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.IG2DNode;
21 import org.simantics.scenegraph.g2d.events.EventTypes;
22 import org.simantics.scenegraph.g2d.events.MouseEvent;
23 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin;
24 import org.simantics.scenegraph.utils.InitValueSupport;
25 import org.simantics.scenegraph.utils.NodeUtil;
26
27 public class SingleElementNode extends TransformNode implements InitValueSupport {
28
29     private static final long serialVersionUID = -4982578347433716440L;
30
31     private TransferableProvider transferableProvider;
32     protected Composite composite;
33     protected Boolean visible = Boolean.TRUE;
34     protected Boolean hidden = Boolean.FALSE;
35
36     public void setTransferableProvider(TransferableProvider transferableProvider) {
37         if (transferableProvider != this.transferableProvider) {
38             if (this.transferableProvider != null)
39                 removeEventHandler(this);
40             if (transferableProvider != null)
41                 addEventHandler(this);
42             this.transferableProvider = transferableProvider;
43         }
44     }
45
46     @Override
47     public boolean validate() {
48         return visible && !hidden;
49     }
50
51     @SyncField("composite")
52     public void setComposite(Composite composite) {
53         this.composite = composite;
54     }
55
56     @SyncField("visible")
57     public void setVisible(Boolean visible) {
58         this.visible = visible;
59     }
60
61     public boolean isVisible() {
62         return visible;
63     }
64
65     @SyncField("hidden")
66     public void setHidden(Boolean hidden) {
67         this.hidden = hidden;
68     }
69
70     public boolean isHidden() {
71         return hidden;
72     }
73
74     @Override
75     public void render(Graphics2D g) {
76         if (!visible || hidden)
77             return;
78
79         Composite oldComposite = null;
80         if(composite != null) {
81             oldComposite = g.getComposite();
82             g.setComposite(composite);
83         }
84         if(alphaComposite != null) {
85             if (oldComposite == null)
86                 oldComposite = g.getComposite();
87             g.setComposite(alphaComposite);
88         }
89
90         super.render(g);
91
92         if (oldComposite != null)
93             g.setComposite(oldComposite);
94     }
95
96     @Override
97     public String toString() {
98         StringBuilder sb = new StringBuilder();
99         sb.append(super.toString());
100         sb.append(" [");
101         if (composite != null) {
102             sb.append("composite=(");
103             AlphaComposite ac = (AlphaComposite) composite;
104             sb.append(ac.getRule());
105             sb.append(", ");
106             sb.append(ac.getAlpha());
107             sb.append("), ");
108         }
109         sb.append("visible=");
110         sb.append(visible);
111         sb.append("]");
112         return sb.toString();
113     }
114
115     protected Composite alphaComposite = null;
116
117     @PropertySetter("alpha")
118     @SyncField("alphaComposite")
119     public void setAlphaComposite(Composite alphaComposite) {
120         this.alphaComposite = alphaComposite;
121     }
122
123     @Override
124     public void initValues() {
125         alphaComposite = null;
126         for (IG2DNode node : getSortedNodes()) {
127             if (node instanceof InitValueSupport) {
128                 ((InitValueSupport) node).initValues();
129             }
130         }
131     }
132
133     @Override
134     public void cleanup() {
135         if (transferableProvider != null) {
136             removeEventHandler(this);
137             transferableProvider = null;
138         }
139         super.cleanup();
140     }
141
142     protected boolean isDragStartEvent(MouseEvent e) {
143         return e.isControlDown();
144     }
145
146     protected boolean hitTest(MouseEvent event) {
147         Rectangle2D bounds = super.getBoundsInLocal(true);
148         if (bounds == null)
149             return false;
150         Point2D localPos = NodeUtil.worldToLocal(this, event.controlPosition, new Point2D.Double());
151         double x = localPos.getX();
152         double y = localPos.getY();
153         boolean hit = bounds.contains(x, y);
154         return hit;
155     }
156
157     @Override
158     protected boolean mouseDragged(MouseDragBegin e) {
159         if (transferableProvider == null
160                 || !isDragStartEvent(e)
161                 || !hitTest(e))
162             return false;
163         e.transferable = transferableProvider.create();
164         return e.transferable != null;
165     }
166
167     @Override
168     public int getEventMask() {
169         return EventTypes.MouseDragBeginMask;
170     }
171
172 }