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