On Monday, July 30, 2012 10:02:03 PM UTC+2, Thad wrote: > > I have a CellTree in which I want to represent something similar to a > directory listing (actually represented in database records): > > public class DirectoryObject implements Serializable { > public String name; > public String type; // 'file' or 'folder' > public int group; > ... > } > > This listing comes from a server application which the user must log into. > Naturally I can't call the RPC to populate the tree until the login takes > place. > > My wish is to draw the UI and upon login (or upon pressing a 'List' or > 'Refresh' button to return an ArrayList<DirectoryObject>. From this I > populate the previously empty tree. Objects of type 'folder' will be the > branch nodes and will require a new RPC call with the name as a parameter > to find the children (null gets me the highest level). > > My question is how, once the empty tree is present, to trigger that call > and start my listing. So far I've got what you see below, but I'm not sure > if it's right and I'm stumped on the UiHandler for my list button (at the > very bottom). I'm trying to follow the CellTree examples, but they use > static data or don't start empty. > > public class DirectoryPanel extends Composite { > > private static DirectoryPanelUiBinder uiBinder = GWT > .create(DirectoryPanelUiBinder.class); > > interface DirectoryPanelUiBinder extends > UiBinder<Widget, DirectoryPanel> { > } > > private static class MyDataProvider extends > AsyncDataProvider<DirectoryObject> { > > private String folderName; > > public MyDataProvider(DirectoryObject directory) { > if (directory != null) > folderName = directory.name; > } > > @Override > protected void onRangeChanged(HasData<DirectoryObject> display) { > final Range range = display.getVisibleRange(); > > AsyncCallback<ArrayList<DirectoryObject>> callback = > new AsyncCallback<ArrayList<DirectoryObject>>() { > @Override > public void onFailure(Throwable caught) { > Window.alert((new GwtOptixException(caught)).getMessage()); > } > > @Override > public void onSuccess(ArrayList<DirectoryObject> result) { > int start = range.getStart(); > GWT.log("onRangeChanged, start: "+start); > updateRowData(start, result); > } > }; > Cold.getRpcService().getDirectoryListing(folderName, callback); > } > } > > private static class DirectoryTreeModel implements TreeViewModel { > > private SingleSelectionModel<DirectoryObject> selectionModel = > new SingleSelectionModel<DirectoryObject>(); > > public DirectoryTreeModel() { > selectionModel.addSelectionChangeHandler(new > SelectionChangeEvent.Handler(){ > public void onSelectionChange(SelectionChangeEvent event){ > /* Huh? > from > https://groups.google.com/forum/?start&hl=en#!searchin/google-web-toolkit/CellTree$20asyncdataprovider/google-web-toolkit/jdQLj_oZTek/fuKmFMrbghsJ > but there's no getSelectedObject() in SelectionChangeEvent > */ > //DirectoryObject rec = > (DirectoryObject)event.getSelectedObject(); >
It's actually selectionModel.getSelectedObject() that returns your real DirectoryObject. > } > }); > } > > @Override > public <T> NodeInfo<?> getNodeInfo(T arg0) { > if (arg0 instanceof DirectoryObject) { > Cell<DirectoryObject> cell = new AbstractCell<DirectoryObject>() { > @Override > public void render(Context context, DirectoryObject value, > SafeHtmlBuilder sb) { > if (value != null) { > sb.appendEscaped(value.name); > } > } > }; > MyDataProvider provider = new > MyDataProvider((DirectoryObject)arg0); > return new DefaultNodeInfo<DirectoryObject>(provider, cell, > selectionModel, null); > // or return new DefaultNodeInfo<DirectoryObject>(provider, cell); > ?? > The first line: generally you should provide a selection model for all your nodes if you want to do something when they are selected (the actual expansion, if not a leaf, is a provider's job). } > return null; > } > > @Override > public boolean isLeaf(Object arg0) { > return arg0 != null && ((DirectoryObject)arg0).name != null && > ((DirectoryObject)arg0).type.equals('file'); > } > } > > @UiField(provided = true) > CellTree tree; > @UiField > Button list; > > DirectoryTreeModel treeModel; > > public DirectoryPanel() { > treeModel = new DirectoryTreeModel(); > tree = new CellTree(treeModel, null); > > initWidget(uiBinder.createAndBindUi(this)); > } > > @UiHandler("list") > void onList(ClickEvent event) { > // What here?? > } > > } > I'd: - create the cell tree only if the user has logged in (and show something like an empty message); - create a root null node (as you did) but refuse the expansion/selection until the user has logged in (probably an async provider's job, i.e., the inner RPC is used in an authentication mechanism and refuses requests from unauthenticated clients); - create a default root node that does nothing at all, backed by a no-op (null) selection model and when the used logs in, replace it with the real selection model (I think the only way is re-instantiate the cell tree). I think the best way to programmatically select a node is by using the selection model, although I don't remember if it also expand inner nodes. Hope that helps. -- You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group. To view this discussion on the web visit https://groups.google.com/d/msg/google-web-toolkit/-/2lAkaJUvDY8J. To post to this group, send email to google-web-toolkit@googlegroups.com. To unsubscribe from this group, send email to google-web-toolkit+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.