+ @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(false);\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