Thanks John,
I was thinking in the same thing.
One last question. If I update the ListDataProvier of the Child
Objects will the nodes that were open stay open or will they be
automatically be closed?

cheers
Uemit


On Nov 3, 7:38 pm, John LaBanca <[email protected]> wrote:
> 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%2Bunsubs 
> > [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