PDA

View Full Version : How to rebind Tree



erincarikan
19 Mar 2009, 1:28 PM
Hi;

I am using a reordering drag and drop tree. Based on a event I get data from database and want to rebind the table with a different model, if I try to use TreeBinder again, it gives me an error as follows:

at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:215), what is the best way to rebind data to tree.

fother
20 Mar 2009, 5:36 AM
post your code example... and all stacktrace :)

erincarikan
20 Mar 2009, 6:53 AM
Thanks following is the way my application is structured.

I am using ReorderingTreeDNDExample.java but modified it a little bit.


package com.cmt.client.samples.examples.dnd;

import java.util.ArrayList;
import com.cmt.client.model.MediaEntry;
import com.cmt.client.model.MediasetModel;
import com.cmt.client.model.Skeleton;
import com.cmt.client.samples.Examples;
import com.cmt.client.samples.ExamplesModel;
import com.cmt.client.samples.examples.model.Category;
import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.Style.Scroll;
import com.extjs.gxt.ui.client.binder.TreeBinder;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.TreeModel;
import com.extjs.gxt.ui.client.dnd.TreeDragSource;
import com.extjs.gxt.ui.client.dnd.TreeDropTarget;
import com.extjs.gxt.ui.client.dnd.DND.Feedback;
import com.extjs.gxt.ui.client.event.DNDEvent;
import com.extjs.gxt.ui.client.event.DNDListener;
import com.extjs.gxt.ui.client.store.TreeStore;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.tree.Tree;
import com.extjs.gxt.ui.client.widget.tree.TreeItem;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Window;
public class ReordingTreeDNDExample extends LayoutContainer {
private Tree tree = new Tree();
private TreeStore store;

public Tree getTree()
{
return this.tree;
}

public Tree setTree(Tree tree)
{
return this.tree = tree;
}



@Override
protected void onRender(Element parent, int index) {
super.onRender(parent, index);

LayoutContainer container = new LayoutContainer();
container.setSize(800, 500);
container.setBorders(false);
container.setScrollMode(Scroll.NONE);
setStyleAttribute("margin", "10px");

Skeleton skeleton = new Skeleton();

store = new TreeStore();
TreeModel root = (Skeleton) skeleton;


store.add(root, true);

tree.getStyle().setLeafIconStyle("icon-list");
TreeBinder binder = new TreeBinder(tree, store) {
@Override
public boolean hasChildren(ModelData parent) {
if ("My Files".equals(parent.get("name")) || parent instanceof MediasetModel) {
return true;
}
return super.hasChildren(parent);
}
};


binder.setAutoLoad(true);
binder.setDisplayProperty("name");
binder.init();

tree.getRootItem().getItem(0).setExpanded(true);
tree.getRootItem().getItem(0).setLeaf(false);
tree.setWidth(800);

TreeDragSource source = new TreeDragSource(binder);
source.addDNDListener(new DNDListener() {
@Override
public void dragStart(DNDEvent e) {
TreeItem item = tree.findItem(e.getTarget());
if (item != null && item == tree.getRootItem().getItem(0) && tree.getRootItem().getItemCount() == 1) {
e.doit = false;
e.status.setStatus(false);
return;
}
super.dragStart(e);
}
});
TreeDropTarget target = new TreeDropTarget(binder);
target.setAllowSelfAsSource(true);
target.setFeedback(Feedback.BOTH);
container.add(tree);
add(container);
tree.hide();
}
}

The only difference I have here is Skeleton class, that is pretty much skeleton of the model, creates the structure and lets you add entries in it. In my entry point class, I instantiate an object of this class. And I pass a reference of it to another tree(ContextMenuTree which is left navigation object of my page) in the constructor.

And in that tree on selectionchange event I make async call to get data and try to rebind data to the reordering tree as follows.

/*dragTree is the reference to the reordering tree, tree is contextmenutree which is being built */

TreeBuilder.buildTree(

tree, root);

tree.addListener(Events.SelectionChange, new Listener<TreeEvent>(){
publicvoid handleEvent(TreeEvent be )
{
if(tree.getSelectedItem() != null)
{
if(tree.getSelectedItem().hasChildren() == false)
{
if(dragTree != null)
{


try
{
getMediaset(Integer.parseInt(tree.getSelectedItem().getModel().get("id").toString()));
dragTree.getTree().getRootItem().getItems().get(0).setText(tree.getSelectedItem().getText());


}
catch(Exception ex)
{
Info.display("Error Tree Selection Change", ex.getMessage());
}
com.google.gwt.user.client.Window.alert("To Do: Update Right Panel");
}
else
{
com.google.gwt.user.client.Window.alert("It's pretty much null");
}


}
}
}
}
);

And getMediaset method is as follows.


private


void getMediaset(int playlistId)

{
if (playlistDataSvc == null) {
playlistDataSvc = GWT.create(PlaylistDataService.class);
}


AsyncCallback<ArrayList<Mediaset>> callback = new AsyncCallback<ArrayList<Mediaset>>() {
publicvoid onFailure(Throwable caught) {
// TODO: Do something with errors.
Info.display(


"Problem","Failure RPC call while saving playlist");

}


publicvoid onSuccess(ArrayList<Mediaset> result) {


Tree newTree = new Tree();
TreeStore newStore = new TreeStore();


//removing all elements in the reordering tree
dragTree.getTree().getRootItem().removeAll();



Skeleton skeleton = (Skeleton) new Skeleton();



/* Process result, create skeleton by using data, didn't include not to elobarate the discussion */



try
{
TreeModel treemodel = (Skeleton) skeleton;


newStore =


new TreeStore();

newStore.add(treemodel,true);


TreeBinder binder = new TreeBinder(dragTree.getTree(), newStore);


binder.setAutoLoad(true);
binder.setDisplayProperty("name");
binder.init();


Info.display(


"No Error", "Hatasiz kul olmaz");

}
catch(Exception ex)
{
Info.display("Error", ex.getMessage());
}
dragTree.getTree().show();
}
};
playlistDataSvc.getMediaset(playlistId, callback);
}

If I try to bind the new data to the existing reorderingdndtree object I catch these errors.

Index:0 Size:0
Index:3 Size:0,

if I create a new tree in the eventhandler method and bind the data to it and If I set the reorderingtree's tree to that object, I don't receive an error but I don't see anything on the screen.

And I tested and it looks like I don't have a problem with my model. When I add entries while instantiating the reorderingtree, everything works like a charm but when I try to rebind the tree with new data I experience the problem.

Thanks in advance.

erincarikan
20 Mar 2009, 7:27 AM
Here's the complete stack trace of the problem, when the above code is run:


java.lang.NullPointerException

at com.extjs.gxt.ui.client.binder.TreeBinder.createAll(TreeBinder.java:217)
at com.extjs.gxt.ui.client.binder.StoreBinder.bind(StoreBinder.java:254)
at com.extjs.gxt.ui.client.binder.StoreBinder.<init>(StoreBinder.java:105)
at com.extjs.gxt.ui.client.binder.TreeBinder.<init>(TreeBinder.java:56)
at com.cmt.client.samples.examples.tree.ContextMenuTreeExample$10$1.<init>(ContextMenuTreeExample.java:495)
at com.cmt.client.samples.examples.tree.ContextMenuTreeExample$10.onSuccess(ContextMenuTreeExample.java:495)
at com.cmt.client.samples.examples.tree.ContextMenuTreeExample$10.onSuccess(ContextMenuTreeExample.java:1)
at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:215)
at com.google.gwt.http.client.Request.fireOnResponseReceivedImpl(Request.java:254)
at com.google.gwt.http.client.Request.fireOnResponseReceivedAndCatch(Request.java:226)
at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:217)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.ie.IDispatchImpl.callMethod(IDispatchImpl.java:126)
at com.google.gwt.dev.shell.ie.IDispatchProxy.invoke(IDispatchProxy.java:155)
at com.google.gwt.dev.shell.ie.IDispatchImpl.Invoke(IDispatchImpl.java:294)
at com.google.gwt.dev.shell.ie.IDispatchImpl.method6(IDispatchImpl.java:194)
at org.eclipse.swt.internal.ole.win32.COMObject.callback6(COMObject.java:117)
at org.eclipse.swt.internal.ole.win32.COM.VtblCall(Native Method)
at org.eclipse.swt.internal.ole.win32.IDispatch.Invoke(IDispatch.java:64)
at org.eclipse.swt.ole.win32.OleAutomation.invoke(OleAutomation.java:493)
at org.eclipse.swt.ole.win32.OleAutomation.invoke(OleAutomation.java:417)
at com.google.gwt.dev.shell.ie.ModuleSpaceIE6.doInvokeOnWindow(ModuleSpaceIE6.java:67)
at com.google.gwt.dev.shell.ie.ModuleSpaceIE6.doInvoke(ModuleSpaceIE6.java:152)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:447)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeVoid(ModuleSpace.java:248)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeVoid(JavaScriptHost.java:107)
at com.google.gwt.user.client.Window.alert(Window.java)
at com.cmt.client.samples.examples.tree.ContextMenuTreeExample$6$1.handleEvent(ContextMenuTreeExample.java:293)
at com.cmt.client.samples.examples.tree.ContextMenuTreeExample$6$1.handleEvent(ContextMenuTreeExample.java:1)
at com.extjs.gxt.ui.client.event.BaseObservable.fireEvent(BaseObservable.java:74)
at com.extjs.gxt.ui.client.widget.Component.fireEvent(Component.java:443)
at com.extjs.gxt.ui.client.widget.selection.AbstractSelectionModel.fireSelectionChanged(AbstractSelectionModel.java:375)
at com.extjs.gxt.ui.client.widget.selection.AbstractSelectionModel.doSelect(AbstractSelectionModel.java:341)
at com.extjs.gxt.ui.client.widget.tree.TreeSelectionModel.doMultiSelect(TreeSelectionModel.java:75)
at com.extjs.gxt.ui.client.widget.tree.TreeSelectionModel.onMouseDown(TreeSelectionModel.java:39)
at com.extjs.gxt.ui.client.widget.selection.AbstractSelectionModel.handleEvent(AbstractSelectionModel.java:148)
at com.extjs.gxt.ui.client.widget.selection.AbstractSelectionModel.handleEvent(AbstractSelectionModel.java:1)
at com.extjs.gxt.ui.client.event.BaseObservable.fireEvent(BaseObservable.java:74)
at com.extjs.gxt.ui.client.widget.Component.fireEvent(Component.java:443)
at com.extjs.gxt.ui.client.widget.Component.onBrowserEvent(Component.java:725)
at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1308)
at com.google.gwt.user.client.DOM.dispatchEventAndCatch(DOM.java:1287)
at com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1255)
at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.ie.IDispatchImpl.callMethod(IDispatchImpl.java:126)
at com.google.gwt.dev.shell.ie.IDispatchProxy.invoke(IDispatchProxy.java:155)
at com.google.gwt.dev.shell.ie.IDispatchImpl.Invoke(IDispatchImpl.java:294)
at com.google.gwt.dev.shell.ie.IDispatchImpl.method6(IDispatchImpl.java:194)
at org.eclipse.swt.internal.ole.win32.COMObject.callback6(COMObject.java:117)
at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:1925)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2966)
at com.google.gwt.dev.GWTShell.pumpEventLoop(GWTShell.java:720)
at com.google.gwt.dev.GWTShell.run(GWTShell.java:593)
at com.google.gwt.dev.GWTShell.main(GWTShell.java:357)

erincarikan
20 Mar 2009, 11:05 AM
I gave up on rebinding, i thought I could iterate my model nodes one by one since it has a predefined structure, and I thought I could add treeitems on my way. Unfortunately treebinder throws another null exception. I am losing it, I really don't understand how can one repopulate the reordering tree. here is my method and it works while adding the first item. But when I try the expand its children here's what I get back:




private void addToTree(MediasetModel mediamodel)
{
newItem = new TreeItem();


ComponentHelper.setModel(newItem, mediamodel);
newItem.setLeaf(false);
newItem.setText(mediamodel.toString());



dragTree.getRootItem().firstChild().add(newItem);


for(int i = 0; i < mediamodel.getEntries().size(); i++)
{


TreeItem newEntry = new TreeItem();
ComponentHelper.setModel(newEntry, mediamodel.getEntries().get(i));
newEntry.setText(mediamodel.getEntries().get(i).toString());
newItem.add(newEntry);
}
}








[ERROR] Uncaught exception escaped
java.lang.NullPointerException: null
at com.extjs.gxt.ui.client.binder.TreeBinder.renderChildren(TreeBinder.java:461)
at com.extjs.gxt.ui.client.binder.TreeBinder.loadChildren(TreeBinder.java:317)
at com.extjs.gxt.ui.client.binder.TreeBinder.onBeforeExpand(TreeBinder.java:380)
at com.extjs.gxt.ui.client.binder.TreeBinder$2.handleEvent(TreeBinder.java:298)
at com.extjs.gxt.ui.client.binder.TreeBinder$2.handleEvent(TreeBinder.java:1)
at com.extjs.gxt.ui.client.event.BaseObservable.fireEvent(BaseObservable.java:74)
at com.extjs.gxt.ui.client.widget.Component.fireEvent(Component.java:443)
at com.extjs.gxt.ui.client.widget.tree.TreeItem.fireEvent(TreeItem.java:697)
at com.extjs.gxt.ui.client.widget.tree.TreeItem.setExpanded(TreeItem.java:578)
at com.extjs.gxt.ui.client.widget.tree.TreeItem.setExpanded(TreeItem.java:553)
at com.extjs.gxt.ui.client.widget.tree.TreeItem.toggle(TreeItem.java:687)
at com.extjs.gxt.ui.client.widget.tree.TreeItemUI.handleClickEvent(TreeItemUI.java:374)
at com.extjs.gxt.ui.client.widget.tree.TreeItemUI.handleEvent(TreeItemUI.java:152)
at com.extjs.gxt.ui.client.widget.tree.TreeItem.onComponentEvent(TreeItem.java:446)
at com.extjs.gxt.ui.client.widget.tree.Tree.onComponentEvent(Tree.java:473)
at com.extjs.gxt.ui.client.widget.Component.onBrowserEvent(Component.java:722)
at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1308)
at com.google.gwt.user.client.DOM.dispatchEventAndCatch(DOM.java:1287)
at com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1255)
at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.ie.IDispatchImpl.callMethod(IDispatchImpl.java:126)
at com.google.gwt.dev.shell.ie.IDispatchProxy.invoke(IDispatchProxy.java:155)
at com.google.gwt.dev.shell.ie.IDispatchImpl.Invoke(IDispatchImpl.java:294)
at com.google.gwt.dev.shell.ie.IDispatchImpl.method6(IDispatchImpl.java:194)
at org.eclipse.swt.internal.ole.win32.COMObject.callback6(COMObject.java:117)
at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:1925)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2966)
at com.google.gwt.dev.GWTShell.pumpEventLoop(GWTShell.java:720)
at com.google.gwt.dev.GWTShell.run(GWTShell.java:593)
at com.google.gwt.dev.GWTShell.main(GWTShell.java:357)