import java.awt.AlphaComposite;\r
import java.awt.Composite;\r
import java.awt.Graphics2D;\r
+import java.awt.geom.Point2D;\r
+import java.awt.geom.Rectangle2D;\r
\r
import org.simantics.scenegraph.g2d.IG2DNode;\r
+import org.simantics.scenegraph.g2d.events.EventTypes;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin;\r
import org.simantics.scenegraph.utils.InitValueSupport;\r
+import org.simantics.scenegraph.utils.NodeUtil;\r
\r
public class SingleElementNode extends TransformNode implements InitValueSupport {\r
- /**\r
- * \r
- */\r
+\r
private static final long serialVersionUID = -4982578347433716440L;\r
\r
+ private TransferableProvider transferableProvider;\r
protected Composite composite;\r
protected Boolean visible = Boolean.TRUE;\r
protected Boolean hidden = Boolean.FALSE;\r
\r
+ public void setTransferableProvider(TransferableProvider transferableProvider) {\r
+ if (transferableProvider != this.transferableProvider) {\r
+ if (this.transferableProvider != null)\r
+ removeEventHandler(this);\r
+ if (transferableProvider != null)\r
+ addEventHandler(this);\r
+ this.transferableProvider = transferableProvider;\r
+ }\r
+ }\r
+\r
@Override\r
public boolean validate() {\r
return visible && !hidden;\r
return sb.toString();\r
}\r
\r
-// private INode findChild(String key) {\r
-//\r
-// INode result = getNode(key);\r
-// if(result != null) return result;\r
-//\r
-// for(Map.Entry<String, IG2DNode> entry : children.entrySet()) {\r
-//\r
-// if(!(entry.getValue() instanceof SingleElementNode)) {\r
-// if(entry.getKey().startsWith(key)) return entry.getValue();\r
-// }\r
-//\r
-// }\r
-//\r
-// for(IG2DNode node : getNodes()) {\r
-//\r
-// if(node instanceof SingleElementNode) {\r
-//\r
-// result = ((SingleElementNode)node).findChild(key);\r
-// if(result != null) return result;\r
-//\r
-// }\r
-//\r
-// }\r
-//\r
-// return null;\r
-//\r
-// }\r
-\r
protected Composite alphaComposite = null;\r
\r
@PropertySetter("alpha")\r
this.alphaComposite = alphaComposite;\r
}\r
\r
-// public void setValue(String key, Object value) {\r
-//\r
-// if ("alpha".equals(key)) {\r
-// Float val = Float.parseFloat((String)value);\r
-// alphaComposite = AlphaComposite.getInstance(AlphaComposite. SRC_OVER, val);\r
-// } else {\r
-//\r
-// String[] parts = key.split("\\.");\r
-// if(parts.length != 2) return;\r
-//\r
-// INode child = findChild(parts[0]);\r
-//\r
-// if(child == null) return;\r
-//\r
-//// child.setValue(parts[1], value);\r
-//\r
-// }\r
-//\r
-// }\r
-\r
@Override\r
public void initValues() {\r
alphaComposite = null;\r
}\r
}\r
\r
+ @Override\r
+ public void cleanup() {\r
+ if (transferableProvider != null) {\r
+ removeEventHandler(this);\r
+ transferableProvider = null;\r
+ }\r
+ super.cleanup();\r
+ }\r
+\r
+ protected boolean isDragStartEvent(MouseEvent e) {\r
+ return e.isControlDown();\r
+ }\r
+\r
+ protected boolean hitTest(MouseEvent event) {\r
+ Rectangle2D bounds = super.getBoundsInLocal(true);\r
+ if (bounds == null)\r
+ return false;\r
+ Point2D localPos = NodeUtil.worldToLocal(this, event.controlPosition, new Point2D.Double());\r
+ double x = localPos.getX();\r
+ double y = localPos.getY();\r
+ boolean hit = bounds.contains(x, y);\r
+ return hit;\r
+ }\r
+\r
+ @Override\r
+ protected boolean mouseDragged(MouseDragBegin e) {\r
+ if (transferableProvider == null\r
+ || !isDragStartEvent(e)\r
+ || !hitTest(e))\r
+ return false;\r
+ e.transferable = transferableProvider.create();\r
+ return e.transferable != null;\r
+ }\r
+\r
+ @Override\r
+ public int getEventMask() {\r
+ return EventTypes.MouseDragBeginMask;\r
+ }\r
+\r
}\r