1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.scenegraph.g2d.nodes;
\r
14 import java.awt.AlphaComposite;
\r
15 import java.awt.Composite;
\r
16 import java.awt.Graphics2D;
\r
17 import java.awt.geom.Point2D;
\r
18 import java.awt.geom.Rectangle2D;
\r
20 import org.simantics.scenegraph.g2d.IG2DNode;
\r
21 import org.simantics.scenegraph.g2d.events.EventTypes;
\r
22 import org.simantics.scenegraph.g2d.events.MouseEvent;
\r
23 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin;
\r
24 import org.simantics.scenegraph.utils.InitValueSupport;
\r
25 import org.simantics.scenegraph.utils.NodeUtil;
\r
27 public class SingleElementNode extends TransformNode implements InitValueSupport {
\r
29 private static final long serialVersionUID = -4982578347433716440L;
\r
31 private TransferableProvider transferableProvider;
\r
32 protected Composite composite;
\r
33 protected Boolean visible = Boolean.TRUE;
\r
34 protected Boolean hidden = Boolean.FALSE;
\r
36 public void setTransferableProvider(TransferableProvider transferableProvider) {
\r
37 if (transferableProvider != this.transferableProvider) {
\r
38 if (this.transferableProvider != null)
\r
39 removeEventHandler(this);
\r
40 if (transferableProvider != null)
\r
41 addEventHandler(this);
\r
42 this.transferableProvider = transferableProvider;
\r
47 public boolean validate() {
\r
48 return visible && !hidden;
\r
51 @SyncField("composite")
\r
52 public void setComposite(Composite composite) {
\r
53 this.composite = composite;
\r
56 @SyncField("visible")
\r
57 public void setVisible(Boolean visible) {
\r
58 this.visible = visible;
\r
61 public boolean isVisible() {
\r
65 @SyncField("hidden")
\r
66 public void setHidden(Boolean hidden) {
\r
67 this.hidden = hidden;
\r
70 public boolean isHidden() {
\r
75 public void render(Graphics2D g) {
\r
76 if (!visible || hidden)
\r
79 Composite oldComposite = null;
\r
80 if(composite != null) {
\r
81 oldComposite = g.getComposite();
\r
82 g.setComposite(composite);
\r
84 if(alphaComposite != null) {
\r
85 if (oldComposite == null)
\r
86 oldComposite = g.getComposite();
\r
87 g.setComposite(alphaComposite);
\r
92 if (oldComposite != null)
\r
93 g.setComposite(oldComposite);
\r
97 public String toString() {
\r
98 StringBuilder sb = new StringBuilder();
\r
99 sb.append(super.toString());
\r
101 if (composite != null) {
\r
102 sb.append("composite=(");
\r
103 AlphaComposite ac = (AlphaComposite) composite;
\r
104 sb.append(ac.getRule());
\r
106 sb.append(ac.getAlpha());
\r
109 sb.append("visible=");
\r
110 sb.append(visible);
\r
112 return sb.toString();
\r
115 protected Composite alphaComposite = null;
\r
117 @PropertySetter("alpha")
\r
118 @SyncField("alphaComposite")
\r
119 public void setAlphaComposite(Composite alphaComposite) {
\r
120 this.alphaComposite = alphaComposite;
\r
124 public void initValues() {
\r
125 alphaComposite = null;
\r
126 for (IG2DNode node : getSortedNodes()) {
\r
127 if (node instanceof InitValueSupport) {
\r
128 ((InitValueSupport) node).initValues();
\r
134 public void cleanup() {
\r
135 if (transferableProvider != null) {
\r
136 removeEventHandler(this);
\r
137 transferableProvider = null;
\r
142 protected boolean isDragStartEvent(MouseEvent e) {
\r
143 return e.isControlDown();
\r
146 protected boolean hitTest(MouseEvent event) {
\r
147 Rectangle2D bounds = super.getBoundsInLocal(true);
\r
148 if (bounds == null)
\r
150 Point2D localPos = NodeUtil.worldToLocal(this, event.controlPosition, new Point2D.Double());
\r
151 double x = localPos.getX();
\r
152 double y = localPos.getY();
\r
153 boolean hit = bounds.contains(x, y);
\r
158 protected boolean mouseDragged(MouseDragBegin e) {
\r
159 if (transferableProvider == null
\r
160 || !isDragStartEvent(e)
\r
163 e.transferable = transferableProvider.create();
\r
164 return e.transferable != null;
\r
168 public int getEventMask() {
\r
169 return EventTypes.MouseDragBeginMask;
\r