You are correct that refreshing the ListDataProvider<ObjectA> will only
update that level of the tree.  You need to keep a reference to
ListDataProvider<ObjectB> in order to refresh that section of the tree.
 That probably means creating a parallel tree structure of
ListDataProviders, or at least having a map for ObjectA to the
ListDataProvider<ObjectB> that represents its children.

One workaround is to close/reopen the TreeNode, which will cause it to
request a new DefaultNodeInfo from the TreeViewModel.

Thanks,
John LaBanca
[email protected]


On Wed, Nov 3, 2010 at 1:13 PM, Ümit <[email protected]> wrote:

> Hi all,
>
> I have an issue with the CellTree and adding new items to a child
> node. I am not exactly sure if my approach is flawed or maybe there is
> an issue with the CellTree but maybe somebody can help with that
> problem.
> So basically I followed the CellTree example from the showace.
>
> I have a CellTree which consists of 3 nodes which correspond to three
> different DTO's (let's say: ObjectA, ObjectB and ObjectC)
> Each ObjectA instance contains a list of ObjectBs and each ObjectB has
> a list of ObjectCs.
>
> ObjectA should be displayed in the root node, ObejctB in the second
> node and ObjectC in the third node (= leaf node).
>
> I created a CustomTreeModel with a custom constructor which takes a
> List of ObjectA instances as a parameter. In the constructor I create
> a ListDataProvider which is stored as a member variable in the
> CustomTreeModel.
>
> Then I define the necessary Cells for each node level and implement
> the  public <T> NodeInfo<?> getNodeInfo(T value)  function.
>
> This looks something like this:
> public <T> NodeInfo<?> getNodeInfo(T value) {
>                if (value == null)
>                {
>                        return new DefaultNodeInfo<ObjectA>
>                                (listDataProvider,new TextCell());
>                }
>                else if (value instanceof ObjectA)
>                {
>                        ObjectA object  = (ObjectA)value;
>                        return new DefaultNodeInfo<ObjectB>(new
> ListDataProvider<ObjectB>(object.getObjectBList()),new TextCell());
>                }
>                else if (value instanceof ObjectB)
>                {
>                        ObjectB object  = (ObjectB)value;
>                        return new DefaultNodeInfo<ObjectC>(new
> ListDataProvider<ObjectC>(object.getObjectCList()),new TextCell());
>                }
>                String type = value.getClass().getName();
>                throw new IllegalArgumentException("Unsupported object type:
> "+
> type);
>        }
>
>
> getObjectBList(),getObjectCList() return the List of the child
> Objects.
>
> I pass this model to the CellTree and the CellTree is displayed
> correctly.
>
> Now I try to add a new ObjectB instance to the list of ObjectBs in the
> one of the ObjectA instances. In order to update the CellTree I have
> to update the DataProvider. I define a updateData function in the
> CustomTreeModel:
>
> public void updateData(List<ObjectA> objects){
>                listDataProvider.setList(objects);  //listDataProvider of
> the root
> node level is stored in the CustomTreeModel
>                listDataProvider.refresh(); //probably not necessary as
> setList
> already takes care of refreshing the Tree.
> }
>
>
> Now when I call this method and pass the List of ObjectA instances
> (one of them has modified List of ObjectB instances). the CellTree
> doesn't get updated/refreshed.
>
> My assumption is that listDataProvider.setList() only checks the List
> of ObjectAs and as I haven't changed anything in the root list but in
> one of its client lists, the CellTree doesn't get updated. One
> workaround is that I call listDataProvider.setList(new
> ArrayList<ObjectA>()) (empty list) before calling setList with the
> actual list. However this causes the CellTree Nodes to get collapsed,
> which I want to avoid.
>
> Another approach would be to store the DataProviders for the ObjectB
> and ObjectC instances (which I now only create as a local variable and
> pass it to new DefaultNodeInfo) in the CustomTreeModel and also call
> setList() on them. But IMHO that's not a really nice way of solving
> it.
>
>
> So basically there are two questions:
>
> 1.)  When does setList() on the DataAdapter cause the Display to
> refresh it contents? ( I assume that setList() will only call refresh
> if the amount of elements is changed -> that's the reason why using
> the workaround with a new empty ArrayList worked). What happens, if I
> only change one of the properties? How can I force the DataAdapter to
> update the Display if the amount of elements doesn't change ?
>
> 2.) How can I map an object graph (parent -> client objects) to a
> CellTree or CellBrowser, so that any change to one of the client
> objects causes a refresh of the Display (CellTree).
>
> --
> You received this message because you are subscribed to the Google Groups
> "Google Web Toolkit" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<google-web-toolkit%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-web-toolkit?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to