/*
* Ext GWT - Ext for GWT
* Copyright(c) 2007-2009, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.samples.client.examples.treepanel;
import java.util.List;
import com.extjs.gxt.samples.client.Examples;
import com.extjs.gxt.samples.client.FileServiceAsync;
import com.extjs.gxt.samples.client.examples.model.FileModel;
import com.extjs.gxt.samples.client.examples.model.FolderModel;
import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.data.BaseTreeLoader;
import com.extjs.gxt.ui.client.data.ModelIconProvider;
import com.extjs.gxt.ui.client.data.ModelKeyProvider;
import com.extjs.gxt.ui.client.data.RpcProxy;
import com.extjs.gxt.ui.client.data.TreeLoader;
import com.extjs.gxt.ui.client.store.Store;
import com.extjs.gxt.ui.client.store.StoreSorter;
import com.extjs.gxt.ui.client.store.TreeStore;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.button.ToolButton;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
import com.extjs.gxt.ui.client.widget.tips.ToolTipConfig;
import com.extjs.gxt.ui.client.widget.treepanel.TreePanel;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
public class AsyncTreePanelExample extends LayoutContainer {
private TreeLoader<FileModel> loader;
private TreePanel<FileModel> tree;
@Override
protected void onRender(Element parent, int index) {
super.onRender(parent, index);
setLayout(new FlowLayout(10));
final FileServiceAsync service = (FileServiceAsync) Registry.get(Examples.FILE_SERVICE);
// data proxy
RpcProxy<List<FileModel>> proxy = new RpcProxy<List<FileModel>>() {
@Override
protected void load(Object loadConfig, AsyncCallback<List<FileModel>> callback) {
service.getFolderChildren((FileModel) loadConfig, callback);
}
};
// tree loader
loader = new BaseTreeLoader<FileModel>(proxy) {
@Override
public boolean hasChildren(FileModel parent) {
return parent instanceof FolderModel;
}
};
// trees store
TreeStore<FileModel> store = new TreeStore<FileModel>(loader);
store.setKeyProvider(new ModelKeyProvider<FileModel>() {
public String getKey(FileModel model) {
return "node_" + model.<String> get("id");
}
});
store.setStoreSorter(new StoreSorter<FileModel>() {
@Override
public int compare(Store<FileModel> store, FileModel m1, FileModel m2, String property) {
boolean m1Folder = m1 instanceof FolderModel;
boolean m2Folder = m2 instanceof FolderModel;
if (m1Folder && !m2Folder) {
return -1;
} else if (!m1Folder && m2Folder) {
return 1;
}
return m1.getName().compareTo(m2.getName());
}
});
tree = new TreePanel<FileModel>(store);
tree.setStateful(true);
tree.setDisplayProperty("name");
// statefull components need a defined id
tree.setId("statefullasynctreepanel");
tree.setIconProvider(new ModelIconProvider<FileModel>() {
public AbstractImagePrototype getIcon(FileModel model) {
if (!(model instanceof FolderModel)) {
String ext = model.getName().substring(model.getName().lastIndexOf(".") + 1);
// new feature, using image paths rather than style names
if ("xml".equals(ext)) {
return IconHelper.createPath("samples/images/icons/page_white_code.png");
} else if ("java".equals(ext)) {
return IconHelper.createPath("samples/images/icons/page_white_cup.png");
} else if ("html".equals(ext)) {
return IconHelper.createPath("samples/images/icons/html.png");
} else {
return IconHelper.createPath("samples/images/icons/page_white.png");
}
}
return null;
}
});
ContentPanel cp = new ContentPanel();
cp.setHeading("Async TreePanel");
cp.setLayout(new FitLayout());
cp.add(tree);
cp.setSize(315, 400);
ToolTipConfig config = new ToolTipConfig();
config.setTitle("Example Information");
config.setShowDelay(1);
config.setText("In this example state has been enabled for the tree. When enabled, the expand state of the tree is "
+ "saved and restored using the StateManager. Try refreshing the browser after expanding some nodes in the "
+ "tree. Notice that this works with asynchronous loading of nodes.");
ToolButton btn = new ToolButton("x-tool-help");
btn.setToolTip(config);
cp.getHeader().addTool(btn);
add(cp);
}
}