}
}
public static void dropNode(WorldObject node) throws UserCancelledException {
if (node instanceof DroppableX || node instanceof Droppable) {
WorldObject worldLayer = node.getWorldLayer();
Collection<WorldObject> allTargets = worldLayer.findIntersectingNodes(node
.localToGlobal(node.getBounds()));
Collection<WorldObject> goodTargets = new ArrayList<WorldObject>(allTargets.size());
// Do not allow a Node to be dropped on a child of itself
for (WorldObject target : allTargets) {
if (!node.isAncestorOf(target)) {
goodTargets.add(target);
}
}
if (node instanceof DroppableX) {
DroppableX droppable = (DroppableX) node;
droppable.droppedOnTargets(goodTargets);
}
if (node instanceof Droppable) {
Droppable droppable = (Droppable) node;
WorldObject target = null;
for (WorldObject potentialTarget : goodTargets) {
if (droppable.acceptTarget(potentialTarget)) {
target = potentialTarget;
}
}
if (target == null) {
if (droppable.acceptTarget(worldLayer)) {
target = worldLayer;
}
}
if (target != null) {
Point2D position = target.globalToLocal(node.localToGlobal(new Point2D.Double(
0, 0)));
node.setOffset(position);
target.addChild(node);
droppable.justDropped();
}
}
}