Tree Sample - Duplicate component ID '_id1' found in view.
klsateesh Apr 17, 2007 5:13 PMHi All,
I am trying to create a Simple Drag and Drop Tree and when i add Elements to the Root Element and the Child Elements i have added to the Root are leaf Nodes and they are getting displayed with Folder Icon. And when i try to expand any of these Child Nodes i am getting an Error..
And all these Child Nodes has the same Display Text ( Root Node)
Code i am using is:
I have a Basic DragDrop Tree Node . Still in the priliminary stage ..
package org.richfaces;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.event.FacesEvent;
import org.ajax4jsf.dnd.event.DragEvent;
import org.ajax4jsf.dnd.event.DropEvent;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.richfaces.component.ListRowKey;
import org.richfaces.component.TreeNode;
import org.richfaces.component.TreeNodeImpl;
import org.richfaces.component.UITree;
import org.richfaces.component.UITreeNode;
import org.richfaces.component.events.NodeExpandedEvent;
import org.richfaces.component.events.NodeSelectedEvent;
public class DPADragDropTree {
static Log log = LogFactory.getLog(DPADragDropTree.class);
private TreeNode selectedNode = null;
private UITree uiTree;
private TreeNode rootNode = null;
private Map nodeToTreeNodeMap = null;
private Map selectedNodeChildren = new LinkedHashMap<TreeNode,Integer>();
private String expandPath;
private Object dragValue;
private String pathToExpand;
private boolean dragOn;
public DPADragDropTree(){
super();
dragOn = true;
nodeToTreeNodeMap = new HashMap<Node,TreeNode>();
}
// Tree Operations and Events
public void onSelect(NodeSelectedEvent event) {
log.info("Node selected: " + getTree(event).getRowKey());
if (getTree(event).getTreeNode() != null) {
selectedNode = getTree(event).getTreeNode();
refreshSelectedNode();
}
}
public void onExpand(NodeExpandedEvent event) {
UITree tree = getTree(event);
log.info("Node "
+ (tree.isExpanded() ? "expanded" : "collapsed") + " "
+ tree.getRowKey());
}
public String expand() {
if (expandPath != null && expandPath.length() != 0) {
try {
uiTree.queueNodeExpand(new ListRowKey(expandPath));
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
public String collapseAll() throws IOException {
this.uiTree.queueCollapseAll();
return null;
}
public String expandAll() {
try {
this.uiTree.queueExpandAll();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public Map getSelectedNodeChildren() {
return selectedNodeChildren;
}
public void setSelectedNodeChildren(Map selectedNodeChildren) {
this.selectedNodeChildren = selectedNodeChildren;
}
public void processDrop(DropEvent dropEvent) {
log.info("Should be printed twice per event!!!");
log.info(dropEvent);
log.info("DragValue: " + dropEvent.getDragValue());
log.info("DropValue: " + dropEvent.getDropValue());
/*
log.info("Drag row data: "
+ getTree(dropEvent).getRowData(dropEvent.getDragValue()));
log.info("Drop row data: "
+ getTree(dropEvent).getRowData(dropEvent.getDropValue()));
log.info("+++++");
*/
log.info("Bean.processDrop()");
this.dragValue = dropEvent.getDragValue();
}
public String expandNode() {
String pathToExpand = getPathToExpand();
if (pathToExpand != null && pathToExpand.trim().length() != 0) {
try {
(getUiTree()).queueNodeExpand(new ListRowKey(
pathToExpand));
} catch (IOException e) {
throw new FacesException(e);
}
}
return null;
}
public void processDrag(DragEvent dragEvent) {
log.info("Bean.processDrag()");
}
private UITree getTree(FacesEvent event) {
UIComponent component = event.getComponent();
if (component instanceof UITree) {
return ((UITree) component);
}
if (component instanceof UITreeNode) {
return ((UITree) component.getParent());
}
return null;
}
private void refreshSelectedNode() {
selectedNodeChildren.clear();
if (selectedNode != null) {
Iterator iter = selectedNode.getChildren();
int i = 0;
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
selectedNodeChildren.put(((TreeNode) entry.getValue()).getData(), Integer.toString(i++));
}
}
}
// Setter and Getters for the Data Members..
/**
*
* @return
*/
public Map getNodeToTreeNodeMap() {
return nodeToTreeNodeMap;
}
public void setNodeToTreeNodeMap(Map nodeToTreeNodeMap) {
this.nodeToTreeNodeMap = nodeToTreeNodeMap;
}
public TreeNode getRootNode() {
return rootNode;
}
public void setRootNode(TreeNode rootNode) {
this.rootNode = rootNode;
}
public TreeNode getSelectedNode() {
return selectedNode;
}
public void setSelectedNode(TreeNode selectedNode) {
this.selectedNode = selectedNode;
}
public UITree getUiTree() {
return uiTree;
}
public void setUiTree(UITree uiTree) {
this.uiTree = uiTree;
}
public String getExpandPath() {
return expandPath;
}
public void setExpandPath(String expandPath) {
this.expandPath = expandPath;
}
public Object getDragValue() {
return dragValue;
}
public void setDragValue(Object dragValue) {
this.dragValue = dragValue;
}
public String getPathToExpand() {
return pathToExpand;
}
public void setPathToExpand(String pathToExpand) {
this.pathToExpand = pathToExpand;
}
public boolean isDragOn() {
return dragOn;
}
public void setDragOn(boolean dragOn) {
this.dragOn = dragOn;
}
}
And my Managed Bean is
public class FormatTreeBean {
DPADragDropTree dragDropTree =null;
public FormatTreeBean(){
dragDropTree = new DPADragDropTree();
initTree(dragDropTree);
}
public void setDragDropTree(DPADragDropTree dragDropTree) {
this.dragDropTree = dragDropTree;
}
public DPADragDropTree getDragDropTree() {
return dragDropTree;
}
public void initTree(DPADragDropTree dragDropTree){
TreeNodeImpl rootNode = new TreeNodeImpl();
rootNode.setData("Root Node");
for(int i=0;i<10;i++){
TreeNodeImpl childNode = new TreeNodeImpl();
childNode.setData(" Node "+i);
childNode.setParent(rootNode);
rootNode.addChild(new Integer(i), rootNode);
}
dragDropTree.setRootNode(rootNode);
}
}
And my JSP Page is:
<f:view>
<a4j:outputPanel ajaxRendered="true">
<h:messages />
</a4j:outputPanel>
<h:form>
<dnd:dragIndicator id="treeIndicator">
<f:facet name="single">
<f:verbatim>{marker} <br /> {treeParam} <br /> {nodeParam}</f:verbatim>
</f:facet>
</dnd:dragIndicator>
<rich:tree
id="DPAFormatTree"
value="#{FormatTreeBean.dragDropTree.rootNode}"
var="node"
nodeFace="#{data.name != 'param-value' ? 'input' : 'text'}"
changeExpandListener="#{FormatTreeBean.dragDropTree.onExpand}"
nodeSelectListener="#{FormatTreeBean.dragDropTree.onSelect}"
binding="#{FormatTreeBean.dragDropTree.uiTree}"
onselected="window.status='selectedNode: '+event.selectedNode"
onexpand="window.status='expandedNode: '+event.expandedNode"
oncollapse="window.status='collapsedNode: '+event.collapsedNode"
ajaxSubmitSelection="true"
reRender="outputText, selectOneListbox"
preserveModel="none"
dragIndicator="treeIndicator"
immediate="false"
acceptedTypes="file1"
dragType="#{FormatTreeBean.dragDropTree.dragOn ? 'file1' : ''}"
dropListener="#{FormatTreeBean.dragDropTree.processDrop}">
</rich:tree>
</h:form>
</f:view>
Another thing i couldn't figure out is setting the value for nodeFace. if i use
value ="{#node.data}"
I am getting the Error:
javax.faces.el.PropertyNotFoundException: Error getting property 'data' from bean of type java.lang.String
As the above should be resolved to
nodeFace ="#{FormatTreeBean.dragDropTree.rootNode.data}"
rootNode is of Type TreeNode and it has getData() method ..I am unable to figure out why
the type is java.lang.String as the error suggested..
Thanks
Sateesh