You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Sergey Plevko (JIRA)" <ji...@apache.org> on 2011/04/05 13:45:06 UTC

[jira] [Issue Comment Edited] (WICKET-3449) Tree doesn't update correctly

    [ https://issues.apache.org/jira/browse/WICKET-3449?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13015878#comment-13015878 ] 

Sergey Plevko edited comment on WICKET-3449 at 4/5/11 11:44 AM:
----------------------------------------------------------------

Martin, if you go back to WICKET-2886, you'll see that the problem with junction link was not only with ROOT. There was the fix for that issue. Unfortunately, that fix doesn't cover current issue. You propose to use ''nodeChanged()'' method, but it looks like a hot fix. Sure, this way works, but it's rather strange to use _nodeChanged()_ only for the case when you add first child to the root. I don't doubt this issue must be fixed internally in the wicket framework.

I suppose the problem is in 

{code:title=AbstractTree.java|borderStyle=solid}
public final void treeNodesInserted(TreeModelEvent e)
{
              ...
	// parentNode now has children for the first time, so we may need to invalidate
	// grandparent so that parentNode's junctionLink gets rebuilt with a plus/minus link
	Object grandparentNode = getParentNode(parentNode);
	// not invalidating if the grandparent is a not presented root
	if (!(getParentNode(grandparentNode) == null && isRootLess()))
	{
		invalidateNodeWithChildren(grandparentNode);
	}
	...
}
{code}

In our case *parentNode* is ROOT and *grandparentNode* is _null_. So _invalidateNodeWithChildren()_ does nothing.

      was (Author: lotos):
    Martin, if you go back to WICKET-2886, you'll see that the problem with junction link was not only with ROOT. There was the fix for that issue. Unfortunately, that fix doesn't cover current issue. You propose to use _nodeChanged()_ method, but it looks like a hot fix. Sure, this way works, but it's rather strange to use _nodeChanged()_ only for the case when you add first child to the root. I don't doubt this issue must be fixed internally in the wicket framework.

I suppose the problem is in 

{code:title=AbstractTree.java|borderStyle=solid}
public final void treeNodesInserted(TreeModelEvent e)
{
              ...
	// parentNode now has children for the first time, so we may need to invalidate
	// grandparent so that parentNode's junctionLink gets rebuilt with a plus/minus link
	Object grandparentNode = getParentNode(parentNode);
	// not invalidating if the grandparent is a not presented root
	if (!(getParentNode(grandparentNode) == null && isRootLess()))
	{
		invalidateNodeWithChildren(grandparentNode);
	}
	...
}
{code}

In our case *parentNode* is ROOT and *grandparentNode* is _null_. So _invalidateNodeWithChildren()_ does nothing.
  
> Tree doesn't update correctly
> -----------------------------
>
>                 Key: WICKET-3449
>                 URL: https://issues.apache.org/jira/browse/WICKET-3449
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket-core
>    Affects Versions: 1.4.15
>         Environment: tomcat 6.0.26, win 7
>            Reporter: Sergey Plevko
>            Assignee: Martin Grigorov
>         Attachments: 3.jpg, quickStart.zip
>
>
> When we add a first child to the root node junction link (near the root) doesn't appear in the tree. 
> This bug easily can be reproduced with the next piece of code.
> TestPage.html 
> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
> <body>
> <table>
>     <tr>        <td>            <div wicket:id="tree"></div>        </td>    </tr>
>     <tr>        <td>            <input type="submit" wicket:id="addChild" class="btn btnStd" />        </td>    </tr>
> </table>
> </body>
> </html>
> TestPage.java
> public class TestPage extends WebPage {
>     public TestPage() {
>         final DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
>         final DefaultTreeModel treeModel = new DefaultTreeModel(root);
>         final BaseTree tree = new LinkTree("tree", treeModel);
>         add(tree);
>         tree.getTreeState().expandNode(root);
>         AjaxLink addButton = new AjaxLink("addChild") {
>             public void onClick(AjaxRequestTarget ajaxRequestTarget) {
>                 DefaultMutableTreeNode child = new DefaultMutableTreeNode("child");
>                 root.add(child); // it doesn't matter how we add this child
>                 treeModel.insertNodeInto(child, root, 0);
>                 tree.updateTree(ajaxRequestTarget);
>             }
>         };
>         add(addButton);
>     }
> }

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira