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")]