1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
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
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.scenegraph.g2d.nodes;
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;
21 import org.simantics.scenegraph.INode;
22 import org.simantics.scenegraph.g2d.G2DRenderingHints;
23 import org.simantics.scenegraph.g2d.IG2DNode;
24 import org.simantics.scenegraph.g2d.color.ColorFilter;
25 import org.simantics.scenegraph.g2d.color.Graphics2DWithColorFilter;
26 import org.simantics.scenegraph.g2d.events.EventTypes;
27 import org.simantics.scenegraph.g2d.events.MouseEvent;
28 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin;
29 import org.simantics.scenegraph.utils.InitValueSupport;
30 import org.simantics.scenegraph.utils.NodeUtil;
32 public class SingleElementNode extends TransformNode implements InitValueSupport {
34 private static final long serialVersionUID = -4982578347433716440L;
36 private TransferableProvider transferableProvider;
37 protected Composite composite;
38 private ColorFilter colorFilter;
39 protected Boolean visible = Boolean.TRUE;
40 protected Boolean hidden = Boolean.FALSE;
41 private transient Object key;
42 private transient String typeClass;
43 private transient Map<String, Object> parameters;
45 public void setKey(Object key) {
49 public void setTypeClass(String typeClass) {
50 this.typeClass = typeClass;
53 public Object getKey() {
57 public String getTypeClass() {
61 public void setParameters(Map<String,Object> parameters) {
62 this.parameters = parameters;
65 public <T> T getParameter(String key) {
66 if (parameters != null) {
67 @SuppressWarnings("unchecked")
68 T t = (T) parameters.get(key);
69 if(t != null) return t;
71 INode parent = NodeUtil.getNearestParentOfType(this, SingleElementNode.class);
72 if (parent instanceof SingleElementNode) {
73 return ((SingleElementNode)parent).getParameter(key);
78 public void setTransferableProvider(TransferableProvider transferableProvider) {
79 if (transferableProvider != this.transferableProvider) {
80 if (this.transferableProvider != null)
81 removeEventHandler(this);
82 if (transferableProvider != null)
83 addEventHandler(this);
84 this.transferableProvider = transferableProvider;
89 public boolean validate() {
90 return visible && !hidden;
93 @SyncField("composite")
94 public void setComposite(Composite composite) {
95 this.composite = composite;
98 public void setColorFilter(ColorFilter colorFilter) {
99 this.colorFilter = colorFilter;
102 @SyncField("visible")
103 public void setVisible(Boolean visible) {
104 this.visible = visible;
107 public boolean isVisible() {
112 public void setHidden(Boolean hidden) {
113 this.hidden = hidden;
116 public boolean isHidden() {
121 public void render(Graphics2D g2d) {
122 if (!visible || hidden)
126 if (colorFilter != null) {
127 g = new Graphics2DWithColorFilter(g2d, colorFilter);
128 g.setRenderingHint(G2DRenderingHints.KEY_COLOR_FILTER, colorFilter);
133 Composite oldComposite = null;
134 if(composite != null) {
135 oldComposite = g.getComposite();
136 g.setComposite(composite);
138 if(alphaComposite != null) {
139 if (oldComposite == null)
140 oldComposite = g.getComposite();
141 g.setComposite(alphaComposite);
146 if (oldComposite != null)
147 g.setComposite(oldComposite);
149 if (colorFilter != null) {
150 g.setRenderingHint(G2DRenderingHints.KEY_COLOR_FILTER, null);
155 public String toString() {
156 StringBuilder sb = new StringBuilder();
157 sb.append(super.toString());
159 if (composite != null) {
160 sb.append("composite=(");
161 AlphaComposite ac = (AlphaComposite) composite;
162 sb.append(ac.getRule());
164 sb.append(ac.getAlpha());
167 sb.append("visible=");
170 return sb.toString();
173 protected Composite alphaComposite = null;
175 @PropertySetter("alpha")
176 @SyncField("alphaComposite")
177 public void setAlphaComposite(Composite alphaComposite) {
178 this.alphaComposite = alphaComposite;
182 public void initValues() {
183 alphaComposite = null;
184 for (IG2DNode node : getSortedNodes()) {
185 if (node instanceof InitValueSupport) {
186 ((InitValueSupport) node).initValues();
192 public void cleanup() {
193 if (transferableProvider != null) {
194 removeEventHandler(this);
195 transferableProvider = null;
200 protected boolean isDragStartEvent(MouseEvent e) {
201 return e.isControlDown();
204 protected boolean hitTest(MouseEvent event) {
205 Rectangle2D bounds = super.getBoundsInLocal(true);
208 Point2D localPos = NodeUtil.worldToLocal(this, event.controlPosition, new Point2D.Double());
209 double x = localPos.getX();
210 double y = localPos.getY();
211 boolean hit = bounds.contains(x, y);
216 protected boolean mouseDragged(MouseDragBegin e) {
217 if (transferableProvider == null
218 || !isDragStartEvent(e)
221 e.transferable = transferableProvider.create();
222 return e.transferable != null;
226 public int getEventMask() {
227 return EventTypes.MouseDragBeginMask;
230 public void beforeRender(Graphics2D g) {
231 g.setRenderingHint(G2DRenderingHints.KEY_BEGIN_ELEMENT, "definedElement");
234 public void afterRender(Graphics2D g) {
235 g.setRenderingHint(G2DRenderingHints.KEY_END_ELEMENT, "definedElement");