package org.cloudgraph.web.model.taxonomy;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.cloudgraph.web.model.ModelBean;
import org.cloudgraph.web.model.tree.DynamicTreeNodeModel;
import org.cloudgraph.web.model.tree.TreeNodeTypeMap;
import org.cloudgraph.web.sdo.categorization.Category;
import org.cloudgraph.web.sdo.categorization.Taxonomy;
import org.primefaces.event.NodeCollapseEvent;
import org.primefaces.event.NodeExpandEvent;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.event.NodeUnselectEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
public abstract class DynamicTaxonomyTreeBean extends ModelBean {
private static Log log = LogFactory.getLog(DynamicTaxonomyTreeBean.class);
private long ids = 0;
private DefaultTreeNode treeRoot;
// private TreeState treeState;
protected TreeNodeTypeMap typeMap;
protected CategoryLabelFormat labelFormat;
private boolean displayNodeHelpText = true;
protected Set<Integer> ajaxKeys = new HashSet<Integer>();
protected TreeNode selectedNode;
protected Category selectedCategory;
public DynamicTaxonomyTreeBean() {
treeRoot = new DefaultTreeNode("Root", null);
}
public DynamicTaxonomyTreeBean(TreeNodeTypeMap typeMap) {
this.typeMap = typeMap;
}
public TreeNode getModel() {
return this.treeRoot;
}
public TreeNode getSelectedNode() {
return selectedNode;
}
public void setSelectedNode(TreeNode selectedNode) {
this.selectedNode = selectedNode;
}
public boolean getHasSelectedNode() {
return this.selectedNode != null;
}
public Category getSelectedCategory() {
return selectedCategory;
}
public void setSelectedCategory(Category selectedCategory) {
this.selectedCategory = selectedCategory;
}
public boolean getCategorySelected() {
return this.selectedCategory != null;
}
public boolean isDisplayNodeHelpText() {
return displayNodeHelpText;
}
public void setDisplayNodeHelpText(boolean displayNodeHelpText) {
this.displayNodeHelpText = displayNodeHelpText;
}
public TreeNodeTypeMap getTypeMap() {
return typeMap;
}
public void setTypeMap(TreeNodeTypeMap typeMap) {
this.typeMap = typeMap;
}
/**
* Init the tree structure. Load only the top-level nodes and then
* add/remove child tree nodes dynamically based on user input, instead of
* loading all of the nodes on instantiation.
*
* @param model
* - the data graph with all the pertinent db data.
*/
protected void initTree(Taxonomy model) {
treeRoot.setData(model);
if (treeRoot.getChildren() != null)
treeRoot.getChildren().clear(); // rebuild it
if (model.getCategory() == null)
return;
Category[] topcats = model.getCategory().getChild();
for (int i = 0; i < topcats.length; i++) {
DefaultTreeNode topNode = new DefaultTreeNode(topcats[i], treeRoot);
DefaultTreeNode dummyNode = new DefaultTreeNode("loading...", topNode);
// topNode.setType(typeMap.getTreeNodeType(topNode.getLevel()));
}
}
public void onNodeExpand(NodeExpandEvent event) {
if (!event.getTreeNode().isLeaf() && !event.getTreeNode().isExpanded()) {
addChildrenNodes(event.getTreeNode());
}
}
public void onNodeCollapse(NodeCollapseEvent event) {
}
public void onNodeSelect(NodeSelectEvent event) {
this.selectedCategory = (Category)event.getTreeNode().getData();
}
public void onNodeUnselect(NodeUnselectEvent event) {
this.selectedCategory = null;
}
/**
* Method for adding children nodes to a given tree model node.
*/
public void addChildrenNodes(TreeNode parentNode) {
Category parentCat = null;
if (parentNode.getData() instanceof Category)
parentCat = (Category) parentNode.getData();
else if (parentNode.getData() instanceof Taxonomy)
parentCat = ((Taxonomy) parentNode.getData()).getCategory();
else
throw new IllegalStateException(
"expected either a Catagory or Taxonomy as user-data");
Category[] childCats = parentCat.getChild();
if (childCats == null || childCats.length == 0) {
if (parentNode.getChildren() != null)
parentNode.getChildren().clear();
return;
}
if (parentNode.getChildren() != null
&& parentNode.getChildren().iterator().hasNext()) {
log.warn("found existing children - clearing and re-adding");
parentNode.getChildren().clear();
//return;
}
for (Category childCat : childCats) {
DefaultTreeNode childNode = new DefaultTreeNode(childCat,
parentNode);
DefaultTreeNode dummyNode = new DefaultTreeNode("loading...", childNode);
}
}
public CategoryLabelFormat getLabelFormat() {
return labelFormat;
}
public void setLabelFormat(CategoryLabelFormat labelFormat) {
this.labelFormat = labelFormat;
}
}