Hi,
I had the exact problem using tree2. I started to play around with the
setValue method from HtmlTree. It seems to do the trick. The only problem
is the initial click to process the actionListener. (I'm still trying to
solve this problem (bug?)) After going to load my initial tree, I click on
a node to process the actionListener. It seems to be reloading the initial
tree again after I click on the node and it doesn't expand the node. After
that initial click on the tree, the actionListener works like its supposed
to and adds children to the tree with every click. Maybe "<x:tree2
value="#{treeBacker.treeData" ... >" is not being set correctly on the
initial load of the page. Do I somehow need to do a setValue in my
treeData() method like in the processAction method for the actionListener?
-Ky
Here's the code I used:
In JSP
-----
<x:tree2 value="#{treeBacker.treeData}" id="server-tree"
var="node" varNodeToggler="t"
clientSideToggle="false" showRootNode="false">
<f:facet name="tree-type">
<h:panelGroup>
<h:commandLink immediate="true"
action="#{t.toggleExpanded}">
<f:actionListener
type="com.x.TreeBackerListener"/>
<h:graphicImage
value="/images/yellow-folder-open.png"
rendered="#{t.nodeExpanded}" border="0" />
<h:graphicImage
value="/images/yellow-folder-closed.png"
rendered="#{!t.nodeExpanded}" border="0" />
</h:commandLink>
<h:outputText
value="#{node.description}" styleClass="nodeFolder" />
</h:panelGroup>
</f:facet>
</x:tree2>
In class TreeBackerListener
----
public class StudyDBTreeListener implements ActionListener {
public TreeNode treeData() {
TreeNode treeData = new TreeNodeBase("tree-type", "Tree
Description", true);
TreeNode newNode = new TreeNodeBase("tree-type",
"Description", "Identifier", true);
treeData.getChildren().add(addModelNode);
return treeData;
}
public void processAction(ActionEvent actionEvent) {
UIComponent component = actionEvent.getComponent();
UIComponent parent = component.getParent().getParent();
HtmlTree tree = (HtmlTree) parent;
TreeNode treeData = tree.getNode();
String treeType = treeData.getType();
//Important to check to see if node has any children.
//Without the children check, it adds the same childen to
the
//node over again (if this is what you want then take out
the
//child count check.
if(treeType.equals("tree-type") && treeData.getChildCount()
== 0){
TreeNode newNode = new TreeNodeBase("tree-type",
"description",
"identifier", true);
treeData.getChildren().add(newNode);
}
TreeNode treeDataRoot = (TreeNode) tree.getValue();
tree.setValue(treeDataRoot);
}
}
-----Original Message-----
From: Edwin Mercado [mailto:[EMAIL PROTECTED]
Sent: Friday, July 22, 2005 1:43 PM
To: MyFaces Discussion
Subject: RE: tree3 component reload
Here's the action listener for the add child node
command link:
public void createProArgumentationNode(ActionEvent event)
{
ArgumentationNode child = createNode();
ArgumentationNode parent = getCurrentNode();
addEdge(child, parent, true);
/* view updated model data */
focusNode(event, child);
toggleSelectedNode();
}
loadTreeData() gets called twice by the getTreeData()
BEFORE the addition of the new node and once AFTER.
Apparently, the tree model is updated with the previous (old) data.
Edwin
-----Original Message-----
From: Dennis Byrne [mailto:[EMAIL PROTECTED]
Sent: Friday, July 22, 2005 4:34 PM
To: MyFaces Discussion
Subject: Re: tree3 component reload
Can you post the code for your action listener? I'm curious
to see if loadTreeData() is being called after or before you
updating the tree model.
---- Original message ----
>Date: Fri, 22 Jul 2005 15:40:22 -0400
>From: Edwin Mercado <[EMAIL PROTECTED]>
>Subject: tree3 component reload
>To: [email protected]
>
>Hello all,
>I'm still baffled by the JSF phases. I'm using a tree3
component
>that is a tied to a getTreeData() function to retrieve the
current data
>from the model. Everytime I select a node, the getTreeData()
function is
>called 3 times, retrieving the same data every time.
>
><a:tree3 expandAllInit="true" id="networkTree"
> value="#
{treeBacker.treeData}" var="node"
>varNodeToggler="t"
> clientSideToggle="true">
>...
></a:tree3>
>
> public TreeNode getTreeData() {
> treeData = loadTreeData();
> return treeData;
> }
>
>
>Now, for each tree3 node that has been selected I display
>a command link to add a child node.
>
> <h:commandLink value="#{labels.add_pro} "
> styleClass="document"
> action="UpdateViewAction"
>
>actionListener="#{treeBacker.createProArgumentationNode}">
> <h:graphicImage
value="images/ProNodeIcon.gif"
>border="0" />
> </h:commandLink>
>
>Whenever I click add child node command
>link, the getTreeData() is called 3 times, but with a
little "twist". This
>is
>how it goes:
>
>1st time: getTreeData() gets called and returns the
already displayed
>data
>2nd time: similar steps as in the 1st time.
>====> the actionListener for the add child node command link
gets called.
> The model is updated with the appropriate value.
>3rd time: getTreeData() gets called but this time it
gets the updated
> model value.
>
>Unfortunately, after the 3rd time that getTreeData() got
called with the
>updated
>model value, the tree3 component displays only the previous
stored value.
>Now, if I selected a node THEN the updated value (the added
node) gets
>displayed.
>
>My question is how can I make the tree3 component display
the most recent
>model data?
>
>Thanks
>Edwin
>p.s. I experience the same effect using the tree2 component
instead of the
>tree3.
>
>
Dennis Byrne
*********************************************************************
This message and any attachments are solely for the intended recipient. If you
are not the intended recipient, disclosure, copying, use or distribution of the
information included in this message is prohibited -- Please immediately and
permanently delete.