height * 1.5 || dropParentItem == null) { return false; } } else { // Current drop target is an empty opened branch if(myTree.dataDescriptor.isBranch(dropItem)) { if(myTree.isItemOpen(dropItem) && !myTree.dataDescriptor.hasChildren(dropItem) && offset > height * 0.5) { dropParentItem = dropItem; } else { if(dropIndex > 0 && offset < height * 0.5) { itemRenderer = myTree.indexToItemRenderer(dropIndex - 1); dropItem = XML(itemRenderer.data); } } } } if(dropItem != null || dropParentItem != null) { // No parentItem is found yet. Use the parent of the dropItem (default case). if(dropParentItem == null) { dropParentItem = dropItem.parent(); } // Multiple root nodes are not allowed if(dropParentItem != null) { for each(var obj:Object in dragAndDropRules) { if(obj is DragAndDropRule) { var rule:DragAndDropRule = DragAndDropRule(obj); if(rule.child is NodeTest && NodeTest(rule.child).doTest(dragItem) || !(rule.child is NodeTest) && rule.child == dragItem.name()) { for each(var parentObj:Object in rule.parents) { if(parentObj is NodeTest) { if(NodeTest(parentObj).doTest(dropParentItem)) { return true; } } else { if(parentObj == dropParentItem.name()) { return true; } } } } } } } } return false; } /** * Event handler. Called after dragging is started. */ private function dragEnter(event:DragEvent) : void { event.ctrlKey = false; event.action = DragManager.MOVE; } /** * Event handler. Called when the mouse is moved while dragging. */ private function dragOver(event:DragEvent) : void { if(!isDropAllowed(event)) { event.preventDefault(); myTree.hideDropFeedback(event); } event.ctrlKey = false; event.action = DragManager.MOVE; } /** * Event handler. Called when an item is dropped. */ private function dragDrop(event:DragEvent) : void { if(!isDropAllowed(event)) { event.preventDefault(); myTree.hideDropFeedback(event); } callLater(dispatchEvent, [new ItemMovedEvent(dragItem, dragItem.parent(), dropParentItem)]); event.action = DragManager.MOVE; } ]]> [Event(name="itemMoved", type="events.ItemMovedEvent")]