DnD fail when using TreeMap instead of LinkedHashMap with Tr
spaceyoyo May 13, 2009 8:17 AMHi,
I have an implimentation of TreeNode wich work fine with a java.util.LinkedHashMap to store the children.
I want to sort the nodes so I change this by a java.util.TreeMap to have the node sorted.
It's Ok, the nodes are sorted, but it don't work completely with TreeMap.... :(
In fact, the problem is with the drag'n'drop. When I use TreeMap drag from the tree don't work...
Nothing happen, no error, the dragListerner and dropListener aren't triggered when I drag from the tree.
If i drag something from outside the tree to the tree, the dropListener is triggered.
If i drag something from into the tree to the tree or outside, the dropListener is not triggered.
Here the code of my TreeNode implementation :
package fr.sncm.gsmsecu.ui.tree;
import java.io.Serializable;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import java.util.Map.Entry;
import org.richfaces.model.TreeNode;
public abstract class NodeGeneric implements IdentifierTreeNode, TreeNode<NodeGeneric>, Serializable {
private static final long serialVersionUID = 6665422957818929545L;
private NodeKey nodeKey;
private String code;
private String libelle;
private boolean valid;
// private Map<Object, TreeNode<NodeGeneric>> enfants = new LinkedHashMap<Object, TreeNode<NodeGeneric>>();
private Map<Object, TreeNode<NodeGeneric>> enfants = new TreeMap<Object, TreeNode<NodeGeneric>>();
private NodeGeneric parent;
/**
* @param id
*/
public NodeGeneric(long id) {
super();
this.nodeKey = new NodeKey(id);
this.valid = true;
}
/**
* @param id
* @param code
* @param libelle
* @param order
*/
public NodeGeneric(long id, String code, String libelle, Integer order) {
super();
this.nodeKey = new NodeKey(id, order);
this.code = code;
this.libelle = libelle;
this.valid = true;
}
public abstract String getIcon();
public abstract String getLeafIcon();
public abstract String getType();
/**
* @return the valid
*/
public boolean isValid() {
return valid;
}
/**
* @param valid
* the valid to set
*/
public void setValid(boolean valid) {
this.valid = valid;
}
/**
* @return the id
*/
public long getId() {
return this.nodeKey.getKey();
}
/**
* @param id
* the id to set
*/
public void setId(long id) {
this.nodeKey.setKey(id);
}
/**
* @return the code
*/
public String getCode() {
return code;
}
/**
* @return the libelle
*/
public String getLibelle() {
return libelle;
}
/**
* @param code
* the code to set
*/
public void setCode(String code) {
this.code = code;
}
/**
* @param libelle
* the libelle to set
*/
public void setLibelle(String libelle) {
this.libelle = libelle;
}
public void addChild(Object identifier, TreeNode<NodeGeneric> child) {
child.setParent(this);
enfants.put(identifier, child);
}
public TreeNode<NodeGeneric> getChild(Object identifier) {
return (TreeNode<NodeGeneric>) enfants.get(identifier);
}
public void setParent(TreeNode<NodeGeneric> parent) {
this.parent = (NodeGeneric) parent;
}
public TreeNode<NodeGeneric> getParent() {
return parent;
}
public boolean isLeaf() {
return enfants.isEmpty();
}
public void removeChild(Object identifier) {
enfants.remove(identifier);
}
public Iterator<Entry<Object, TreeNode<NodeGeneric>>> getChildren() {
return enfants.entrySet().iterator();
}
public NodeGeneric getData() {
return this;
}
public void setData(NodeGeneric data) {
}
/*
* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((nodeKey == null) ? 0 : nodeKey.hashCode());
return result;
}
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof NodeGeneric))
return false;
NodeGeneric other = (NodeGeneric) obj;
if (nodeKey == null) {
if (other.nodeKey != null)
return false;
} else if (!nodeKey.equals(other.nodeKey))
return false;
return true;
}
// ++ LMI 140409
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
if (this.code == null) {
return super.toString();
}
StringBuffer buffer = new StringBuffer("[").append(this.code).append("]");
if (this.libelle != null) {
buffer.append(" ").append(this.libelle);
}
if (this.nodeKey != null && this.nodeKey.getOrder() != null) {
buffer.append(" (").append(this.nodeKey.getOrder()).append(")");
}
return buffer.toString();
}
/**
* méthodes qui ne sont pas implémentées par TreeNode
*
* @param children
* @return void
*/
public void addChildrenToMe(NodeGeneric children) {
addChild(children.getNodeKey(), children);
children.setParent(this);
}
public Object getMyParent() {
return parent;
}
@SuppressWarnings("unchecked")
public void setMyParent(Object parent) {
this.setParent((TreeNode<NodeGeneric>) parent);
}
/**
* @return the nodeKey
*/
public NodeKey getNodeKey() {
return nodeKey;
}
/**
* @param nodeKey
* the nodeKey to set
*/
public void setNodeKey(NodeKey nodeKey) {
this.nodeKey = nodeKey;
}
}