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;
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;
28 public class SingleElementNode extends TransformNode implements InitValueSupport {
30 private static final long serialVersionUID = -4982578347433716440L;
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 private transient String typeClass;
39 public void setKey(Object key) {
43 public void setTypeClass(String typeClass) {
44 this.typeClass = typeClass;
47 public Object getKey() {
51 public String getTypeClass() {
55 public void setTransferableProvider(TransferableProvider transferableProvider) {
56 if (transferableProvider != this.transferableProvider) {
57 if (this.transferableProvider != null)
58 removeEventHandler(this);
59 if (transferableProvider != null)
60 addEventHandler(this);
61 this.transferableProvider = transferableProvider;
66 public boolean validate() {
67 return visible && !hidden;
70 @SyncField("composite")
71 public void setComposite(Composite composite) {
72 this.composite = composite;
76 public void setVisible(Boolean visible) {
77 this.visible = visible;
80 public boolean isVisible() {
85 public void setHidden(Boolean hidden) {
89 public boolean isHidden() {
94 public void render(Graphics2D g) {
95 if (!visible || hidden)
98 Composite oldComposite = null;
99 if(composite != null) {
100 oldComposite = g.getComposite();
101 g.setComposite(composite);
103 if(alphaComposite != null) {
104 if (oldComposite == null)
105 oldComposite = g.getComposite();
106 g.setComposite(alphaComposite);
111 if (oldComposite != null)
112 g.setComposite(oldComposite);
116 public String toString() {
117 StringBuilder sb = new StringBuilder();
118 sb.append(super.toString());
120 if (composite != null) {
121 sb.append("composite=(");
122 AlphaComposite ac = (AlphaComposite) composite;
123 sb.append(ac.getRule());
125 sb.append(ac.getAlpha());
128 sb.append("visible=");
131 return sb.toString();
134 protected Composite alphaComposite = null;
136 @PropertySetter("alpha")
137 @SyncField("alphaComposite")
138 public void setAlphaComposite(Composite alphaComposite) {
139 this.alphaComposite = alphaComposite;
143 public void initValues() {
144 alphaComposite = null;
145 for (IG2DNode node : getSortedNodes()) {
146 if (node instanceof InitValueSupport) {
147 ((InitValueSupport) node).initValues();
153 public void cleanup() {
154 if (transferableProvider != null) {
155 removeEventHandler(this);
156 transferableProvider = null;
161 protected boolean isDragStartEvent(MouseEvent e) {
162 return e.isControlDown();
165 protected boolean hitTest(MouseEvent event) {
166 Rectangle2D bounds = super.getBoundsInLocal(true);
169 Point2D localPos = NodeUtil.worldToLocal(this, event.controlPosition, new Point2D.Double());
170 double x = localPos.getX();
171 double y = localPos.getY();
172 boolean hit = bounds.contains(x, y);
177 protected boolean mouseDragged(MouseDragBegin e) {
178 if (transferableProvider == null
179 || !isDragStartEvent(e)
182 e.transferable = transferableProvider.create();
183 return e.transferable != null;
187 public int getEventMask() {
188 return EventTypes.MouseDragBeginMask;
191 public void beforeRender(Graphics2D g) {
192 g.setRenderingHint(G2DRenderingHints.KEY_BEGIN_ELEMENT, "definedElement");
195 public void afterRender(Graphics2D g) {
196 g.setRenderingHint(G2DRenderingHints.KEY_END_ELEMENT, "definedElement");