The challenging thing about this is that the TreeNode class has no get 
child method, making it problematic to do a tree traversal. The only way to 
get a child of TreeNode is by calling:
TreeNode childNode = treeNode.setChildOpen(i, treeNode.isChildOpen(i));

Since you're making the call with the open status it's already set to, the 
call has absolutely no effect, except that it returns the child. Why the 
creators of this class didn't add a getChild method is beyond me.  Despite 
it's MANY problems, it's one of the better options I've seen.

Here's my complete solution. These methods are inside a class that extends 
CellTree:
    public void refresh() {
        Map<Object,Boolean> openMap = new HashMap<Object,Boolean>();
        TreeNode root = getRootTreeNode();
        getNodeOpenMap(root, openMap);
        openMap.put(root, true);
        refresh(root, openMap);
    }
    
    private void getNodeOpenMap(TreeNode treeNode, Map<Object,Boolean> 
openMap) {
        if (treeNode == null) {
            return;
        }
        for (int i = 0, n = treeNode.getChildCount(); i < n; ++i) {
            if (null == treeNode.getChildValue(i) || 
treeNode.isChildLeaf(i)) {
                continue;
            }
            
            openMap.put(treeNode.getChildValue(i), treeNode.isChildOpen(i));
            
            // This gets the child node, but doesn't change the open status 
(there's no other way to get the child).
            TreeNode childNode = treeNode.setChildOpen(i, 
treeNode.isChildOpen(i));
            
            getNodeOpenMap(childNode, openMap);
        }
    }
    
    public void refresh(TreeNode treeNode, Map<Object,Boolean> openMap) {
        if (treeNode == null) {
            return;
        }
        for (int i = 0, n = treeNode.getChildCount(); i < n; ++i) {
            if (null == treeNode.getChildValue(i) || 
treeNode.isChildLeaf(i)) {
                continue;
            }
            treeNode.setChildOpen(i, false);
            Boolean open = openMap.get(treeNode.getChildValue(i));
            if (open != null && open) {
                TreeNode childNode = treeNode.setChildOpen(i, true);
                refresh(childNode, openMap);
            }
        }
    }

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to