Pessoal estou com o seguinte problema:
Quando o usuário clica em um nó filho os nós pais devem ficar em negrito.
Bom teoricamente o problema é simples, mas a arvore é gerada dinamicamente.
Estava tentando pegar os componentes atraves do viewroot mas não tive sucesso.
Alguem tem uma solução para isso.
segue um exemplo:
public class ProvaConceito{
private Boolean nodeSelecionado = false;
private TreeModel treeModel;
private static final long serialVersionUID = 1L;
private TreeModelBase _treeModel;
private HtmlTree _tree;
/*EXEMPLO DE ARVORE DO TOMAHAWK*/
public TreeNode getTreeData()
{
TreeNode treeData = new TreeNodeBase("foo-folder", "Inbox", false);
// construct a set of fake data (normally your data would come from a database)
// populate Frank's portion of the tree
TreeNodeBase personNode = new TreeNodeBase("person", "Frank Foo", false);
personNode.getChildren().add(new TreeNodeBase("foo-folder", "Requires Foo", false));
TreeNodeBase folderNode = new TreeNodeBase("foo-folder", "Requires Foo Reviewer", false);
folderNode.getChildren().add(new TreeNodeBase("document", "X050001", true));
folderNode.getChildren().add(new TreeNodeBase("document", "X050002", true));
folderNode.getChildren().add(new TreeNodeBase("document", "X050003", true));
personNode.getChildren().add(folderNode);
personNode.getChildren().add(new TreeNodeBase("foo-folder", "Requires Foo Recommendation", false));
folderNode = new TreeNodeBase("foo-folder", "Requires Foo Approval", false);
folderNode.getChildren().add(new TreeNodeBase("document", "J050001", true));
folderNode.getChildren().add(new TreeNodeBase("document", "J050002", true));
folderNode.getChildren().add(new TreeNodeBase("document", "J050003", true));
folderNode.getChildren().add(new TreeNodeBase("document", "E050011", true));
folderNode.getChildren().add(new TreeNodeBase("document", "R050002", true));
folderNode.getChildren().add(new TreeNodeBase("document", "C050003", true));
personNode.getChildren().add(folderNode);
folderNode = new TreeNodeBase("bar-folder", "Requires Bar Processing", false);
folderNode.getChildren().add(new TreeNodeBase("document", "X050003", true));
folderNode.getChildren().add(new TreeNodeBase("document", "X050011", true));
folderNode.getChildren().add(new TreeNodeBase("document", "F050002", true));
folderNode.getChildren().add(new TreeNodeBase("document", "G050003", true));
personNode.getChildren().add(folderNode);
folderNode = new TreeNodeBase("bar-folder", "Requires Bar Approval", false);
folderNode.getChildren().add(new TreeNodeBase("document", "J050006", true));
folderNode.getChildren().add(new TreeNodeBase("document", "J050007", true));
personNode.getChildren().add(folderNode);
treeData.getChildren().add(personNode);
// populate Betty's portion of the tree
personNode = new TreeNodeBase("person", "Betty Bar", false);
personNode.getChildren().add(new TreeNodeBase("foo-folder", "Requires Foo", false));
folderNode = new TreeNodeBase("foo-folder", "Requires Foo Reviewer", false);
folderNode.getChildren().add(new TreeNodeBase("document", "X012000", true));
folderNode.getChildren().add(new TreeNodeBase("document", "X013000", true));
folderNode.getChildren().add(new TreeNodeBase("document", "X014000", true));
personNode.getChildren().add(folderNode);
folderNode = new TreeNodeBase("foo-folder", "Requires Foo Recommendation", false);
folderNode.getChildren().add(new TreeNodeBase("document", "J010026", true));
folderNode.getChildren().add(new TreeNodeBase("document", "J020002", true));
folderNode.getChildren().add(new TreeNodeBase("document", "J030103", true));
folderNode.getChildren().add(new TreeNodeBase("document", "E030214", true));
folderNode.getChildren().add(new TreeNodeBase("document", "R020444", true));
folderNode.getChildren().add(new TreeNodeBase("document", "C010000", true));
personNode.getChildren().add(folderNode);
personNode.getChildren().add(new TreeNodeBase("foo-folder", "Requires Foo Approval", false));
folderNode = new TreeNodeBase("bar-folder", "Requires Bar Processing", false);
folderNode.getChildren().add(new TreeNodeBase("document", "T052003", true));
folderNode.getChildren().add(new TreeNodeBase("document", "T020011", true));
personNode.getChildren().add(folderNode);
folderNode = new TreeNodeBase("bar-folder", "Requires Bar Approval", false);
folderNode.getChildren().add(new TreeNodeBase("document", "J010002", true));
folderNode.getChildren().add(new TreeNodeBase("document", "J030047", true));
folderNode.getChildren().add(new TreeNodeBase("document", "F030112", true));
personNode.getChildren().add(folderNode);
treeData.getChildren().add(personNode);
return treeData;
}
/**
* NOTE: This is just to show an alternative way of supplying tree data. You can supply either a
* TreeModel or TreeNode.
*
* @return TreeModel
*/
public TreeModel getExpandedTreeData()
{
return (TreeModel) new TreeModelBase(getTreeData());
}
public void setTree(HtmlTree tree)
{
tree = tree;
}
public HtmlTree getTree()
{
return _tree;
}
public String expandAll()
{
_tree.expandAll();
return null;
}
private String _nodePath;
public void setNodePath(String nodePath)
{
System.out.println(_nodePath);
_nodePath = nodePath;
}
public String getNodePath()
{
return _nodePath;
}
public void checkPath(FacesContext context, UIComponent component, java.lang.Object value)
{
// make sure path is valid (leaves cannot be expanded or renderer will complain)
FacesMessage message = null;
String[] path = _tree.getPathInformation(value.toString());
for (int i = 0; i < path.length; i++)
{
String nodeId = path[i];
try
{
_tree.setNodeId(nodeId);
}
catch (Exception e)
{
throw new ValidatorException(message, e);
}
if (_tree.getNode().isLeaf())
{
message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid node path (cannot expand a leaf): "
+ nodeId, "Invalid node path (cannot expand a leaf): " + nodeId);
throw new ValidatorException(message);
}
}
}
public void expandPath(ActionEvent event)
{
_tree.expandPath(_tree.getPathInformation(_nodePath));
}
public void setNodeSelected(ActionEvent evento){
//setNodeSelected(evento);
FacesContext facesCxt = FacesContext.getCurrentInstance();
ExternalContext context= facesCxt.getExternalContext();
//Map reqMap = context.getRequestParameterMap();
UIViewRoot root = facesCxt.getViewRoot();
UIComponent component = (UIComponent)evento.getSource();
while (!(component != null && component instanceof HtmlTree))
{ component = component.getParent();
}
if (component != null) {
System.out.println("COMPONENT");
HtmlTree tree = (HtmlTree)component;
TreeNodeBase node = (TreeNodeBase)tree.getNode();
tree.setNodeSelected(evento);
nodeSelecionado = true;
}
}
public Boolean getNodeSelecionado() {
return nodeSelecionado;
}
public void setNodeSelecionado(Boolean nodeSelected) {
this.nodeSelecionado = nodeSelected;
}
/**
* Finds component with the given id
*/
private UIComponent findComponent(UIComponent c, String id) {
if (id.equals(c.getId())) {
return c;
}
Iterator<UIComponent> kids = c.getFacetsAndChildren();
while (kids.hasNext()) {
UIComponent found = findComponent(kids.next(), id);
if (found != null) {
return found;
}
}
return null;
}
}
HTML
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>
<html>
<head>
<title>Hello World</title>
<script src="jquery-latest.js"></script>
<link rel="stylesheet" type="text/css" href="<%= request.getContextPath() %>/css/basic.css" />
</head>
<body>
<f:view>
<h:form id="foo" >
<t:tree2 id="clientTree" value="#{provaConceito.treeData}" var="node" varNodeToggler="t" binding="#{provaConceito.tree}">
<f:facet name="person">
<h:panelGroup>
<f:facet name="expand">
<t:graphicImage value="images/yellow-folder-open.png" rendered="#{t.nodeExpanded}" border="0"/>
</f:facet>
<f:facet name="collapse">
<t:graphicImage value="images/yellow-folder-closed.png" rendered="#{!t.nodeExpanded}" border="0"/>
</f:facet>
<h:outputText value="#{node.description}" styleClass="nodeFolder"/>
</h:panelGroup>
</f:facet>
<f:facet name="foo-folder">
<h:panelGroup>
<f:facet name="expand">
<t:graphicImage value="images/yellow-folder-open.png" rendered="#{t.nodeExpanded}" border="0"/>
</f:facet>
<f:facet name="collapse">
<t:graphicImage value="images/yellow-folder-closed.png" rendered="#{!t.nodeExpanded}" border="0"/>
</f:facet>
<h:outputText value="#{node.description}" styleClass="nodeFolder"/>
<h:outputText value=" (#{node.childCount})" styleClass="childCount" rendered="#{!empty node.children}"/>
</h:panelGroup>
</f:facet>
<f:facet name="bar-folder">
<h:panelGroup>
<f:facet name="expand">
<t:graphicImage value="images/blue-folder-open.gif" rendered="#{t.nodeExpanded}" border="0"/>
</f:facet>
<f:facet name="collapse">
<t:graphicImage value="images/blue-folder-closed.png" rendered="#{!t.nodeExpanded}" border="0"/>
</f:facet>
<h:outputText value="#{node.description}" styleClass="#{provaConceito.nodeSelecionado ? 'nodeFolderSelected':'nodeFolder'}"/>
<h:outputText value=" (#{node.childCount})" styleClass="childCount" rendered="#{!empty node.children}"/>
</h:panelGroup>
</f:facet>
<f:facet name="document">
<h:panelGroup>
<h:commandLink immediate="true" styleClass="#{t.nodeSelected ? 'documentSelected':'document'}" actionListener="#{provaConceito.setNodeSelected}" >
<t:graphicImage value="images/document.png" border="0"/>
<h:outputText value="#{node.description}"/>
<h:outputText value="#{node.identifier}"/>
<f:param name="docNum" value="#{node.identifier}"/>
<f:param name="docNum2" value="#{node.description}"/>
<f:param name="docNum1" value="666"/>
</h:commandLink>
</h:panelGroup>
</f:facet>
</t:tree2>
</h:form>
</f:view>
</body>
</html>