The following Tree loads the children asynchronously (FileServiceImpl from explorer demo is used) and allows the Tree items to be dragged into other folders.
A TreeItem will expand and loads its children when a TreeItem is dragged and hovered over a folder. This works in the 1.2 release, but fails in version 1.2.1.
Code:
public class DNDTreeTest extends LayoutContainer {
@SuppressWarnings("unchecked")
@Override
public void onRender(Element parent, int index) {
super.onRender(parent, index);
LayoutContainer container = new LayoutContainer();
container.setSize(280, 400);
container.setBorders(true);
container.setScrollMode(Scroll.AUTO);
this.setStyleAttribute("margin", "10px");
final FileServiceAsync service = (FileServiceAsync) Registry.get("fileservice");
RpcProxy<FileModel, List<FileModel>> proxy = new RpcProxy<FileModel, List<FileModel>>() {
@Override
protected void load(FileModel loadConfig, AsyncCallback<List<FileModel>> callback) {
service.getFolderChildren(loadConfig, callback);
}
};
TreeLoader loader = new BaseTreeLoader(proxy) {
@Override
public boolean hasChildren(ModelData parent) {
return parent instanceof FolderModel;
}
};
TreeStore<FileModel> store = new TreeStore<FileModel>(loader);
final Tree tree = new Tree();
tree.getStyle().setLeafIconStyle("icon-list");
TreeBinder<FileModel> binder = new TreeBinder<FileModel>(tree, store);
binder.setDisplayProperty("name");
loader.load(null);
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);
this.add(container);
}
}