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.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;
27 public class SingleElementNode extends TransformNode implements InitValueSupport {
29 private static final long serialVersionUID = -4982578347433716440L;
31 private TransferableProvider transferableProvider;
32 protected Composite composite;
33 protected Boolean visible = Boolean.TRUE;
34 protected Boolean hidden = Boolean.FALSE;
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;
47 public boolean validate() {
48 return visible && !hidden;
51 @SyncField("composite")
52 public void setComposite(Composite composite) {
53 this.composite = composite;
57 public void setVisible(Boolean visible) {
58 this.visible = visible;
61 public boolean isVisible() {
66 public void setHidden(Boolean hidden) {
70 public boolean isHidden() {
75 public void render(Graphics2D g) {
76 if (!visible || hidden)
79 Composite oldComposite = null;
80 if(composite != null) {
81 oldComposite = g.getComposite();
82 g.setComposite(composite);
84 if(alphaComposite != null) {
85 if (oldComposite == null)
86 oldComposite = g.getComposite();
87 g.setComposite(alphaComposite);
92 if (oldComposite != null)
93 g.setComposite(oldComposite);
97 public String toString() {
98 StringBuilder sb = new StringBuilder();
99 sb.append(super.toString());
101 if (composite != null) {
102 sb.append("composite=(");
103 AlphaComposite ac = (AlphaComposite) composite;
104 sb.append(ac.getRule());
106 sb.append(ac.getAlpha());
109 sb.append("visible=");
112 return sb.toString();
115 protected Composite alphaComposite = null;
117 @PropertySetter("alpha")
118 @SyncField("alphaComposite")
119 public void setAlphaComposite(Composite alphaComposite) {
120 this.alphaComposite = alphaComposite;
124 public void initValues() {
125 alphaComposite = null;
126 for (IG2DNode node : getSortedNodes()) {
127 if (node instanceof InitValueSupport) {
128 ((InitValueSupport) node).initValues();
134 public void cleanup() {
135 if (transferableProvider != null) {
136 removeEventHandler(this);
137 transferableProvider = null;
142 protected boolean isDragStartEvent(MouseEvent e) {
143 return e.isControlDown();
146 protected boolean hitTest(MouseEvent event) {
147 Rectangle2D bounds = super.getBoundsInLocal(true);
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);
158 protected boolean mouseDragged(MouseDragBegin e) {
159 if (transferableProvider == null
160 || !isDragStartEvent(e)
163 e.transferable = transferableProvider.create();
164 return e.transferable != null;
168 public int getEventMask() {
169 return EventTypes.MouseDragBeginMask;