RF 4 Tree drag-n- drop support
robertgary1 Feb 13, 2012 8:58 PMI don't see any reference of drag and drop is still supported in trees in RF 4.1. I'm migrating from 3.3.3.Final. I'm using the example dropListener and the symbols no longer exist...
public void dropListener(DropEvent dropEvent) {
try {
// resolve drag destination attributes
UITreeNode destNode = (dropEvent.getSource() instanceof UITreeNode) ? (UITreeNode) dropEvent.getSource() : null;
UITree destTree = destNode != null ? destNode.getUITree() : null;
TreeRowKey dropNodeKey = (dropEvent.getDropValue() instanceof TreeRowKey) ? (TreeRowKey) dropEvent.getDropValue() : null;
TreeNode droppedInNode = dropNodeKey != null ? destTree.getTreeNode(dropNodeKey) : null;
// resolve drag source attributes
UITreeNode srcNode = (dropEvent.getDraggableSource() instanceof UITreeNode) ? (UITreeNode) dropEvent.getDraggableSource() : null;
UITree srcTree = srcNode != null ? srcNode.getUITree() : null;
TreeRowKey dragNodeKey = (dropEvent.getDragValue() instanceof TreeRowKey) ? (TreeRowKey) dropEvent.getDragValue() : null;
TreeNode draggedNode = dragNodeKey != null ? srcTree.getTreeNode(dragNodeKey) : null;
if (dropEvent.getDraggableSource() instanceof UIDragSupport && srcTree == null && draggedNode == null && dropEvent.getDragValue() instanceof TreeNode) {
srcTree = destTree;
draggedNode = (TreeNode) dropEvent.getDragValue();
dragNodeKey = srcTree.getTreeNodeRowKey(draggedNode) instanceof TreeRowKey ? (TreeRowKey) srcTree.getTreeNodeRowKey(draggedNode) : null;
}
// Note: check if we dropped node on to itself
if (droppedInNode != null && (droppedInNode.equals(draggedNode))) {
return;
}
//Don't drag below yourself, that would be crazy and recurrsive
TreeNode currNode = droppedInNode.getParent();
while (currNode != null) {
if (currNode.equals(draggedNode)) {
return;
}
currNode = currNode.getParent();
}
if (dropNodeKey != null) {
// add destination node for rerender
destTree.addRequestKey(dropNodeKey);
Object state = null;
if (dragNodeKey != null) { // Drag from this or other tree
TreeNode<Group> dropParentNode = droppedInNode.getParent();
Group dragNodeGroup = (Group) draggedNode.getData();
Group dropGroup = (Group) droppedInNode.getData();
if ( dropGroup.getName().equals(allGroupName) == true )
{
dropGroup = null; //make a top node
}
dragNodeGroup.move(dropGroup, null);
// 1. remove node from tree
state = srcTree.removeNode(dragNodeKey);
// 2. add parent for rerender
// Object rowKey = srcTree.getTreeNodeRowKey(parentNode); drops in parent
Object rowKey = srcTree.getTreeNodeRowKey(draggedNode); //drop below instead
srcTree.addRequestKey(rowKey);
} else if (dropEvent.getDragValue() != null) { // We'll probably never do this but this drags from other than a tree
// drag source
draggedNode = new SortedTreeMap<Group>();
draggedNode.setData(dropEvent.getDragValue().toString());
}
String groupName = ((Group)draggedNode.getData()).getName();
destTree.addNode(dropNodeKey, draggedNode, groupName, state);
}
AjaxContext ac = AjaxContext.getCurrentInstance();
// Add destination tree to reRender
ac.addComponentToAjaxRender(destTree);
} catch (Exception e) {
logger.error(e.getMessage(), e);
getFacesContext().addMessage("Error:", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
}
}